Fuse Orchestrator API
Control plane for Fuse orchestrator. Provisions, inspects, and destroys VMs; manages snapshots. This API is consumed by the fuse CLI (via the Go SDK), the language SDKs, and operations tooling. It is the stable HTTP surface for everything that is not the in-guest agent (fused), which exposes its own HTTP API from inside the VM.
Path prefix: /v1. Backward-incompatible changes bump the prefix.
Every non-2xx response under /v1 uses the Error envelope defined
below. The one exception is the unauthenticated /ready probe,
which reports failure as a bare {"status","checks"} object with no
error key — so a client must not assume body.error.code is
present on any non-2xx it receives.
Every response carries an X-Request-ID header — either the value
the client supplied on the request (when it matches [A-Za-z0-9_-]{1,128})
or a freshly generated req_<32hex> identifier. The same value is
threaded through audit events and server logs for correlation.
Probe endpoints (/health, /ready, /metrics, /v1/version) are
mounted outside this middleware and do not carry a request ID.
http://localhost:8080health
Unauthenticated probe and identity endpoints (mounted outside auth)
- GETCheck liveness
/health - GETCheck readiness
/ready - GETScrape Prometheus metrics
/metrics - GETIdentify the orchestrator
/v1/version
auth
Session-cookie login/logout for browser callers
environments
VM provisioning and inspection
- GETList environments
/v1/environments - POSTCreate environment
/v1/environments - GETGet environment
/v1/environments/{vmId} - POSTAct on an environment
/v1/environments/{vmId} - DELETEDestroy environment
/v1/environments/{vmId} - GETAttach to environment
/v1/environments/{vmId}/attach - GETStream environment events
/v1/environments/{vmId}/events - GETReport the environment's display
/v1/environments/{vmId}/computer - POSTDrive the environment's desktop
/v1/environments/{vmId}/computer - GETStream the environment's desktop live
/v1/environments/{vmId}/computer/stream
snapshots
Checkpoint / restore lifecycle
- POSTSnapshot a running VM
/v1/environments/{vmId}/snapshots - GETList snapshots
/v1/snapshots - GETResolve a build layer
/v1/snapshots/resolve - GETGet a snapshot
/v1/snapshots/{snapshotId} - POSTPerform a snapshot action
/v1/snapshots/{snapshotId} - DELETEDelete a leaf snapshot
/v1/snapshots/{snapshotId}
hosts
Host registry and scheduling controls
- GETList registered hosts
/v1/hosts - POSTRegister or update a host
/v1/hosts - GETFetch a host by ID
/v1/hosts/{hostId} - POSTPerform an action on a host
/v1/hosts/{hostId} - DELETERemove a host from the scheduler
/v1/hosts/{hostId}
api-keys
Revocable API key management (master token only; requires Postgres).
These routes exist only when the orchestrator runs with a
Postgres-backed key store (DATABASE_URL). Without it they are not
registered, and a call — authenticated or not — returns 404 with
code route_not_found, not 401. The CIDR allowlist still applies
first: it is mounted at the router level, ahead of the not-found
handler, so a caller outside the allowlist gets 403 forbidden
instead and never reaches the 404.