Skip to content
0xHost API
Log in

Developers

API documentation

Manage servers, orders, domains, networks and hosting from your own code. 71 endpoints.

Overview

The 0xHost API is the same JSON API the customer panel runs on. Most of what you do in the panel, you can do from a script: order and renew services, manage servers, edit DNS records and read your billing.

Base URL
FormatJSON responses. Requests use the query string, a JSON body or form fields, as each endpoint states.
CurrencyEUR for every price and amount.
IDsUUIDs such as 2f1c...-... unless an endpoint says otherwise. Plan ids are integers.
DatesYYYY-MM-DD HH:MM:SS in server time (Central European Time). Crypto payment times are Unix timestamps.

Paths have no file extension: call /API/info_user, not /API/info_user.php. Numeric database fields can arrive as strings ("9.99"); convert them before doing arithmetic.

Authentication

Authenticate every request with an API key in the x-api-key header. The key identifies your account, so endpoints never ask for a user id.

  1. Create a key. Log in and open API keys. Give it a name and choose how long it stays valid (7 days to 1 year, or never expires).
  2. Send it with each request as the header x-api-key.
  3. Rotate it before it expires, or delete it if it leaks. An expired or deleted key simply stops working and the API answers 401.
curl "https://0xhost.com/API/info_user" -H "x-api-key: YOUR_API_KEY"
A key is your whole account.It can spend your balance, reinstall servers and read root passwords. Keep it on your server, never in browser code or a public repository. If one leaks, delete it on the API keys page; it stops working at once.

Endpoints marked Public need no key. A few, such as List plans, work without one but return prices for your account when you send it. While you are logged in to the panel, your browser session also authenticates calls, which is how the panel itself uses this API.

How ordering works

  1. Pick a product. List plans for VPS and storage, List dedicated servers, List network products, List add-ons, List hosting plans, or Check domain availability.
  2. Pay from balance by sending "type_payment": "balance". The order is charged and provisioned in the same call.
  3. Or pay with crypto. Send "type_payment": "crypto" (the default). The order is created as pending and its id comes back as order_id. Pass it to Create a crypto invoice, send the exact amount to the address you get back, then poll Get an invoice until its status is completed.
  4. Several pending orders? Bundle them and pay once, or pay any one of them later with Pay a pending order from balance.

To add funds, create a crypto invoice without order_id and with an amount. Services with auto-renew on are renewed from your balance before they expire; Account summary tells you whether your balance covers the next 7 days.

Responses and errors

Check the HTTP status first, then the body. Most responses carry "success": true or false, and failures add an error or message string. A few endpoints use a different shape; each card notes it.

StatusMeaning
200Done. A few calls (a taken domain, an invalid price query) also report success: false with 200.
400Missing or invalid parameter. The body names it, often as missing_field.
401No key, unknown key or expired key.
403The resource exists but is not yours.
404Not found.
405Wrong HTTP method.
409Conflicts with something you already have, such as a pending order for the same product.
500The action failed. Business errors such as an insufficient balance also use 500, with the reason in message.
502An upstream service (payments, registry or hypervisor) did not answer correctly. Retry later.

List endpoints accept page and per_page and return a pagination object with total_items, total_pages and current_page.

Account

Your profile, balance ledger and notification settings. Every call acts on the account that owns the API key.

GET

Returns the account that owns the API key: username, email, current balance in EUR, notification settings and whether the email address is verified.

No parameters.

Request
curl "https://0xhost.com/API/info_user" \
  -H "x-api-key: YOUR_API_KEY"
Response 200
{
  "success": true,
  "user": {
    "id": "USER_UUID",
    "username": "your_username",
    "email": "[email protected]",
    "userTelegram": null,
    "balance": "42.50",
    "createdAt": "2026-01-10 09:12:44",
    "updatedAt": "2026-09-01 18:03:10",
    "isActive": 1,
    "superuser": 0,
    "notification_days_before": 6,
    "notification_preference": "email",
    "subscription_id": 2,
    "email_verified": true
  }
}
GET

Account summary

API key

Everything the dashboard shows in one call: balance, service counts, your active services sorted by expiry, what renews in the next 7 days and whether your balance covers it, open tickets and the latest announcements.

  • services is capped at 30 rows and expiring at 8; services_total and expiring_total give the full counts.

No parameters.

Request
curl "https://0xhost.com/API/dashboard/summary" \
  -H "x-api-key: YOUR_API_KEY"
Response 200
{
  "success": true,
  "balance": 42.5,
  "counts": {
    "vps": 2,
    "dedicated": 0,
    "domains": 1,
    "plesk": 0,
    "network": 0
  },
  "services": [
    {
      "id": "SERVER_UUID",
      "name": "web-01",
      "type": "vps",
      "ip": "203.0.113.10",
      "status": "active",
      "expires_at": "2026-10-02 11:00:00",
      "price": 9.99,
      "days_left": 6
    }
  ],
  "expiring_total": 1,
  "services_total": 3,
  "expiring": [
    {
      "name": "web-01",
      "type": "vps",
      "expires_at": "2026-10-02 11:00:00",
      "days_left": 6,
      "auto_renew": true,
      "price": 9.99
    }
  ],
  "renewals": {
    "window_days": 7,
    "total": 9.99,
    "covered": true,
    "short_by": 0,
    "overdue": 0,
    "overdue_count": 0,
    "manual": 0,
    "manual_count": 0,
    "due_total": 9.99
  },
  "tickets": {
    "open": 1,
    "list": [
      {
        "id": "TICKET_UUID",
        "reference": "REFERENCE_NUMBER",
        "subject": "rDNS change",
        "service": "Technical Issue",
        "status": "open",
        "priority": "medium",
        "updated_at": "2026-09-24 10:00:00"
      }
    ]
  },
  "announcements": [
    {
      "id": "NEWS_UUID",
      "title": "New location",
      "summary": "Short summary",
      "type": "news",
      "published_at": "2026-09-20 12:00:00"
    }
  ]
}
GET

Balance movements

API key Query string

Your balance ledger, newest first. Every top-up (IN) and every charge (OUT) is a movement.

  • Without a valid key this endpoint answers 400 rather than 401.

Parameters

NameTypeRequiredDescription
page integer Optional Page number. Default 1.
per_page integer Optional Rows per page. Default 10.
Request
curl "https://0xhost.com/API/users/balance_movements?page=1&per_page=10" \
  -H "x-api-key: YOUR_API_KEY"
Response 200
{
  "success": true,
  "data": [
    {
      "id": "MOVEMENT_UUID",
      "user_id": "USER_UUID",
      "amount": "9.99",
      "type": "OUT",
      "description": "Payment for service",
      "status": "completed",
      "related_transaction_id": null,
      "metadata": null,
      "created_at": "2026-09-02 11:00:05",
      "updated_at": "2026-09-02 11:00:05"
    }
  ],
  "pagination": {
    "total_items": 14,
    "total_pages": 2,
    "current_page": 1,
    "per_page": 10,
    "has_next_page": true,
    "has_prev_page": false
  }
}
POST

Choose how and how early you are reminded before a service expires.

  • The path is spelled change_preferences_notificaction, exactly like that.
  • Any other value than the ones listed is rejected with HTTP 500.
  • data in the response is your profile as it was before the change.

Parameters

NameTypeRequiredDescription
preferences string Required One of email, telegram, both, none.
days integer Required Days before expiry to send the reminder: 3, 6 or 15.
Request
curl -X POST "https://0xhost.com/API/users/change_preferences_notificaction" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "preferences": "both",
    "days": 6
  }'
Response 200
{
  "success": true,
  "data": {
    "id": "USER_UUID",
    "username": "your_username",
    "notification_preference": "email",
    "notification_days_before": 3
  }
}

Plans and pricing

The VPS and storage catalog, and price calculators. Prices are in EUR per 30 days (720 hours) and follow your account's pricing tier.

GET

List plans

API key optional Query string

All orderable VPS or storage plans with their monthly price, specs and the OS images and applications each plan can be installed with.

  • Without a key you get standard prices. With a key, prices follow your account's pricing tier, which is what you will actually be charged.
  • Use external_id as plan_id when ordering. params and available_os_image_versions are JSON strings; decode them. Each OS image has an id (send it as os_image_id) and a name (send it as versions).

Parameters

NameTypeRequiredDescription
type string Optional VPS (default) or Storage.
Request
curl "https://0xhost.com/API/plans/list_plan?type=VPS" \
  -H "x-api-key: YOUR_API_KEY"
Response 200
{
  "success": true,
  "data": [
    {
      "id": "PLAN_UUID",
      "name": "VPS 2",
      "params": "{\"vcpu\":2,\"ram\":4294967296,\"disk\":60}",
      "external_id": 12,
      "price": 9.99,
      "currency": "EUR",
      "available_os_image_versions": "[{\"id\":5,\"name\":\"Ubuntu 24.04\"},{\"id\":9,\"name\":\"Debian 12\"}]",
      "available_applications": [
        {
          "id": 3,
          "name": "Docker"
        }
      ],
      "created_at": "2025-11-02 10:00:00",
      "updated_at": "2026-08-30 10:00:00"
    }
  ],
  "count": 1,
  "generated_at": "2026-09-25 12:00:00"
}
GET

Get one plan

API key Query string

A single plan by its external_id, priced for your account.

Parameters

NameTypeRequiredDescription
id integer Required The plan's external_id from List plans.
Request
curl "https://0xhost.com/API/plans/get_by_external_id?id=12" \
  -H "x-api-key: YOUR_API_KEY"
Response 200
{
  "success": true,
  "data": {
    "id": "PLAN_UUID",
    "name": "VPS 2",
    "params": "{\"vcpu\":2,\"ram\":4294967296,\"disk\":60}",
    "external_id": 12,
    "price": 9.99,
    "currency": "EUR",
    "available_os_image_versions": "[...]",
    "available_applications": "[...]"
  },
  "generated_at": "2026-09-25 12:00:00"
}
POST

Calculate a price

Public JSON body

Prorates a monthly price over a number of hours (a month is 720 hours) and returns the cost and the resulting expiry date.

  • Send a JSON body; form fields are not read. Errors come back as success: false with HTTP 200.

Parameters

NameTypeRequiredDescription
hours number Required Hours to price. Must be greater than 0.
monthly_price number Required Monthly price in EUR. Must be greater than 0.
renewal_date string Optional Start date YYYY-MM-DD HH:MM:SS. Defaults to now.
Request
curl -X POST "https://0xhost.com/API/calculate_price" \
  -H "Content-Type: application/json" \
  -d '{
    "hours": 720,
    "monthly_price": 9.99
  }'
Response 200
{
  "success": true,
  "data": {
    "monthly_price": 9.99,
    "hours_purchased": 720,
    "hourly_rate": 0.0139,
    "total_cost": 9.99,
    "purchase_date": "2026-09-25 12:00:00",
    "expiration_date": "2026-10-25 12:00:00",
    "hours_in_month": 720,
    "time_components": {
      "whole_hours": 720,
      "minutes": 0,
      "decimal_hours": 720
    }
  },
  "timestamp": "2026-09-25 12:00:00"
}
POST

Quote a VPS upgrade

API key JSON body

What moving one of your servers to a bigger plan would cost right now: the prorated difference for the time left, plus any extra hours you add.

  • The response has no success field. If the server has already expired, upgrade_difference is 0 and you pay only the new hours.

Parameters

NameTypeRequiredDescription
server_id string Required Server UUID.
plan_id integer Required Target plan external_id.
hours integer Optional Extra hours to add on the new plan. Default 0.
Request
curl -X POST "https://0xhost.com/API/calculate_different_plan" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "server_id": "SERVER_UUID",
    "plan_id": 13,
    "hours": 0
  }'
Response 200
{
  "total_cost": 3.35,
  "upgrade_difference": 3.35,
  "hours_remaining": 402
}

Orders and billing

Every purchase, renewal and upgrade is an order. With type_payment: "balance" the order is charged to your balance and provisioned immediately. With anything else ("crypto" is the default) the order is created as pending: pay it by creating a crypto invoice for it, or later from your balance.

POST

Order a new VPS

API key JSON body

Creates a new VPS order. Paid from balance, the server is created straight away and server_status holds the result; otherwise the order waits for payment.

  • Send either an OS image (os_image_id + versions) or an application_id, both taken from the plan in List plans.
  • The response echoes the root password you sent. Store it; it is also kept in the server's metadata.
  • A domain order is sent to this same path; see Register or renew a domain.

Parameters

NameTypeRequiredDescription
extra_ips integer Optional New server only: extra IPv4 addresses to add with it, 0 to 5. Each is priced like the IPv4 add-on for the same period and is assigned a minute or two after the server is ready.
extra_disk_gb integer Optional New server only: an extra NVMe disk, 10 to 100 GB in steps of 10, at EUR 0.25 per GB a month for the same period. It appears as a second disk that you format and mount yourself.
name_server string Required Hostname for the server. A random suffix is added if you already have one with that name.
plan_id integer Required Plan external_id from List plans.
password string Required Root password, 8 to 20 characters. Commas and equals signs are stripped.
os_image_id integer Sometimes OS image id. Required unless application_id is sent.
versions string Sometimes OS image name, as listed with the image. Required with os_image_id.
application_id integer Optional Install an application instead of a plain OS.
rental_duration integer Required Hours to buy. Minimum 720 (30 days).
type_payment string Optional balance to pay now from balance, crypto (default) to leave the order pending.
auto_renew integer Optional 1 to renew automatically from balance, 0 (default) not to. Send 0 or 1; the string "false" counts as on.
Request
curl -X POST "https://0xhost.com/API/orders/create_order" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name_server": "web-01",
    "plan_id": 12,
    "password": "CHANGE_ME_8_to_20",
    "os_image_id": 5,
    "versions": "Ubuntu 24.04",
    "rental_duration": 720,
    "type_payment": "balance",
    "auto_renew": 1
  }'
Response 200
{
  "success": true,
  "amount": 9.99,
  "balance_before": "42.50",
  "type": "new_server",
  "plan_id": 12,
  "password": "CHANGE_ME_8_to_20",
  "hours_purchased": "720",
  "upgrade_difference": 0,
  "order_id": "ORDER_UUID",
  "server_status": "pending server for pay"
}
POST

Renew a VPS

API key JSON body

Adds time to one of your servers on its current plan. The new time is added from the later of now and the current expiry, and a stopped server is started again.

  • Any active add-ons on the server are billed for the same hours. Terminated servers cannot be renewed.

Parameters

NameTypeRequiredDescription
server_id string Required Server UUID.
rental_duration integer Required Hours to add. Minimum 720.
type_payment string Optional balance or crypto (default).
Request
curl -X POST "https://0xhost.com/API/orders/create_order" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "server_id": "SERVER_UUID",
    "rental_duration": 720,
    "type_payment": "balance"
  }'
Response 200
{
  "success": true,
  "amount": 9.99,
  "balance_before": "42.50",
  "type": "renew_server",
  "plan_id": 12,
  "password": null,
  "hours_purchased": "720",
  "upgrade_difference": 0,
  "order_id": "ORDER_UUID",
  "server_status": {
    "...": "provisioning result"
  }
}
POST

Upgrade a VPS plan

API key JSON body

Moves a server to a bigger plan. You pay the prorated price difference for the time already paid, plus any extra hours. The disk grows with the plan and your data is kept.

  • Downgrades are refused. Use Quote a VPS upgrade first to see the price.
  • If the server has already expired, this behaves like a renewal on the new plan and needs at least 720 hours.

Parameters

NameTypeRequiredDescription
server_id string Required Server UUID.
plan_id integer Required Target plan external_id. Must cost more than the current plan.
rental_duration integer Required Extra hours to add. 0 upgrades without extending, otherwise at least 720.
type_payment string Optional balance or crypto (default).
Request
curl -X POST "https://0xhost.com/API/orders/create_order" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "server_id": "SERVER_UUID",
    "plan_id": 13,
    "rental_duration": 0,
    "type_payment": "balance"
  }'
Response 200
{
  "success": true,
  "amount": 3.35,
  "balance_before": "42.50",
  "type": "scale_server",
  "plan_id": 13,
  "password": null,
  "hours_purchased": "0",
  "upgrade_difference": 3.35,
  "order_id": "ORDER_UUID",
  "server_status": {
    "...": "provisioning result"
  }
}
POST

Register or renew a domain

API key JSON body

Sending domain_name makes this a domain order. If the domain is new it is registered; if it is already yours it is renewed for vyear more years.

  • Check availability first with Check domain availability. A domain that is not available returns success: false with HTTP 200.
  • Only second-level names such as example.com are accepted.

Parameters

NameTypeRequiredDescription
domain_name string Required Full domain, for example example.com.
vyear integer Required Years to register or renew, 1 to 10.
domain_suffix string Sometimes The extension, for example com. Required for a new registration.
password string Sometimes Password for the domain registration. Required for a new registration.
type_payment string Optional balance or crypto (default).
auto_renew integer Optional 1 or 0 (default).
Request
curl -X POST "https://0xhost.com/API/orders/create_order" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "domain_name": "example.com",
    "vyear": 1,
    "domain_suffix": "com",
    "password": "DOMAIN_PASSWORD",
    "type_payment": "balance",
    "auto_renew": 1
  }'
Response 200
{
  "success": true,
  "data": {
    "id": "ORDER_UUID",
    "status": "completed",
    "metadata": "...",
    "amount": "20.00",
    "currency": "EUR"
  },
  "domain": {
    "...": "registration result, or null while unpaid"
  }
}
POST

Order or renew a storage VPS

API key JSON body

Same flow as a VPS order, on the storage plans (List plans with type=Storage). Send server_id instead of the new-server fields to renew or upgrade an existing storage server.

  • Windows images and extra terabytes are added to the price. Storage per server is capped at 20 TB.

Parameters

NameTypeRequiredDescription
name_server string Sometimes Hostname. Required for a new server.
plan_id integer Sometimes Storage plan external_id. Required for a new server; on an existing one it means upgrade.
os_image_id integer Sometimes OS image id. Required for a new server.
versions string Optional OS image name.
password string Sometimes Root password. Required for a new server.
server_id string Optional Existing storage server to renew or upgrade.
rental_duration integer Required Hours to buy (720 = 30 days).
add_extra integer Optional Extra terabytes of storage, 1 to 20.
type_payment string Optional balance or crypto (default).
auto_renew integer Optional 1 or 0 (default).
Request
curl -X POST "https://0xhost.com/API/orders/create_order_storage" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name_server": "backup-01",
    "plan_id": 40,
    "os_image_id": 9,
    "versions": "Debian 12",
    "password": "CHANGE_ME_8_to_20",
    "rental_duration": 720,
    "add_extra": 0,
    "type_payment": "balance",
    "auto_renew": 1
  }'
Response 200
{
  "success": true,
  "amount": 14.99,
  "balance_before": "42.50",
  "type": "new_server",
  "plan_id": 40,
  "password": "CHANGE_ME_8_to_20",
  "hours_purchased": "720",
  "upgrade_difference": 0,
  "order_id": "ORDER_UUID",
  "server_status": {
    "...": "provisioning result"
  }
}
POST

Orders a dedicated server from the catalog, or extends one you already have when server_id is sent.

Parameters

NameTypeRequiredDescription
server_dedicated_id integer Sometimes Catalog id from List dedicated servers. Required for a new server; it must be available.
server_id string Optional Your existing dedicated server (UUID) to extend instead.
rental_duration_hours integer Required Hours to buy. 720 is 30 days.
type_payment string Optional balance or crypto (default).
auto_renew integer Optional 1 or 0 (default).
Request
curl -X POST "https://0xhost.com/API/orders/create_order_dedicated_server" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "server_dedicated_id": 7,
    "rental_duration_hours": 720,
    "type_payment": "balance"
  }'
Response 200
{
  "success": true,
  "order": {
    "id": "ORDER_UUID",
    "status": "completed",
    "metadata": "server_dedicated_id=7",
    "amount": "89.00",
    "currency": "EUR"
  },
  "data": {
    "...": "provisioning result"
  }
}
POST

Order an IP range

API key JSON body

Orders a network product from List network products. Every order is a new, separate subscription at the product's full price; you can hold the same product several times.

  • The renewal price only applies when an existing subscription renews, never to a new order.
  • The order metadata names the subscription it created (subscriptionId=...); that subscription is activated when the order is paid.
  • The response is the created order itself, without a success field.

Parameters

NameTypeRequiredDescription
network_id string Required Product UUID from List network products.
type_payment string Optional balance or crypto (default).
auto_renew integer Optional 1 or 0 (default).
Request
curl -X POST "https://0xhost.com/API/orders/create_order_network" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "network_id": "NETWORK_PRODUCT_UUID",
    "type_payment": "balance",
    "auto_renew": 1
  }'
Response 200
{
  "id": "ORDER_UUID",
  "status": "completed",
  "metadata": "networkId=NETWORK_PRODUCT_UUID, name=..., billing_cycle=monthly, expiration_date=2026-10-25 12:00:00, subscriptionId=SUBSCRIPTION_UUID",
  "amount": "60.00",
  "currency": "EUR"
}
POST

Order an add-on

API key JSON body

Adds an add-on (extra IP, extra disk, storage and so on) to one of your servers.

  • For storage add-ons, quantity is terabytes and the server total is capped at 20 TB.
  • Extra disk (VPS only): send size_gb, 10 to 100 in steps of 10, at most 100 GB of extra disk per server. The price is EUR 0.25 per GB a month, computed on our side. The server may be running or powered off. It appears inside the server as a second disk that you format and mount yourself.
  • An extra IP is assigned a minute or two after the order; poll Add-ons on your servers until its assigned_value is set.

Parameters

NameTypeRequiredDescription
server_id string Required Server UUID. Must be yours.
addon_id string Required Add-on UUID from List add-ons.
quantity integer Optional 1 to 50. Default 1. Ignored for the extra disk.
size_gb integer Optional Extra disk only, and required for it: 10 to 100, in steps of 10.
type_payment string Optional balance or crypto (default).
Request
curl -X POST "https://0xhost.com/API/orders/create_order_addon" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "server_id": "SERVER_UUID",
    "addon_id": "ADDON_UUID",
    "quantity": 1,
    "type_payment": "balance"
  }'
Response 200
{
  "success": true,
  "order": {
    "id": "ORDER_UUID",
    "status": "completed",
    "metadata": null,
    "amount": "3.00",
    "currency": "EUR"
  },
  "addon_server": {
    "...": "assignment result"
  }
}
POST

Order web hosting

API key JSON body

Creates a web hosting subscription for a domain. Paid from balance, the control panel account and the subscription are set up immediately.

Parameters

NameTypeRequiredDescription
plan_id string Required Hosting plan db_id from List hosting plans.
domain_name string Required Domain to host.
email string Required Email for the hosting control panel account.
username string Required Control panel login.
password string Required Control panel password.
full_name string Required Account holder name.
company string Optional Company name.
ftp_login string Required FTP username.
ftp_password string Required FTP password.
duration integer Optional Months, default 1.
type_payment string Optional balance or crypto (default).
auto_renew integer Optional 1 or 0 (default).
Request
curl -X POST "https://0xhost.com/API/orders/create_order_plesk" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "plan_id": "HOSTING_PLAN_DB_ID",
    "domain_name": "example.com",
    "email": "[email protected]",
    "username": "panel_login",
    "password": "PANEL_PASSWORD",
    "full_name": "Your Name",
    "ftp_login": "ftp_login",
    "ftp_password": "FTP_PASSWORD",
    "duration": 1,
    "type_payment": "balance"
  }'
Response 200
{
  "success": true,
  "amount": 4.99,
  "balance_before": "42.50",
  "type": "plesk_hosting",
  "plan_id": "HOSTING_PLAN_DB_ID",
  "domain_name": "example.com",
  "order_id": "ORDER_UUID",
  "setup_status": "..."
}
POST

Renew web hosting

API key JSON body

Sending subscription_id to the hosting order path renews that subscription. Paid from balance, the expiry moves forward immediately and a suspended subscription is reactivated.

  • A crypto renewal is created as pending; pay it with Create a crypto invoice using the returned order_id.

Parameters

NameTypeRequiredDescription
subscription_id string Required Hosting subscription UUID.
duration integer Optional Months to add, default 1.
type_payment string Optional balance or crypto (default).
Request
curl -X POST "https://0xhost.com/API/orders/create_order_plesk" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "subscription_id": "SUBSCRIPTION_UUID",
    "duration": 3,
    "type_payment": "balance"
  }'
Response 200
{
  "success": true,
  "amount": 14.97,
  "type": "plesk_renew",
  "order_id": "ORDER_UUID",
  "payment_method": "balance",
  "new_expires_at": "2026-12-25 12:00:00"
}
POST

Change web hosting plan

API key JSON body

Moves a hosting subscription to another plan. The remaining time is credited at the old price and charged at the new one; a downgrade that costs nothing is applied at once.

Parameters

NameTypeRequiredDescription
subscription_id string Required Hosting subscription UUID.
plan_id string Required New plan db_id from List hosting plans.
type_payment string Optional balance or crypto (default).
Request
curl -X POST "https://0xhost.com/API/orders/create_order_scale_plesk" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "subscription_id": "SUBSCRIPTION_UUID",
    "plan_id": "HOSTING_PLAN_DB_ID",
    "type_payment": "balance"
  }'
Response 200
{
  "success": true,
  "amount": 2.5,
  "direction": "UPGRADE",
  "type": "plesk_scale",
  "order_id": "ORDER_UUID",
  "payment_method": "balance",
  "new_plan": "Medium",
  "credit": 2.5,
  "new_cost": 5,
  "remaining_ratio": 0.5
}
GET

List orders

API key Query string

Your orders, newest first, with filters.

  • Server order metadata contains the root password that was set. Treat responses as secret.

Parameters

NameTypeRequiredDescription
page integer Optional Page number. Default 1.
per_page integer Optional Rows per page. Default 10.
status string Optional For example pending, completed, cancelled.
order_type string Optional One type, for example new_server, renew_server, scale_server, activate_domain, scale_domain, network, new_addon, dedicated_server, plesk_hosting, mass_payment.
order_types string Optional Several types, comma separated.
server_id string Optional Orders for one server.
service_id string Optional Orders for one product or subscription.
domain_name string Optional Orders for one domain.
name_server string Optional Orders for one server hostname.
sort string Optional Sort column. Default created_at.
order string Optional ASC or DESC (default).
Request
curl "https://0xhost.com/API/orders/list_order?status=pending&page=1" \
  -H "x-api-key: YOUR_API_KEY"
Response 200
{
  "success": true,
  "data": [
    {
      "id": "ORDER_UUID",
      "user_id": "USER_UUID",
      "server_id": null,
      "service_id": null,
      "order_number": "CLOUD-XXXXXXXX",
      "order_type": "new_server",
      "status": "pending",
      "server_status": null,
      "name_server": "web-01",
      "plan_id": 12,
      "os_image_id": 5,
      "versions": "Ubuntu 24.04",
      "rental_duration_hours": 720,
      "amount": "9.99",
      "currency": "EUR",
      "metadata": "password=...,type=vps",
      "domain_name": null,
      "description": "VPS SERVICE CONTRACT PAYMENT: crypto",
      "created_at": "2026-09-25 11:58:00",
      "updated_at": "2026-09-25 11:58:00"
    }
  ],
  "pagination": {
    "total_items": 1,
    "total_pages": 1,
    "current_page": 1,
    "per_page": 10,
    "has_next_page": false,
    "has_prev_page": false
  }
}
POST

Charges a pending order to your balance and provisions it. For a mass order, every order inside it is provisioned.

  • Only pass your own order ids. An order that is not pending, or a balance that is too low, returns HTTP 500 with a message.

Parameters

NameTypeRequiredDescription
id string Required Order UUID.
Request
curl -X POST "https://0xhost.com/API/orders/balance_pay" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "ORDER_UUID"
  }'
Response 200
{
  "success": true,
  "service": {
    "...": "provisioning result"
  },
  "status": "completed"
}
POST

Bundle orders into one payment

API key JSON body

Combines several of your pending orders into a single mass_payment order, which you then pay once from balance or with one crypto invoice.

  • Send a JSON body. Orders that are not yours, not pending, or for a terminated server are skipped silently.

Parameters

NameTypeRequiredDescription
order_ids array Required Pending order UUIDs.
Request
curl -X POST "https://0xhost.com/API/orders/create_mass_order" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "order_ids": [
      "ORDER_UUID_1",
      "ORDER_UUID_2"
    ]
  }'
Response 200
{
  "success": true,
  "data": {
    "id": "MASS_ORDER_UUID",
    "amount": 19.98,
    "currency": "EUR",
    "order_count": 2
  }
}
POST

Create a crypto invoice

API key JSON body

Creates a crypto payment for a pending order, or a balance top-up when no order is given. Send the exact pay_amount to address before expired_at; the order is provisioned (or the balance credited) once the payment confirms.

  • Invoices are always in EUR. Do not send a currency field.
  • Supported pairs include BTC/Bitcoin, XMR/Monero, LTC/Litecoin, ETH/Ethereum, ETH/Base, USDT/Tron, USDT/BSC, USDT/Ethereum, USDT/Polygon, USDT/TON, USDC/Ethereum, SOL/Solana, TRX/Tron, BNB/BSC, TON/TON, DOGE/Dogecoin and SHIB/BSC.
  • Each call creates a new invoice. Track it with Get an invoice or List transactions.

Parameters

NameTypeRequiredDescription
order_id string Sometimes Pending order UUID to pay. Omit it for a balance top-up.
amount number Sometimes Top-up amount in EUR. Required when order_id is omitted; ignored otherwise.
pay_currency string Required Coin symbol, for example XMR.
network string Required Network for that coin, for example Monero.
Request
curl -X POST "https://0xhost.com/API/invoice" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "order_id": "ORDER_UUID",
    "pay_currency": "XMR",
    "network": "Monero"
  }'
Response 200
{
  "success": true,
  "transaction": {
    "...": "stored transaction"
  },
  "message": "Transaction created successfully",
  "data": {
    "track_id": "TRACK_ID",
    "amount": 9.99,
    "currency": "EUR",
    "pay_amount": 0.0321,
    "pay_currency": "XMR",
    "network": "Monero",
    "address": "PAYMENT_ADDRESS",
    "qr_code": "https://...",
    "lifetime": 90,
    "expired_at": 1790000000,
    "order_id": "ORDER_UUID",
    "date": 1789996400
  }
}
GET

Get an invoice

API key Query string

One of your orders seen as an invoice: amount, status, what it is for, how it was paid and every crypto payment attempt made for it, newest first.

  • attempts[].expired is computed for you: a crypto attempt past its expired_at that was never paid. An invoice that is not yours returns 404.

Parameters

NameTypeRequiredDescription
id string Required Order UUID.
Request
curl "https://0xhost.com/API/invoices/detail?id=ORDER_UUID" \
  -H "x-api-key: YOUR_API_KEY"
Response 200
{
  "success": true,
  "invoice": {
    "id": "ORDER_UUID",
    "number": "CLOUD-XXXXXXXX",
    "type": "new_server",
    "status": "completed",
    "amount": 9.99,
    "currency": "EUR",
    "description": "VPS SERVICE CONTRACT PAYMENT: crypto",
    "created_at": "2026-09-25 11:58:00",
    "updated_at": "2026-09-25 12:20:00",
    "auto_renew": true,
    "duration_hours": 720,
    "error_message": null,
    "subject": "web-01",
    "server_id": "SERVER_UUID",
    "server_status": "active",
    "payment_method": "crypto"
  },
  "balance_payment": null,
  "attempts": [
    {
      "track_id": "TRACK_ID",
      "status": "Paid",
      "expired": false,
      "type": "ORDER",
      "amount": 9.99,
      "currency": "EUR",
      "pay_amount": "0.0321",
      "pay_currency": "XMR",
      "network": "Monero",
      "tx_hash": "TX_HASH",
      "created_at": "2026-09-25 11:58:30",
      "expired_at": "1790000000"
    }
  ]
}
GET

List transactions

API key Query string

Your crypto payments (orders and top-ups), with filters.

Parameters

NameTypeRequiredDescription
page integer Optional Page number. Default 1.
per_page integer Optional Rows per page. Default 20, maximum 100.
status string Optional For example Paid, Paying, Expired.
type string Optional ORDER or RECHARGE.
pay_currency string Optional Coin symbol.
order_id string Optional Order UUID.
track_id string Optional Payment track id.
start_date integer Optional Unix timestamp, inclusive.
end_date integer Optional Unix timestamp, inclusive.
min_amount number Optional Minimum EUR amount.
max_amount number Optional Maximum EUR amount.
Request
curl "https://0xhost.com/API/list_transactions?status=Paid&per_page=20" \
  -H "x-api-key: YOUR_API_KEY"
Response 200
{
  "success": true,
  "data": [
    {
      "track_id": "TRACK_ID",
      "status": "Paid",
      "type": "ORDER",
      "amount": "9.99",
      "currency": "EUR",
      "pay_amount": "0.0321",
      "pay_currency": "XMR",
      "network": "Monero",
      "order_id": "ORDER_UUID",
      "date": 1789996400,
      "expired_at": 1790000000
    }
  ],
  "pagination": {
    "total_items": 1,
    "total_pages": 1,
    "current_page": 1,
    "per_page": 20,
    "has_next_page": false,
    "has_prev_page": false
  }
}

Servers

Manage your VPS, storage and dedicated servers. Every call checks that the server is yours. Power, password, reinstall and console calls take their parameters in the query string, even when the method is POST or PUT.

GET

List your servers

API key Query string

Your servers with plan, price, add-on totals, status and expiry.

  • This response uses status: true instead of success.

Parameters

NameTypeRequiredDescription
page integer Optional Page number. Default 1.
per_page integer Optional Rows per page, 1 to 100. Default 10.
status string Optional For example active, inactive, suspended, terminated.
hide_terminated boolean Optional true to leave out terminated servers when no status is given.
search string Optional Free text search.
type_server string Optional dedicated to list only dedicated servers.
sort_field string Optional Default created_at.
sort_order string Optional ASC or DESC (default).
Request
curl "https://0xhost.com/API/services/all_servers_by_owner?hide_terminated=true&per_page=20" \
  -H "x-api-key: YOUR_API_KEY"
Response 200
{
  "status": true,
  "data": [
    {
      "id": "SERVER_UUID",
      "name": "web-01",
      "primary_ip": "203.0.113.10",
      "status": "active",
      "type": "vps",
      "os_image_id": 5,
      "application_id": null,
      "plan_id": 12,
      "auto_renew": 1,
      "plan_price": "9.99",
      "addons_price": "0.00",
      "addons_count": 0,
      "plan_name": "VPS 2",
      "plan_currency": "EUR",
      "owner_id": "USER_UUID",
      "created_at": "2026-09-02 11:00:00",
      "updated_at": "2026-09-02 11:03:00",
      "expire_date": "2026-10-02 11:00:00"
    }
  ],
  "pagination": {
    "total_items": 1,
    "total_pages": 1,
    "current_page": 1,
    "per_page": 20,
    "has_next_page": false,
    "has_prev_page": false
  }
}
GET

Get a server

API key Query string

Full detail of one server: the server row, its plan, the installed OS image or application, all IP addresses (including IP add-ons) and the parsed metadata.

  • metadata includes the root password set at creation. Treat this response as secret.

Parameters

NameTypeRequiredDescription
id string Required Server UUID.
Request
curl "https://0xhost.com/API/servers/detail?id=SERVER_UUID" \
  -H "x-api-key: YOUR_API_KEY"
Response 200
{
  "success": true,
  "data": {
    "server": {
      "id": "SERVER_UUID",
      "name": "web-01",
      "primary_ip": "203.0.113.10",
      "status": "active",
      "expire_date": "2026-10-02 11:00:00",
      "auto_renew": 1,
      "additional_ips": [
        "203.0.113.11"
      ],
      "owner": {
        "id": "USER_UUID",
        "username": "your_username"
      }
    },
    "plan": {
      "external_id": 12,
      "name": "VPS 2",
      "price": "9.99"
    },
    "os_image": {
      "id": 5,
      "name": "Ubuntu 24.04"
    },
    "application_image": null,
    "metadata": {
      "password": "ROOT_PASSWORD",
      "username": "root"
    }
  },
  "generated_at": "2026-09-25 12:00:00"
}
POST

Start, stop or restart

API key Query string

Power action on one of your servers. An expired server cannot be started until it is renewed.

  • The success flag in this response is spelled succes. status is the new state recorded for the server.

Parameters

NameTypeRequiredDescription
server_id string Required Server UUID.
action string Required start, stop or restart.
force integer Optional Forced (hard) action. Default on; send 0 for a graceful one.
Request
curl -X POST "https://0xhost.com/API/services/servers_actions?server_id=SERVER_UUID&action=restart" \
  -H "x-api-key: YOUR_API_KEY"
Response 200
{
  "succes": true,
  "status": "active"
}
POST

Reset root password

API key Query string

Generates a new root password for the server and returns it.

Parameters

NameTypeRequiredDescription
server_id string Required Server UUID.
Request
curl -X POST "https://0xhost.com/API/services/reset_password?server_id=SERVER_UUID" \
  -H "x-api-key: YOUR_API_KEY"
Response 200
{
  "success": true,
  "data": {
    "password": "NEW_ROOT_PASSWORD"
  },
  "message": "Password reset successfully"
}
PUT

Reinstall

API key Query string

Wipes the server and installs another OS image, or an application. All data on the server is lost.

Parameters

NameTypeRequiredDescription
server_id string Required Server UUID.
os_id integer Sometimes OS image id from the server's plan. Required unless application_id is sent.
application_id integer Optional Application id from the server's plan.
Request
curl -X PUT "https://0xhost.com/API/services/reinstall_server?server_id=SERVER_UUID&os_id=9" \
  -H "x-api-key: YOUR_API_KEY"
Response 200
{
  "success": true,
  "os_id": 9,
  "application_id": null,
  "login_link": null,
  "message": "Server reinstall successfully"
}
POST

Open the VNC console

API key Query string

Returns the browser console URL for the server and the credentials to log in to it.

  • Without a valid key this endpoint answers 400 (not the owner) rather than 401.

Parameters

NameTypeRequiredDescription
server_id string Required Server UUID.
Request
curl -X POST "https://0xhost.com/API/services/vnc_server?server_id=SERVER_UUID" \
  -H "x-api-key: YOUR_API_KEY"
Response 200
{
  "success": true,
  "vnc_url": "https://...",
  "vnc_password": "VNC_PASSWORD",
  "vnc_user": "root"
}
PUT

Set auto-renew

API key JSON body

Turns automatic renewal from balance on or off, for one server or for every server you own.

  • Send a JSON body. Either server_id or "all": true is required; with all the response carries affected instead of server_id.

Parameters

NameTypeRequiredDescription
auto_renew integer Required 1 on, 0 off.
server_id string Sometimes Server UUID.
all boolean Sometimes true to apply to all your servers.
Request
curl -X PUT "https://0xhost.com/API/services/auto_renew" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "server_id": "SERVER_UUID",
    "auto_renew": 1
  }'
Response 200
{
  "success": true,
  "message": "Auto-renew updated successfully",
  "server_id": "SERVER_UUID",
  "auto_renew": 1
}
GET

Usage: CPU, memory and network

API key Query string

Recent CPU, memory and network samples for a server in one call. Each part has its own success flag, so one failing metric does not hide the others.

  • Samples come straight from the hypervisor and some can be all zero; treat those as gaps.

Parameters

NameTypeRequiredDescription
server_id string Required Server UUID.
Request
curl "https://0xhost.com/API/services/usage_server_bulk?server_id=SERVER_UUID" \
  -H "x-api-key: YOUR_API_KEY"
Response 200
{
  "success": true,
  "success_update_db": false,
  "data": {
    "cpu": {
      "success": true,
      "data": {
        "items": [
          {
            "time": "2026-09-25T12:00:00Z",
            "load_average": 3.2,
            "cpu_count": 2,
            "cpu_time": 123456
          }
        ]
      }
    },
    "memory": {
      "success": true,
      "data": {
        "items": [
          {
            "time": "2026-09-25T12:00:00Z",
            "memory": 1432
          }
        ]
      }
    },
    "network": {
      "success": true,
      "data": {
        "items": [
          {
            "time": "2026-09-25T12:00:00Z",
            "derivative": {
              "read_kb": 12,
              "write_kb": 4
            }
          }
        ]
      }
    }
  }
}
GET

Usage: one metric

API key Query string

Samples for a single metric. Prefer the bulk call when you need more than one.

  • This response has no success field.

Parameters

NameTypeRequiredDescription
server_id string Required Server UUID.
specification string Required cpu, memory or network.
Request
curl "https://0xhost.com/API/services/usage_server?server_id=SERVER_UUID&specification=cpu" \
  -H "x-api-key: YOUR_API_KEY"
Response 200
{
  "success_update_db": false,
  "data": {
    "items": [
      {
        "time": "2026-09-25T12:00:00Z",
        "load_average": 3.2,
        "cpu_count": 2
      }
    ]
  }
}
GET

Disk usage

API key Query string

Current disk usage of a server, as reported by the hypervisor (null when it is not available).

Parameters

NameTypeRequiredDescription
server_id string Required Server UUID.
Request
curl "https://0xhost.com/API/services/detail_disk?server_id=SERVER_UUID" \
  -H "x-api-key: YOUR_API_KEY"
Response 200
{
    "success": true,
    "data": { disk usage object, or null }
}
GET

Disks and space used

API key Query string

Every disk of a VPS, primary first, with its size and the space it uses.

  • used_gb is measured on the host. Deleting files inside the server does not always lower it, so it can be higher than what the server itself reports. It is null when not available.

Parameters

NameTypeRequiredDescription
server_id string Required Server UUID. Must be yours.
Request
curl "https://0xhost.com/API/servers/disks?server_id=SERVER_UUID" \
  -H "x-api-key: YOUR_API_KEY"
Response 200
{
  "success": true,
  "data": [
    {
      "primary": true,
      "size_gb": 60,
      "used_gb": 18.4
    },
    {
      "primary": false,
      "size_gb": 50,
      "used_gb": 2.1
    }
  ]
}
POST

Change the primary IP

API key JSON body

Makes one of the server's extra IPv4 addresses its primary IP. The old primary becomes an extra IP.

  • Connections to the old primary IP drop. The network configuration inside the server may need updating, or a reboot, and DNS or firewall rules that point at the old IP must be changed.
  • VPS only, running or powered off. Send dry_run to run every check without changing anything.
  • Errors: 400 if the IP is not one of the server's, 409 if the server is busy or not active.

Parameters

NameTypeRequiredDescription
server_id string Required Server UUID. Must be yours.
ip string Required One of the server's extra IPv4 addresses.
dry_run integer Optional 1 to check only.
Request
curl -X POST "https://0xhost.com/API/servers/set_primary_ip" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "server_id": "SERVER_UUID",
    "ip": "203.0.113.11"
  }'
Response 200
{
  "success": true,
  "message": "The primary IP was changed.",
  "data": {
    "server_id": "SERVER_UUID",
    "old_primary_ip": "203.0.113.10",
    "primary_ip": "203.0.113.11",
    "extra_ips": [
      "203.0.113.10"
    ]
  }
}
GET

Abuse reports for an IP

API key Query string

Abuse reports received for one of the server's IP addresses, limited to the period the IP has been yours.

  • The IP must belong to the server (primary, extra or IP add-on), otherwise HTTP 403. This response has no success field; SERVER_DATE is when the server was created.

Parameters

NameTypeRequiredDescription
server_id string Required Server UUID.
ip string Required An IP address of that server.
Request
curl "https://0xhost.com/API/servers/abuses_reports?server_id=SERVER_UUID&ip=203.0.113.10" \
  -H "x-api-key: YOUR_API_KEY"
Response 200
{
  "ip": "203.0.113.10",
  "reports": [
    {
      "subject": "Abuse report",
      "content": "...",
      "abuse_type": "scanning",
      "date": "2026-09-20 08:00:00",
      "raw_content": "..."
    }
  ],
  "SERVER_DATE": "2026-09-02 11:00:00"
}
GET

List dedicated servers

Public Query string

The dedicated server catalog with specs, monthly price and availability. Use a server's id as server_dedicated_id when ordering.

  • Text filters must match exactly. total_filtered is only present when listing (no id).

Parameters

NameTypeRequiredDescription
id integer Optional Return a single catalog entry.
available boolean Optional true for in-stock servers only.
cpu string Optional Exact CPU name.
ram string Optional Exact RAM value.
storage string Optional Exact storage value.
price_per_month_eur number Optional Maximum monthly price.
Request
curl "https://0xhost.com/API/servers/list_vps_dedicated?available=true"
Response 200
{
  "servers": [
    {
      "id": 7,
      "name": "DS-1",
      "cpu": "CPU model",
      "ram": "64 GB",
      "storage": "2x 1 TB NVMe",
      "price_per_month_eur": 89,
      "available": 1
    }
  ],
  "total_filtered": 1
}

Add-ons

Extras you can attach to a server. Order them with Order an add-on.

GET

List add-ons

Public Query string

The add-on catalog with prices. Storage add-ons are hidden unless you ask for them for a storage server.

Parameters

NameTypeRequiredDescription
page integer Optional Page number. Default 1.
per_page integer Optional Rows per page. Default 10.
type string Optional Only this add-on type, for example ip_address.
server_type string Optional storage to include storage add-ons.
server_id string Optional With server_type=storage: hides storage add-ons again if this server already has one. With include_extra_disk=1: adds how many GB of extra disk that server already has (used_gb).
include_extra_disk integer Optional 1 together with server_type=vps to include the Extra disk add-on, with an extra_disk object: price_per_gb, min_gb, max_gb, step_gb, used_gb.
Request
curl "https://0xhost.com/API/addons/list_addons?per_page=50"
Response 200
{
  "success": true,
  "data": [
    {
      "id": "ADDON_UUID",
      "name": "Extra IPv4",
      "description": "One additional IPv4 address",
      "type": "ip_address",
      "price": "3.00",
      "is_active": 1,
      "requires_approval": 0,
      "created_at": "2025-11-02 10:00:00",
      "updated_at": "2025-11-02 10:00:00"
    }
  ],
  "pagination": {
    "total_items": 1,
    "total_pages": 1,
    "current_page": 1,
    "per_page": 50,
    "has_next_page": false,
    "has_prev_page": false
  }
}
GET

Add-ons on your servers

API key Query string

Add-ons attached to your servers, with the assigned value (for example the IP) and price. total_cost sums the assigned prices.

Parameters

NameTypeRequiredDescription
server_id string Optional Only this server. Omit it for all your servers.
per_page integer Optional Rows to return. Default 10.
Request
curl "https://0xhost.com/API/servers/list_addon_server?server_id=SERVER_UUID" \
  -H "x-api-key: YOUR_API_KEY"
Response 200
{
  "success": true,
  "data": [
    {
      "id": "SERVER_ADDON_UUID",
      "addon_id": "ADDON_UUID",
      "server_id": "SERVER_UUID",
      "status": "active",
      "assigned_price": "3.00",
      "assigned_value": "203.0.113.11",
      "created_at": "2026-09-03 10:00:00",
      "updated_at": "2026-09-03 10:00:00",
      "addon_name": "Extra IPv4"
    }
  ],
  "total_cost": [
    {
      "total_assigned_value": "3.00"
    }
  ],
  "pagination": {
    "current_page": 1,
    "per_page": 10,
    "total_items": 1,
    "total_pages": 1
  }
}

Firewall and DDoS protection

DDoS protection, firewall rules, IP lists, website (layer 7) checks and attack history for the IPv4 addresses of your VPS or dedicated server: its primary IP, additional IPs and extra IP add-ons. Every call takes the server_id of a server you own; an ip must belong to that server. Suspended servers answer 403 and terminated ones 410. When the firewall add-on is not active on the server, calls answer 403 (State returns entitled: false). Changes reach the filter within a few seconds.

GET

Get firewall state

API key Query string

Everything the Firewall tab shows for one server: each IP with its protection switches and rules, your IP lists, protected websites, limits, the application profiles and the defaults of the advanced settings.

  • Each IP holds at most max_rules (10) rules, counting rules set up by our team. Those come back with editable: false and cannot be changed or deleted through the API.
  • Rules are checked in seq order, 1 first. Deleting a rule renumbers the rest.
  • advanced is set only on action 6 rules and application only on action 10 rules; see Create or update a rule.
  • Lists with shared: true are kept up to date by our team. You can use them as a rule source but not change them; only the first entries are included in prefixes.
  • When the add-on is not active the answer is only {"success": true, "entitled": false, "beta": false, "ips": ["203.0.113.10"]}.

Parameters

NameTypeRequiredDescription
server_id string Required Server UUID.
Request
curl "https://0xhost.com/API/firewall/state?server_id=SERVER_UUID" \
  -H "x-api-key: YOUR_API_KEY"
Response 200
{
  "success": true,
  "entitled": true,
  "sites": [
    {
      "uuid": "SITE_UUID",
      "ip": "203.0.113.10",
      "domain": "shop.example.com",
      "https": true,
      "cert_until": 1798761600,
      "mode": "jscookie",
      "requests": {
        "limit": 100,
        "mode": "captcha",
        "timeout": 300
      },
      "paths": [
        {
          "path": "^/api/",
          "mode": "bypass"
        }
      ]
    }
  ],
  "lists": [
    {
      "uuid": "LIST_UUID",
      "name": "Office",
      "count": 2,
      "prefixes": [
        "198.51.100.7/32",
        "198.51.100.128/25"
      ],
      "shared": false
    }
  ],
  "limits": {
    "lists": 20,
    "prefixes": 1000,
    "rules": 10,
    "ratelimit": 250000,
    "ratelimitmax": 1000000,
    "app_ratelimit": 2500,
    "app_ports": 10
  },
  "advanced": {
    "ftp_port": {
      "default": 21,
      "min": 1,
      "max": 65535,
      "label": "FTP port",
      "unit": ""
    },
    "...": "one entry per advanced setting"
  },
  "app_profiles": [
    {
      "id": "25565",
      "name": "Minecraft Protocol (TCP)",
      "description": "Profile description",
      "protocol": 6,
      "ratelimit": 750
    }
  ],
  "beta": true,
  "server": {
    "id": "SERVER_UUID",
    "name": "web-01"
  },
  "ips": [
    {
      "ip": "203.0.113.10",
      "protection": {
        "custom": true,
        "l4_permanent": false,
        "l7_permanent": true,
        "l7_only": false
      },
      "rules": [
        {
          "uuid": "RULE_UUID",
          "seq": 1,
          "protocol": 17,
          "src_ip": "",
          "uses_list": false,
          "src_list": "",
          "length": "",
          "tcp_flags": [],
          "ratelimitmax": null,
          "src_port": "",
          "dst_port": "27015",
          "action": 2,
          "ratelimit": 10000,
          "advanced": null,
          "application": null,
          "editable": true
        }
      ],
      "max_rules": 10
    }
  ]
}
POST

Create or update a rule

API key JSON body

Adds a rule at the end of an IP's rule list, or changes one of your rules when you send its uuid. Match fields left empty match anything.

  • Actions: 0 discard; 2 accept up to ratelimit pps, discard the rest; 3 accept up to ratelimit pps per source IP, optionally capped in total by ratelimitmax; 4 accept up to ratelimit pps, then hand the rest to the normal DDoS filtering; 6 advanced configuration; 10 application profile.
  • Action 6 changes how the filter treats matching traffic. Send the settings you want to change in advanced; anything you leave out keeps the filter default. Keys, defaults and bounds: ftp_port 21, ftp_passive_start 49152, ftp_passive_end 65535 (1 to 65535, start not above end); icmp_host_limit 100, syn_client_limit 10, synack_host_limit 100 (1 to 250,000 pps); stateful_syn_client_limit 10000, stateful_synack_host_limit 10000 (1 to 1,000,000 pps); session lifetimes session_tcp_syn 60, session_tcp_synack 60, session_tcp_stateful 900, session_udp_application 60, session_udp_general 60 (10 to 3,600 seconds). The same list is in the advanced field of Get firewall state.
  • Action 10 applies an application profile. app_profile is an id from List application profiles. app_ratelimit is the rate limit per client session, 0 to 2,500 pps; leave it out to use the profile's suggested ratelimit. app_ports optionally applies other profiles to specific ports: up to 10 entries of {"port": 9987, "profile": "PROFILE_ID", "ratelimit": 750}, where ratelimit is optional too.
  • An IP holds at most 10 rules, including rules set up by our team; a new rule on a full IP answers 409. Rules set up by our team cannot be changed (403).
  • A setting the filter refuses answers 422 with its reason in error.

Parameters

NameTypeRequiredDescription
server_id string Required Server UUID.
ip string Required One of the server's IPv4 addresses.
uuid string Optional Rule to change. Leave out to create a rule.
action integer Required 0, 2, 3, 4, 6 or 10. See the notes.
protocol integer Optional 0 any (default), 6 TCP, 17 UDP, 1 ICMP.
dst_port string Optional Port on your server: 27015 or a range 7000-7100. Not with ICMP.
src_port string Optional Source port or range. Not with ICMP.
src_type string Optional any, ip (use src_ip) or list (use src_list).
src_ip string Optional Source IPv4 address or range, e.g. 198.51.100.7 or 198.51.100.1-198.51.100.50.
src_list string Sometimes Required when src_type is list: the uuid of one of your IP lists or a shared list.
length string Optional Packet size in bytes, a number or a range such as 1000-1500.
tcp_flags array Optional TCP flags that must all be set: any of syn, ack, psh, fin, urg, rst. Only with protocol 6.
ratelimit integer Sometimes Required for actions 2, 3 and 4: packets per second, 1 to 250,000.
ratelimitmax integer Optional Action 3 only: total ceiling across all sources, from ratelimit up to 1,000,000 pps.
advanced object Optional Action 6 only: settings to change, e.g. {"ftp_port": 2121, "syn_client_limit": 100}. See the notes.
app_profile string Sometimes Required for action 10: application profile id.
app_ratelimit integer Optional Action 10 only: rate limit per client session, 0 to 2,500 pps.
app_ports array Optional Action 10 only: per-port profiles, see the notes.
Request
curl -X POST "https://0xhost.com/API/firewall/rule_save" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "server_id": "SERVER_UUID",
    "ip": "203.0.113.10",
    "action": 10,
    "protocol": 6,
    "dst_port": "25565",
    "app_profile": "25565",
    "app_ratelimit": 750
  }'
Response 200
{
  "success": true,
  "uuid": "RULE_UUID",
  "rule": {
    "uuid": "RULE_UUID",
    "seq": 1,
    "protocol": 6,
    "src_ip": "",
    "uses_list": false,
    "src_list": "",
    "length": "",
    "tcp_flags": [],
    "ratelimitmax": null,
    "src_port": "",
    "dst_port": "25565",
    "action": 10,
    "ratelimit": null,
    "advanced": null,
    "application": {
      "profile": "25565",
      "ratelimit": 750,
      "ports": []
    },
    "editable": true
  }
}
GET

Application profiles for rule action 10, such as game servers and VPNs. Each has a suggested rate limit per client session.

  • The list is the same for every server. Get firewall state includes it too, as app_profiles.

No parameters.

Request
curl "https://0xhost.com/API/firewall/app_profiles" \
  -H "x-api-key: YOUR_API_KEY"
Response 200
{
  "success": true,
  "max_ratelimit": 2500,
  "profiles": [
    {
      "id": "25565",
      "name": "Minecraft Protocol (TCP)",
      "description": "Profile description",
      "protocol": 6,
      "ratelimit": 750
    },
    {
      "id": "51820",
      "name": "Wireguard VPN Server",
      "description": "Profile description",
      "protocol": 17,
      "ratelimit": 750
    }
  ]
}
POST

Delete a rule

API key JSON body

Deletes one of your rules. The remaining rules on that IP are renumbered so they stay in order.

  • Only rules you created can be deleted (403 otherwise).

Parameters

NameTypeRequiredDescription
server_id string Required Server UUID.
uuid string Required Rule UUID.
Request
curl -X POST "https://0xhost.com/API/firewall/rule_delete" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "server_id": "SERVER_UUID",
    "uuid": "RULE_UUID"
  }'
Response 200
{
  "success": true
}
POST

Set DDoS protection

API key JSON body

Switches the DDoS filters of one IP. By default they switch on automatically when an attack is detected.

  • Send all three flags; one left out counts as false.
  • Website filtering: off is l7_permanent: false, l7_only: false; during attacks is l7_permanent: true; always is l7_permanent: true, l7_only: true.
  • The IP's original settings are restored when the service ends.

Parameters

NameTypeRequiredDescription
server_id string Required Server UUID.
ip string Required One of the server's IPv4 addresses.
l4_permanent boolean Optional Keep the network (layer 4) filters on all the time.
l7_permanent boolean Optional Check website visitors whenever the network filters are on.
l7_only boolean Optional Check website visitors even while the network filters are off.
Request
curl -X POST "https://0xhost.com/API/firewall/protection" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "server_id": "SERVER_UUID",
    "ip": "203.0.113.10",
    "l4_permanent": true,
    "l7_permanent": false,
    "l7_only": false
  }'
Response 200
{
  "success": true,
  "protection": {
    "prefix": "203.0.113.10/32",
    "l4_permanent": true,
    "l7_permanent": false,
    "l7_only": false
  }
}
GET

Attack history

API key Query string

DDoS attacks detected on one IP: totals, a histogram and a paginated list of attacks, newest first.

  • An attack groups detections less than 6 minutes apart. While it lasts it is detected again about every minute, so duration (seconds) is approximate; one detection means under a minute.
  • Data is refreshed at most every 5 minutes (updated, a Unix time). History goes back to history_from.
  • bucket is the width of each bar in seconds; count in a bar is the number of attacks that started in it. Times are Unix seconds.

Parameters

NameTypeRequiredDescription
server_id string Required Server UUID.
ip string Required One of the server's IPv4 addresses.
range string Optional 1, 24 (default) or 168 hours, or all for everything since the server was created.
page integer Optional Page of the attack list, 15 per page. Default 1.
from integer Optional With to: only list attacks overlapping this Unix time window, e.g. one bar.
to integer Optional End of the window, Unix time.
Request
curl "https://0xhost.com/API/firewall/metrics?server_id=SERVER_UUID&ip=203.0.113.10&range=24&page=1" \
  -H "x-api-key: YOUR_API_KEY"
Response 200
{
  "success": true,
  "ip": "203.0.113.10",
  "range": "24",
  "since": 1790280000,
  "service_start": 1780000000,
  "history_from": 1785000000,
  "updated": 1790366000,
  "count": 1,
  "detections": 3,
  "total_duration": 240,
  "peak_mbps": 1850,
  "peak_pps": 410000,
  "last_at": 1790350000,
  "bucket": 3600,
  "bars": [
    {
      "t": 1790348400,
      "count": 1,
      "mbps": 1850,
      "pps": 410000
    }
  ],
  "list": {
    "page": 1,
    "per_page": 15,
    "total": 1,
    "items": [
      {
        "id": "ATTACK_ID",
        "start": 1790349880,
        "end": 1790350000,
        "duration": 180,
        "detections": 3,
        "mbps": 1850,
        "pps": 410000,
        "how": [
          "DDoS filter"
        ],
        "proto": {
          "17": 2900
        },
        "ports": [
          "27015"
        ],
        "cc": [
          "US",
          "BR"
        ],
        "sources": 812
      }
    ]
  }
}
GET

Attack detail

API key Query string

Full detail of one attack: a timeline of its detections and the top sources, networks, countries and ports, plus sample packets from its peak.

Parameters

NameTypeRequiredDescription
server_id string Required Server UUID.
uuid string Required An attack id from Attack history.
Request
curl "https://0xhost.com/API/firewall/incident?server_id=SERVER_UUID&uuid=ATTACK_ID" \
  -H "x-api-key: YOUR_API_KEY"
Response 200
{
  "success": true,
  "ip": "203.0.113.10",
  "id": "ATTACK_ID",
  "start": 1790349880,
  "end": 1790350000,
  "duration": 180,
  "detections": 3,
  "mbps": 1850,
  "pps": 410000,
  "how": [
    "DDoS filter"
  ],
  "proto": {
    "17": 2900
  },
  "ports": [
    "27015"
  ],
  "cc": [
    "US"
  ],
  "sources": 812,
  "timeline": [
    {
      "t": 1790349880,
      "mbps": 1200,
      "pps": 260000,
      "how": [
        "DDoS filter"
      ]
    }
  ],
  "flows_total": 2900,
  "stats": {
    "sources": 812,
    "nets": 140,
    "countries": 31,
    "ports": 3
  },
  "carpet": false,
  "protocols": {
    "17": 2900
  },
  "top_countries": [
    {
      "v": "US",
      "n": 900
    }
  ],
  "top_ports": [
    {
      "v": "27015",
      "n": 2800
    }
  ],
  "top_nets": [
    {
      "v": "Example Network",
      "n": 300
    }
  ],
  "top_sources": [
    {
      "ip": "198.51.100.20",
      "n": 40,
      "cc": "US",
      "net": "Example Network"
    }
  ],
  "flows": [
    {
      "t": 1790349890,
      "src": "198.51.100.20",
      "sp": 53,
      "dp": 27015,
      "pr": 17,
      "len": 1200,
      "fl": null,
      "cc": "US",
      "net": "Example Network"
    }
  ],
  "peak_at": 1790349940
}
POST

Create or update an IP list

API key JSON body

Saves a reusable list of IPv4 addresses and networks to use as the source of a rule. Lists belong to your account and work on all your servers.

  • Up to 20 lists, each with up to 1,000 entries from /8 to /32. A plain address is stored as /32 and networks are normalised (198.51.100.9/24 becomes 198.51.100.0/24).
  • Names are up to 40 characters and unique per account (409 on a duplicate).
  • Updating replaces all entries of the list.

Parameters

NameTypeRequiredDescription
server_id string Required Any of your servers with the firewall add-on active.
uuid string Optional List to change. Leave out to create a list.
name string Required List name.
prefixes string Required Entries separated by new lines, commas or spaces, or a JSON array of strings.
Request
curl -X POST "https://0xhost.com/API/firewall/list_save" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "server_id": "SERVER_UUID",
    "name": "Office",
    "prefixes": [
      "198.51.100.7",
      "198.51.100.128/25"
    ]
  }'
Response 200
{
  "success": true,
  "uuid": "LIST_UUID",
  "count": 2
}
GET

Get an IP list

API key Query string

Every entry of one of your lists, or of a shared list kept up to date by our team.

Parameters

NameTypeRequiredDescription
server_id string Required Server UUID.
uuid string Required List UUID from Get firewall state.
Request
curl "https://0xhost.com/API/firewall/list_view?server_id=SERVER_UUID&uuid=LIST_UUID" \
  -H "x-api-key: YOUR_API_KEY"
Response 200
{
  "success": true,
  "uuid": "LIST_UUID",
  "name": "Office",
  "shared": false,
  "count": 2,
  "prefixes": [
    "198.51.100.7/32",
    "198.51.100.128/25"
  ]
}
POST

Delete an IP list

API key JSON body

Deletes one of your IP lists.

  • A list used by a rule on any IP cannot be deleted (409, the error names the rule). Change or delete that rule first.

Parameters

NameTypeRequiredDescription
server_id string Required Server UUID.
uuid string Required List UUID.
Request
curl -X POST "https://0xhost.com/API/firewall/list_delete" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "server_id": "SERVER_UUID",
    "uuid": "LIST_UUID"
  }'
Response 200
{
  "success": true
}
POST

Protect a website

API key JSON body

Puts a browser check in front of a website on one of the server's IPs, or changes one you set up (send its uuid). The checks run according to the IP's website filtering setting (see Set DDoS protection).

  • The domain must already resolve to the IP (an A record). Add each hostname, such as the domain and www, separately. Each domain can be set up once, up to 20 websites per server.
  • Checks (mode): jscookie invisible JavaScript check (default), jsbutton click to continue, captcha, bypass no check.
  • For HTTPS send the certificate (with intermediates) and its unencrypted private key in PEM format. The key is passed to the filter and never stored by us. Leave both out when updating to keep the current certificate.
  • The domain and IP of a website cannot be changed; remove it and add it again. Send a JSON body.
  • Saving can take up to about a minute.

Parameters

NameTypeRequiredDescription
server_id string Required Server UUID.
ip string Required One of the server's IPv4 addresses.
uuid string Optional Website to change. Leave out to add one.
domain string Required Hostname, e.g. shop.example.com.
mode string Optional How visitors are checked. Default jscookie.
req_limit integer Optional Switch a visitor to a stricter check above this many requests per second, 20 to 2,000.
req_mode string Optional That stricter check: captcha (default), jsbutton or jscookie.
req_timeout integer Optional How long the stricter check lasts, 60 to 65,535 seconds. Default 300.
paths array Optional Up to 10 {"path": "^/api/", "mode": "bypass"} entries: a regular expression matched against the path and the check to use for it.
cert_pem string Optional PEM certificate chain.
key_pem string Sometimes PEM private key. Required with cert_pem.
remove_cert boolean Optional Make the website HTTP only.
Request
curl -X POST "https://0xhost.com/API/firewall/site_save" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "server_id": "SERVER_UUID",
    "ip": "203.0.113.10",
    "domain": "shop.example.com",
    "mode": "jscookie",
    "req_limit": 100,
    "req_mode": "captcha",
    "req_timeout": 300,
    "paths": [
      {
        "path": "^/api/",
        "mode": "bypass"
      }
    ]
  }'
Response 200
{
  "success": true,
  "site": {
    "uuid": "SITE_UUID",
    "ip": "203.0.113.10",
    "domain": "shop.example.com",
    "https": false,
    "cert_until": null,
    "mode": "jscookie",
    "requests": {
      "limit": 100,
      "mode": "captcha",
      "timeout": 300
    },
    "paths": [
      {
        "path": "^/api/",
        "mode": "bypass"
      }
    ]
  }
}
POST

Remove a website

API key JSON body

Stops checking visitors of a website. Its certificate is removed from the filter too.

  • Send a JSON body.

Parameters

NameTypeRequiredDescription
server_id string Required Server UUID.
uuid string Required Website UUID from Get firewall state.
Request
curl -X POST "https://0xhost.com/API/firewall/site_delete" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "server_id": "SERVER_UUID",
    "uuid": "SITE_UUID"
  }'
Response 200
{
  "success": true
}

Domains

Search, nameservers and DNS records. To register or renew a domain, see Register or renew a domain under Orders.

POST

Check domain availability

Public JSON body

Checks one name against several extensions in a single call.

  • Send a JSON body. A name that looks free at the registry but already has DNS records is reported as unknown.

Parameters

NameTypeRequiredDescription
query string Required Name without extension. Characters other than letters, digits and hyphens are removed.
suffixes array Required Extensions to check, with or without the dot. A comma separated string also works.
onlyAvailable boolean Optional true to return only available, non-premium names.
Request
curl -X POST "https://0xhost.com/API/domains/check_availability" \
  -H "Content-Type: application/json" \
  -d '{
    "query": "example",
    "suffixes": [
      "com",
      "net",
      "io"
    ]
  }'
Response 200
{
  "success": true,
  "data": [
    {
      "domain": "example.com",
      "available": false,
      "status": "registered",
      "premium": false,
      "message": "Domain is already registered",
      "dns_check": false,
      "whois_check": false
    },
    {
      "domain": "example.io",
      "available": true,
      "status": "available",
      "premium": false,
      "message": "Domain is available for registration",
      "dns_check": true,
      "whois_check": true
    }
  ],
  "meta": {
    "total_checked": 3,
    "available_count": 1,
    "checked_at": "2026-09-25T12:00:00+02:00",
    "filtered": false
  }
}
POST

Change nameservers

API key JSON body

Points one of your domains at two new nameservers.

  • Send a JSON body. Custom DNS records (below) only work while the domain uses our default nameservers.

Parameters

NameTypeRequiredDescription
domain string Required Your domain, for example example.com.
dns1 string Required First nameserver.
dns2 string Required Second nameserver.
Request
curl -X POST "https://0xhost.com/API/domains/change_nameserver" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "domain": "example.com",
    "dns1": "ns1.example.net",
    "dns2": "ns2.example.net"
  }'
Response 200
{
  "success": true,
  "message": "Nameserver change successful",
  "data": {
    "domain": "example.com",
    "new_dns1": "ns1.example.net",
    "new_dns2": "ns2.example.net",
    "api_response": {
      "...": "..."
    }
  }
}
GET

List DNS records

API key Query string

DNS records of one of your domains hosted on our nameservers.

Parameters

NameTypeRequiredDescription
domain string Required Your domain.
page integer Optional Page number. Default 1.
Request
curl "https://0xhost.com/API/domains/dns_records?domain=example.com" \
  -H "x-api-key: YOUR_API_KEY"
Response 200
{
  "success": true,
  "data": [
    {
      "id": 1001,
      "type": "A",
      "host": "@",
      "value": "203.0.113.10",
      "ttl": 600,
      "pri": 0
    }
  ]
}
POST

Create a DNS record

API key JSON body

Adds a record to one of your domains.

Parameters

NameTypeRequiredDescription
domain string Required Your domain.
type string Required A, AAAA, CNAME, MX, TXT, NS, SRV or CAA.
host string Required Record name, @ for the domain itself.
value string Required Record value.
pri integer Optional Priority, for MX and SRV. Default 0.
Request
curl -X POST "https://0xhost.com/API/domains/dns_records" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "domain": "example.com",
    "type": "A",
    "host": "www",
    "value": "203.0.113.10"
  }'
Response 200
{
  "success": true,
  "data": {
    "...": "created record"
  }
}
PUT

Update a DNS record

API key JSON body

Changes the value (and priority) of an existing record.

Parameters

NameTypeRequiredDescription
domain string Required Your domain.
id integer Required Record id from List DNS records.
value string Required New value.
pri integer Optional Priority. Default 0.
Request
curl -X PUT "https://0xhost.com/API/domains/dns_records" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "domain": "example.com",
    "id": 1001,
    "value": "203.0.113.20"
  }'
Response 200
{
  "success": true,
  "data": {
    "...": "updated record"
  }
}
DELETE

Delete a DNS record

API key JSON body

Removes a record. The domain and record id go in a JSON body.

Parameters

NameTypeRequiredDescription
domain string Required Your domain.
id integer Required Record id from List DNS records.
Request
curl -X DELETE "https://0xhost.com/API/domains/dns_records" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "domain": "example.com",
    "id": 1001
  }'
Response 200
{
  "success": true,
  "data": null
}

Network (IP ranges)

IP range products and your subscriptions to them. Order with Order an IP range.

GET

List network products

API key Query string

The network products you can order, with price, renewal price and billing cycle.

Parameters

NameTypeRequiredDescription
page integer Optional Page number. Default 1.
per_page integer Optional Rows per page. Default 10.
name string Optional Filter by name (partial match).
Request
curl "https://0xhost.com/API/network/list_network?per_page=50" \
  -H "x-api-key: YOUR_API_KEY"
Response 200
{
  "success": true,
  "data": [
    {
      "id": "NETWORK_PRODUCT_UUID",
      "name": "/24 IPv4",
      "description": "256 IPv4 addresses",
      "price": "60.00",
      "currency": "EUR",
      "billing_cycle": "monthly",
      "renew_price": "60.00",
      "created_at": "2025-11-02 10:00:00",
      "updated_at": "2025-11-02 10:00:00"
    }
  ],
  "pagination": {
    "total_items": 1,
    "total_pages": 1,
    "current_page": 1,
    "per_page": 50,
    "has_next_page": false,
    "has_prev_page": false
  }
}
GET

Every network subscription you own, with its product, status and expiry.

No parameters.

Request
curl "https://0xhost.com/API/network/list_network_users" \
  -H "x-api-key: YOUR_API_KEY"
Response 200
{
  "success": true,
  "data": [
    {
      "id": "SUBSCRIPTION_UUID",
      "user_id": "USER_UUID",
      "network_id": "NETWORK_PRODUCT_UUID",
      "expiration_date": "2026-10-25 12:00:00",
      "status": "active",
      "billing_cycle": "monthly",
      "auto_renew": 1,
      "created_at": "2026-09-25 12:00:00",
      "updated_at": "2026-09-25 12:00:00",
      "service_name": "/24 IPv4",
      "service_description": "256 IPv4 addresses",
      "price": "60.00",
      "renew_price": "60.00",
      "currency": "EUR"
    }
  ]
}
GET

Get a subscription

API key Query string

One of your network subscriptions.

Parameters

NameTypeRequiredDescription
id string Sometimes Subscription UUID. Preferred.
network_id string Sometimes Product UUID, used when id is absent. If you hold several subscriptions to one product, use id.
Request
curl "https://0xhost.com/API/network/detail_network_users?id=SUBSCRIPTION_UUID" \
  -H "x-api-key: YOUR_API_KEY"
Response 200
{
  "success": true,
  "data": {
    "id": "SUBSCRIPTION_UUID",
    "network_id": "NETWORK_PRODUCT_UUID",
    "status": "active",
    "expiration_date": "2026-10-25 12:00:00",
    "auto_renew": 1
  }
}
PUT

Set auto-renew

API key JSON body

Turns automatic renewal on or off for one of your network subscriptions. POST works as well as PUT.

Parameters

NameTypeRequiredDescription
subscription_id string Required Subscription UUID.
auto_renew integer Required 1 on, 0 off.
Request
curl -X PUT "https://0xhost.com/API/network/auto_renew" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "subscription_id": "SUBSCRIPTION_UUID",
    "auto_renew": 1
  }'
Response 200
{
  "success": true,
  "message": "Auto-renew updated successfully",
  "subscription_id": "SUBSCRIPTION_UUID",
  "auto_renew": 1
}

Web hosting

Shared web hosting plans and subscriptions. Ordering, renewing and changing plan are under Orders.

GET

Hosting plans with monthly price and features. Send db_id as plan_id when ordering or changing plan.

No parameters.

Request
curl "https://0xhost.com/API/plesk/plans/lists_plans"
Response 200
{
  "success": true,
  "data": [
    {
      "id": "basic",
      "db_id": "HOSTING_PLAN_DB_ID",
      "plesk_plan_id": "PANEL_PLAN_ID",
      "name": "Basic",
      "price": 4.99,
      "currency": "EUR",
      "features": [
        "10 GB SSD",
        "1 website"
      ]
    }
  ],
  "count": 1,
  "generated_at": "2026-09-25 12:00:00"
}
GET

Your hosting subscriptions with domain, price, status, expiry and auto-renew.

No parameters.

Request
curl "https://0xhost.com/API/plesk/subscriptions/lists_subscriptions" \
  -H "x-api-key: YOUR_API_KEY"
Response 200
{
  "success": true,
  "data": [
    {
      "id": "SUBSCRIPTION_UUID",
      "client_id": "CLIENT_UUID",
      "domain_name": "example.com",
      "price": "4.99",
      "status": "active",
      "expires_at": "2026-10-25 12:00:00",
      "auto_renew": 1,
      "plan_id": "HOSTING_PLAN_DB_ID",
      "created_at": "2026-09-25 12:00:00",
      "updated_at": "2026-09-25 12:00:00",
      "client_name": "Your Name"
    }
  ],
  "count": 1
}
GET

Get a subscription

API key Query string

One subscription with its plan, its orders and the control panel and FTP credentials.

  • The response contains passwords. Treat it as secret.

Parameters

NameTypeRequiredDescription
id string Required Subscription UUID.
Request
curl "https://0xhost.com/API/plesk/subscriptions/detail?id=SUBSCRIPTION_UUID" \
  -H "x-api-key: YOUR_API_KEY"
Response 200
{
  "success": true,
  "data": {
    "subscription": {
      "id": "SUBSCRIPTION_UUID",
      "domain_name": "example.com",
      "status": "active",
      "price": "4.99",
      "expires_at": "2026-10-25 12:00:00"
    },
    "orders": [
      {
        "id": "ORDER_UUID",
        "order_type": "plesk_hosting",
        "status": "completed",
        "amount": "4.99",
        "track_id": null
      }
    ],
    "plan": {
      "id": "HOSTING_PLAN_DB_ID",
      "name": "Basic",
      "price": "4.99"
    },
    "credentials": {
      "ftp_login": "ftp_login",
      "ftp_password": "FTP_PASSWORD",
      "plesk_username": "panel_login",
      "plesk_password": "PANEL_PASSWORD"
    }
  }
}
POST

Set auto-renew

API key JSON body

Turns automatic renewal on or off for one of your hosting subscriptions.

  • Send a JSON body; form fields are not read.

Parameters

NameTypeRequiredDescription
id string Required Subscription UUID.
auto_renew integer Required 1 on, 0 off.
Request
curl -X POST "https://0xhost.com/API/plesk/subscriptions/toggle_autorenew" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "SUBSCRIPTION_UUID",
    "auto_renew": 1
  }'
Response 200
{
  "success": true,
  "auto_renew": true
}
GET

The hosting control panel account(s) linked to your 0xHost account.

  • The response contains the control panel password. Treat it as secret.

No parameters.

Request
curl "https://0xhost.com/API/plesk/clients/lists_clients" \
  -H "x-api-key: YOUR_API_KEY"
Response 200
{
  "success": true,
  "data": [
    {
      "id": "CLIENT_UUID",
      "plesk_client_id": "PANEL_CLIENT_ID",
      "name": "Your Name",
      "company": "",
      "login": "panel_login",
      "email": "[email protected]",
      "plesk_username": "panel_login",
      "plesk_password": "PANEL_PASSWORD",
      "metadata": null,
      "created_at": "2026-09-25 12:00:00"
    }
  ]
}
POST

Create your hosting account

API key JSON body

Creates the hosting control panel account for your 0xHost account. You rarely need this: ordering hosting creates it for you. If one already exists it is returned instead.

Parameters

NameTypeRequiredDescription
name string Required Full name.
login string Required Control panel login.
email string Required Email address.
password string Required Control panel password.
company string Optional Company name.
Request
curl -X POST "https://0xhost.com/API/plesk/clients/create" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Your Name",
    "login": "panel_login",
    "email": "[email protected]",
    "password": "PANEL_PASSWORD"
  }'
Response 200
{
  "success": true,
  "message": "Client created successfully",
  "plesk_client_id": "PANEL_CLIENT_ID"
}

Support tickets

Open a ticket and reply to it. Your open tickets are listed in Account summary.

POST

Open a ticket

API key JSON body

Opens a support ticket. Our team is notified straight away.

  • Send a JSON body. The returned id is what Reply to a ticket expects.

Parameters

NameTypeRequiredDescription
subject string Required Short summary.
service string Required Category, for example General Support, Billing, Technical Issue, Account, Other.
description string Required The full message.
Request
curl -X POST "https://0xhost.com/API/create_ticket" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "subject": "Reverse DNS for 203.0.113.10",
    "service": "Technical Issue",
    "description": "Please set the PTR record to mail.example.com."
  }'
Response 200
{
  "success": true,
  "message": "Ticket created successfully",
  "data": {
    "id": "TICKET_HEX_ID",
    "subject": "Reverse DNS for 203.0.113.10",
    "service": "Technical Issue",
    "status": "open",
    "priority": "medium",
    "reference_number": "REFERENCE_NUMBER",
    "created_at": "2026-09-25 12:00:00"
  }
}
POST

Reply to a ticket

API key Form data

Adds your reply to an open ticket, optionally with one file attached.

  • Send form fields (multipart/form-data, or url-encoded without a file); a JSON body is not read. Closed or resolved tickets cannot be replied to.

Parameters

NameTypeRequiredDescription
ticket_id string Required Ticket id from Open a ticket or Account summary.
message string Sometimes Your reply. Required unless you attach a file.
attachment file Optional One file.
Request
curl -X POST "https://0xhost.com/API/add_ticket_reply" \
  -H "x-api-key: YOUR_API_KEY" \
  -F "ticket_id=TICKET_ID" \
  -F "message=Thanks, one more detail: ..." \
  -F "[email protected]"
Response 200
{
  "success": true,
  "message": "Reply added successfully",
  "message_id": "MESSAGE_ID",
  "file_path": null
}