ZelvorCloud

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.

Open the console → Jump to quickstart

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. Send Content-Type: application/json on any request with a body.
  • IDs are opaque strings prefixed by type, for example srv-8f21ac90, db-1a2b3c or zone-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 meta block with the total count.
  • Standard HTTP status codes: 200/201 success, 202 accepted (async action), 401 bad token, 404 not found, 422 validation error, 429 rate limited.
This is a concept demo for a fictional company. The hostnames, tokens and IDs below are illustrative and do not resolve to a live service - but the shapes match the resources you can create in the interactive console.

Regions

Resources are created in one of eight regions. Pass the region id (not the city) wherever a region field is expected.

Region IDLocationContinent

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.

Authenticated request - curl
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:

200 OK - application/json
{
  "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
  }
}
Treat tokens like passwords. Scope them 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

POST /v2/servers - curl
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:

201 Created - application/json
{
  "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

GET /v2/servers/{id} - curl
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 (nanoxxl) or you can pass explicit vcpu, ram_gb and ssd_gb for a custom size.

GET/v2/serversList all servers
POST/v2/serversDeploy a new server
GET/v2/servers/{id}Retrieve one server
POST/v2/servers/{id}/actionsPower / reboot / resize / snapshot
DELETE/v2/servers/{id}Destroy a server

Request parameters (POST /v2/servers)

FieldTypeDescription
namestringRequired. Hostname, e.g. web-prod-03.
regionstringRequired. A region ID such as us-east-1.
planstringPlan ID (nanoxxl). Omit to pass a custom size.
imagestringRequired. OS or 1-click app, e.g. ubuntu-24, app-docker.
ssh_keysarrayOptional. SSH key IDs to inject at boot.
backupsbooleanOptional. Enable automated daily backups (+20% of plan).
tagsarrayOptional. 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.

POST /v2/servers/{id}/actions - reboot
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

GET /v2/servers - 200 OK
{
  "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.

GET/v2/databasesList database clusters
POST/v2/databasesProvision a cluster
GET/v2/databases/{id}Retrieve one cluster
POST/v2/databases/{id}/replicasAdd a read replica
DELETE/v2/databases/{id}Destroy a cluster
POST /v2/databases - curl
curl -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
  }'
201 Created - application/json
{
  "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.

GET/v2/dns/zonesList zones (domains)
GET/v2/dns/zones/{id}/recordsList records in a zone
POST/v2/dns/zones/{id}/recordsCreate a record
DELETE/v2/dns/zones/{id}/records/{recordId}Delete a record
POST /v2/dns/zones/{id}/records - curl
curl -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
  }'
GET /v2/dns/zones/{id}/records - 200 OK
{
  "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 tierRequests / minuteBurst
Free6090
Team300450
Business1,2001,800
Enterprise5,000Custom
On a 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 →