Provision, fetch, and tear down isolated dev environments.
Every endpoint,
typed end-to-end.
REST + JSON over TLS, described by an OpenAPI 3.1 document checked into the same repo as the server code. Every release regenerates the TypeScript, Python, Go, and Rust SDKs from that spec — by definition in sync.
Bearer-token auth, Idempotency-Key on every non-idempotent write, signed webhooks for delivery, async run start with SSE for receipts. The same surface the workspace, the CLI, and the review tooling all read from. No private endpoints, no undocumented headers.
One header.
One host per env.
Bearer-token auth on the wire, Idempotency-Key on the writes, one host per environment. The same shape every example, sample, and SDK call uses internally — no SDK-only conveniences hidden behind the curtain.
Every request carries a bearer token in the Authorization header. Tokens come in two scopes — org-scoped for service-to-service traffic minted from the tenant settings panel, and user-scoped for human-in-the-loop flows minted from the workspace.
Non-idempotent endpoints — every POST that allocates real work — accept an Idempotency-Key header. Reuse the same key within 24 hours and the API returns the original 2xx body, byte-identical, without re-executing the side effect. Use a UUID per logical operation; don't reuse keys across distinct requests.
Every response carries an x-exai-receipt header pointing back to the run that produced it — every action is auditable from a single id, every retry is collapsible from a single key.
$ curl -X POST \ https://api.exai.cloud/v1/runs \ -H "Authorization: Bearer sk_live_8a3f..." \ -H "Idempotency-Key: 550e8400-e29b-41d4-a716..." \ -H "Content-Type: application/json" \ -d '{"plan_id":"pln_abc"}'
shared multi-tenant · auto-scaled
shared sandbox · resets weekly
single-tenant · region-pinned
Eight resources.
One surface.
The eight areas below mirror the eight teams behind the product. If you are wiring runs from a CI service, read Orchestrator. If you are streaming audit into Splunk, read Audit. Cross-references are inline; nothing is buried in a tree.
Plan-diff-apply review flow against a working tree.
Drive prompt-to-app generation runs end-to-end.
Run typed DAGs of agents with replayable checkpoints.
Browse the registry and register custom typed agents.
Reusable starting points for workspaces and DAGs.
Query the receipted event log and stream into your SIEM.
Subscribe to typed events and inspect signed deliveries.
A bucket per org.
A key per write.
The API is shaped to be retried. Token-bucket rate limits are measured at the gateway; idempotency is enforced at the service. Headers tell you exactly where you stand without a probe call.
Limits are token-bucket per-org and per-key, refilled continuously. Every response carries X-RateLimit-Remaining and X-RateLimit-Reset so a polite client never has to guess. When the bucket empties the API returns 429 with a Retry-After integer in seconds — back off exactly that long, no more, no less.
Long-running endpoints are async by design. A run start returns 202 Accepted with a poll URL and a server-sent-events stream — you never block on the response, you never time out a TCP connection waiting on a 30-hour DAG.
Idempotency-Key is required on every non-idempotent write. Reuse within 24 hours collapses to a single side effect; the original 2xx body is replayed byte-identical. Different body, same key, within the window? You get a 409 conflict and nothing is executed.
Per-org token-bucket. Refills continuously. Counted at the gateway, not at the service.
Per-key burst window. Drains down to default after 30 seconds. Headers report the live floor.
Run starts return 202 with a poll URL. Stream the receipt via SSE or webhook — never block on the response.
Idempotency-Key on POST collapses retries to a single side effect. Replays return the original 2xx body.
Ten codes.
One signature shape.
Errors are the same JSON envelope across the surface — code, name, message, receipt. Webhooks are signed with HMAC-SHA256 over a canonical request, verifiable in three lines of any language.
# incoming headers Webhook-Id: whk_01HV9C… Webhook-Timestamp: 1715212847 Webhook-Signature: v1=4f3ad28e… # canonical request to sign canonical = "${id}.${timestamp}.${body}" # verify (node) const sig = crypto .createHmac("sha256", secret) .update( canonical) .digest("hex"); if ( !crypto.timingSafeEqual( Buffer.from("v1=" + sig), Buffer.from(headerSig))) throw new Error("invalid signature");
Open the spec.
Generate the SDK.
142 endpoints across eight resources. Bearer-token auth on every request, Idempotency-Key on every write, signed webhooks on every delivery. Generated SDKs in TypeScript, Python, Go, and Rust — regenerated from the same OpenAPI 3.1 document on every release.