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.
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).
Send it with each request as the header x-api-key.
Rotate it before it expires, or delete it if it leaks. An expired or deleted key simply stops working and the API answers 401.
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.
Pay from balance by sending "type_payment": "balance". The order is charged and provisioned in the same call.
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.
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.
Status
Meaning
200
Done. A few calls (a taken domain, an invalid price query) also report success: false with 200.
400
Missing or invalid parameter. The body names it, often as missing_field.
401
No key, unknown key or expired key.
403
The resource exists but is not yours.
404
Not found.
405
Wrong HTTP method.
409
Conflicts with something you already have, such as a pending order for the same product.
500
The action failed. Business errors such as an insufficient balance also use 500, with the reason in message.
502
An 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.
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.
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).
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.
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
Name
Type
Required
Description
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.
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.
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
Name
Type
Required
Description
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.
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
Name
Type
Required
Description
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.
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.
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
Name
Type
Required
Description
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.
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.
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.
Server order metadata contains the root password that was set. Treat responses as secret.
Parameters
Name
Type
Required
Description
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.
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.
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.
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.
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.
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.
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.
The add-on catalog with prices. Storage add-ons are hidden unless you ask for them for a storage server.
Parameters
Name
Type
Required
Description
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.
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.
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"]}.
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
Name
Type
Required
Description
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.
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
Name
Type
Required
Description
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.
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
Name
Type
Required
Description
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.
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
Name
Type
Required
Description
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.
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.
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
Name
Type
Required
Description
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."
}'
const res = await fetch("https://0xhost.com/API/create_ticket", {
method: "POST",
headers: {
"x-api-key": "YOUR_API_KEY",
"Content-Type": "application/json"
},
body: JSON.stringify({
"subject": "Reverse DNS for 203.0.113.10",
"service": "Technical Issue",
"description": "Please set the PTR record to mail.example.com."
})
});
const data = await res.json();
console.log(res.status, data);
import requests
API_KEY = "YOUR_API_KEY"
res = requests.post(
"https://0xhost.com/API/create_ticket",
headers={"x-api-key": API_KEY},
json={
"subject": "Reverse DNS for 203.0.113.10",
"service": "Technical Issue",
"description": "Please set the PTR record to mail.example.com.",
},
)
print(res.status_code, res.json())
<?php
$ch = curl_init('https://0xhost.com/API/create_ticket');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => [
'x-api-key: YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'subject' => 'Reverse DNS for 203.0.113.10',
'service' => 'Technical Issue',
'description' => 'Please set the PTR record to mail.example.com.',
]),
]);
$data = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
print_r($data);
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"
}
}