Purchases and lifecycle
Orders and operations
| Identifier | Meaning | Read result |
|---|---|---|
api_key_id | Integration and its balance | GET /balance |
api_user_id | Your customer's string ID | Filter VPS, rentals and orders |
order_id | A paid purchase, renewal or upgrade | GET /orders/{order_id} |
vm_id | VPS | GET /vms/{vm_id} |
rental_id | Dedicated server rental | GET /dedicated/rentals/{rental_id} |
ip_id | IP allocation | GET /ips |
operation_id | An asynchronous VPS command | GET /vms/{vm_id}/operations/{operation_id} |
Purchases debit the integration balance when the order is accepted. Provisioning then proceeds asynchronously. A quote only calculates a price: it does not debit, create an order or reserve a resource. HTTP 202 confirms acceptance; it is not the final result.
| Order status | Meaning |
|---|---|
pending | Saved, waiting for processing |
processing | Processing in progress |
completed | Paid action completed; for a dedicated purchase, reservation completed |
failed | Action failed; inspect the error and transaction history |
refunded | The order amount was returned to the integration balance |
review | Uncertain or partial outcome requiring clarification |
For review or requires_review=true, inspect the resource and contact support before placing another paid or destructive command. Do not assume that a failed or uncertain response proves the resource was never created. Transactions show the actual balance movements; order_id can be null for top-ups and other unrelated movements.
After a lost response, reuse the original Idempotency-Key and unchanged parameters. Track existing orders rather than making new purchases to recover a result. Webhook delivery can repeat or fail, so keep a status lookup path in your integration.
VPS pricing and renewal
Plan price depends on location, platform, plan and CPU share. The published monthly price already includes your integration markup. A multi-month purchase/renewal applies the current term discount; use quote routes for the total rather than multiplying the displayed monthly price yourself.
Terms are calendar months, not fixed 30-day blocks. A new VPS term is calculated when its order is created. Renewal extends the paid term, or starts from the current time if the service is already overdue. You can renew during the grace period, before deletion begins.
Plan upgrades cannot decrease CPU resources, RAM, disk or included traffic. Omitted cpu_percent preserves its current value. The surcharge is the price difference for the remaining paid calendar periods, using current plan prices and each period's original discount, including advance renewals. The payment deadline is preserved. A resize quote returns the maximum price to confirm in expected_amount_usd and the new monthly price.
Cloud-init
VPS creation, its quote and OS reinstallation accept optional cloud_init: a JSON cloud-config object, not a YAML string. Omit it or send null for the standard installation.
{
"cloud_init": {
"packages": ["curl"],
"runcmd": [["sh", "-c", "echo ready > /root/cloud-init-ready"]]
}
}
The object is limited to 65536 bytes after server JSON serialization, which escapes non-ASCII characters. If supplied, users, packages, runcmd and write_files must be arrays. Networking, hostname and primary access remain platform-managed. Creation still requires exactly one of password or ssh_public_key. Retain the same cloud-init object when retrying the same purchase or command.
guest_initialization reports the installation result in VPS details, the purchase order, the reinstall operation result, and the corresponding webhooks:
| Status | error_code | Meaning |
|---|---|---|
succeeded | null | Cloud-init finished; this does not confirm application health |
failed | cloud_init_failed | Custom configuration failed; the running VPS is retained |
unknown | guest_initialization_timeout | Initialization was not confirmed within 15 minutes; a confirmed running VPS with custom configuration is retained |
The field may be null when no result is available. VPS details show the result of the latest installation. A purchase can be completed, or a reinstall operation succeeded, with initialization failed or unknown: inspect both results. A custom configuration failure alone does not cancel the purchase or refund it. Infrastructure failures still fail provisioning.
Cloud-init contents and execution output are not included in public order parameters or partner webhooks.
Rescue
Enable Rescue with PUT /vms/{vm_id}/rescue, an Idempotency-Key and JSON:
{
"api_key_id": 1,
"password": "Temporary-Rescue-2026!"
}
The temporary password is required: 5–128 characters without CR, LF or NUL. The VPS must be paid and have at least 2048 MiB RAM. Rescue restarts the VPS into a recovery environment and preserves disks and networking. After the operation succeeds, connect as root to the VPS IP over SSH on port 22 using that password. Firewall rules still apply.
Both enable and disable return HTTP 202 with an operation ID in data.id. Poll operation status. Successful results include vm_id, status and rescue; VPS details also expose rescue:
{
"active": true,
"access": "ssh",
"requires_review": false,
"operation_id": 501,
"operation_status": "succeeded"
}
active indicates saved Rescue context, not guaranteed current SSH availability. access can be ssh, console or null. The entire state may be null when unavailable. While Rescue is active, plan changes, OS reinstallation and normal OS password resets are unavailable.
Disable Rescue with DELETE /vms/{vm_id}/rescue?api_key_id=1 and a separate Idempotency-Key; no body or password is needed. This restores normal OS boot and starts the VPS if it is paid. An expired or suspended VPS remains stopped. Exit is also available from error when Rescue context is saved.
Check error_code and requires_review on failure. rescue_not_ready means Rescue readiness was not confirmed; inspect VPS state and exit Rescue. rescue_memory_required requires a plan with enough RAM; rescue_iso_missing or rescue_not_configured requires support. Retry a lost request with its original key and parameters.
Traffic and IPv4
Extra VPS traffic and separately billed IPv4 have fixed prices without integration markup or term discounts.
- Traffic: an integer number of units, each equal to 1024⁴ bytes, valid only for the current traffic period. Quote returns
expected_period_idandperiod_ends_at; send that period ID when buying to reject an expired quote. Unused extra traffic does not carry over. - IPv4 purchase: one additional address attached to a VPS, paid for 30 days independently of the VPS term. At most 10 IPv4 per VPS including its primary address.
- IPv4 renewal: 30 days from the later of now and
paid_until, at the current fixed price. Applies to paid additional or saved IPv4; an included primary IPv4 and IPv6 cannot be renewed separately. - Saved addresses:
GET /ips?api_key_id=1&attachment=unattached. Keeping an address continues its billing even without a VPS.
To move an additional IPv4, detach it with keep_ip=true, then attach it to a compatible VPS of the same customer (api_user_id). The saved address must remain paid and available. Attachment does not buy an address or extend its term. Check guest_configuration_required and update guest OS networking if needed.
Detaching with keep_ip=false releases the address. DELETE /ips/{ip_id} releases a saved, unattached IPv4. An existing primary IPv4 cannot be detached from its VPS.
Dedicated rentals
- Read dedicated plans, availability, allowed disk layouts and term discounts.
- Quote, then buy using
plan_id,os_id,disk_layout, customer ID and a password or SSH public key. The physical server is selected by the platform. - Save
order_idand laterrental_id.order.completedconfirms reservation, not readiness. - Wait for
dedicated.issuedor rental statusactive. Read rental details for addresses and credentials. The rental term starts on issue.
Rental states: preparing → active → overdue → cleaning → completed. An unissued cancelled rental can end as cancelled. cleaning means release/cleanup is already underway; do not promise renewal at that point.
Extra IPv4 selected in extra_ipv4_count are billed as part of the dedicated rental at a fixed price. Use the dedicated renewal quote for the full amount. The separate VPS /ips purchase and renewal flow is not the dedicated rental billing flow.
If an administrator cancels a rental before issue, the original dedicated purchase is refunded once to the integration balance; expect order.refunded and dedicated.released. Ordinary expiry or release of an issued service is not an automatic refund.
Auto-renewal and expiry
auto_renew defaults to false and can be set on purchase or changed later via PATCH for a VPS, rental or separately paid IPv4. Changing the flag does not charge money immediately. Each service has its own setting.
| Service | Renewal term | Price |
|---|---|---|
| VPS | Same number of months as its latest paid purchase/renewal | Current plan price, integration markup and current term discount |
| Dedicated rental | Same number of months as its latest paid purchase/renewal | Current rental price, markup, term discount and extra IPv4 charge |
| Separate IPv4 | 30 days | Current fixed IPv4 price |
When enabled, Cloud API attempts renewal from the integration balance on the warning one hour before expiry. If the service expires, a final warning one hour before its release/deletion triggers another attempt. Insufficient balance does not extend the service. A balance top-up does not itself trigger an immediate retry; use manual renewal when needed.
Overdue VPS and paid IPv4 are suspended; the grace period is 24 hours. Without payment they are deleted/released. Dedicated rentals become overdue and then enter cleanup/release after the grace period. Processing is asynchronous; a deadline is not a guarantee that cleanup finishes at that exact second.
Partner warnings are delivered through Webhooks, including vm.deleting_soon, ip.releasing_soon and dedicated.releasing_soon, even when auto-renewal is disabled or funds are insufficient. A warning is not proof of a successful renewal: check the resulting paid term.
VPS commands and deletion
Commands return an operation: queued → running → succeeded / failed. Check the operation and current resource state; HTTP 202 is only acceptance. Graceful shutdown/reboot differ from forced stop/reset. Reinstallation destroys system disk data; wipe_extra_disks=true also opts into removing additional disks.
For firewall changes, first read the rules and revision. Send that revision with every mutation; on conflict reread the settings. Reordering requires the full set of rule IDs, each once. System SMTP restrictions remain managed by the platform.
VPS deletion requires explicit keep_ips:
true: retain IPv4, including the former primary IPv4, as separately paid addresses. Inspectheld_ipsin the operation result and the address list for billing dates and settings.false: release the addresses along with the VPS.
Deletion, address release and unused paid time do not create a prorated refund. Save required data before deleting or reinstalling.