Build with the VxCloud API & CLI
Everything the dashboard does, you can do from your terminal or your code. Provision VMs and Docker stacks, query the audit log, manage tenant nodes, and stream deployment progress over WebSockets — all through one REST surface and one Go binary called vxcli.
$ vxcli auth login -k xc_live_… ✓ token resolved · node = node1.prodxcloud.com $ vxcli deploy --app my-api --cloud aws \ --service ec2 --region us-east-1 ▸ session adc2d5c4-… queued ▸ [10%] cloning repo ▸ [40%] terraform apply ▸ [85%] systemd unit started ✓ [100%] my-api live at https://54.183.21.5
120+
REST endpoints
< 50ms
p50 control-plane latency
Go
Single static CLI binary
OpenAPI
Spec-first, machine-readable
What we ship
API-first, no SDK churn
Every dashboard feature is a thin wrapper over a documented REST endpoint. The same endpoints are available to your scripts, CI jobs, and automation tooling.
REST API
Full REST surface for provisioning, deploys, sessions, audit, and tenant nodes. Bearer-token auth with API keys.
GET / POST / PATCH / DELETE
WebSocket streams
Real-time deployment progress, audit events, and session status — perfect for dashboards and incident bots.
wss://api.prodxcloud.com/ws
vxcli (Go binary)
One static binary: deploy, apply, sessions, pull, doctor, init. Same surface the dashboard uses, scriptable from CI.
curl -fsSL https://vxcloud.io/download/cli/install.sh | sh
API keys
Live, dev, and test keys (xc_live_*, xc_dev_*, xc_test_*) with scope, expiry, and rotation. Keys exchange for short-lived JWTs.
xc_live_… · xc_dev_… · xc_test_…
Webhooks
Subscribe to deployment, audit, and resource events. Signed payloads, replay protection, retry with exponential backoff.
HMAC-SHA256 · idempotent
Audit API
Query the append-only audit log for SIEM ingestion. JSON or NDJSON streaming, hash-chained for tamper detection.
NDJSON · hash-chained
Heads up: we deliberately don't publish language SDKs. The REST surface is small enough that any HTTP client works, and pinning to a hand-written SDK creates more maintenance churn than it removes. If you want a typed client, we'll point you at our OpenAPI spec — generate your own in 30 seconds.
Quick start
Five lines from API key to running VM
That's the whole loop. The CLI handles auth, tenant-node resolution, terraform, and SSH provisioning under the hood — or call the same endpoints over REST.
# 1. Sign in (exchanges API key → JWT, picks your tenant node)
vxcli auth login -u joelwembo -k xc_live_…
# 2. Verify the CLI resolved your node
vxcli node current
# 3. Create a workspace bound to that node
vxcli init my-project && cd my-project
# 4. Preview a deploy without executing
vxcli deploy --app my-api --cloud aws --service ec2 \
--region us-east-1 --env development --dry-run
# 5. Ship it
vxcli deploy --app my-api --cloud aws --service ec2 \
--region us-east-1 --env developmentHow it fits
One API. One CLI. Every plane.
Your API key exchanges for a short-lived JWT, which is honored by both the control plane and the tenant nodes that own your resources. vxcli is just a transport.
- Scoped keys:
xc_live_(prod),xc_dev_(dev),xc_test_(CI). - JWTs expire in 15 minutes — vxcli rotates silently, no infinite-token risk if a binary leaks.
- Tenant nodes addressed by JWT claim, so you can't accidentally hit someone else's control plane.
API key
xc_live_… (long-lived, scoped)
JWT (15-min TTL)
eyJhbGciOi… · auto-rotated
Control plane
api.prodxcloud.com · 120+ endpoints
Tenant node + resources
node1.prodxcloud.com · VMs / Docker / k8s
Beyond request/response
Real-time streams, signed webhooks, hash-chained audit
The control plane is event-driven. Subscribe to what matters, ignore the rest.
// Stream deployment progress in real time.
const ws = new WebSocket(
'wss://api.prodxcloud.com/ws/api/v3/tenant/provision/status'
);
ws.onopen = () => ws.send(JSON.stringify({
type: 'subscribe',
session_id: 'adc2d5c4-0b4e-4ff6-b351-106200b1cdf6',
token: 'eyJhbGciOi…',
}));
ws.onmessage = (e) => {
const ev = JSON.parse(e.data);
console.log(`[${ev.progress}%] ${ev.status}`);
// [10%] cloning repo
// [40%] running terraform apply
// [85%] systemd unit started
// [100%] deployment complete
};FAQ
Questions developers ask first
Ship the loop, not the boilerplate
One API key. One static binary. Every plane the dashboard touches, exposed and documented.