API reference

Partner API

HTTP API for provisioning virtual servers, managing server operations and retrieving usage. Requests use bearer authentication. Request and response bodies use JSON.

Base URLhttps://enterprise.chartvps.com/v1
Versionv1.0.0
Endpoints24
AuthenticationBearer token
FormatJSON, UTF-8

01Getting started

Use the Partner API to manage virtual servers, SSH keys and backups, receive events, and retrieve usage. All endpoints use the base URL shown above, including /v1.

1. Obtain access and verify your key

Open API keys in your Enterprise dashboard and request API access. After approval, create a key and copy its value. Up to five keys can be active per account. If your account requires approved source IP addresses, ask your account contact to approve the integration server's outbound IP address before testing.

The cURL examples run in Bash or zsh. Set API_KEY and API_BASE_URL in your terminal; these are example environment variables. Requests send the key in the Authorization header.

# Replace YOUR_API_KEY with the complete key shown at creation.
export API_KEY='YOUR_API_KEY'
export API_BASE_URL='https://enterprise.chartvps.com/v1'

curl --silent --show-error --include "$API_BASE_URL/me" \
  --header "Authorization: Bearer $API_KEY"

Expect 200 OK with your account, limits and key details. 401 means the key or access approval is invalid; 403 NETWORK_RESTRICTED means the request's source IP is not approved. Keep these variables set in the same terminal for the examples below.

2. Select your configuration

for resource in plans regions images; do
  curl --silent --show-error "$API_BASE_URL/$resource" \
    --header "Authorization: Bearer $API_KEY"
  printf '\n'
done

Select code values returned for your account. An empty plan list means no plans are currently available to order. Register your SSH public key, then use the returned ssh_key.id in ssh_keys. Send the complete public key; keep its private key on your own machine.

3. Save and validate a request

Create server.json with the command below, then edit it to use your selected catalog codes and registered SSH key ID. The sample values are illustrative. dry_run: true validates the configuration and returns pricing without creating or charging for a server.

cat > server.json <<'JSON'
{
  "name": "web-01",
  "plan": "standard-2",
  "region": "chicago",
  "image": "ubuntu-24.04",
  "ssh_keys": [123],
  "dry_run": true
}
JSON
curl --silent --show-error --include --request POST "$API_BASE_URL/servers" \
  --header "Authorization: Bearer $API_KEY" \
  --header "Content-Type: application/json" \
  --data @server.json

Expect 200 OK with valid: true and pricing. A dry run does not reserve capacity or guarantee that a later creation request will be accepted.

4. Create and track the server

When ready to provision a billable server, edit server.json to set dry_run to false. Generate an idempotency key once with uuidgen (or your application's UUID generator), and retain it with the final request body. Run the key-generation command only for a new intended server.

export IDEMPOTENCY_KEY="$(uuidgen)"
# Reuse the same key and unchanged file if this request must be retried.
curl --silent --show-error --include --request POST "$API_BASE_URL/servers" \
  --header "Authorization: Bearer $API_KEY" \
  --header "Idempotency-Key: $IDEMPOTENCY_KEY" \
  --header "Content-Type: application/json" \
  --data @server.json

Expect 202 Accepted. Copy server.id from the response and poll its URL, or use events to track provisioning.

export SERVER_ID='REPLACE_WITH_RETURNED_SERVER_ID'
curl --silent --show-error --include "$API_BASE_URL/servers/$SERVER_ID" \
  --header "Authorization: Bearer $API_KEY"

active means provisioning completed; ssh_reachable_at records a successful TCP connection to port 22, which does not confirm SSH authentication or application readiness. Handle failed by inspecting failure and related events.

Examples use sample IDs, keys and prices. Replace them with values from your account. Requests to the production URL affect real resources.

02Authentication and limits

Send the API key in the Authorization header using the Bearer scheme. API keys belong to one partner account and authorize operations on that account's resources. API access must remain approved.

Authorization: Bearer <API_KEY>

Keys are displayed once when created. Store them securely on the server that runs your integration. Revoke a compromised or unused key from the dashboard. Invalid or revoked keys, and accounts without approved API access, receive 401 UNAUTHENTICATED.

The API specification and standalone reference do not require an API key. All operations below require authentication.

Concurrency and quotas

GET /v1/me returns inflight, servers and limits. Provisioning above the concurrent request limit returns 429 INFLIGHT_LIMIT; exceeding the server quota returns 403 QUOTA.

Request limits per account

Limits are shared across the account's API keys.

ScopeRequests per minute
All operations except server creation, combined600
Server creation, including dry runs and replays60
Password reset, within the general limit20
Operating system rebuild, within the general limit20

A rate-limited response returns 429 RATE_LIMITED. Wait at least the number of seconds specified by Retry-After. Adding API keys does not increase the account's limits.

03Requests and responses

Content types

Send JSON request bodies with Content-Type: application/json. Responses with a body use JSON. 204 No Content and 304 Not Modified responses have no body.

Identifiers and timestamps

Server IDs are strings prefixed with srv_. Account, SSH key, task, backup and event IDs are integers. Server, event and usage timestamps use ISO 8601 UTC. Invoice dates and daily usage dates use YYYY-MM-DD. Billing month parameters use YYYY-MM. Monetary amounts are decimal strings; use decimal arithmetic when processing them. The API does not return a currency code or billing timezone; use the currency and timezone confirmed for your account.

Pagination

GET /v1/servers and GET /v1/events accept limit (default 50, maximum 100) and after. Pass a non-null next_after from the previous response as the next request's after. A null cursor ends the result set. Server cursors are strings; event cursors are integers. Other list endpoints do not use these parameters.

Conditional requests

Server list and detail responses include an ETag and a private cache lifetime of five seconds. Send If-None-Match with that ETag to receive 304 when the representation is unchanged.

Idempotency

POST /v1/servers requires a non-empty Idempotency-Key of at most 128 characters, except when dry_run is true. Use one key per intended server and retain it with the original request body for 24 hours.

Once the result is saved, a retry with the same key and body returns that response with Idempotent-Replayed: true. Generated passwords are redacted on replay. Reusing a key with a different body returns 409 IDEMPOTENCY_MISMATCH.

A concurrent retry, or a request whose result could not be saved, returns 409 CONFLICT with details.reason: request_in_progress and Retry-After. Retry with the same key. If the conflict persists, provide support with details.server_id and the request ID.

After an ambiguous creation response, poll the server or repeat the original request with the same key. A server in requested can still be reconciled with the compute platform. Do not generate a new key while the outcome is unresolved.

Retry policy

For 429 or 503, respect Retry-After when present and apply exponential backoff with jitter. Some dependency failures omit this header; start with a short delay and increase it on repeated failures. The idempotency guarantee applies only to server creation. Do not automatically repeat password resets, rebuilds, backup requests or webhook configuration changes after a timeout; first establish whether the operation was accepted. A replay returns the originally stored response; retrieve the server separately for its current status. After the 24-hour retention period, resolve the original outcome before submitting another creation request.

04Server lifecycle and operations

Server creation and deletion return a server resource with 202 Accepted. Monitor that resource through GET /v1/servers/{id} or events. Server actions and backup operations return a task; poll GET /v1/tasks/{id} when task.id is non-null.

A task status of done means success; failed or canceled is unsuccessful. pending and running are incomplete. Treat unfamiliar statuses as unresolved. Poll at intervals of five seconds or longer. If no task ID is returned, poll the server and events for a rebuild, or the server's backup list for a backup. A password reset returns the new password; verify access to the guest. 202 alone does not confirm completion. The task's action may use platform names such as vm-restart instead of the submitted reboot.

Server statusMeaning
requestedCreation accepted; provisioning outcome is pending.
provisioningThe compute platform is provisioning the server.
activeProvisioning completed. Check guest connectivity separately.
rebuildingThe operating system is being reinstalled.
suspendedThe server is suspended.
destroyingDeletion accepted; removal is pending.
destroyedDeletion completed. The API record is retained.
failedCreation failed. Inspect failure and related events.

Deletion protection

Set locked to true to prevent API deletion. This setting does not prevent a rebuild or backup restore.

Backup availability

Check backups.enabled in the plan and server responses. Backup creation and restore require backup support for that plan and configured storage. When backups are disabled or the plan configuration is missing, these operations return 403 FORBIDDEN with details.reason=backups_disabled before submission. Existing backups remain visible, and deleting a server still removes its backups.

Rebuild and restore

A rebuild reinstalls the selected operating system on the existing server. A restore replaces its disk contents with a selected backup. Both operations overwrite data. The server ID and assigned address remain associated with the existing server.

A failed rebuild can return the server to active. Check the task result and server.rebuild_failed event before treating a state change as success. Provisioning time depends on the selected image and available capacity.

Guest configuration

Images with cloud_init: true accept user_data beginning with #cloud-config or #!, up to 65,536 UTF-8 bytes after line-ending normalization. Avoid embedding persistent credentials. IPv4 is allocated in this API version; ipv6 remains null.

05Usage and billing

The account's assigned price book determines available plans, prices and discount rules. Retrieve the catalog before submitting a request. Use the prices returned for your account.

Usage is measured in started hours and capped per server per calendar month. Use the returned monthly_cap_hours rather than assuming a cap. Deletion stops billing at destroy_requested_at. Failed provisioning attempts are not billed; suspended and rebuilding servers remain billable.

Billing start

For vm_months_per_plan, billing starts at creation acceptance. For allocated_per_plan and allocated_combined, billing starts at active_at. The applicable discount_basis is returned with pricing data where available.

Discount basis

vm_months_per_plan selects discounts from monthly usage on each plan. allocated_per_plan counts qualifying allocated servers on each plan; allocated_combined counts them across the price book. Allocation-based rates apply to each started hour at the qualifying count for that hour. Later changes do not reprice recorded charges.

Use current_tier for the current allocation-based rate and period_segments for recorded rate intervals when present. GET /v1/usage returns monthly charges; GET /v1/servers/{id}/usage returns server usage.

Estimates

GET /v1/billing/estimate separates month-to-date charges from projected month-end charges and the next invoice. Projections assume the current fleet remains allocated and are not final invoice amounts.

06Errors

API errors use an error object. Branch on error.code; display error.message as a human-readable explanation. Optional error.details contains field errors or operation-specific information. Field errors are keyed directly by field name.

HTTP statusError codeMeaning
400VALIDATION, BAD_REQUESTMalformed JSON or missing request requirements.
401UNAUTHENTICATEDInvalid credentials or API access not approved.
402CREDIT_LIMITAccount credit limit reached.
403NETWORK_RESTRICTEDThe request source is outside the deployment's approved IP networks.
403FROZEN, PARTNER_SUSPENDED, QUOTAAccount state or server quota prevents creation.
404NOT_FOUNDThe resource does not exist or is not owned by this account.
409CONFLICTResource state or a concurrent update prevents the operation. Inspect details.reason.
409IDEMPOTENCY_MISMATCHIdempotency key reused with a different request body.
422VALIDATIONInvalid parameters or rejected configuration.
429RATE_LIMITED, INFLIGHT_LIMITRequest rate or provisioning concurrency exceeded.
500INTERNALUnexpected server error.
503MAINTENANCE, STORE_BUSY, STORE_UNAVAILABLE, UPSTREAMTemporary service or dependency failure.

Validation error

{
  "error": {
    "code": "VALIDATION",
    "message": "Invalid request",
    "details": {
      "name": ["name must be an RFC 1123 hostname (lowercase letters, digits, hyphens, dots)"]
    }
  }
}

Record the HTTP status, error.code and X-Request-Id for troubleshooting. Include the request ID when contacting support. Do not log API keys or generated passwords.

07Webhooks

Configure an HTTPS destination with PUT /v1/webhook. Each delivery is a JSON event with id, type, at, server_id and data. The same events are available through GET /v1/events.

Verify the signature against the original request body bytes before parsing JSON or processing the event. Reject signatures more than five minutes from the current time. Use a constant-time comparison.

Event type header
X-Partner-Event
Signature header
X-Partner-Signature: t=<timestamp>,v1=<digest>
Signed content
Timestamp, a period, and the unmodified request body.
Algorithm
HMAC-SHA256 using the signing secret.

Delivery and recovery

Return a 2xx response within 10 seconds. Failed deliveries are retried after 1 minute, 5 minutes, 30 minutes, 2 hours and 12 hours, then marked as failed permanently. Redirects are not followed. Do not depend on delivery order; deduplicate using the event ID and retain a processed-event cursor for recovery.

Every webhook update with a non-null URL rotates the signing secret, even when the URL is unchanged. Copy the new secret from that response. Pending deliveries are cancelled on rotation. Retrieve missed events from GET /v1/events using the last processed cursor.

Signature verification · Node.js

import { createHmac, timingSafeEqual } from "node:crypto";

export function verifyWebhook(secret, header, rawBody, now = Date.now()) {
  if (typeof header !== "string" || !Buffer.isBuffer(rawBody)) return false;
  const match = /^t=([0-9]{1,12}),v1=([a-f0-9]{64})$/.exec(header);
  if (!match || !Number.isFinite(now)) return false;
  const timestamp = Number(match[1]);
  if (Math.abs(now / 1000 - timestamp) > 300) return false;
  const expected = createHmac("sha256", secret)
    .update(match[1] + ".")
    .update(rawBody)
    .digest();
  const received = Buffer.from(match[2], "hex");
  return received.length === expected.length &&
    timingSafeEqual(received, expected);
}

Pass the raw body as a Buffer. Missing, malformed, expired or mismatched signatures return false.

Account

GET /v1/me

Retrieve account details

Returns account status, server quotas, concurrent provisioning limits and credit availability for the authenticated account.

Responses

200 Account details.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
partnerrequired
idrequiredinteger
statusrequiredactive frozen suspended
tenant_keyrequiredstring
inflightrequired
currentrequiredinteger
maxrequiredinteger
serversrequired
countrequiredinteger
maxrequiredinteger nullable
limitsrequired
max_inflightrequiredinteger
max_serversrequiredinteger nullable
credit_limitrequiredstring nullable
creditrequired
limitrequiredstring nullable
Credit limit; null = no limit
unbilledrequiredstring nullable
Current usage + closed uninvoiced usage + open invoice balances - free credit, floored at 0; null while billing data is degraded
availablerequiredstring nullable
limit - unbilled; creates are refused with 402 CREDIT_LIMIT at 0
breakdownrequired
usage_month_to_daterequiredstring nullable
closed_uninvoicedrequiredstring nullable
open_invoicesrequiredstring nullable
credit_balancerequiredstring nullable
degradedrequiredboolean
True when current billing data is unavailable. Credit availability is treated as zero until recovery.
as_ofrequiredstring
snapshot_as_ofrequiredstring nullable
Native financial snapshot time; null while degraded
keyrequired
key_idrequiredstring
labelrequiredstring nullable
401 Authentication failed. The API key is missing, invalid or revoked, or API access is not approved.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
WWW-AuthenticateBearer authentication challenge.
Error envelope, see Errors.
403 NETWORK_RESTRICTED: the request source is outside this deployment's approved IP networks.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
429 Rate limit exceeded. See Retry-After before retrying.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Retry-AfterMinimum delay in seconds before retrying, when present. Some dependency failures omit this header; use exponential backoff with jitter.
Error envelope, see Errors.
500 INTERNAL: unexpected server error. Retain X-Request-Id for support; resolve the outcome before repeating a write.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
503 Service temporarily unavailable: MAINTENANCE, STORE_BUSY, STORE_UNAVAILABLE or UPSTREAM.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Retry-AfterMinimum delay in seconds before retrying, when present. Some dependency failures omit this header; use exponential backoff with jitter.
Error envelope, see Errors.
default Other API error. Inspect the HTTP status and error envelope; request parsing can return 400, 413 or 415.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.

Example request · cURL

Uses the variables from Getting started. Replace sample IDs and configuration values with your own.

curl --silent --show-error --include --request GET "$API_BASE_URL/me" \
  --header "Authorization: Bearer $API_KEY"

Example 200 response

{
  "partner": {
    "id": 42,
    "status": "active",
    "tenant_key": "partner-42"
  },
  "inflight": {
    "current": 0,
    "max": 20
  },
  "servers": {
    "count": 1,
    "max": 300
  },
  "limits": {
    "max_inflight": 20,
    "max_servers": 300,
    "credit_limit": "1000.00"
  },
  "credit": {
    "limit": "1000.00",
    "unbilled": "2.40",
    "available": "997.60",
    "breakdown": {
      "usage_month_to_date": "2.40",
      "closed_uninvoiced": "0.00",
      "open_invoices": "0.00",
      "credit_balance": "0.00"
    },
    "degraded": false,
    "as_of": "2026-09-10T00:00:00.000Z",
    "snapshot_as_of": "2026-09-10T00:00:00.000Z"
  },
  "key": {
    "key_id": "a1b2c3d4e5f6",
    "label": "Provisioning integration"
  }
}

Catalog

GET /v1/plans

List plans

Returns active plans in the account's assigned price book. Prices and discounts are account-specific. An empty list means no plans are currently available to order.

Responses

200 Available plans and prices.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
plansrequiredarray of
discount_basisoptionalvm_months_per_plan allocated_per_plan allocated_combined
current_tieroptional
qualifying_countrequiredinteger
Allocated server count used to select this rate.
monthly_pricerequiredstring
Monthly price at this allocation count.
hourly_pricerequiredstring
Displayed hourly rate at this allocation count; use returned charges for billing totals.
next_from_countrequiredinteger nullable
Next discount threshold, or null when there is no higher tier.
coderequiredstring
namerequiredstring
hourly_pricerequiredstring
Base per-hour rate: monthly_price / 672
monthly_priceoptionalstring
Base price per VM-month (the first tier)
monthly_cap_hoursrequiredinteger
backupsrequired
enabledrequiredboolean
specsoptionalany nullable
tiersoptionalarray of
from_vm_monthsrequirednumber
monthly_pricerequiredstring
Volume tiers on your price book; one entry means a flat price
schemeoptionalvolume graduated
For VM-month basis: whole-month volume or graduated brackets. Allocated-count bases require volume, applied separately to each started hour
401 Authentication failed. The API key is missing, invalid or revoked, or API access is not approved.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
WWW-AuthenticateBearer authentication challenge.
Error envelope, see Errors.
403 NETWORK_RESTRICTED: the request source is outside this deployment's approved IP networks.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
429 Rate limit exceeded. See Retry-After before retrying.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Retry-AfterMinimum delay in seconds before retrying, when present. Some dependency failures omit this header; use exponential backoff with jitter.
Error envelope, see Errors.
500 INTERNAL: unexpected server error. Retain X-Request-Id for support; resolve the outcome before repeating a write.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
503 Service temporarily unavailable: MAINTENANCE, STORE_BUSY, STORE_UNAVAILABLE or UPSTREAM.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Retry-AfterMinimum delay in seconds before retrying, when present. Some dependency failures omit this header; use exponential backoff with jitter.
Error envelope, see Errors.
default Other API error. Inspect the HTTP status and error envelope; request parsing can return 400, 413 or 415.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.

Example request · cURL

Uses the variables from Getting started. Replace sample IDs and configuration values with your own.

curl --silent --show-error --include --request GET "$API_BASE_URL/plans" \
  --header "Authorization: Bearer $API_KEY"

Example 200 response

{
  "plans": [
    {
      "code": "standard-2",
      "name": "Standard 2",
      "hourly_price": "0.1000",
      "monthly_price": "67.20",
      "monthly_cap_hours": 672,
      "backups": {
        "enabled": true
      },
      "specs": null
    }
  ]
}

GET /v1/regions

List regions

Use the returned region code in server creation requests.

Responses

200 Available regions.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
regionsrequiredarray of
coderequiredstring
namerequiredstring
401 Authentication failed. The API key is missing, invalid or revoked, or API access is not approved.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
WWW-AuthenticateBearer authentication challenge.
Error envelope, see Errors.
403 NETWORK_RESTRICTED: the request source is outside this deployment's approved IP networks.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
429 Rate limit exceeded. See Retry-After before retrying.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Retry-AfterMinimum delay in seconds before retrying, when present. Some dependency failures omit this header; use exponential backoff with jitter.
Error envelope, see Errors.
500 INTERNAL: unexpected server error. Retain X-Request-Id for support; resolve the outcome before repeating a write.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
503 Service temporarily unavailable: MAINTENANCE, STORE_BUSY, STORE_UNAVAILABLE or UPSTREAM.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Retry-AfterMinimum delay in seconds before retrying, when present. Some dependency failures omit this header; use exponential backoff with jitter.
Error envelope, see Errors.
default Other API error. Inspect the HTTP status and error envelope; request parsing can return 400, 413 or 415.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.

Example request · cURL

Uses the variables from Getting started. Replace sample IDs and configuration values with your own.

curl --silent --show-error --include --request GET "$API_BASE_URL/regions" \
  --header "Authorization: Bearer $API_KEY"

Example 200 response

{
  "regions": [
    {
      "code": "chicago",
      "name": "Chicago"
    }
  ]
}

GET /v1/images

List operating system images

Use the returned image code in create or rebuild requests. Images with cloud_init set to true accept user_data.

Responses

200 Available images.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
imagesrequiredarray of
coderequiredstring
namerequiredstring
cloud_initrequiredboolean
401 Authentication failed. The API key is missing, invalid or revoked, or API access is not approved.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
WWW-AuthenticateBearer authentication challenge.
Error envelope, see Errors.
403 NETWORK_RESTRICTED: the request source is outside this deployment's approved IP networks.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
429 Rate limit exceeded. See Retry-After before retrying.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Retry-AfterMinimum delay in seconds before retrying, when present. Some dependency failures omit this header; use exponential backoff with jitter.
Error envelope, see Errors.
500 INTERNAL: unexpected server error. Retain X-Request-Id for support; resolve the outcome before repeating a write.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
503 Service temporarily unavailable: MAINTENANCE, STORE_BUSY, STORE_UNAVAILABLE or UPSTREAM.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Retry-AfterMinimum delay in seconds before retrying, when present. Some dependency failures omit this header; use exponential backoff with jitter.
Error envelope, see Errors.
default Other API error. Inspect the HTTP status and error envelope; request parsing can return 400, 413 or 415.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.

Example request · cURL

Uses the variables from Getting started. Replace sample IDs and configuration values with your own.

curl --silent --show-error --include --request GET "$API_BASE_URL/images" \
  --header "Authorization: Bearer $API_KEY"

Example 200 response

{
  "images": [
    {
      "code": "ubuntu-24.04",
      "name": "Ubuntu 24.04 LTS",
      "cloud_init": true
    }
  ]
}

Servers

GET /v1/servers

List servers

Returns a cursor-paginated list of servers owned by the authenticated account. Supports filtering and conditional requests.

Parameters

statusqueryrequested provisioning active rebuilding suspended destroying destroyed failed
updated_afterquerystring
Pattern^\d{4}-\d{2}-\d{2}[ T]\d{2}:\d{2}:\d{2}(\.\d{1,3})?Z?$
Return servers updated after this UTC timestamp.
idsquerystring maximum 4000 characters
Comma-separated server IDs.
batchquerystring maximum 64 characters
Filter by batch label.
external_idquerystring maximum 64 characters
Filter by the identifier from your system.
limitqueryinteger minimum 1, maximum 100, default 50
Maximum number of servers to return.
afterquerystring maximum 30 characters
Pagination cursor from the preceding next_after value.
If-None-Matchheaderstring
ETag from a previous response. A matching representation returns 304 with no response body.

Responses

200 Server list.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
ETagIdentifier for the current representation.
Cache-ControlPrivate response cache policy; max-age is 5 seconds.
serversrequiredarray of
idrequiredstring
Server identifier in srv_<ulid> format.
namerequiredstring
Server hostname.
statusrequiredrequested provisioning active rebuilding suspended destroying destroyed failed
Provisioning or lifecycle state; does not indicate application health.
failurerequiredcreate_call ambiguous_create task_failed timeout vanished destroy_timeout nullable
Failure classification, or null when no failure has been recorded.
planrequiredstring
Plan code.
regionrequiredstring
Region code.
imagerequiredstring
Operating system image code.
ipv4requiredstring nullable
Assigned IPv4 address, or null before allocation.
ipv6requiredstring nullable
Reserved for IPv6. Null in this API version.
lockedrequiredboolean
Whether deletion through the API is blocked.
external_idrequiredstring nullable
Identifier supplied by the integration, or null.
batchrequiredstring nullable
Group label supplied by the integration, or null.
backupsrequired
enabledrequiredboolean
created_atrequiredstring date-time
Creation acceptance timestamp. Billing starts here for vm_months_per_plan, and at active_at for allocation-based pricing.
active_atrequiredstring date-time nullable
Timestamp when provisioning completed, or null while pending.
ssh_reachable_atrequiredstring date-time nullable
First successful TCP connection to port 22. Does not verify SSH authentication.
destroy_requested_atrequiredstring date-time nullable
Deletion acceptance timestamp and end of billing, or null.
versionrequiredinteger
Resource revision, incremented when the record changes.
updated_atrequiredstring date-time
Timestamp of the most recent record update.
costrequired
hourlyrequiredstring
Current hourly rate as a decimal string.
month_to_daterequiredstring
Accrued charges for the current billing month.
projectedrequiredstring
Projected charge through month end if the server remains allocated.
next_afterrequiredstring nullable
304 Not Modified. The representation matches If-None-Match; no response body.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
ETagIdentifier for the current representation.
Cache-ControlPrivate response cache policy; max-age is 5 seconds.
No body.
401 Authentication failed. The API key is missing, invalid or revoked, or API access is not approved.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
WWW-AuthenticateBearer authentication challenge.
Error envelope, see Errors.
403 NETWORK_RESTRICTED: the request source is outside this deployment's approved IP networks.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
422 Invalid query parameters.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
429 Rate limit exceeded. See Retry-After before retrying.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Retry-AfterMinimum delay in seconds before retrying, when present. Some dependency failures omit this header; use exponential backoff with jitter.
Error envelope, see Errors.
500 INTERNAL: unexpected server error. Retain X-Request-Id for support; resolve the outcome before repeating a write.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
503 Service temporarily unavailable: MAINTENANCE, STORE_BUSY, STORE_UNAVAILABLE or UPSTREAM.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Retry-AfterMinimum delay in seconds before retrying, when present. Some dependency failures omit this header; use exponential backoff with jitter.
Error envelope, see Errors.
default Other API error. Inspect the HTTP status and error envelope; request parsing can return 400, 413 or 415.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.

Example request · cURL

Uses the variables from Getting started. Replace sample IDs and configuration values with your own.

curl --silent --show-error --include --request GET "$API_BASE_URL/servers" \
  --header "Authorization: Bearer $API_KEY"

Example 200 response

{
  "servers": [
    {
      "id": "srv_01J8Z3M4N5P6Q7R8S9T0V1W2X3",
      "name": "web-01",
      "status": "active",
      "failure": null,
      "plan": "standard-2",
      "region": "chicago",
      "image": "ubuntu-24.04",
      "ipv4": "203.0.113.10",
      "ipv6": null,
      "locked": false,
      "external_id": "customer-4711",
      "batch": null,
      "backups": {
        "enabled": true
      },
      "created_at": "2026-09-09T00:00:00.000Z",
      "active_at": "2026-09-09T00:00:30.000Z",
      "ssh_reachable_at": "2026-09-09T00:01:00.000Z",
      "destroy_requested_at": null,
      "version": 3,
      "updated_at": "2026-09-09T00:01:00.000Z",
      "cost": {
        "hourly": "0.1000",
        "month_to_date": "2.40",
        "projected": "52.80"
      }
    }
  ],
  "next_after": null
}

POST /v1/servers

Create a server

Creates a server asynchronously. Set dry_run to true to validate the configuration and retrieve pricing without creating a server. If neither a password nor SSH keys are supplied, the generated root password is returned once. A 202 response confirms acceptance, not completion. Poll the returned server until its status changes; reuse the same idempotency key after a timeout. Billing start depends on the account's discount basis; see Billing.

Parameters

Idempotency-Keyheaderstring maximum 128 characters, minimum 1 characters
Required when dry_run is false or omitted. Use one unique value per intended server and reuse it for retries with the same request body. Retained for 24 hours. An unfinished request returns 409 CONFLICT with details.reason=request_in_progress and Retry-After. A different body returns 409 IDEMPOTENCY_MISMATCH.

Request body

namerequiredstring maximum 253 characters, minimum 1 characters
Pattern^(?=.{1,253}$)([a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)(\.[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)*$
Server hostname. Lowercase DNS labels separated by dots; unique among live servers in this account.
planrequiredstring maximum 32 characters, minimum 1 characters
Plan code returned by GET /v1/plans.
regionrequiredstring maximum 32 characters, minimum 1 characters
Region code returned by GET /v1/regions.
imagerequiredstring maximum 32 characters, minimum 1 characters
Operating system image code returned by GET /v1/images.
ssh_keysoptionalarray of integer greater than 0 maximum 20 items
IDs of registered SSH public keys owned by this account. Maximum 20 keys.
passwordoptionalstring maximum 20 characters, minimum 8 characters
Root password, 8–20 characters. If omitted with no SSH keys, a password is generated and returned once.
user_dataoptionalstring
Cloud-init configuration or shell script. Must begin with #cloud-config or #! and be at most 65,536 UTF-8 bytes after CRLF normalization. Requires an image with cloud_init enabled.
external_idoptionalstring maximum 64 characters, minimum 1 characters
Identifier from your system. Must be unique across this account, including deleted server records.
batchoptionalstring maximum 64 characters, minimum 1 characters
Optional group label for filtering related servers.
dry_runoptionalboolean
When true, validate and return pricing without creating a server. Does not require Idempotency-Key.

Responses

200 Configuration validated. Returned only for dry_run.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
validrequiredtrue
planrequired
coderequiredstring
hourly_pricerequiredstring
monthly_cap_hoursrequiredinteger
pricerequired
discount_basisoptionalvm_months_per_plan allocated_per_plan allocated_combined
current_tieroptional
qualifying_countrequiredinteger
Allocated server count used to select this rate.
monthly_pricerequiredstring
Monthly price at this allocation count.
hourly_pricerequiredstring
Displayed hourly rate at this allocation count; use returned charges for billing totals.
next_from_countrequiredinteger nullable
Next discount threshold, or null when there is no higher tier.
hourlyrequiredstring
Current hourly rate (monthly price / 672). Allocated-count books rate each started hour at the qualifying count then; existing charges stay fixed
monthly_maxrequiredstring
Base-rate monthly ceiling; current discounts may change during the month
monthly_priceoptionalstring
Price per VM-month at the tier in force
tieroptional
hoursrequirednumber
vm_monthsrequirednumber
from_vm_monthsrequirednumber
monthly_pricerequiredstring
nextrequired
from_vm_monthsrequirednumber
monthly_pricerequiredstring
nullable
nullable

Example response

{
  "valid": true,
  "plan": {
    "code": "standard-2",
    "hourly_price": "0.1000",
    "monthly_cap_hours": 672
  },
  "price": {
    "hourly": "0.1000",
    "monthly_max": "67.20",
    "monthly_price": "67.20"
  }
}
202 Server creation accepted.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
LocationRelative URL of the created server.
Idempotent-Replayedtrue when this is a replay of a stored response.
serverrequired
idrequiredstring
Server identifier in srv_<ulid> format.
namerequiredstring
Server hostname.
statusrequiredrequested provisioning active rebuilding suspended destroying destroyed failed
Provisioning or lifecycle state; does not indicate application health.
failurerequiredcreate_call ambiguous_create task_failed timeout vanished destroy_timeout nullable
Failure classification, or null when no failure has been recorded.
planrequiredstring
Plan code.
regionrequiredstring
Region code.
imagerequiredstring
Operating system image code.
ipv4requiredstring nullable
Assigned IPv4 address, or null before allocation.
ipv6requiredstring nullable
Reserved for IPv6. Null in this API version.
lockedrequiredboolean
Whether deletion through the API is blocked.
external_idrequiredstring nullable
Identifier supplied by the integration, or null.
batchrequiredstring nullable
Group label supplied by the integration, or null.
backupsrequired
enabledrequiredboolean
created_atrequiredstring date-time
Creation acceptance timestamp. Billing starts here for vm_months_per_plan, and at active_at for allocation-based pricing.
active_atrequiredstring date-time nullable
Timestamp when provisioning completed, or null while pending.
ssh_reachable_atrequiredstring date-time nullable
First successful TCP connection to port 22. Does not verify SSH authentication.
destroy_requested_atrequiredstring date-time nullable
Deletion acceptance timestamp and end of billing, or null.
versionrequiredinteger
Resource revision, incremented when the record changes.
updated_atrequiredstring date-time
Timestamp of the most recent record update.
costrequired
hourlyrequiredstring
Current hourly rate as a decimal string.
month_to_daterequiredstring
Accrued charges for the current billing month.
projectedrequiredstring
Projected charge through month end if the server remains allocated.
pricerequired
discount_basisoptionalvm_months_per_plan allocated_per_plan allocated_combined
current_tieroptional
qualifying_countrequiredinteger
Allocated server count used to select this rate.
monthly_pricerequiredstring
Monthly price at this allocation count.
hourly_pricerequiredstring
Displayed hourly rate at this allocation count; use returned charges for billing totals.
next_from_countrequiredinteger nullable
Next discount threshold, or null when there is no higher tier.
hourlyrequiredstring
Current hourly rate (monthly price / 672). Allocated-count books rate each started hour at the qualifying count then; existing charges stay fixed
monthly_maxrequiredstring
Base-rate monthly ceiling; current discounts may change during the month
monthly_priceoptionalstring
Price per VM-month at the tier in force
tieroptional
hoursrequirednumber
vm_monthsrequirednumber
from_vm_monthsrequirednumber
monthly_pricerequiredstring
nextrequired
from_vm_monthsrequirednumber
monthly_pricerequiredstring
nullable
nullable
passwordoptionalstring nullable
Generated root password, returned once. Null with password_redacted on an idempotent replay.
password_generatedrequiredboolean
Whether the API generated a root password for this request.
password_redactedoptionalboolean
True when a generated password is omitted from an idempotent replay.
400 Idempotency-Key is missing or invalid.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
401 Authentication failed. The API key is missing, invalid or revoked, or API access is not approved.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
WWW-AuthenticateBearer authentication challenge.
Error envelope, see Errors.
402 CREDIT_LIMIT: account credit limit reached.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
403 FROZEN, PARTNER_SUSPENDED or QUOTA: account state or server quota prevents creation. NETWORK_RESTRICTED: the request source is outside this deployment's approved IP networks.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
409 CONFLICT or IDEMPOTENCY_MISMATCH: duplicate name or external_id, unfinished or expired idempotency key, or key used with a different body. For request_in_progress, wait for Retry-After and retry with the same key. A persistent conflict requires reconciling details.server_id with support.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Retry-AfterMinimum delay in seconds before retrying, when present. Some dependency failures omit this header; use exponential backoff with jitter.
Error envelope, see Errors.
422 VALIDATION: invalid configuration or rejected provisioning. A rejected provisioning attempt also returns a failed server record.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
429 INFLIGHT_LIMIT or RATE_LIMITED: provisioning concurrency or request rate exceeded.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Retry-AfterMinimum delay in seconds before retrying, when present. Some dependency failures omit this header; use exponential backoff with jitter.
Error envelope, see Errors.
500 INTERNAL: unexpected server error. Retain X-Request-Id for support; resolve the outcome before repeating a write.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
503 Service temporarily unavailable: MAINTENANCE, STORE_BUSY, STORE_UNAVAILABLE or UPSTREAM.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Retry-AfterMinimum delay in seconds before retrying, when present. Some dependency failures omit this header; use exponential backoff with jitter.
Error envelope, see Errors.
default Other API error. Inspect the HTTP status and error envelope; request parsing can return 400, 413 or 415.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.

Example request · cURL

Uses the variables from Getting started. Replace sample IDs and configuration values with your own.

curl --silent --show-error --include --request POST "$API_BASE_URL/servers" \
  --header "Authorization: Bearer $API_KEY" \
  --header "Idempotency-Key: $IDEMPOTENCY_KEY" \
  --header "Content-Type: application/json" \
  --data '{
  "name": "web-01",
  "plan": "standard-2",
  "region": "chicago",
  "image": "ubuntu-24.04",
  "ssh_keys": [
    123
  ],
  "external_id": "customer-4711"
}'
Validate a server configuration
curl --silent --show-error --include --request POST "$API_BASE_URL/servers" \
  --header "Authorization: Bearer $API_KEY" \
  --header "Content-Type: application/json" \
  --data '{
  "name": "web-01",
  "plan": "standard-2",
  "region": "chicago",
  "image": "ubuntu-24.04",
  "ssh_keys": [
    123
  ],
  "dry_run": true
}'

Example 202 response

{
  "server": {
    "id": "srv_01J8Z3M4N5P6Q7R8S9T0V1W2X3",
    "name": "web-01",
    "status": "provisioning",
    "failure": null,
    "plan": "standard-2",
    "region": "chicago",
    "image": "ubuntu-24.04",
    "ipv4": null,
    "ipv6": null,
    "locked": false,
    "external_id": "customer-4711",
    "batch": null,
    "backups": {
      "enabled": true
    },
    "created_at": "2026-09-10T00:00:00.000Z",
    "active_at": null,
    "ssh_reachable_at": null,
    "destroy_requested_at": null,
    "version": 1,
    "updated_at": "2026-09-10T00:00:00.000Z",
    "cost": {
      "hourly": "0.1000",
      "month_to_date": "0.00",
      "projected": "50.40"
    }
  },
  "price": {
    "hourly": "0.1000",
    "monthly_max": "67.20",
    "monthly_price": "67.20"
  },
  "password_generated": false
}

GET /v1/servers/{id}

Retrieve a server

Parameters

idpath, requiredstring
Server identifier returned by the API.
If-None-Matchheaderstring
ETag from a previous response. A matching representation returns 304 with no response body.

Responses

200 Server details.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
ETagIdentifier for the current representation.
Cache-ControlPrivate response cache policy; max-age is 5 seconds.
serverrequired
idrequiredstring
Server identifier in srv_<ulid> format.
namerequiredstring
Server hostname.
statusrequiredrequested provisioning active rebuilding suspended destroying destroyed failed
Provisioning or lifecycle state; does not indicate application health.
failurerequiredcreate_call ambiguous_create task_failed timeout vanished destroy_timeout nullable
Failure classification, or null when no failure has been recorded.
planrequiredstring
Plan code.
regionrequiredstring
Region code.
imagerequiredstring
Operating system image code.
ipv4requiredstring nullable
Assigned IPv4 address, or null before allocation.
ipv6requiredstring nullable
Reserved for IPv6. Null in this API version.
lockedrequiredboolean
Whether deletion through the API is blocked.
external_idrequiredstring nullable
Identifier supplied by the integration, or null.
batchrequiredstring nullable
Group label supplied by the integration, or null.
backupsrequired
enabledrequiredboolean
created_atrequiredstring date-time
Creation acceptance timestamp. Billing starts here for vm_months_per_plan, and at active_at for allocation-based pricing.
active_atrequiredstring date-time nullable
Timestamp when provisioning completed, or null while pending.
ssh_reachable_atrequiredstring date-time nullable
First successful TCP connection to port 22. Does not verify SSH authentication.
destroy_requested_atrequiredstring date-time nullable
Deletion acceptance timestamp and end of billing, or null.
versionrequiredinteger
Resource revision, incremented when the record changes.
updated_atrequiredstring date-time
Timestamp of the most recent record update.
costrequired
hourlyrequiredstring
Current hourly rate as a decimal string.
month_to_daterequiredstring
Accrued charges for the current billing month.
projectedrequiredstring
Projected charge through month end if the server remains allocated.
304 Not Modified. The representation matches If-None-Match; no response body.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
ETagIdentifier for the current representation.
Cache-ControlPrivate response cache policy; max-age is 5 seconds.
No body.
401 Authentication failed. The API key is missing, invalid or revoked, or API access is not approved.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
WWW-AuthenticateBearer authentication challenge.
Error envelope, see Errors.
403 NETWORK_RESTRICTED: the request source is outside this deployment's approved IP networks.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
404 Server not found in this account.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
429 Rate limit exceeded. See Retry-After before retrying.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Retry-AfterMinimum delay in seconds before retrying, when present. Some dependency failures omit this header; use exponential backoff with jitter.
Error envelope, see Errors.
500 INTERNAL: unexpected server error. Retain X-Request-Id for support; resolve the outcome before repeating a write.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
503 Service temporarily unavailable: MAINTENANCE, STORE_BUSY, STORE_UNAVAILABLE or UPSTREAM.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Retry-AfterMinimum delay in seconds before retrying, when present. Some dependency failures omit this header; use exponential backoff with jitter.
Error envelope, see Errors.
default Other API error. Inspect the HTTP status and error envelope; request parsing can return 400, 413 or 415.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.

Example request · cURL

Uses the variables from Getting started. Replace sample IDs and configuration values with your own.

curl --silent --show-error --include --request GET "$API_BASE_URL/servers/srv_01J8Z3M4N5P6Q7R8S9T0V1W2X3" \
  --header "Authorization: Bearer $API_KEY"

Example 200 response

{
  "server": {
    "id": "srv_01J8Z3M4N5P6Q7R8S9T0V1W2X3",
    "name": "web-01",
    "status": "active",
    "failure": null,
    "plan": "standard-2",
    "region": "chicago",
    "image": "ubuntu-24.04",
    "ipv4": "203.0.113.10",
    "ipv6": null,
    "locked": false,
    "external_id": "customer-4711",
    "batch": null,
    "backups": {
      "enabled": true
    },
    "created_at": "2026-09-09T00:00:00.000Z",
    "active_at": "2026-09-09T00:00:30.000Z",
    "ssh_reachable_at": "2026-09-09T00:01:00.000Z",
    "destroy_requested_at": null,
    "version": 3,
    "updated_at": "2026-09-09T00:01:00.000Z",
    "cost": {
      "hourly": "0.1000",
      "month_to_date": "2.40",
      "projected": "52.80"
    }
  }
}

PATCH /v1/servers/{id}

Update deletion protection

Set locked to true to prevent deletion through the API, or false to allow deletion. This setting does not prevent a rebuild or backup restore.

Parameters

idpath, requiredstring
Server identifier returned by the API.

Request body

lockedrequiredboolean
Enable or disable deletion protection. Does not prevent rebuilds or backup restores.

Responses

200 Updated server.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
serverrequired
idrequiredstring
Server identifier in srv_<ulid> format.
namerequiredstring
Server hostname.
statusrequiredrequested provisioning active rebuilding suspended destroying destroyed failed
Provisioning or lifecycle state; does not indicate application health.
failurerequiredcreate_call ambiguous_create task_failed timeout vanished destroy_timeout nullable
Failure classification, or null when no failure has been recorded.
planrequiredstring
Plan code.
regionrequiredstring
Region code.
imagerequiredstring
Operating system image code.
ipv4requiredstring nullable
Assigned IPv4 address, or null before allocation.
ipv6requiredstring nullable
Reserved for IPv6. Null in this API version.
lockedrequiredboolean
Whether deletion through the API is blocked.
external_idrequiredstring nullable
Identifier supplied by the integration, or null.
batchrequiredstring nullable
Group label supplied by the integration, or null.
backupsrequired
enabledrequiredboolean
created_atrequiredstring date-time
Creation acceptance timestamp. Billing starts here for vm_months_per_plan, and at active_at for allocation-based pricing.
active_atrequiredstring date-time nullable
Timestamp when provisioning completed, or null while pending.
ssh_reachable_atrequiredstring date-time nullable
First successful TCP connection to port 22. Does not verify SSH authentication.
destroy_requested_atrequiredstring date-time nullable
Deletion acceptance timestamp and end of billing, or null.
versionrequiredinteger
Resource revision, incremented when the record changes.
updated_atrequiredstring date-time
Timestamp of the most recent record update.
costrequired
hourlyrequiredstring
Current hourly rate as a decimal string.
month_to_daterequiredstring
Accrued charges for the current billing month.
projectedrequiredstring
Projected charge through month end if the server remains allocated.
401 Authentication failed. The API key is missing, invalid or revoked, or API access is not approved.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
WWW-AuthenticateBearer authentication challenge.
Error envelope, see Errors.
403 NETWORK_RESTRICTED: the request source is outside this deployment's approved IP networks.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
404 Server not found.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
409 CONFLICT: the server changed concurrently.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
422 Invalid request body.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
429 Rate limit exceeded. See Retry-After before retrying.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Retry-AfterMinimum delay in seconds before retrying, when present. Some dependency failures omit this header; use exponential backoff with jitter.
Error envelope, see Errors.
500 INTERNAL: unexpected server error. Retain X-Request-Id for support; resolve the outcome before repeating a write.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
503 Service temporarily unavailable: MAINTENANCE, STORE_BUSY, STORE_UNAVAILABLE or UPSTREAM.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Retry-AfterMinimum delay in seconds before retrying, when present. Some dependency failures omit this header; use exponential backoff with jitter.
Error envelope, see Errors.
default Other API error. Inspect the HTTP status and error envelope; request parsing can return 400, 413 or 415.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.

Example request · cURL

Uses the variables from Getting started. Replace sample IDs and configuration values with your own.

curl --silent --show-error --include --request PATCH "$API_BASE_URL/servers/srv_01J8Z3M4N5P6Q7R8S9T0V1W2X3" \
  --header "Authorization: Bearer $API_KEY" \
  --header "Content-Type: application/json" \
  --data '{
  "locked": true
}'

Example 200 response

{
  "server": {
    "id": "srv_01J8Z3M4N5P6Q7R8S9T0V1W2X3",
    "name": "web-01",
    "status": "active",
    "failure": null,
    "plan": "standard-2",
    "region": "chicago",
    "image": "ubuntu-24.04",
    "ipv4": "203.0.113.10",
    "ipv6": null,
    "locked": true,
    "external_id": "customer-4711",
    "batch": null,
    "backups": {
      "enabled": true
    },
    "created_at": "2026-09-09T00:00:00.000Z",
    "active_at": "2026-09-09T00:00:30.000Z",
    "ssh_reachable_at": "2026-09-09T00:01:00.000Z",
    "destroy_requested_at": null,
    "version": 4,
    "updated_at": "2026-09-10T00:00:00.000Z",
    "cost": {
      "hourly": "0.1000",
      "month_to_date": "2.40",
      "projected": "52.80"
    }
  }
}

DELETE /v1/servers/{id}

Delete a server

Permanently deletes the server. Active or suspended servers transition to destroying; billing ends when deletion is accepted. Returns 204 if the server is already destroying, destroyed or failed. Locked servers and servers in requested, provisioning or rebuilding state return 409.

Parameters

idpath, requiredstring
Server identifier returned by the API.

Responses

202 Deletion accepted; server status is destroying.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
serverrequired
idrequiredstring
Server identifier in srv_<ulid> format.
namerequiredstring
Server hostname.
statusrequiredrequested provisioning active rebuilding suspended destroying destroyed failed
Provisioning or lifecycle state; does not indicate application health.
failurerequiredcreate_call ambiguous_create task_failed timeout vanished destroy_timeout nullable
Failure classification, or null when no failure has been recorded.
planrequiredstring
Plan code.
regionrequiredstring
Region code.
imagerequiredstring
Operating system image code.
ipv4requiredstring nullable
Assigned IPv4 address, or null before allocation.
ipv6requiredstring nullable
Reserved for IPv6. Null in this API version.
lockedrequiredboolean
Whether deletion through the API is blocked.
external_idrequiredstring nullable
Identifier supplied by the integration, or null.
batchrequiredstring nullable
Group label supplied by the integration, or null.
backupsrequired
enabledrequiredboolean
created_atrequiredstring date-time
Creation acceptance timestamp. Billing starts here for vm_months_per_plan, and at active_at for allocation-based pricing.
active_atrequiredstring date-time nullable
Timestamp when provisioning completed, or null while pending.
ssh_reachable_atrequiredstring date-time nullable
First successful TCP connection to port 22. Does not verify SSH authentication.
destroy_requested_atrequiredstring date-time nullable
Deletion acceptance timestamp and end of billing, or null.
versionrequiredinteger
Resource revision, incremented when the record changes.
updated_atrequiredstring date-time
Timestamp of the most recent record update.
costrequired
hourlyrequiredstring
Current hourly rate as a decimal string.
month_to_daterequiredstring
Accrued charges for the current billing month.
projectedrequiredstring
Projected charge through month end if the server remains allocated.
204 Server is already destroying, destroyed or failed. No response body.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
No body.
401 Authentication failed. The API key is missing, invalid or revoked, or API access is not approved.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
WWW-AuthenticateBearer authentication challenge.
Error envelope, see Errors.
403 NETWORK_RESTRICTED: the request source is outside this deployment's approved IP networks.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
404 Server not found.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
409 CONFLICT: deletion protection, server state or a concurrent update prevents deletion.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
429 Rate limit exceeded. See Retry-After before retrying.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Retry-AfterMinimum delay in seconds before retrying, when present. Some dependency failures omit this header; use exponential backoff with jitter.
Error envelope, see Errors.
500 INTERNAL: unexpected server error. Retain X-Request-Id for support; resolve the outcome before repeating a write.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
503 Service temporarily unavailable: MAINTENANCE, STORE_BUSY, STORE_UNAVAILABLE or UPSTREAM.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Retry-AfterMinimum delay in seconds before retrying, when present. Some dependency failures omit this header; use exponential backoff with jitter.
Error envelope, see Errors.
default Other API error. Inspect the HTTP status and error envelope; request parsing can return 400, 413 or 415.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.

Example request · cURL

Uses the variables from Getting started. Replace sample IDs and configuration values with your own.

curl --silent --show-error --include --request DELETE "$API_BASE_URL/servers/srv_01J8Z3M4N5P6Q7R8S9T0V1W2X3" \
  --header "Authorization: Bearer $API_KEY"

Example 202 response

{
  "server": {
    "id": "srv_01J8Z3M4N5P6Q7R8S9T0V1W2X3",
    "name": "web-01",
    "status": "destroying",
    "failure": null,
    "plan": "standard-2",
    "region": "chicago",
    "image": "ubuntu-24.04",
    "ipv4": "203.0.113.10",
    "ipv6": null,
    "locked": false,
    "external_id": "customer-4711",
    "batch": null,
    "backups": {
      "enabled": true
    },
    "created_at": "2026-09-09T00:00:00.000Z",
    "active_at": "2026-09-09T00:00:30.000Z",
    "ssh_reachable_at": "2026-09-09T00:01:00.000Z",
    "destroy_requested_at": "2026-09-10T00:00:00.000Z",
    "version": 4,
    "updated_at": "2026-09-10T00:00:00.000Z",
    "cost": {
      "hourly": "0.1000",
      "month_to_date": "2.40",
      "projected": "2.40"
    }
  }
}

POST /v1/servers/{id}/actions

Perform a server action

Supports reboot, start, stop, reset_password and rebuild on active servers. reset_password returns the password generated by the compute platform once; its task ID can be null. Rebuild overwrites the server disk with the selected image while preserving the server ID, IP address and billing interval. Supply SSH keys or a password, or receive a generated password once. Rebuild can return a null task ID; monitor the returned server and events. Rebuild failure requires checking task and event details; a return to active does not confirm a successful reinstall.

Parameters

idpath, requiredstring
Server identifier returned by the API.

Request body

actionrequiredreboot start stop reset_password
or
actionrequired"rebuild"
imagerequiredstring maximum 32 characters, minimum 1 characters
Operating system image code returned by GET /v1/images.
ssh_keysoptionalarray of integer greater than 0 maximum 20 items
IDs of registered SSH public keys owned by this account. Maximum 20 keys.
passwordoptionalstring maximum 20 characters, minimum 8 characters
Root password, 8–20 characters. If omitted with no SSH keys, a password is generated and returned once.
user_dataoptionalstring
Cloud-init configuration or shell script. Must begin with #cloud-config or #! and be at most 65,536 UTF-8 bytes after CRLF normalization. Requires an image with cloud_init enabled.

Responses

202 Action accepted. Poll task.id when present.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
taskrequired
idrequiredinteger nullable
Task identifier for polling, or null when the operation returned no task.
actionrequiredstring
Operation performed by this task.
statusrequiredstring
Task status: pending or running is incomplete; done is success; failed or canceled is unsuccessful. Treat unknown values as unresolved.
server_idoptionalstring
Associated server ID, included when retrieving a task.
passwordoptionalstring
Generated root password, shown once for reset_password or a rebuild with neither password nor non-empty ssh_keys. A supplied password is not echoed.
serveroptional
idrequiredstring
Server identifier in srv_<ulid> format.
namerequiredstring
Server hostname.
statusrequiredrequested provisioning active rebuilding suspended destroying destroyed failed
Provisioning or lifecycle state; does not indicate application health.
failurerequiredcreate_call ambiguous_create task_failed timeout vanished destroy_timeout nullable
Failure classification, or null when no failure has been recorded.
planrequiredstring
Plan code.
regionrequiredstring
Region code.
imagerequiredstring
Operating system image code.
ipv4requiredstring nullable
Assigned IPv4 address, or null before allocation.
ipv6requiredstring nullable
Reserved for IPv6. Null in this API version.
lockedrequiredboolean
Whether deletion through the API is blocked.
external_idrequiredstring nullable
Identifier supplied by the integration, or null.
batchrequiredstring nullable
Group label supplied by the integration, or null.
backupsrequired
enabledrequiredboolean
created_atrequiredstring date-time
Creation acceptance timestamp. Billing starts here for vm_months_per_plan, and at active_at for allocation-based pricing.
active_atrequiredstring date-time nullable
Timestamp when provisioning completed, or null while pending.
ssh_reachable_atrequiredstring date-time nullable
First successful TCP connection to port 22. Does not verify SSH authentication.
destroy_requested_atrequiredstring date-time nullable
Deletion acceptance timestamp and end of billing, or null.
versionrequiredinteger
Resource revision, incremented when the record changes.
updated_atrequiredstring date-time
Timestamp of the most recent record update.
costrequired
hourlyrequiredstring
Current hourly rate as a decimal string.
month_to_daterequiredstring
Accrued charges for the current billing month.
projectedrequiredstring
Projected charge through month end if the server remains allocated.
Only for rebuild: the server in rebuilding
401 Authentication failed. The API key is missing, invalid or revoked, or API access is not approved.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
WWW-AuthenticateBearer authentication challenge.
Error envelope, see Errors.
403 NETWORK_RESTRICTED: the request source is outside this deployment's approved IP networks.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
404 Server not found.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
409 CONFLICT: server must be active; concurrent operations can also prevent an action.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
422 Invalid action or rebuild configuration.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
429 Rate limit exceeded. See Retry-After before retrying.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Retry-AfterMinimum delay in seconds before retrying, when present. Some dependency failures omit this header; use exponential backoff with jitter.
Error envelope, see Errors.
500 INTERNAL: unexpected server error. Retain X-Request-Id for support; resolve the outcome before repeating a write.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
503 Service temporarily unavailable: MAINTENANCE, STORE_BUSY, STORE_UNAVAILABLE or UPSTREAM.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Retry-AfterMinimum delay in seconds before retrying, when present. Some dependency failures omit this header; use exponential backoff with jitter.
Error envelope, see Errors.
default Other API error. Inspect the HTTP status and error envelope; request parsing can return 400, 413 or 415.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.

Example request · cURL

Uses the variables from Getting started. Replace sample IDs and configuration values with your own.

curl --silent --show-error --include --request POST "$API_BASE_URL/servers/srv_01J8Z3M4N5P6Q7R8S9T0V1W2X3/actions" \
  --header "Authorization: Bearer $API_KEY" \
  --header "Content-Type: application/json" \
  --data '{
  "action": "reboot"
}'
Reinstall the operating system
curl --silent --show-error --include --request POST "$API_BASE_URL/servers/srv_01J8Z3M4N5P6Q7R8S9T0V1W2X3/actions" \
  --header "Authorization: Bearer $API_KEY" \
  --header "Content-Type: application/json" \
  --data '{
  "action": "rebuild",
  "image": "ubuntu-24.04",
  "ssh_keys": [
    123
  ]
}'
Reset the root password
curl --silent --show-error --include --request POST "$API_BASE_URL/servers/srv_01J8Z3M4N5P6Q7R8S9T0V1W2X3/actions" \
  --header "Authorization: Bearer $API_KEY" \
  --header "Content-Type: application/json" \
  --data '{
  "action": "reset_password"
}'

Example 202 response

{
  "task": {
    "id": 90210,
    "action": "reboot",
    "status": "pending"
  }
}

SSH keys

GET /v1/ssh-keys

List SSH keys

Responses

200 Registered SSH public keys.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
ssh_keysrequiredarray of
idrequiredinteger
namerequiredstring
bodyrequiredstring
401 Authentication failed. The API key is missing, invalid or revoked, or API access is not approved.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
WWW-AuthenticateBearer authentication challenge.
Error envelope, see Errors.
403 NETWORK_RESTRICTED: the request source is outside this deployment's approved IP networks.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
429 Rate limit exceeded. See Retry-After before retrying.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Retry-AfterMinimum delay in seconds before retrying, when present. Some dependency failures omit this header; use exponential backoff with jitter.
Error envelope, see Errors.
500 INTERNAL: unexpected server error. Retain X-Request-Id for support; resolve the outcome before repeating a write.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
503 Service temporarily unavailable: MAINTENANCE, STORE_BUSY, STORE_UNAVAILABLE or UPSTREAM.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Retry-AfterMinimum delay in seconds before retrying, when present. Some dependency failures omit this header; use exponential backoff with jitter.
Error envelope, see Errors.
default Other API error. Inspect the HTTP status and error envelope; request parsing can return 400, 413 or 415.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.

Example request · cURL

Uses the variables from Getting started. Replace sample IDs and configuration values with your own.

curl --silent --show-error --include --request GET "$API_BASE_URL/ssh-keys" \
  --header "Authorization: Bearer $API_KEY"

Example 200 response

{
  "ssh_keys": [
    {
      "id": 123,
      "name": "deploy",
      "body": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB [email protected]"
    }
  ]
}

POST /v1/ssh-keys

Register an SSH key

Registers an OpenSSH public key for use in create and rebuild requests. Supports Ed25519, RSA and ECDSA public keys. Submit the complete public key, never its private key.

Request body

namerequiredstring maximum 64 characters, minimum 1 characters
Display name for the SSH public key.
bodyrequiredstring maximum 8192 characters, minimum 20 characters
Pattern^(ssh-(rsa|ed25519)|ecdsa-sha2-nistp\d+)
Complete OpenSSH public key, including its key type and base64-encoded key data.

Responses

201 SSH public key registered.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
ssh_keyrequired
idrequiredinteger
namerequiredstring
bodyrequiredstring
401 Authentication failed. The API key is missing, invalid or revoked, or API access is not approved.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
WWW-AuthenticateBearer authentication challenge.
Error envelope, see Errors.
403 NETWORK_RESTRICTED: the request source is outside this deployment's approved IP networks.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
422 Invalid SSH public key or name.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
429 Rate limit exceeded. See Retry-After before retrying.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Retry-AfterMinimum delay in seconds before retrying, when present. Some dependency failures omit this header; use exponential backoff with jitter.
Error envelope, see Errors.
500 INTERNAL: unexpected server error. Retain X-Request-Id for support; resolve the outcome before repeating a write.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
503 Service temporarily unavailable: MAINTENANCE, STORE_BUSY, STORE_UNAVAILABLE or UPSTREAM.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Retry-AfterMinimum delay in seconds before retrying, when present. Some dependency failures omit this header; use exponential backoff with jitter.
Error envelope, see Errors.
default Other API error. Inspect the HTTP status and error envelope; request parsing can return 400, 413 or 415.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.

Example request · cURL

Uses the variables from Getting started. Replace sample IDs and configuration values with your own.

curl --silent --show-error --include --request POST "$API_BASE_URL/ssh-keys" \
  --header "Authorization: Bearer $API_KEY" \
  --header "Content-Type: application/json" \
  --data '{
  "name": "deploy",
  "body": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB [email protected]"
}'

Example 201 response

{
  "ssh_key": {
    "id": 123,
    "name": "deploy",
    "body": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB [email protected]"
  }
}

DELETE /v1/ssh-keys/{id}

Delete an SSH key

Removes the key from the account's registered keys. It does not remove keys already installed in existing servers.

Parameters

idpath, requiredinteger minimum 1
SSH key identifier.

Responses

204 SSH key deleted. No response body.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
No body.
401 Authentication failed. The API key is missing, invalid or revoked, or API access is not approved.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
WWW-AuthenticateBearer authentication challenge.
Error envelope, see Errors.
403 NETWORK_RESTRICTED: the request source is outside this deployment's approved IP networks.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
404 SSH key not found.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
429 Rate limit exceeded. See Retry-After before retrying.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Retry-AfterMinimum delay in seconds before retrying, when present. Some dependency failures omit this header; use exponential backoff with jitter.
Error envelope, see Errors.
500 INTERNAL: unexpected server error. Retain X-Request-Id for support; resolve the outcome before repeating a write.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
503 Service temporarily unavailable: MAINTENANCE, STORE_BUSY, STORE_UNAVAILABLE or UPSTREAM.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Retry-AfterMinimum delay in seconds before retrying, when present. Some dependency failures omit this header; use exponential backoff with jitter.
Error envelope, see Errors.
default Other API error. Inspect the HTTP status and error envelope; request parsing can return 400, 413 or 415.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.

Example request · cURL

Uses the variables from Getting started. Replace sample IDs and configuration values with your own.

curl --silent --show-error --include --request DELETE "$API_BASE_URL/ssh-keys/123" \
  --header "Authorization: Bearer $API_KEY"

Response

204 · No response body.

Backups

GET /v1/servers/{id}/backups

List server backups

Requires an active or suspended server. Existing backups remain visible when backups.enabled is false. Deleting the server also removes its backups.

Parameters

idpath, requiredstring
Server identifier returned by the API.

Responses

200 Server backups.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
backupsrequiredarray of
idrequiredinteger
statusrequiredstring
created_atrequiredstring
sizerequirednumber nullable
401 Authentication failed. The API key is missing, invalid or revoked, or API access is not approved.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
WWW-AuthenticateBearer authentication challenge.
Error envelope, see Errors.
403 NETWORK_RESTRICTED: the request source is outside this deployment's approved IP networks.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
404 Server not found.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
409 CONFLICT: server is not active or suspended.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
429 Rate limit exceeded. See Retry-After before retrying.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Retry-AfterMinimum delay in seconds before retrying, when present. Some dependency failures omit this header; use exponential backoff with jitter.
Error envelope, see Errors.
500 INTERNAL: unexpected server error. Retain X-Request-Id for support; resolve the outcome before repeating a write.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
503 Service temporarily unavailable: MAINTENANCE, STORE_BUSY, STORE_UNAVAILABLE or UPSTREAM.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Retry-AfterMinimum delay in seconds before retrying, when present. Some dependency failures omit this header; use exponential backoff with jitter.
Error envelope, see Errors.
default Other API error. Inspect the HTTP status and error envelope; request parsing can return 400, 413 or 415.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.

Example request · cURL

Uses the variables from Getting started. Replace sample IDs and configuration values with your own.

curl --silent --show-error --include --request GET "$API_BASE_URL/servers/srv_01J8Z3M4N5P6Q7R8S9T0V1W2X3/backups" \
  --header "Authorization: Bearer $API_KEY"

Example 200 response

{
  "backups": [
    {
      "id": 7,
      "status": "created",
      "created_at": "2026-09-09T06:00:00.000Z",
      "size": 1073741824
    }
  ]
}

POST /v1/servers/{id}/backups

Create a backup

Creates a backup of the server disk. Requires an active or suspended server and backups.enabled=true for its plan. The current plan setting is enforced on every request. When task.id is null, poll the server backup list to track completion.

Parameters

idpath, requiredstring
Server identifier returned by the API.

Responses

202 Backup task accepted.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
taskrequired
idrequiredinteger nullable
Task identifier for polling, or null when the operation returned no task.
actionrequiredstring
Operation performed by this task.
statusrequiredstring
Task status: pending or running is incomplete; done is success; failed or canceled is unsuccessful. Treat unknown values as unresolved.
server_idoptionalstring
Associated server ID, included when retrieving a task.
401 Authentication failed. The API key is missing, invalid or revoked, or API access is not approved.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
WWW-AuthenticateBearer authentication challenge.
Error envelope, see Errors.
403 FORBIDDEN with details.reason=backups_disabled: the plan disables backups or its configuration is missing. NETWORK_RESTRICTED: the request source is outside this deployment's approved IP networks.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
404 Server not found.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
409 CONFLICT: server is not active or suspended.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
429 Rate limit exceeded. See Retry-After before retrying.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Retry-AfterMinimum delay in seconds before retrying, when present. Some dependency failures omit this header; use exponential backoff with jitter.
Error envelope, see Errors.
500 INTERNAL: unexpected server error. Retain X-Request-Id for support; resolve the outcome before repeating a write.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
503 Service temporarily unavailable: MAINTENANCE, STORE_BUSY, STORE_UNAVAILABLE or UPSTREAM.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Retry-AfterMinimum delay in seconds before retrying, when present. Some dependency failures omit this header; use exponential backoff with jitter.
Error envelope, see Errors.
default Other API error. Inspect the HTTP status and error envelope; request parsing can return 400, 413 or 415.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.

Example request · cURL

Uses the variables from Getting started. Replace sample IDs and configuration values with your own.

curl --silent --show-error --include --request POST "$API_BASE_URL/servers/srv_01J8Z3M4N5P6Q7R8S9T0V1W2X3/backups" \
  --header "Authorization: Bearer $API_KEY"

Example 202 response

{
  "task": {
    "id": null,
    "action": "vm-backup",
    "status": "pending"
  }
}

POST /v1/servers/{id}/backups/{bid}/restore

Restore a backup

Overwrites the server disk with this backup. The backup must belong to the server. Requires an active or suspended server and backups.enabled=true for its plan, enforced on every request. This operation does not create a new server.

Parameters

idpath, requiredstring
Server identifier returned by the API.
bidpath, requiredinteger minimum 1
Backup identifier returned by the server's backup list.

Responses

202 Restore task accepted.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
taskrequired
idrequiredinteger nullable
Task identifier for polling, or null when the operation returned no task.
actionrequiredstring
Operation performed by this task.
statusrequiredstring
Task status: pending or running is incomplete; done is success; failed or canceled is unsuccessful. Treat unknown values as unresolved.
server_idoptionalstring
Associated server ID, included when retrieving a task.
401 Authentication failed. The API key is missing, invalid or revoked, or API access is not approved.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
WWW-AuthenticateBearer authentication challenge.
Error envelope, see Errors.
403 FORBIDDEN with details.reason=backups_disabled: the plan disables backups or its configuration is missing. NETWORK_RESTRICTED: the request source is outside this deployment's approved IP networks.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
404 Server or backup not found.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
409 CONFLICT: server is not active or suspended.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
429 Rate limit exceeded. See Retry-After before retrying.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Retry-AfterMinimum delay in seconds before retrying, when present. Some dependency failures omit this header; use exponential backoff with jitter.
Error envelope, see Errors.
500 INTERNAL: unexpected server error. Retain X-Request-Id for support; resolve the outcome before repeating a write.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
503 Service temporarily unavailable: MAINTENANCE, STORE_BUSY, STORE_UNAVAILABLE or UPSTREAM.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Retry-AfterMinimum delay in seconds before retrying, when present. Some dependency failures omit this header; use exponential backoff with jitter.
Error envelope, see Errors.
default Other API error. Inspect the HTTP status and error envelope; request parsing can return 400, 413 or 415.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.

Example request · cURL

Uses the variables from Getting started. Replace sample IDs and configuration values with your own.

curl --silent --show-error --include --request POST "$API_BASE_URL/servers/srv_01J8Z3M4N5P6Q7R8S9T0V1W2X3/backups/7/restore" \
  --header "Authorization: Bearer $API_KEY"

Example 202 response

{
  "task": {
    "id": 90212,
    "action": "vm-restore",
    "status": "pending"
  }
}

Tasks

GET /v1/tasks/{id}

Retrieve a task

Returns a task associated with a server in the authenticated account. Task IDs are integers; server IDs are strings. done indicates success, failed or canceled is unsuccessful, and pending or running is incomplete. Poll at intervals of five seconds or longer. action is the platform task name and can differ from the submitted action, for example vm-restart for reboot.

Parameters

idpath, requiredinteger minimum 1
Task identifier returned by an asynchronous operation.

Responses

200 Task details.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
taskrequired
idrequiredinteger nullable
Task identifier for polling, or null when the operation returned no task.
actionrequiredstring
Operation performed by this task.
statusrequiredstring
Task status: pending or running is incomplete; done is success; failed or canceled is unsuccessful. Treat unknown values as unresolved.
server_idoptionalstring
Associated server ID, included when retrieving a task.
401 Authentication failed. The API key is missing, invalid or revoked, or API access is not approved.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
WWW-AuthenticateBearer authentication challenge.
Error envelope, see Errors.
403 NETWORK_RESTRICTED: the request source is outside this deployment's approved IP networks.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
404 Task not found in this account.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
429 Rate limit exceeded. See Retry-After before retrying.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Retry-AfterMinimum delay in seconds before retrying, when present. Some dependency failures omit this header; use exponential backoff with jitter.
Error envelope, see Errors.
500 INTERNAL: unexpected server error. Retain X-Request-Id for support; resolve the outcome before repeating a write.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
503 Service temporarily unavailable: MAINTENANCE, STORE_BUSY, STORE_UNAVAILABLE or UPSTREAM.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Retry-AfterMinimum delay in seconds before retrying, when present. Some dependency failures omit this header; use exponential backoff with jitter.
Error envelope, see Errors.
default Other API error. Inspect the HTTP status and error envelope; request parsing can return 400, 413 or 415.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.

Example request · cURL

Uses the variables from Getting started. Replace sample IDs and configuration values with your own.

curl --silent --show-error --include --request GET "$API_BASE_URL/tasks/90210" \
  --header "Authorization: Bearer $API_KEY"

Example 200 response

{
  "task": {
    "id": 90210,
    "action": "vm-restart",
    "status": "done",
    "server_id": "srv_01J8Z3M4N5P6Q7R8S9T0V1W2X3"
  }
}

Events

GET /v1/events

List events

Returns account events in ascending ID order. Use after to resume from the last processed event. Webhook test events are excluded. Poll at intervals of 10 seconds or longer, or use webhooks for delivery and this endpoint for recovery.

Parameters

afterqueryinteger minimum 0
Return events with an ID greater than this cursor.
typequeryapi_access.requested api_access.reviewed api_access.migrated api_key.issued api_key.revoked server.requested server.provisioning server.active server.ssh_ready server.provision_failed server.create_ambiguous server.destroy_requested server.destroyed server.destroy_failed server.action server.rebuild_requested server.rebuilt server.rebuild_failed server.updated server.suspended server.unsuspended server.orphaned server.adopted backup.requested backup.restore_requested backup.deleted partner.suspended partner.unsuspended partner.frozen partner.unfrozen partner.billed webhook.test
Filter by event type.
limitqueryinteger minimum 1, maximum 100, default 50
Maximum number of events to return.

Responses

200 Event list.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
eventsrequiredarray of
idrequiredinteger
Event identifier. Use for deduplication and pagination.
typerequiredapi_access.requested api_access.reviewed api_access.migrated api_key.issued api_key.revoked server.requested server.provisioning server.active server.ssh_ready server.provision_failed server.create_ambiguous server.destroy_requested server.destroyed server.destroy_failed server.action server.rebuild_requested server.rebuilt server.rebuild_failed server.updated server.suspended server.unsuspended server.orphaned server.adopted backup.requested backup.restore_requested backup.deleted partner.suspended partner.unsuspended partner.frozen partner.unfrozen partner.billed webhook.test
atrequiredstring date-time
server_idrequiredstring nullable
datarequiredobject
next_afterrequiredinteger nullable
401 Authentication failed. The API key is missing, invalid or revoked, or API access is not approved.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
WWW-AuthenticateBearer authentication challenge.
Error envelope, see Errors.
403 NETWORK_RESTRICTED: the request source is outside this deployment's approved IP networks.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
422 Invalid query or unknown event type.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
429 Rate limit exceeded. See Retry-After before retrying.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Retry-AfterMinimum delay in seconds before retrying, when present. Some dependency failures omit this header; use exponential backoff with jitter.
Error envelope, see Errors.
500 INTERNAL: unexpected server error. Retain X-Request-Id for support; resolve the outcome before repeating a write.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
503 Service temporarily unavailable: MAINTENANCE, STORE_BUSY, STORE_UNAVAILABLE or UPSTREAM.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Retry-AfterMinimum delay in seconds before retrying, when present. Some dependency failures omit this header; use exponential backoff with jitter.
Error envelope, see Errors.
default Other API error. Inspect the HTTP status and error envelope; request parsing can return 400, 413 or 415.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.

Example request · cURL

Uses the variables from Getting started. Replace sample IDs and configuration values with your own.

curl --silent --show-error --include --request GET "$API_BASE_URL/events" \
  --header "Authorization: Bearer $API_KEY"

Example 200 response

{
  "events": [
    {
      "id": 1042,
      "type": "server.active",
      "at": "2026-09-09T00:00:30.000Z",
      "server_id": "srv_01J8Z3M4N5P6Q7R8S9T0V1W2X3",
      "data": {
        "ipv4": "203.0.113.10",
        "seconds_since_request": 30
      }
    }
  ],
  "next_after": null
}

Webhooks

GET /v1/webhook

Retrieve webhook configuration

Returns the destination URL and configuration timestamp, or null when delivery is disabled. The signing secret is not returned.

Responses

200 Webhook configuration.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
webhookrequired
urlrequiredstring
configured_atrequiredstring date-time
nullable
401 Authentication failed. The API key is missing, invalid or revoked, or API access is not approved.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
WWW-AuthenticateBearer authentication challenge.
Error envelope, see Errors.
403 NETWORK_RESTRICTED: the request source is outside this deployment's approved IP networks.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
429 Rate limit exceeded. See Retry-After before retrying.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Retry-AfterMinimum delay in seconds before retrying, when present. Some dependency failures omit this header; use exponential backoff with jitter.
Error envelope, see Errors.
500 INTERNAL: unexpected server error. Retain X-Request-Id for support; resolve the outcome before repeating a write.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
503 Service temporarily unavailable: MAINTENANCE, STORE_BUSY, STORE_UNAVAILABLE or UPSTREAM.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Retry-AfterMinimum delay in seconds before retrying, when present. Some dependency failures omit this header; use exponential backoff with jitter.
Error envelope, see Errors.
default Other API error. Inspect the HTTP status and error envelope; request parsing can return 400, 413 or 415.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.

Example request · cURL

Uses the variables from Getting started. Replace sample IDs and configuration values with your own.

curl --silent --show-error --include --request GET "$API_BASE_URL/webhook" \
  --header "Authorization: Bearer $API_KEY"

Example 200 response

{
  "webhook": {
    "url": "https://hooks.example.com/infra",
    "configured_at": "2026-09-10T00:00:00.000Z"
  }
}

PUT /v1/webhook

Update webhook configuration

Sets or disables the destination URL. Every request with a non-null URL rotates the signing secret, including requests that repeat the existing URL. The new secret is returned once. Pending deliveries are cancelled; recover missed events through GET /v1/events. This operation is not safe to retry automatically.

Request body

urlrequiredstring maximum 512 characters, minimum 12 characters nullable
HTTPS URL with a public hostname. IP addresses, embedded credentials and private destinations are rejected. Set to null to disable delivery.

Responses

200 Webhook configuration updated.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
webhookrequired
urlrequiredstring
secretrequiredstring
Shown once
noterequiredstring
nullable
dead_letteredrequiredinteger
401 Authentication failed. The API key is missing, invalid or revoked, or API access is not approved.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
WWW-AuthenticateBearer authentication challenge.
Error envelope, see Errors.
403 NETWORK_RESTRICTED: the request source is outside this deployment's approved IP networks.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
409 CONFLICT: the account changed concurrently.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
422 Destination URL rejected.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
429 Rate limit exceeded. See Retry-After before retrying.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Retry-AfterMinimum delay in seconds before retrying, when present. Some dependency failures omit this header; use exponential backoff with jitter.
Error envelope, see Errors.
500 INTERNAL: unexpected server error. Retain X-Request-Id for support; resolve the outcome before repeating a write.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
503 Service temporarily unavailable: MAINTENANCE, STORE_BUSY, STORE_UNAVAILABLE or UPSTREAM.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Retry-AfterMinimum delay in seconds before retrying, when present. Some dependency failures omit this header; use exponential backoff with jitter.
Error envelope, see Errors.
default Other API error. Inspect the HTTP status and error envelope; request parsing can return 400, 413 or 415.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.

Example request · cURL

Uses the variables from Getting started. Replace sample IDs and configuration values with your own.

curl --silent --show-error --include --request PUT "$API_BASE_URL/webhook" \
  --header "Authorization: Bearer $API_KEY" \
  --header "Content-Type: application/json" \
  --data '{
  "url": "https://hooks.example.com/infra"
}'
Disable webhook delivery
curl --silent --show-error --include --request PUT "$API_BASE_URL/webhook" \
  --header "Authorization: Bearer $API_KEY" \
  --header "Content-Type: application/json" \
  --data '{
  "url": null
}'

Example 200 response

{
  "webhook": {
    "url": "https://hooks.example.com/infra",
    "secret": "whsec_example_not_a_valid_secret",
    "note": "secret shown once; queued deliveries were dead-lettered, replay via /v1/events"
  },
  "dead_lettered": 0
}

POST /v1/webhook/test

Send a test webhook

Attempts one synchronous delivery of a signed webhook.test event. HTTP 200 indicates the test ran; inspect ok and status for the delivery result. Response bodies from the destination are not returned.

Responses

200 Delivery result. status is the destination's HTTP status, or 0 for a connection failure.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
statusrequiredinteger
latency_msrequiredinteger
okrequiredboolean
erroroptionalstring
401 Authentication failed. The API key is missing, invalid or revoked, or API access is not approved.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
WWW-AuthenticateBearer authentication challenge.
Error envelope, see Errors.
403 NETWORK_RESTRICTED: the request source is outside this deployment's approved IP networks.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
409 CONFLICT: no webhook configured.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
429 Rate limit exceeded. See Retry-After before retrying.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Retry-AfterMinimum delay in seconds before retrying, when present. Some dependency failures omit this header; use exponential backoff with jitter.
Error envelope, see Errors.
500 INTERNAL: unexpected server error. Retain X-Request-Id for support; resolve the outcome before repeating a write.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
503 Service temporarily unavailable: MAINTENANCE, STORE_BUSY, STORE_UNAVAILABLE or UPSTREAM.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Retry-AfterMinimum delay in seconds before retrying, when present. Some dependency failures omit this header; use exponential backoff with jitter.
Error envelope, see Errors.
default Other API error. Inspect the HTTP status and error envelope; request parsing can return 400, 413 or 415.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.

Example request · cURL

Uses the variables from Getting started. Replace sample IDs and configuration values with your own.

curl --silent --show-error --include --request POST "$API_BASE_URL/webhook/test" \
  --header "Authorization: Bearer $API_KEY"

Example 200 response

{
  "status": 204,
  "latency_ms": 82,
  "ok": true
}

Billing

GET /v1/usage

Retrieve monthly usage

Returns billable hours and charges by plan for a billing month. Rates, caps and discount calculations follow the account's price book.

Parameters

monthquerystring
Pattern^\d{4}-(0[1-9]|1[0-2])$
Billing month in YYYY-MM format. Defaults to the current month in the billing timezone.

Responses

200 Monthly usage.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
monthrequiredstring
as_ofrequiredstring date-time
plansrequiredarray of
discount_basisoptionalvm_months_per_plan allocated_per_plan allocated_combined
current_tieroptional
qualifying_countrequiredinteger
Allocated server count used to select this rate.
monthly_pricerequiredstring
Monthly price at this allocation count.
hourly_pricerequiredstring
Displayed hourly rate at this allocation count; use returned charges for billing totals.
next_from_countrequiredinteger nullable
Next discount threshold, or null when there is no higher tier.
period_segmentsoptionalarray of
fromrequiredstring date-time
torequiredstring date-time
qualifying_countrequiredinteger
monthly_pricerequiredstring
hourly_pricerequiredstring
hoursrequiredinteger
charge_numeratorrequiredstring
Exact charge numerator: monthly price in cents multiplied by billed hours. Divide by 672 for cents. Sum numerators before rounding the plan total.
subtotalrequiredstring
Rounded display amount for this segment; independently rounded segments may not sum to the final plan amount.
coderequiredstring
hoursrequirednumber
capped_hoursrequirednumber
vm_monthsrequirednumber
Capped hours divided by 672, to four decimals. Used for tier selection with vm_months_per_plan; allocation-based pricing uses charges recorded for each hour.
monthly_pricerequiredstring
Monthly price at the selected VM-month tier, or current allocation-count tier. It does not reprice historical allocated usage.
hourly_pricerequiredstring
Displayed hourly rate at the same tier. Use amount for the period's charge.
amountrequiredstring
tieroptional
hoursrequirednumber
vm_monthsrequirednumber
from_vm_monthsrequirednumber
monthly_pricerequiredstring
nextrequired
from_vm_monthsrequirednumber
monthly_pricerequiredstring
nullable
nullable
totalrequiredstring
401 Authentication failed. The API key is missing, invalid or revoked, or API access is not approved.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
WWW-AuthenticateBearer authentication challenge.
Error envelope, see Errors.
403 NETWORK_RESTRICTED: the request source is outside this deployment's approved IP networks.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
422 Invalid month parameter.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
429 Rate limit exceeded. See Retry-After before retrying.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Retry-AfterMinimum delay in seconds before retrying, when present. Some dependency failures omit this header; use exponential backoff with jitter.
Error envelope, see Errors.
500 INTERNAL: unexpected server error. Retain X-Request-Id for support; resolve the outcome before repeating a write.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
503 Service temporarily unavailable: MAINTENANCE, STORE_BUSY, STORE_UNAVAILABLE or UPSTREAM.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Retry-AfterMinimum delay in seconds before retrying, when present. Some dependency failures omit this header; use exponential backoff with jitter.
Error envelope, see Errors.
default Other API error. Inspect the HTTP status and error envelope; request parsing can return 400, 413 or 415.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.

Example request · cURL

Uses the variables from Getting started. Replace sample IDs and configuration values with your own.

curl --silent --show-error --include --request GET "$API_BASE_URL/usage" \
  --header "Authorization: Bearer $API_KEY" \
  --get \
  --data-urlencode 'month=2026-09'

Example 200 response

{
  "month": "2026-09",
  "as_of": "2026-09-10T00:00:00.000Z",
  "plans": [
    {
      "code": "standard-2",
      "hours": 24,
      "capped_hours": 24,
      "vm_months": 0.0357,
      "monthly_price": "67.20",
      "hourly_price": "0.1000",
      "amount": "2.40"
    }
  ],
  "total": "2.40"
}

GET /v1/servers/{id}/usage

Retrieve server usage

Returns daily billable hours and the monthly charge for one server. closed indicates that a daily usage record is finalized.

Parameters

idpath, requiredstring
Server identifier returned by the API.
monthquerystring
Pattern^\d{4}-(0[1-9]|1[0-2])$
Billing month in YYYY-MM format. Defaults to the current month in the billing timezone.

Responses

200 Server usage.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
usagerequired
discount_basisoptionalvm_months_per_plan allocated_per_plan allocated_combined
current_tieroptional
qualifying_countrequiredinteger
Allocated server count used to select this rate.
monthly_pricerequiredstring
Monthly price at this allocation count.
hourly_pricerequiredstring
Displayed hourly rate at this allocation count; use returned charges for billing totals.
next_from_countrequiredinteger nullable
Next discount threshold, or null when there is no higher tier.
server_idrequiredstring
monthrequiredstring
planrequiredstring
daysrequiredarray of
dayrequiredstring
hoursrequirednumber
closedrequiredboolean
amountoptionalstring
period_segmentsoptionalarray of
fromrequiredstring date-time
torequiredstring date-time
qualifying_countrequiredinteger
monthly_pricerequiredstring
hourly_pricerequiredstring
hoursrequiredinteger
charge_numeratorrequiredstring
Exact charge numerator: monthly price in cents multiplied by billed hours. Divide by 672 for cents. Sum numerators before rounding the plan total.
subtotalrequiredstring
Rounded display amount for this segment; independently rounded segments may not sum to the final plan amount.
hoursrequirednumber
capped_hoursrequirednumber
hourly_pricerequiredstring
monthly_priceoptionalstring
Monthly price at the current allocation-count tier; present for allocation-based pricing.
amountrequiredstring
401 Authentication failed. The API key is missing, invalid or revoked, or API access is not approved.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
WWW-AuthenticateBearer authentication challenge.
Error envelope, see Errors.
403 NETWORK_RESTRICTED: the request source is outside this deployment's approved IP networks.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
404 Server not found.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
422 Invalid month parameter.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
429 Rate limit exceeded. See Retry-After before retrying.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Retry-AfterMinimum delay in seconds before retrying, when present. Some dependency failures omit this header; use exponential backoff with jitter.
Error envelope, see Errors.
500 INTERNAL: unexpected server error. Retain X-Request-Id for support; resolve the outcome before repeating a write.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
503 Service temporarily unavailable: MAINTENANCE, STORE_BUSY, STORE_UNAVAILABLE or UPSTREAM.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Retry-AfterMinimum delay in seconds before retrying, when present. Some dependency failures omit this header; use exponential backoff with jitter.
Error envelope, see Errors.
default Other API error. Inspect the HTTP status and error envelope; request parsing can return 400, 413 or 415.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.

Example request · cURL

Uses the variables from Getting started. Replace sample IDs and configuration values with your own.

curl --silent --show-error --include --request GET "$API_BASE_URL/servers/srv_01J8Z3M4N5P6Q7R8S9T0V1W2X3/usage" \
  --header "Authorization: Bearer $API_KEY" \
  --get \
  --data-urlencode 'month=2026-09'

Example 200 response

{
  "usage": {
    "server_id": "srv_01J8Z3M4N5P6Q7R8S9T0V1W2X3",
    "month": "2026-09",
    "plan": "standard-2",
    "days": [
      {
        "day": "2026-09-09",
        "hours": 24,
        "closed": true
      }
    ],
    "hours": 24,
    "capped_hours": 24,
    "hourly_price": "0.1000",
    "amount": "2.40"
  }
}

GET /v1/billing/estimate

Retrieve a billing estimate

Returns month-to-date charges, a month-end projection and the next invoice estimate. The projection assumes the current fleet remains allocated until month end with no server creations or deletions. Use next_invoice.issued_on and due_on for the invoice dates.

Responses

200 Billing estimate.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
estimaterequired
discount_basisoptionalvm_months_per_plan allocated_per_plan allocated_combined
periodrequiredstring
as_ofrequiredstring date-time
month_to_daterequired
hoursrequirednumber
amountrequiredstring
projected_month_endrequired
amountrequiredstring
assumesrequiredstring
next_invoicerequired
monthrequiredstring
amountrequiredstring
issued_onrequiredstring
due_onrequiredstring
per_planrequiredarray of
discount_basisoptionalvm_months_per_plan allocated_per_plan allocated_combined
current_tieroptional
qualifying_countrequiredinteger
Allocated server count used to select this rate.
monthly_pricerequiredstring
Monthly price at this allocation count.
hourly_pricerequiredstring
Displayed hourly rate at this allocation count; use returned charges for billing totals.
next_from_countrequiredinteger nullable
Next discount threshold, or null when there is no higher tier.
period_segmentsoptionalarray of
fromrequiredstring date-time
torequiredstring date-time
qualifying_countrequiredinteger
monthly_pricerequiredstring
hourly_pricerequiredstring
hoursrequiredinteger
charge_numeratorrequiredstring
Exact charge numerator: monthly price in cents multiplied by billed hours. Divide by 672 for cents. Sum numerators before rounding the plan total.
subtotalrequiredstring
Rounded display amount for this segment; independently rounded segments may not sum to the final plan amount.
coderequiredstring
hoursrequirednumber
capped_hoursrequirednumber
vm_monthsrequirednumber
month_to_daterequiredstring
amountoptionalstring
Accrued amount for allocation-based pricing; equal to month_to_date. Use month_to_date consistently across pricing modes.
projectedrequiredstring
hourly_pricerequiredstring
monthly_pricerequiredstring
tieroptional
hoursrequirednumber
vm_monthsrequirednumber
from_vm_monthsrequirednumber
monthly_pricerequiredstring
nextrequired
from_vm_monthsrequirednumber
monthly_pricerequiredstring
nullable
nullable
per_serverrequiredarray of
idrequiredstring
namerequiredstring nullable
planrequiredstring
hourly_pricerequiredstring
hoursrequirednumber
month_to_daterequiredstring
projectedrequiredstring
401 Authentication failed. The API key is missing, invalid or revoked, or API access is not approved.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
WWW-AuthenticateBearer authentication challenge.
Error envelope, see Errors.
403 NETWORK_RESTRICTED: the request source is outside this deployment's approved IP networks.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
429 Rate limit exceeded. See Retry-After before retrying.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Retry-AfterMinimum delay in seconds before retrying, when present. Some dependency failures omit this header; use exponential backoff with jitter.
Error envelope, see Errors.
500 INTERNAL: unexpected server error. Retain X-Request-Id for support; resolve the outcome before repeating a write.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.
503 Service temporarily unavailable: MAINTENANCE, STORE_BUSY, STORE_UNAVAILABLE or UPSTREAM.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Retry-AfterMinimum delay in seconds before retrying, when present. Some dependency failures omit this header; use exponential backoff with jitter.
Error envelope, see Errors.
default Other API error. Inspect the HTTP status and error envelope; request parsing can return 400, 413 or 415.

Response headers

X-Request-IdRequest identifier. Include this value when contacting support.
Error envelope, see Errors.

Example request · cURL

Uses the variables from Getting started. Replace sample IDs and configuration values with your own.

curl --silent --show-error --include --request GET "$API_BASE_URL/billing/estimate" \
  --header "Authorization: Bearer $API_KEY"

Example 200 response

{
  "estimate": {
    "period": "2026-09",
    "as_of": "2026-09-10T00:00:00.000Z",
    "month_to_date": {
      "hours": 24,
      "amount": "2.40"
    },
    "projected_month_end": {
      "amount": "52.80",
      "assumes": "current servers run to month end, no creates or destroys"
    },
    "next_invoice": {
      "month": "2026-09",
      "amount": "52.80",
      "issued_on": "2026-10-01",
      "due_on": "2026-10-01"
    },
    "per_plan": [
      {
        "code": "standard-2",
        "hours": 24,
        "capped_hours": 24,
        "vm_months": 0.0357,
        "monthly_price": "67.20",
        "hourly_price": "0.1000",
        "month_to_date": "2.40",
        "projected": "52.80"
      }
    ],
    "per_server": [
      {
        "id": "srv_01J8Z3M4N5P6Q7R8S9T0V1W2X3",
        "name": "web-01",
        "plan": "standard-2",
        "hourly_price": "0.1000",
        "hours": 24,
        "month_to_date": "2.40",
        "projected": "52.80"
      }
    ]
  }
}