Generated from api/openapi.yaml (OpenAPI 3.1.0, API v1). A running server also serves the contract at /openapi.yaml.
One vendor-neutral API for isolated compute environments on infrastructure you
own, with optional, policy-gated use of external providers.
- Authenticate with
Authorization: Bearer dly_<id>_<secret>.
- Errors use
{"error": {"code", "message", "details", "requestId"}}. Branch on code.
- Lists return
{"items": [...], "nextCursor": "..."}.
- Backends are never named by applications: placement is decided by operator,
organization and project policies, which a request can only narrow.
GET /v1/sandboxes
| Parameter |
In |
Type |
Description |
status |
query |
string |
Comma-separated statuses |
projectId |
query |
string |
|
pool |
query |
string |
|
label |
query |
string |
key=value; repeatable |
cursor |
query |
string |
|
limit |
query |
integer |
|
POST /v1/sandboxes
Admits the request against quota and queues it (202). The scheduler places it on
an eligible pool. Returns 422 immediately when no permitted pool could ever satisfy
it (no_eligible_pool, unsupported_capability). Requires sandboxes:write.
| Parameter |
In |
Type |
Description |
Idempotency-Key |
header |
string |
Replaying the same key within a project returns the live sandbox it created (200). Once that sandbox is terminated or failed, the key creates a new one. |
Request body (application/json): CreateSandboxRequest
GET /v1/sandboxes/{id}
| Parameter |
In |
Type |
Description |
id * |
path |
string |
|
PATCH /v1/sandboxes/{id}
| Parameter |
In |
Type |
Description |
id * |
path |
string |
|
Request body (application/json): UpdateSandboxRequest
| Status |
Response |
| 200 |
Updated — Sandbox |
DELETE /v1/sandboxes/{id}
Idempotent. Queued sandboxes terminate immediately; others move to terminating.
| Parameter |
In |
Type |
Description |
id * |
path |
string |
|
| Status |
Response |
| 202 |
Terminating — Sandbox |
GET /v1/sandboxes/{id}/wait
| Parameter |
In |
Type |
Description |
id * |
path |
string |
|
status |
query |
SandboxStatus |
Defaults to running |
timeoutSeconds |
query |
integer |
|
| Status |
Response |
| 200 |
Current sandbox (check status) — Sandbox |
GET /v1/sandboxes/{id}/placement
Includes every pool evaluated with reasons. For queued sandboxes, current is a fresh dry-run decision.
| Parameter |
In |
Type |
Description |
id * |
path |
string |
|
POST /v1/sandboxes/{id}/exec
Requires sandboxes:exec and a running sandbox. With ?stream=1 (or
Accept: text/event-stream) the response is server-sent events named
stdout, stderr, exit and error, each carrying an ExecEvent as JSON data.
| Parameter |
In |
Type |
Description |
id * |
path |
string |
|
stream |
query |
string |
|
Request body (application/json): ExecRequest
GET /v1/sandboxes/{id}/files
| Parameter |
In |
Type |
Description |
id * |
path |
string |
|
path * |
query |
string |
|
GET /v1/sandboxes/{id}/files/content
| Parameter |
In |
Type |
Description |
id * |
path |
string |
|
path * |
query |
string |
|
| Status |
Response |
| 200 |
File bytes — string (binary) |
PUT /v1/sandboxes/{id}/files/content
| Parameter |
In |
Type |
Description |
id * |
path |
string |
|
path * |
query |
string |
|
Request body (application/octet-stream): string (binary)
| Status |
Response |
| 204 |
Written |
POST /v1/sandboxes/{id}/stop
| Parameter |
In |
Type |
Description |
id * |
path |
string |
|
POST /v1/sandboxes/{id}/start
| Parameter |
In |
Type |
Description |
id * |
path |
string |
|
POST /v1/sandboxes/{id}/pause
| Parameter |
In |
Type |
Description |
id * |
path |
string |
|
POST /v1/sandboxes/{id}/resume
| Parameter |
In |
Type |
Description |
id * |
path |
string |
|
POST /v1/sandboxes/{id}/snapshots
Snapshots live on the pool that took them; restoring is only possible there.
| Parameter |
In |
Type |
Description |
id * |
path |
string |
|
Request body (application/json): CreateSnapshotRequest
POST /v1/sandboxes/{id}/fork
| Parameter |
In |
Type |
Description |
id * |
path |
string |
|
| Status |
Response |
| 202 |
Queued child — Sandbox |
POST /v1/sandboxes/{id}/ports
| Parameter |
In |
Type |
Description |
id * |
path |
string |
|
Request body (application/json): object
POST /v1/sandboxes/{id}/keepalive
Exec, file and port calls already count as activity. Call this when the sandbox is in use in ways the control plane does not see, such as a desktop viewer connected to a port URL.
| Parameter |
In |
Type |
Description |
id * |
path |
string |
|
GET /v1/snapshots
| Status |
Response |
| 200 |
Snapshots — object |
GET /v1/snapshots/{id}
| Parameter |
In |
Type |
Description |
id * |
path |
string |
|
DELETE /v1/snapshots/{id}
| Parameter |
In |
Type |
Description |
id * |
path |
string |
|
| Status |
Response |
| 204 |
Deleted |
GET /v1/me
| Status |
Response |
| 200 |
Caller — Me |
GET /v1/projects
| Status |
Response |
| 200 |
Projects — object |
POST /v1/projects
Request body (application/json): object
| Status |
Response |
| 201 |
Project — Project |
GET /v1/projects/{id}
| Parameter |
In |
Type |
Description |
id * |
path |
string |
|
| Status |
Response |
| 200 |
Project — Project |
DELETE /v1/projects/{id}
| Parameter |
In |
Type |
Description |
id * |
path |
string |
|
GET /v1/api-keys
| Status |
Response |
| 200 |
Keys — object |
POST /v1/api-keys
A key can only grant scopes it holds, within its own organization and project. The token is returned once.
Request body (application/json): CreateAPIKeyRequest
GET /v1/api-keys/{id}
| Parameter |
In |
Type |
Description |
id * |
path |
string |
|
DELETE /v1/api-keys/{id}
| Parameter |
In |
Type |
Description |
id * |
path |
string |
|
| Status |
Response |
| 204 |
Revoked |
POST /v1/api-keys/{id}/rotate
Issues a replacement with the same name, scopes, organization, project and lifetime, and returns its token once. The old key stays valid for graceSeconds (at most a week), or is revoked at once. The caller must be able to grant every scope the key holds.
| Parameter |
In |
Type |
Description |
id * |
path |
string |
|
Request body (application/json): RotateAPIKeyRequest
GET /v1/policies
| Status |
Response |
| 200 |
Policies — object |
PUT /v1/policies/{scope}
| Parameter |
In |
Type |
Description |
scope * |
path |
string |
global (operator), org: or project: |
Request body (application/json): PlacementPolicy
DELETE /v1/policies/{scope}
| Parameter |
In |
Type |
Description |
scope * |
path |
string |
global (operator), org: or project: |
| Status |
Response |
| 204 |
Removed |
GET /v1/capabilities
| Status |
Response |
| 200 |
Pools |
GET /v1/profiles
| Status |
Response |
| 200 |
Profiles |
GET /v1/templates
| Status |
Response |
| 200 |
Templates |
GET /v1/classifications
| Status |
Response |
| 200 |
Classifications |
GET /v1/quotas
| Parameter |
In |
Type |
Description |
projectId |
query |
string |
|
orgId |
query |
string |
Operator keys only |
GET /v1/usage
| Parameter |
In |
Type |
Description |
from |
query |
string (date-time) |
|
to |
query |
string (date-time) |
|
groupBy |
query |
pool | project | org | trust |
|
GET /v1/audit-events
| Parameter |
In |
Type |
Description |
afterSeq |
query |
integer |
|
resource |
query |
string |
|
action |
query |
string |
|
limit |
query |
integer |
|
| Status |
Response |
| 200 |
Events — object |
GET /v1/admin/organizations
| Status |
Response |
| 200 |
Organizations |
POST /v1/admin/organizations
Request body (application/json): object
| Status |
Response |
| 201 |
Created |
GET /v1/admin/organizations/{id}
| Parameter |
In |
Type |
Description |
id * |
path |
string |
|
| Status |
Response |
| 200 |
Organization |
PATCH /v1/admin/organizations/{id}
| Parameter |
In |
Type |
Description |
id * |
path |
string |
|
| Status |
Response |
| 200 |
Organization |
POST /v1/admin/organizations/{id}/suspend
| Parameter |
In |
Type |
Description |
id * |
path |
string |
|
Request body (application/json): object
| Status |
Response |
| 200 |
Suspended |
POST /v1/admin/organizations/{id}/resume
| Parameter |
In |
Type |
Description |
id * |
path |
string |
|
| Status |
Response |
| 200 |
Resumed |
PATCH /v1/admin/projects/{id}
| Parameter |
In |
Type |
Description |
id * |
path |
string |
|
| Status |
Response |
| 200 |
Project |
GET /v1/admin/pools
| Status |
Response |
| 200 |
Pools |
POST /v1/admin/pools
Credentials are references, never values: {"env": NAME} or {"file": PATH} resolved on the server, or {"secret": name} for a credential stored with PUT /v1/admin/secrets/{name}.
GET /v1/admin/pools/{name}
| Parameter |
In |
Type |
Description |
name * |
path |
string |
|
PATCH /v1/admin/pools/{name}
| Parameter |
In |
Type |
Description |
name * |
path |
string |
|
DELETE /v1/admin/pools/{name}
| Parameter |
In |
Type |
Description |
name * |
path |
string |
|
| Status |
Response |
| 204 |
Removed |
POST /v1/admin/pools/{name}/drain
| Parameter |
In |
Type |
Description |
name * |
path |
string |
|
POST /v1/admin/pools/{name}/use
Undrains the pool and drains every other one; running sandboxes stay where they are. An external pool must be approved by the global policy, or approved here with approveExternal. Private-only work still never leaves private pools.
| Parameter |
In |
Type |
Description |
name * |
path |
string |
|
Request body (application/json): object
| Status |
Response |
| 200 |
What changed — object |
| 409 |
Structured error — ErrorEnvelope |
POST /v1/admin/pools/{name}/undrain
| Parameter |
In |
Type |
Description |
name * |
path |
string |
|
POST /v1/admin/sandboxes/{id}/terminate
| Parameter |
In |
Type |
Description |
id * |
path |
string |
|
| Status |
Response |
| 202 |
Terminating |
GET /v1/admin/secrets
| Status |
Response |
| 200 |
Secrets — object |
PUT /v1/admin/secrets/{name}
The value is sealed with AES-256-GCM under the server’s secrets key and never returned. Pools whose credential is secret: use the new value without a restart. Needs a secrets key on the server (secrets.keyEnv or secrets.keyFile).
| Parameter |
In |
Type |
Description |
name * |
path |
string |
|
Request body (application/json): PutSecretRequest
DELETE /v1/admin/secrets/{name}
| Parameter |
In |
Type |
Description |
name * |
path |
string |
|
GET /v1/admin/trust-report
| Status |
Response |
| 200 |
Trust report |
GET /v1/admin/audit/verify
| Status |
Response |
| 200 |
Result |
POST /v1/admin/reconcile
GET /healthz · no authentication
GET /readyz · no authentication
GET /version · no authentication
GET /metrics · no authentication
| Status |
Response |
| 200 |
Prometheus text format |
| Field |
Type |
Description |
error |
object |
|
| Field |
Type |
Description |
version |
string |
|
commit |
string |
|
apiVersion |
string |
|
installation |
string |
|
| Field |
Type |
Description |
keyId |
string |
|
orgId |
string |
|
projectId |
string |
|
scopes |
string[] |
|
operator |
boolean |
|
Type: queued | provisioning | running | stopped | paused | terminating | terminated | failed
| Field |
Type |
Description |
cpu |
integer |
|
memoryMiB |
integer |
|
diskGiB |
integer |
|
Request-level preference; can only narrow policy.
| Field |
Type |
Description |
strategy |
private-first | cost | spread |
|
allowedPools |
string[] |
|
regions |
string[] |
|
external |
never | overflow | allowed |
|
Type: exec | exec.stream | files | lifecycle.stop-start | lifecycle.pause-resume | snapshots.disk | snapshots.memory | fork | persistence.disk | ports.expose | ssh | pty | network.egress-control | gpu | arch.amd64 | arch.arm64 | isolation.microvm | isolation.container
| Field |
Type |
Description |
projectId |
string |
Required for organization and operator keys |
template |
string |
|
profile |
string |
Named resource preset |
resources |
Resources |
|
capabilities |
Capability[] |
|
classification |
string |
Operator-defined, e.g. private-only, internal, public |
placement |
Placement |
|
ttlSeconds |
integer |
|
env |
object |
Write-only; never returned |
labels |
object |
|
priority |
integer |
|
fromSnapshot |
string |
|
idleTimeoutSeconds |
integer |
Stop or pause after this many seconds with no exec, file, port or keepalive call (at least 60); the next such call wakes it. 0 uses the operator default, -1 turns it off |
maxRunSeconds |
integer |
Pause (or stop) after running this long without a break, busy or not (at least 60); the next call resumes it. 0 uses the operator default, -1 turns it off |
maxPausedSeconds |
integer |
Delete after staying paused or stopped this long (at least 60). 0 uses the operator default, -1 turns it off |
preemptible |
boolean |
false keeps the scheduler from pausing this sandbox to make room on a full pool. Default true |
| Field |
Type |
Description |
labels |
object |
|
ttlSeconds |
integer |
|
idleTimeoutSeconds |
integer |
|
maxRunSeconds |
integer |
|
maxPausedSeconds |
integer |
|
preemptible |
boolean |
|
| Field |
Type |
Description |
id * |
string |
|
orgId * |
string |
|
projectId * |
string |
|
status * |
SandboxStatus |
|
statusReason |
string |
|
template |
string |
|
profile |
string |
|
resources * |
Resources |
|
capabilities |
string[] |
|
classification * |
string |
|
placement |
Placement |
|
pool |
string |
|
adapter |
string |
|
trust |
private | external |
|
region |
string |
|
labels |
object |
|
envKeys |
string[] |
|
priority |
integer |
|
ttlSeconds |
integer |
|
expiresAt |
string (date-time) |
|
idleTimeoutSeconds |
integer |
|
maxRunSeconds |
integer |
|
maxPausedSeconds |
integer |
|
preemptible |
boolean |
|
pausedAt |
string (date-time) |
|
slotReleased |
boolean |
A paused sandbox on a pool that checkpoints on pause holds no pool slot until it resumes |
resumeRequestedAt |
string (date-time) |
Set while a resume waits for a free slot |
lastActivityAt |
string (date-time) |
|
idledAt |
string (date-time) |
Set while stopped or paused for being idle; the next exec |
fromSnapshot |
string |
|
attempts |
integer |
|
createdBy |
string |
|
createdAt * |
string (date-time) |
|
updatedAt |
string (date-time) |
|
startedAt |
string (date-time) |
|
endedAt |
string (date-time) |
|
decision |
PlacementDecision |
|
| Field |
Type |
Description |
items |
Sandbox[] |
|
nextCursor |
string |
|
| Field |
Type |
Description |
pool |
string |
|
strategy |
string |
|
external |
string |
|
outcome |
placed | waiting | rejected |
|
reason |
string |
|
policies |
string[] |
|
evaluatedAt |
string (date-time) |
|
candidates |
object[] |
|
Set command (run by /bin/sh -c) or args (executed directly).
| Field |
Type |
Description |
command |
string |
|
args |
string[] |
|
env |
object |
|
cwd |
string |
|
stdin |
string |
|
timeoutSeconds |
integer |
|
| Field |
Type |
Description |
exitCode |
integer |
|
stdout |
string |
|
stderr |
string |
|
durationMs |
integer |
|
truncated |
boolean |
|
| Field |
Type |
Description |
stream |
stdout | stderr |
|
data |
string |
|
exitCode |
integer |
|
error |
string |
|
| Field |
Type |
Description |
path |
string |
|
name |
string |
|
size |
integer |
|
mode |
string |
|
isDir |
boolean |
|
modTime |
string (date-time) |
|
| Field |
Type |
Description |
kind |
disk | memory |
|
| Field |
Type |
Description |
id |
string |
|
sandboxId |
string |
|
orgId |
string |
|
projectId |
string |
|
pool |
string |
|
kind |
string |
|
status |
string |
|
sizeBytes |
integer |
|
createdAt |
string (date-time) |
|
createdBy |
string |
|
| Field |
Type |
Description |
port |
integer |
|
url |
string |
|
Zero means unlimited at that level.
| Field |
Type |
Description |
maxActiveSandboxes |
integer |
|
maxQueued |
integer |
|
maxCPU |
integer |
|
maxMemoryMiB |
integer |
|
maxDiskGiB |
integer |
|
maxTTLSeconds |
integer |
|
maxSnapshots |
integer |
|
poolBudgetsPerHour |
object |
|
| Field |
Type |
Description |
activeSandboxes |
integer |
|
queued |
integer |
|
cpu |
integer |
|
memoryMiB |
integer |
|
diskGiB |
integer |
|
snapshots |
integer |
|
| Field |
Type |
Description |
id |
string |
|
orgId |
string |
|
name |
string |
|
quota |
Quota |
|
createdAt |
string (date-time) |
|
| Field |
Type |
Description |
id |
string |
|
name |
string |
|
orgId |
string |
|
projectId |
string |
|
scopes |
string[] |
|
createdBy |
string |
|
createdAt |
string (date-time) |
|
expiresAt |
string (date-time) |
|
lastUsedAt |
string (date-time) |
|
revoked |
boolean |
|
replacedBy |
string |
The key a rotation issued in place of this one |
| Field |
Type |
Description |
name * |
string |
|
orgId |
string |
|
projectId |
string |
|
scopes * |
admin | org:admin | sandboxes:read | sandboxes:write | sandboxes:exec | projects:write | keys:write | usage:read | audit:read | policies:write[] |
|
ttlHours |
integer |
|
Type: object
| Field |
Type |
Description |
graceSeconds |
integer |
How long the old key stays valid; 0 revokes it at once |
| Field |
Type |
Description |
name |
string |
|
fingerprint |
string |
Identifies the value without revealing it |
createdAt |
string (date-time) |
|
createdBy |
string |
|
updatedAt |
string (date-time) |
|
updatedBy |
string |
|
usedBy |
string[] |
Pools whose credential is this secret |
| Field |
Type |
Description |
value * |
string |
|
| Field |
Type |
Description |
scope |
string |
|
allowedPools |
string[] |
|
deniedPools |
string[] |
|
allowedRegions |
string[] |
|
external |
never | overflow | allowed |
|
externalPools |
string[] |
External pools explicitly approved; none are approved by default |
strategy |
private-first | cost | spread |
|
maxCostPerHour |
number |
|
maxQueueSeconds |
integer |
|
| Field |
Type |
Description |
from |
string (date-time) |
|
to |
string (date-time) |
|
groupBy |
string |
|
note |
string |
|
lines |
UsageLine[] |
|
total |
UsageLine |
|
| Field |
Type |
Description |
key |
string |
|
sandboxes |
integer |
|
cpuSeconds |
number |
|
memoryGiBSeconds |
number |
|
runSeconds |
number |
|
queueSeconds |
number |
|
estimatedCost |
number |
|
| Field |
Type |
Description |
seq |
integer |
|
time |
string (date-time) |
|
actor |
string |
|
orgId |
string |
|
projectId |
string |
|
action |
string |
|
resource |
string |
|
outcome |
string |
|
details |
object |
|
requestId |
string |
|
prevHash |
string |
|
hash |
string |
|
Fields and parameters marked * are required.