Base URLs
Control plane — all lifecycle and management operations use a single base URL rooted at your installation’s control plane domain:/v1 prefix. Examples include POST /v1/sandboxes to create a sandbox and GET /v1/templates to list templates.
Data plane — each sandbox exposes its own management surface on the reserved agent port (50000). The URL is derived from the sandbox ID and your domain:
Authentication
The two APIs use different credential types and different headers:- Control plane: pass your organisation API key in the
X-API-Keyheader, or an OIDC bearer token in theAuthorization: Bearerheader. - Data plane: pass a short-lived capability token in the
X-Sandbox-Tokenheader. Capability tokens are scoped to one sandbox epoch and are minted by the control plane viaPOST /v1/sandboxes/{sandboxId}/token. The SDK handles minting and refreshing these tokens automatically.
Content type
Both APIs useapplication/json for request bodies and response documents. Set Content-Type: application/json on every request that includes a body. File upload and download endpoints on the data plane use application/octet-stream instead.
Every response includes an X-Request-Id header. If you supply a well-formed X-Request-Id on the request, the API echoes it back; otherwise it generates one. Keep this ID when contacting support.
Versioning
All control plane endpoints are prefixed with/v1. Backward-compatible additions — new optional fields and new endpoints — can appear in a minor release without a version bump. Breaking changes advance the path prefix.
The data plane API has no version prefix; it is versioned implicitly by the sandbox agent bundled with each FissionPlane release.
Rate limiting
When you exceed a rate limit or a quota, the API returns429 Too Many Requests. The response body uses the standard error format and the code field distinguishes which limit was hit. Retry after the delay indicated by the Retry-After header if present.
Error format
Every non-2xx response body follows the same JSON structure:string
required
Machine-readable error cause, stable across releases. Common values include
invalid_request, unauthenticated, forbidden, not_found, name_taken,
lifecycle_conflict, quota_exceeded, rate_limited, snapshot_expired,
and no_capacity.string
required
Human-readable description of what went wrong. Never contains credentials or
sensitive data.
boolean
Whether issuing the identical request again would plausibly succeed. Use this
field to decide whether to retry rather than hard-coding status codes.
string
The request identifier, for correlating with support and audit. Include it
in any support request.
OpenAPI specifications
The full machine-readable contracts are available in the FissionPlane source repository:- Control-plane OpenAPI spec — sandboxes, templates, tokens, ports
- Data-plane OpenAPI spec — commands, processes, files
- Data-plane streaming protocol — WebSocket message formats