Developer documentation
Zelvor Cloud API reference
A single REST API for everything in the console - cloud servers, virtual machines, containers, databases, DNS and billing. HTTPS-only, JSON in and out, one predictable rate limit. Base URL https://api.zelvorcloud.net/v2.
Introduction
The Zelvor Cloud API is a JSON REST API served over HTTPS from https://api.zelvorcloud.net/v2. Every resource you see in the console - servers, VMs, containers, managed databases, DNS zones, load balancers, firewalls, volumes and billing - is reachable through the same API and the same token.
Conventions used throughout this reference:
- All requests and responses use
application/json. SendContent-Type: application/jsonon any request with a body. - IDs are opaque strings prefixed by type, for example
srv-8f21ac90,db-1a2b3corzone-9k2f1. - Timestamps are ISO 8601 in UTC (for example
2026-07-03T14:22:05Z). Money is always USD. - List endpoints are paginated with page and per_page (max 200) and return a
metablock with the total count. - Standard HTTP status codes:
200/201success,202accepted (async action),401bad token,404not found,422validation error,429rate limited.
Regions
Resources are created in one of eight regions. Pass the region id (not the city) wherever a region field is expected.
| Region ID | Location | Continent |
|---|
Authentication
The API authenticates with a personal access token sent as a Bearer credential in the Authorization header. Live tokens are prefixed hxc_live_; test tokens are prefixed hxc_test_. Create and revoke tokens under Settings → API tokens in the console.
Every request must be made over HTTPS and must include the header. A request without a valid token returns 401 Unauthorized.
curl https://api.zelvorcloud.net/v2/account \ -H "Authorization: Bearer hxc_live_7Qb1F2xR9m4KpZ0aWc8Ln3Vt" \ -H "Content-Type: application/json"
A successful call returns the account that owns the token:
{
"account": {
"id": "acct-4c19d0",
"name": "Northstar Labs",
"email": "jordan@northstar-labs.com",
"plan": "Team",
"default_region": "us-east-1",
"billing_currency": "USD",
"mfa_enabled": true
}
}
read or read/write, never commit them to source control, and rotate them from the console if one leaks. The token above is a fake placeholder.
Quickstart - deploy a server
This walkthrough deploys a Standard cloud server (4 vCPU / 8 GB) running Ubuntu 24.04 in us-east-1, then polls until it is running. It is the API equivalent of the deploy wizard in the console.
1. Create the server
curl -X POST https://api.zelvorcloud.net/v2/servers \
-H "Authorization: Bearer hxc_live_7Qb1F2xR9m4KpZ0aWc8Ln3Vt" \
-H "Content-Type: application/json" \
-d '{
"name": "web-prod-03",
"region": "us-east-1",
"plan": "standard",
"image": "ubuntu-24",
"ssh_keys": ["key-1a2b3"],
"backups": true,
"tags": ["web", "prod"]
}'
Zelvor responds 201 Created with the new server. It starts in provisioning and typically reaches running in under a minute:
{
"server": {
"id": "srv-8f21ac90",
"name": "web-prod-03",
"status": "provisioning",
"region": "us-east-1",
"plan": "standard",
"vcpu": 4,
"ram_gb": 8,
"ssd_gb": 160,
"image": "ubuntu-24",
"ipv4": "203.0.113.42",
"ipv6": "2604:a880:2:d0::142:1",
"backups": true,
"tags": ["web", "prod"],
"created_at": "2026-07-03T14:22:05Z"
}
}
2. Poll until it is running
curl https://api.zelvorcloud.net/v2/servers/srv-8f21ac90 \ -H "Authorization: Bearer hxc_live_7Qb1F2xR9m4KpZ0aWc8Ln3Vt" # once "status" is "running", SSH in: ssh root@203.0.113.42
That is the whole loop: create, poll, connect. Everything else in this reference follows the same pattern.
Servers
Cloud servers are NVMe-backed VPS instances. Sizes map to the plans (nano … xxl) or you can pass explicit vcpu, ram_gb and ssd_gb for a custom size.
/v2/serversList all servers/v2/serversDeploy a new server/v2/servers/{id}Retrieve one server/v2/servers/{id}/actionsPower / reboot / resize / snapshot/v2/servers/{id}Destroy a serverRequest parameters (POST /v2/servers)
| Field | Type | Description |
|---|---|---|
| name | string | Required. Hostname, e.g. web-prod-03. |
| region | string | Required. A region ID such as us-east-1. |
| plan | string | Plan ID (nano…xxl). Omit to pass a custom size. |
| image | string | Required. OS or 1-click app, e.g. ubuntu-24, app-docker. |
| ssh_keys | array | Optional. SSH key IDs to inject at boot. |
| backups | boolean | Optional. Enable automated daily backups (+20% of plan). |
| tags | array | Optional. Free-form labels for organizing and targeting. |
Actions
Power and lifecycle operations use POST /v2/servers/{id}/actions with a type of power_on, power_off, reboot, resize or snapshot. Async actions return 202 Accepted with an action you can poll.
curl -X POST https://api.zelvorcloud.net/v2/servers/srv-8f21ac90/actions \
-H "Authorization: Bearer hxc_live_7Qb1F2xR9m4KpZ0aWc8Ln3Vt" \
-H "Content-Type: application/json" \
-d '{ "type": "reboot" }'
List response
{
"servers": [
{
"id": "srv-8f21ac90",
"name": "web-prod-01",
"status": "running",
"region": "us-east-1",
"plan": "standard",
"vcpu": 4,
"ram_gb": 8,
"ssd_gb": 160,
"ipv4": "203.0.110.12",
"backups": true,
"tags": ["web", "prod"],
"created_at": "2026-05-04T09:11:00Z"
},
{
"id": "srv-2b7de114",
"name": "worker-queue-01",
"status": "running",
"region": "us-east-1",
"plan": "small",
"vcpu": 2,
"ram_gb": 4,
"ssd_gb": 80,
"ipv4": "203.0.113.19",
"backups": false,
"tags": ["worker"],
"created_at": "2026-05-22T17:40:00Z"
}
],
"meta": { "total": 12, "page": 1, "per_page": 50 }
}
Databases
Managed databases run PostgreSQL, MySQL or Redis with optional high availability and read replicas. Connection strings and credentials are returned masked on list endpoints and in full only on the create response and the dedicated credentials call.
/v2/databasesList database clusters/v2/databasesProvision a cluster/v2/databases/{id}Retrieve one cluster/v2/databases/{id}/replicasAdd a read replica/v2/databases/{id}Destroy a clustercurl -X POST https://api.zelvorcloud.net/v2/databases \
-H "Authorization: Bearer hxc_live_7Qb1F2xR9m4KpZ0aWc8Ln3Vt" \
-H "Content-Type: application/json" \
-d '{
"name": "orders-prod",
"engine": "postgres",
"version": "16",
"size": "plus",
"region": "us-east-1",
"high_availability": true
}'
{
"database": {
"id": "db-1a2b3c",
"name": "orders-prod",
"engine": "postgres",
"version": "16",
"size": "plus",
"region": "us-east-1",
"status": "provisioning",
"high_availability": true,
"nodes": 3,
"connection": {
"host": "orders-prod.db.zelvorcloud.net",
"port": 5432,
"user": "zelvor_admin",
"database": "defaultdb",
"ssl_mode": "require",
"uri": "postgres://zelvor_admin:*****@orders-prod.db.zelvorcloud.net:5432/defaultdb?sslmode=require"
},
"storage_gb": 100,
"created_at": "2026-07-03T14:26:40Z"
}
}
DNS
Managed DNS organizes records into zones, one per domain. Records are validated on write - an A record must carry a valid IPv4 address, an MX record a priority and target, and so on. Changes propagate to Zelvor nameservers within seconds.
/v2/dns/zonesList zones (domains)/v2/dns/zones/{id}/recordsList records in a zone/v2/dns/zones/{id}/recordsCreate a record/v2/dns/zones/{id}/records/{recordId}Delete a recordcurl -X POST https://api.zelvorcloud.net/v2/dns/zones/zone-9k2f1/records \
-H "Authorization: Bearer hxc_live_7Qb1F2xR9m4KpZ0aWc8Ln3Vt" \
-H "Content-Type: application/json" \
-d '{
"type": "A",
"name": "api",
"value": "203.0.112.19",
"ttl": 300
}'
{
"zone": { "id": "zone-9k2f1", "domain": "northstar-labs.com" },
"records": [
{ "id": "r-a1b2c3", "type": "A", "name": "@", "value": "203.0.110.12", "ttl": 3600 },
{ "id": "r-d4e5f6", "type": "A", "name": "www", "value": "203.0.110.12", "ttl": 3600 },
{ "id": "r-g7h8i9", "type": "A", "name": "api", "value": "203.0.112.19", "ttl": 300 },
{ "id": "r-j1k2l3", "type": "CNAME", "name": "cdn", "value": "edge.zelvorcloud.net.", "ttl": 3600 },
{ "id": "r-m4n5o6", "type": "MX", "name": "@", "value": "10 mail.northstar-labs.com.", "ttl": 3600 },
{ "id": "r-p7q8r9", "type": "TXT", "name": "@", "value": "v=spf1 include:_spf.zelvorcloud.net ~all", "ttl": 3600 }
],
"meta": { "total": 6 }
}
Rate limits
The API is rate limited per token on a rolling one-minute window. Every response includes the current budget in its headers so you can back off gracefully:
X-RateLimit-Limit- requests allowed per minute for your tier.X-RateLimit-Remaining- requests left in the current window.X-RateLimit-Reset- Unix time when the window resets.
Exceeding the limit returns 429 Too Many Requests with a Retry-After header. Limits are illustrative for this concept demo:
| Account tier | Requests / minute | Burst |
|---|---|---|
| Free | 60 | 90 |
| Team | 300 | 450 |
| Business | 1,200 | 1,800 |
| Enterprise | 5,000 | Custom |
429, honor Retry-After and use exponential backoff with jitter. Batch list reads with per_page rather than paging one item at a time.
Ready to try it?
The full console runs right here in your browser - create a token under Settings, then deploy a server, add a DNS record or spin up a database. Nothing to install.
Launch the console →