Use the ZYNOO API to order VPS hosting and manage servers from your own application. You can also manage existing VPSs without placing orders through the API.
Base URL
https://bill.zynoo.com/vps-api/index.php
Make your first request
Create an API credential under API Access in your reseller account.
Use HTTPS and send request bodies as JSON. Responses contain ok: true on success, or ok: false with an error object.
Every request except /v1/ping needs the authentication headers. Examples on the following pages show the URL and body; add those headers to your request. Response examples show selected fields. IDs, prices and addresses are illustrative.
Check the API
A public availability check. No API credential is required.
Your API Access ID identifies your account. Your secret signs each request; it is never sent to the API. Make calls from your backend and keep both values out of browser code.
Required headers
Header
What to send
X-VR-Key
Your API Access ID.
X-VR-Timestamp
Current Unix time in seconds. Keep your server clock accurate; the default tolerance is five minutes.
X-VR-Nonce
A fresh random string for each request: 12–120 letters, digits, or ._~-.
X-VR-Signature-Version
2
X-VR-Signature
The hexadecimal HMAC-SHA256 signature described below.
Content-Type
application/json when sending a body.
For orders and reinstalls, also send X-Idempotency-Key: a unique action key you save with the request. Reuse it only when retrying that same request. Use 1–128 letters, digits, or ._:-.
Create the signature
Join these six values with a single LF newline (\n) between them, then calculate HMAC-SHA256 using your API secret:
Use the uppercase method and decoded path, such as /v1/vps. Exclude the domain, /vps-api/index.php and query string. Hash the exact body bytes you send; for GET, hash an empty string. If there is no action key, leave the sixth value empty. Do not append another newline.
Complete PHP example: list your VPSs
Requires PHP 8.1+ with cURL. Set ZYNOO_API_KEY and ZYNOO_API_SECRET in your server environment, then run this example. It makes one read-only request.
Enable the scopes needed by your integration when creating the credential. Each endpoint below lists its scope. If you set an IP allowlist, use the public IP of the server making your API calls.
Plans & orders
Choose a plan, read its available options, then submit an order. Use the values returned by the API for operating systems and other options.
List plans
Get the plans available to your account, including prices in your account currency.
GET/v1/plans
Scope: catalog:read
Example request
GET https://bill.zynoo.com/vps-api/index.php/v1/plans
Use prices to find available billing cycles. Check the required flags for hostname, root_password, operating_system, configurable_options and custom_fields. Base recurring prices include your discount; option prices are before that discount. The invoice contains the final total, including setup fees and applicable taxes.
Order a VPS
Create an order using a plan ID and its options. Your account must have ordering enabled. Payment or available credit determines when provisioning can proceed.
POST/v1/orders
Scope: services:create
Body field
Value
client_service_key
Required. Your unique, permanent ID for this VPS, e.g. store:42. Use 1–128 letters, digits or ._:-.
pid
Required. Plan ID.
billing_cycle
An offered billing cycle; defaults to monthly.
hostname
If required: a DNS hostname, up to 255 characters.
root_password
If required: 8–128 UTF-8 bytes, without control characters.
operating_system
The selected OS value from the plan.
configurable_options / custom_fields
Objects containing the required field names and their values.
A new order returns 201. Save service.remote_service_id and use Get a VPS to check its status. Pending means it is not ready yet; Active means the service is active.
Your VPSs
Use the remote_service_id from your VPS list in place of {reference}. For example: ZV-ABC-0101. Your original client_service_key is also accepted. URL-encode the reference when building the path.
List your VPSs
Returns the VPS records belonging to your account. The list includes every service status unless you add a filter.
GET/v1/vps
Scope: services:read
Query parameter
Value
status
Optional: active, pending, suspended, terminated or error.
limit
Records per page: 1–250. Default: 100.
cursor
The next_cursor returned by the previous page.
Example request
GET https://bill.zynoo.com/vps-api/index.php/v1/vps?status=active&limit=100
When has_more is true, request the next page using cursor and the same status filter. Service status and power state are separate: an Active VPS can be powered off.
Get a VPS
Get the hostname, IP addresses, service status and latest reinstall operation for one VPS.
GET/v1/vps/{reference}
Scope: services:read
Example request
GET https://bill.zynoo.com/vps-api/index.php/v1/vps/ZV-ABC-0101
Read up to 100 VPS records in one request. Results are keyed by the reference you send. Missing or unowned references appear in errors with service_not_found.
POST/v1/vps/query
Scope: services:read
Example request
POST https://bill.zynoo.com/vps-api/index.php/v1/vps/query
Content-Type: application/json
{
"references": [
"ZV-ABC-0101"
]
}
Resource readings normally refresh every 30 minutes. Use collected_at and cache_seconds to show their age. A new VPS may need a minute or two before readings become available. Display unavailable or null values as unavailable, not zero.
Refresh power state
Get a fresh online/offline reading. This does not force new CPU, memory or disk readings.
GET/v1/vps/{reference}/metrics/refresh
Scope: services:read
Example request
GET https://bill.zynoo.com/vps-api/index.php/v1/vps/ZV-ABC-0101/metrics/refresh
The response uses the same metrics object. power_state is online, offline, suspended or unknown; status_collected_at is its timestamp. Timestamps use server_timezone.
Older service references
Get a ZYNOO reference
Convert an older reference to the current ZYNOO format. Send {}. Returns service.remote_service_id; an existing ZYNOO reference is returned unchanged. Requires services:read and services:reference:write.
POST/v1/vps/{reference}/reference
Scope: services:reference:write
Example request
POST https://bill.zynoo.com/vps-api/index.php/v1/vps/ZV-ABC-0101/reference
Content-Type: application/json
{}
Power & access
Use these requests to control a VPS or change its password. Your credential needs the listed scope, and your account must allow VPS management. Check customer ownership in your application before sending a command.
Power controls
The VPS must be Active, without a suspension hold or an unfinished reinstall. Send an empty JSON object {}.
Endpoint · scope: power:write
Action
POST /v1/vps/{reference}/start
Start the VPS.
POST /v1/vps/{reference}/stop
Shut down the VPS gracefully.
POST /v1/vps/{reference}/reboot
Restart the VPS.
POST /v1/vps/{reference}/poweroff
Force the VPS off. Unsaved data may be lost.
Example request
POST https://bill.zynoo.com/vps-api/index.php/v1/vps/ZV-ABC-0101/reboot
Content-Type: application/json
{}
A successful response acknowledges the command. Call Refresh power state to check the result.
Change the root password
Set a new password for an Active VPS without holds or an unfinished reinstall. Use 8–128 UTF-8 bytes without control characters.
POST/v1/vps/{reference}/password
Scope: password:write
Example request
POST https://bill.zynoo.com/vps-api/index.php/v1/vps/ZV-ABC-0101/password
Content-Type: application/json
{
"password": "REPLACE_WITH_PRIVATE_PASSWORD"
}
Returns 200 with ok: true and a service object. The password is not returned.
Suspend or terminate a VPS
Scope: lifecycle:write. Send {} to each endpoint. These actions return 200 with ok: true and the updated service.
Endpoint
Action
POST /v1/vps/{reference}/suspend
Suspend the VPS.
POST /v1/vps/{reference}/unsuspend
Remove your suspension. A ZYNOO hold must be resolved separately.
POST /v1/vps/{reference}/terminate
Permanently delete the VPS and its data. Confirm with the customer first.
OS reinstall
Reinstalling a VPS replaces its operating system and deletes its existing data. Ask the customer to confirm before continuing. The service must be Active, without holds or an unfinished reinstall, and reinstall must be enabled for your account.
1. Choose an operating system
Get the operating systems available for this VPS. Use the returned value in your reinstall request; it may differ from the value used when ordering. Your account must allow VPS management.
GET/v1/vps/{reference}/reinstall-options
Scope: services:read
Example request
GET https://bill.zynoo.com/vps-api/index.php/v1/vps/ZV-ABC-0101/reinstall-options
The password must contain 8–128 UTF-8 bytes without control characters. confirmation_hostname must match the current hostname after trimming whitespace. Save your action key with this request.
Check JSON formatting, the 256 KiB body limit and Content-Type.
401
Check the access ID, signature and server clock.
403
Check credential scopes, account permissions and allowed source IPs.
404
Check the endpoint and VPS reference.
409
Read error.code: the VPS state, an existing action or a reused nonce may conflict with the request.
422
Correct the fields named in the error.
426
Use HTTPS.
429
Wait for Retry-After before sending another request.
5xx
An API or upstream error occurred. Keep the request ID and check the outcome before repeating a write.
Rate limits
The default limit is 120 requests per minute per API credential. X-RateLimit-Limit and X-RateLimit-Remaining show your allowance. A 429 response includes Retry-After in seconds.
For larger accounts, use POST /v1/vps/query to read up to 100 VPS records at once. Space out background requests and reuse cached resource readings.
Timeouts and retries
A timeout does not tell you whether an action completed. Check the VPS or reinstall operation first. For orders and reinstalls, retain the original action key and body. Create fresh authentication headers for every request.