Returns once accepted: 204 when confirmed, else 202 with an operation that completes lifecycle work; GET /operations/ reports completion.
While a destroy is unresolved, a repeated destroy is accepted as the same pending operation and makes no second provider call; once the destroy is confirmed, a repeat returns 204 with no body.
You can set: nothing.
Not promised: how long teardown takes; that the sandbox is already absent from listings on return.
Requests destruction on the original upstream account, including persistent sandbox
storage where the provider’s destroy operation removes it. Separately owned volumes
are not deleted. DELETE returns once the provider accepts the destroy, always as 202
with the sandbox: state is destroyed when the provider confirmed within the request
and destroying while lifecycle work remains, and operation_id is set while work
remains. BoxRouter finishes an accepted destroy without the caller. GET
/operations/ reports the operation’s outcome; for an accepted destroy this
includes any remaining stop, final usage, and deletion work.
A repeat DELETE while destruction is unresolved returns 202 with the existing
operation_id and makes no second provider call. Once destruction is confirmed,
repeat DELETEs return 202 with the destroyed sandbox and no operation_id. Unknown or
unowned sandbox IDs return 404.
BoxRouter API key; never an upstream provider key.
Path Parameters
sandbox_id
string
required
Workspace-owned BoxRouter sandbox ID, not an upstream ID.
Minimum string length: 1
Pattern: ^[^\u0000]*$
Query Parameters
discard_unsaved
boolean
default:false
Destroy even if saving the attached volume fails, discarding unsaved changes.
Response
The sandbox after the provider accepted the destroy.
A sandbox created from a settled body, returned by create, restore, get and list.
Required fields are present; fields with no value are null, never absent. Optional
fields may be absent when their source is not known. Listings do no
provider I/O: they show the latest durably recorded state, and native_state,
route.selection and recorder are null. Detail responses observe the provider live and
record the normalized state unless a concurrent lifecycle change supersedes the read.
id
string
required
Required string length: 1 - 128
Pattern: ^[^\u0000]*$
state
enum<string>
required
Clients must tolerate values they do not know. A sandbox the provider stopped, or one
stopped for being idle that can be started again, reads paused; resume brings either back.
Available options:
creating,
running,
paused,
destroying,
destroyed,
error,
unknown
state_reason
enum<string> | null
required
Why it is in this state. external is a change made at the provider, behind BoxRouter's back.
Available options:
requested,
lifetime,
retention,
idle_shutdown,
external,
null
failure
object | null
required
The provider failure recorded with state=error, or null when no recorded failure
explains the current state. Present on create, detail and list responses; list
reads return the durable value without calling the provider.
Show child attributes
native_state
string | null
required
observed_at
string<date-time>
required
Time the state source for this response was read: the owned-record lookup time
for a list response, or the live provider-observation time for a detail response.
state_recorded_at
string<date-time> | null
required
Timestamp of the durable state source used for this response. This can be an
existing lifecycle or lifetime record when the returned public state is derived
from that source, and may predate observed_at. Null when no source timestamp is
available or a concurrent lifecycle change supersedes the detail read.
created_at
string<date-time> | null
required
Time Cloud sent the first create request when that edge is available; otherwise the sandbox record's created time.
ready_at
string<date-time> | null
required
Time Cloud received the first create response; when that edge is unavailable, the sandbox
record's ready time. Null while creating. List and detail responses use the same value.
ended_at
string<date-time> | null
required
Time Cloud received the last destroy response; when that edge is unavailable, Cloud's
record of confirmation or first observation that the sandbox was gone. Null while the
sandbox has not ended. List and detail responses use the same value.
labels
object
required
Show child attributes
lifetime
object
required
How long the sandbox may live. It counts from the provider's create, as with the
provider's own SDK (BoxRouter's clock starts when it sends the create). Whether paused
time counts depends on the provider.
Show child attributes
route
object
required
The adapter that made this sandbox. Support questions start at adapter_version. A sandbox
with no recorded contract still names its provider and account; its class and
adapter_version are null.
Show child attributes
contract
object | null
required
Null for a record with no recorded contract, such as one a provider-native route created.
Show child attributes
request
object
required
The recorded creation request after server-side expansion and defaulting, without
request-only secret values, environment values or labels. A sandbox can outlive the
create-request schema that was current when it was made, so this historical snapshot
accepts fields from earlier contract versions. Clients should interpret only fields
they recognize and preserve unknown fields when displaying or storing the snapshot.
hidden_secrets
object | null
required
Public metadata for the request-only secret values, keyed by their submitted names.
Each result contains only a placeholder and its allowed hosts. Null when the create
submitted no secret values.
Show child attributes
tcp_ports
object[] | null
required
Public host and port for each requested TCP listener, in request order.
Show child attributes
recorder
object | null
required
A tally of the gate calls made on this sandbox, allowed and refused, with the
requirements line those calls relied on. It only tallies: it switches no gate on.
limits
object
required
Show child attributes
expires_at
string<date-time> | null
Enforced deadline from the recorded lifetime budget, including extensions. This
is the same deadline exposed as lifetime.ends_at; null when no deadline is known.
created_at_source
enum<string> | null
Where created_at came from. Null when created_at is null. Always BoxRouter's own record.
Available options:
provider,
published,
measured,
recorded,
calculated,
unknown
created_at_how
string | null
One sentence saying how created_at was determined. Null when created_at is null.
Minimum string length: 1
created_at_step
integer | null
Null because created_at comes from a recorded lifecycle edge or Cloud's record.
Required range: x >= 1
ready_at_source
enum<string> | null
Where ready_at came from. Null when ready_at is null. Lifecycle edges and Cloud's own record are recorded.
Available options:
provider,
published,
measured,
recorded,
calculated,
unknown
ready_at_how
string | null
One sentence saying how ready_at was determined. Null when ready_at is null.
Minimum string length: 1
ready_at_step
integer | null
Null because ready_at comes from a recorded lifecycle edge or Cloud's record.
Required range: x >= 1
ended_at_source
enum<string> | null
Where ended_at came from. Null when ended_at is null. Lifecycle edges and Cloud's own record are recorded.
Available options:
provider,
published,
measured,
recorded,
calculated,
unknown
ended_at_how
string | null
One sentence saying how ended_at was determined. Null when ended_at is null.
Minimum string length: 1
ended_at_step
integer | null
Null because ended_at comes from a recorded lifecycle edge or Cloud's record.
Required range: x >= 1
cost_source
enum<string> | null
Where cost came from. Null when cost is null. provider for a reported cost, calculated for a worked-out one, unknown when no cost could be worked out. The cost_step is 1 for a provider figure, then 2 provider times, 3 a checked billing boundary, 4 a range, 5 unknown.
Available options:
provider,
published,
measured,
recorded,
calculated,
unknown
cost_how
string | null
One sentence saying how cost was determined. Null when cost is null.
Minimum string length: 1
cost_step
integer | null
The position of the source in BoxRouter's source order for this value, 1 being the best.
Null when the value is BoxRouter's own record rather than a pick between sources.
Required range: x >= 1
origin
object
Durable creation provenance. Omitted when the source is not known.
Option 1
Option 2
Show child attributes
name
string | null
Sandbox name from labels.name, when set.
resources
object
Resolved CPU, memory and disk resources; null values mean unknown.
Show child attributes
image
object | null
The image the sandbox runs and where that is known from. Null when nothing records
it. Absent from responses of a Cloud that does not report it yet.
Show child attributes
image_setup
object
Present only when this start waited for image setup on its chosen provider.
Show child attributes
usage
Usage record · object
What the sandbox used: its size, its running time per state, how often it was created,
each fact with the source it came from. Null when nothing has been recorded or the
response does not carry it. Absent from responses of a Cloud that does not report it yet.
Usage record
Option 2
Show child attributes
cost
Cost · object
What the sandbox cost, with one word saying how far to trust it. Create and detail
responses carry the full cost with its working; list rows carry only its label and
total, from the same calculation. One object serves both, so the schema accepts either
shape anywhere: a client that needs the working reads the detail. Null when no cost has
been worked out. Absent from responses of a Cloud that does not report it yet.
Cost
Option 2
Show child attributes
charge
object | null
What BoxRouter charged to the workspace's credits for this sandbox: the reservation
while it runs, then the amount charged once the provider's records are in. Present
on credit-funded sandboxes in detail and list responses. Null for a sandbox paid with
the workspace's own provider account (BYOK), for a credit-funded one whose
reservation was released without a charge, and for one whose ledger record cannot be
verified: BoxRouter reports no charge rather than a guess. cost still reports the
provider's cost. Absent from create and other responses, and from a Cloud that does
not report it yet. It is the ledger's amount, never derived from cost or from
BoxRouter's clock.
Show child attributes
funded_until
string<date-time> | null
The time up to which the workspace's credits are reserved for this sandbox. A sandbox
created without lifetime_seconds renews its reservation hourly while the balance
covers it, so this moves later at each renewal; the sandbox ends at this time if the
balance could not cover another hour. For a sandbox created with lifetime_seconds
it is the end of that lifetime. Null for a sandbox paid with the workspace's own
provider account (BYOK), which has no reservation. A reservation is a hold on the
balance, never a cost: charge reports the credits reserved and then charged. Present
on create and on detail and list reads; absent from a Cloud that does not report it yet.
connectable
boolean
Whether interactive access to this sandbox is offered: a terminal, commands, files and
processes. False for a sandbox an Actions job runs in, which holds that job's token and
secrets; Cloud refuses these operations on it, before and after the job ends, and the
dashboard shows no Connect action. True for every other sandbox. One rule, decided by
Cloud; clients do not infer it from origin, which an Actions runner that has not yet
served a job does not have. Present on detail and list reads; absent from a Cloud that
does not report it yet.
volume
object | null
Present when the sandbox is attached to a BoxRouter Volume.
Show child attributes
operation_id
string | null
Present on a destroy response: the workspace-owned destroy operation while lifecycle
work remains (state is destroying), null once the destroy is confirmed. Absent
from every other response.
Minimum string length: 1
account
object
Present only while the account's key no longer works (section 7); that sandbox's
calls then answer account_unhealthy and state is unknown.
Show child attributes
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"BoxRouter","description":"Run sandboxes, coding agents, and GitHub Actions jobs on any provider through one API.","colors":{"primary":"#047857","light":"#6ee7b7","dark":"#10b981"},"logo":{"light":"https://mintcdn.com/nv-4965711d/xqQLsJs3vPQQ6w_V/brand-mark.svg?fit=max\u0026auto=format\u0026n=xqQLsJs3vPQQ6w_V\u0026q=85\u0026s=34456eec220b466fd4503f478e120e5b","dark":"https://mintcdn.com/nv-4965711d/xqQLsJs3vPQQ6w_V/brand-mark.svg?fit=max\u0026auto=format\u0026n=xqQLsJs3vPQQ6w_V\u0026q=85\u0026s=34456eec220b466fd4503f478e120e5b","href":"https://boxrouter.ai/"},"favicon":"https://mintcdn.com/nv-4965711d/QLfzpIkb_yuLLqxB/tab-icon.svg?fit=max\u0026auto=format\u0026n=QLfzpIkb_yuLLqxB\u0026q=85\u0026s=768e4d931174b769c852362ed31f7768","api":{"playground":{"display":"none"}},"appearance":{"default":"dark","strict":false},"background":{"color":{"light":"#ffffff","dark":"#03080a"}},"navbar":{"links":[{"href":"https://boxrouter.ai/benchmarks","label":"Benchmarks"},{"href":"/","label":"Docs"}],"primary":{"type":"button","label":"Sign In","href":"https://boxrouter.ai/?return_to=%2Fdashboard"}},"footer":{"links":[{"header":"Company","items":[{"label":"Terms of Service","href":"https://boxrouter.ai/terms"},{"label":"Privacy Policy","href":"https://boxrouter.ai/privacy"},{"label":"Refund Policy","href":"https://boxrouter.ai/refunds"}]},{"header":"Developer","items":[{"label":"Docs","href":"https://boxrouter.ai/docs"},{"label":"Support","href":"https://boxrouter.ai/support"},{"label":"Security","href":"https://boxrouter.ai/security"},{"label":"Service Providers","href":"https://boxrouter.ai/subprocessors"}]},{"header":"Product","items":[{"label":"Dashboard","href":"https://boxrouter.ai/dashboard"},{"label":"Benchmarks","href":"https://boxrouter.ai/benchmarks"}]},{"header":"Connect","items":[{"label":"Contact Us","href":"https://boxrouter.ai/feedback?topic=docs\u0026from=docs"},{"label":"Book a Call","href":"https://calendly.com/andre-boxrouter/boxrouter-intro-call"},{"label":"X","href":"https://x.com/boxrouter_ai"},{"label":"LinkedIn","href":"https://www.linkedin.com/company/boxrouter"},{"label":"Discord","href":"https://discord.gg/3tRbPUJ2bZ"}]}]},"styling":{"codeblocks":{"theme":"css-variables"},"latex":false},"contextual":{"options":["copy","view"],"display":"header"},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"nv-4965711d","hasAudioNarration":false,"actualSubdomain":"nv-4965711d","customDomains":["boxrouter.ai"],"gitSource":{"type":"github","owner":"boxrouter","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":"","_id":"6ae62c8bfb7ed7cff8d909d4"},"entitlements":{"AI_CHAT":{"status":"DISABLED"},"WEB_MCP":{"status":"DISABLED"},"NARRATION":{"status":"DISABLED"}},"buildId":"6af9ce26f845026aa4bf2673","clientVersion":"0.0.4143","searchFilterCounts":[{"language":"default","tag":"API Reference","count":145},{"language":"default","tag":"GitHub Actions","count":34},{"language":"default","tag":"Guides","count":28},{"language":"default","tag":"Credits and Billing","count":24},{"language":"default","tag":"Sandboxes","count":20},{"language":"default","tag":"Volumes","count":15},{"language":"default","tag":"Agents","count":12},{"language":"default","tag":"Files","count":10},{"language":"default","tag":"Provider Accounts","count":8},{"language":"default","tag":"Launch an Agent","count":7}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"/docs","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"docs-search.css","content":".bxs-dialog{--bxs-bg: #071114;--bxs-line: rgba(252, 252, 254, 0.12);--bxs-text: #eef2f3;--bxs-muted: #a3b0b4;--bxs-accent-text: #6ee7b7;--bxs-focus: rgba(252, 252, 254, 0.6);--bxs-hover: rgba(252, 252, 254, 0.08);position:fixed;inset:10vh 0 auto;width:min(640px, calc(100vw - 24px));max-width:none;max-height:80dvh;margin:0 auto;padding:0;overflow:hidden;color:var(--bxs-text);background:var(--bxs-bg);border:1px solid var(--bxs-line);border-radius:14px;box-shadow:0 24px 64px rgba(0, 0, 0, 0.6);font-family:var(--site-font, inherit)}.bxs-dialog::backdrop{background:rgba(3, 8, 10, 0.72)}.bxs-dialog[open]{display:flex;flex-direction:column}.bxs-panel{display:flex;flex-direction:column;min-height:0;max-height:80dvh}.bxs-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}.bxs-head{display:flex;align-items:center;gap:10px;padding:0 12px 0 16px;border-bottom:1px solid var(--bxs-line)}.bxs-icon{flex:none;width:18px;height:18px;color:var(--bxs-muted)}.bxs-input{flex:1;min-width:0;height:56px;padding:0;color:var(--bxs-text);background:transparent;border:0;border-radius:6px;font-size:16px;outline:none}.bxs-input::placeholder{color:var(--bxs-muted)}.bxs-input:focus,.bxs-input:focus-visible{outline:none}.bxs-head:focus-within{box-shadow:inset 0 -2px 0 var(--bxs-focus)}.bxs-close{flex:none;min-width:44px;height:32px;padding:0 8px;color:var(--bxs-muted);background:transparent;border:1px solid var(--bxs-line);border-radius:6px;font-size:12px;font-weight:600;cursor:pointer}.bxs-close:hover{color:var(--bxs-text);border-color:rgba(252, 252, 254, 0.3)}.bxs-close:focus-visible,.bxs-option:focus-visible{outline:2px solid var(--bxs-focus);outline-offset:2px}.bxs-close-x{display:none;font-size:20px;line-height:1}.bxs-status{margin:0;padding:12px 16px 6px;color:var(--bxs-muted);font-size:12px;font-weight:600}.bxs-list{flex:1;min-height:0;padding:4px 8px 8px;overflow-y:auto;overscroll-behavior:contain}.bxs-list[hidden]{display:none}.bxs-option{position:relative;display:block;padding:10px 12px 10px 14px;color:inherit;border-radius:8px;text-decoration:none;scroll-margin:8px}.bxs-option[aria-selected=\"true\"],.bxs-fallback .bxs-option:hover{background:var(--bxs-hover)}.bxs-option[aria-selected=\"true\"]::before{content:\"\";position:absolute;inset:8px auto 8px 0;width:3px;background:var(--bxs-focus);border-radius:2px}.bxs-option .bxs-title{display:block;font-size:15px;font-weight:600;line-height:1.4}.bxs-crumb{display:block;margin-top:1px;color:var(--bxs-muted);font-size:12px;line-height:1.5}.bxs-crumb:empty{display:none}.bxs-snippet{margin-top:4px;color:var(--bxs-muted);font-size:13px;line-height:1.5;overflow-wrap:anywhere;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3;overflow:hidden}.bxs-snippet:empty{display:none}.bxs-mark{color:var(--bxs-accent-text);background:transparent;font-weight:700}.bxs-foot{display:flex;margin:0;padding:8px 16px;color:var(--bxs-muted);border-top:1px solid var(--bxs-line);font-size:12px}@media (max-width: 640px){.bxs-dialog{inset:12px 0 auto;max-height:calc(100dvh - 24px)}.bxs-panel{max-height:calc(100dvh - 24px)}.bxs-close{min-width:44px;height:44px;border:0}.bxs-close-label,.bxs-foot{display:none}.bxs-close-x{display:inline}.bxs-option{padding-block:12px}}"},{"filePath":"style.css","content":"@font-face{font-family:\"Plus Jakarta Sans\";font-style:normal;font-weight:400 800;font-display:swap;src:url(/fonts/plus-jakarta-sans-basic.woff2) format(\"woff2\");unicode-range:U+0020-007E, U+00A0-00FF, U+2013-2014, U+2019, U+201C-201D, U+2022, U+2026, U+203A, U+2190-2193, U+2197, U+2212, U+2248, U+2264-2265, U+24D8, U+25B4, U+25BE, U+25CB, U+25CC, U+25CF, U+2713, U+2715}@font-face{font-family:\"Plus Jakarta Sans\";font-style:normal;font-weight:400 800;font-display:swap;src:url(/fonts/plus-jakarta-sans-cyrillic-ext.woff2) format(\"woff2\");unicode-range:U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F}@font-face{font-family:\"Plus Jakarta Sans\";font-style:normal;font-weight:400 800;font-display:swap;src:url(/fonts/plus-jakarta-sans-vietnamese.woff2) format(\"woff2\");unicode-range:U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB}@font-face{font-family:\"Plus Jakarta Sans\";font-style:normal;font-weight:400 800;font-display:swap;src:url(/fonts/plus-jakarta-sans-latin-ext.woff2) format(\"woff2\");unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}@font-face{font-family:\"Plus Jakarta Sans\";font-style:normal;font-weight:400 800;font-display:swap;src:url(/fonts/plus-jakarta-sans-latin.woff2) format(\"woff2\");unicode-range:U+0000-001F, U+007F-009F, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-2012, U+2015-2018, U+201A-201B, U+201E-201F, U+2023-2025, U+2027-2039, U+203B-206F, U+20AC, U+2122, U+2215, U+FEFF, U+FFFD}body{word-spacing:0.1em}pre,code{word-spacing:normal}:root{--heading-text: #fcfcfef2;--lead-gap: 32px;--hairline: #e2ecef1a;--hairline-width: 1px}html{font-feature-settings:normal}body.antialiased,.antialiased{-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}:root{--site-font: \"Plus Jakarta Sans\", -apple-system, BlinkMacSystemFont, \"Plus Jakarta Sans Fallback Segoe UI\", \"Segoe UI\", \"Plus Jakarta Sans Fallback DejaVu Sans\", \"Plus Jakarta Sans Fallback Roboto\", sans-serif}body,button,input,h1,h2,h3,h4,h5,h6{font-family:var(--site-font)!important}#navbar .max-w-8xl{max-width:none}#navbar .h-16{height:56px;margin:0;padding:0}#navbar .h-16>.border-b{padding:0 24px}#navbar .nav-tabs{margin-left:4px}#navbar>div>div>div.lg\\:flex.px-12,#navbar .hidden.lg\\:flex.px-12.h-12{padding-left:28px;padding-right:28px}#navbar a:has(>.nav-logo){display:inline-flex;align-items:center;gap:4px;margin-left:4px;color:var(--bx-fg);text-decoration:none}#navbar .nav-logo{width:40px;height:40px}#navbar a:has(>.nav-logo)::after{content:\"BoxRouter\";font-family:var(--site-font);font-size:20px;font-weight:600;letter-spacing:-0.5px;line-height:1;white-space:nowrap}#navbar nav[aria-label=\"Main\"] ul{gap:4px}#navbar nav[aria-label=\"Main\"] ul>li{margin:0!important}#navbar nav[aria-label=\"Main\"] ul>li.navbar-link>a{height:32px;padding:0 8px;border-radius:6px;color:var(--bx-site-muted);font-size:14px;font-weight:500;line-height:1.625;word-spacing:0.1em;transition:color 0.15s, background-color 0.15s}#navbar nav[aria-label=\"Main\"] ul>li.navbar-link>a:hover{color:var(--bx-link);background-color:var(--bx-accent-wash)}#navbar nav[aria-label=\"Main\"] ul>li.navbar-link>a:not([href^=\"https:\"]){color:var(--bx-fg)}#navbar #topbar-cta-button{margin-left:8px!important}#navbar #topbar-cta-button a{justify-content:center;height:32px;min-width:100px;padding:0 12px;line-height:1.625;word-spacing:0.1em}#navbar #topbar-cta-button a>span.absolute{border-radius:6px;background:#10b981}#navbar #topbar-cta-button a:hover>span.absolute{opacity:1;background:#10b981e0}#navbar #topbar-cta-button a .text-white{color:#03080a;font-weight:500}#navbar #topbar-cta-button a svg{display:none}#navbar .ml-auto>div:empty{display:none}#navbar .h-16>.border-b>.ml-auto{gap:4px}#navbar .h-16>.border-b>.ml-auto>*{margin:0!important}#navbar .ml-auto>div:has(>#theme-preference-menu-trigger){order:-1}@media (max-width: 1023px){#navbar .h-16>.border-b{gap:4px;padding:0 16px}#navbar .h-16>.border-b>.ml-auto{display:flex;flex:none;order:2}#navbar .h-16>.border-b>.ml-auto nav li:not(#topbar-cta-button){display:none}#navbar #topbar-cta-button{display:flex;margin-left:0!important}#navbar .h-16>.border-b>.lg\\:hidden{display:contents}#navbar #search-bar-entry-mobile{flex:none;order:1}#navbar .h-16>.border-b>.lg\\:hidden>:last-child{flex:none;order:3}}@media (max-width: 360px){#navbar .nav-logo{width:36px;height:36px}#navbar a:has(>.nav-logo){gap:3.6px}#navbar a:has(>.nav-logo)::after{font-size:18px}#navbar #topbar-cta-button a{min-width:0;padding:0 10px}#navbar #search-bar-entry-mobile{display:none!important}#navbar #theme-preference-menu-trigger{width:28px;padding-inline:6px}}#navbar nav[aria-label=\"Main\"]{margin-right:0!important}:root{--bx-bg: #ffffff;--bx-raised: #f6f8f7;--bx-raised-2: #eef2f0;--bx-line: #0b121014;--bx-line-strong: #0b121026;--bx-fg: #0b1210;--bx-body: #0b1210c9;--bx-muted: #0b1210a6;--bx-site-muted: var(--bx-muted);--bx-faint: #0b121057;--bx-accent: #10b981;--bx-link: #046c4f;--bx-accent-ink: #062a1e;--bx-accent-wash: #10b98110;--bx-accent-line: #05966973;--bx-warn: #b45309;--bx-warn-wash: #f59e0b0f;--bx-warn-line: #d9770652;--bx-font-mono: ui-monospace, \"SF Mono\", SFMono-Regular, Menlo, Consolas, monospace;--bx-code-background: var(--bx-raised);--bx-code-foreground: #1f2725;--bx-code-token-constant: #1f2725;--bx-code-token-string: #985a12;--bx-code-token-comment: #0b1210a3;--bx-code-token-keyword: #047857;--bx-code-token-parameter: #1f2725;--bx-code-token-function: #0b1210;--bx-code-token-string-expression: #985a12;--bx-code-token-punctuation: #1f2725;--bx-code-token-link: #047857}html:not(.dark){--heading-text: #0b1210f2;--hairline: #0b12101a}html.dark{--bx-bg: #03080a;--bx-raised: #0a1013;--bx-raised-2: #0f171a;--bx-line: #fcfcfe14;--bx-line-strong: #fcfcfe26;--bx-fg: #fcfcfe;--bx-body: #fcfcfec7;--bx-muted: #fcfcfe96;--bx-site-muted: #fcfcfea0;--bx-faint: #fcfcfe52;--bx-link: #6ee7b7;--bx-accent-ink: #03080a;--bx-accent-wash: #10b98112;--bx-accent-line: #10b98166;--bx-warn: #fbbf24;--bx-warn-wash: #fbbf240a;--bx-warn-line: #fbbf2447;--bx-code-foreground: #d9dfdd;--bx-code-token-constant: #d9dfdd;--bx-code-token-string: #e8cf9f;--bx-code-token-comment: #fcfcfe8f;--bx-code-token-keyword: #6ee7b7;--bx-code-token-parameter: #d9dfdd;--bx-code-token-function: #fcfcfe;--bx-code-token-string-expression: #e8cf9f;--bx-code-token-punctuation: #d9dfdd;--bx-code-token-link: #6ee7b7}#content :is(.code-block,.code-group,.bx-output){--mint-background: var(--bx-code-background);--mint-foreground: var(--bx-code-foreground);--mint-token-constant: var(--bx-code-token-constant);--mint-token-string: var(--bx-code-token-string);--mint-token-comment: var(--bx-code-token-comment);--mint-token-keyword: var(--bx-code-token-keyword);--mint-token-parameter: var(--bx-code-token-parameter);--mint-token-function: var(--bx-code-token-function);--mint-token-string-expression: var(--bx-code-token-string-expression);--mint-token-punctuation: var(--bx-code-token-punctuation);--mint-token-link: var(--bx-code-token-link)}:focus-visible{outline:2px solid var(--bx-link);outline-offset:2px}#navbar .border-b{border-color:var(--bx-line)!important}#navbar #search-bar-entry{border-color:var(--bx-line)!important;background:var(--bx-raised)!important;border-radius:6px!important;color:var(--bx-muted)!important}#navbar #search-bar-entry:hover{border-color:var(--bx-line-strong)!important}#navbar .nav-tabs a,#navbar [data-component-part=\"nav-tabs-item\"]{font-size:14px;font-weight:500}#navbar .nav-tabs-item,#navbar .nav-tabs-item>div{color:var(--bx-muted)}#navbar .nav-tabs-item[data-active=\"true\"]>div,#navbar .nav-tabs-item:hover>div{color:var(--bx-fg)!important}#navbar .nav-tabs-item>div>div:last-child,#navbar .nav-tabs-item [class*=\"bg-primary\"]{background:var(--bx-accent)!important}#sidebar .sidebar-group-header{color:var(--heading-text)!important;font-size:13px;line-height:20px;font-weight:600}#sidebar .sidebar-group li>a{border-radius:6px!important;font-size:14px;line-height:20px;color:var(--bx-muted)!important}#sidebar .sidebar-group li>a:hover{color:var(--bx-fg)!important;background:var(--bx-raised)!important}#sidebar .sidebar-group li>a[data-active=\"true\"],#sidebar .sidebar-group li>a.font-medium,#sidebar .sidebar-group li>a[class*=\"bg-primary\"]{color:var(--bx-link)!important;background:var(--bx-accent-wash)!important;font-weight:500}#table-of-contents .toc-item a{color:var(--bx-muted)!important;font-size:13px;line-height:20px}#table-of-contents .toc-item a:hover{color:var(--bx-fg)!important}#table-of-contents .toc-item[data-active] a{color:var(--bx-fg)!important;text-shadow:none!important}#table-of-contents button{font-size:13px;font-weight:600;color:var(--bx-fg)!important}#header .eyebrow{margin-bottom:0;font-size:13px;line-height:20px;font-weight:600;color:var(--bx-link)!important}#page-title{font-size:32px!important;line-height:40px!important;font-weight:650!important;letter-spacing:-0.02em;color:var(--heading-text)!important;text-wrap:balance}#header .prose{margin-top:12px;font-size:18px;line-height:30px;color:var(--bx-muted)!important;text-wrap:pretty;position:relative}#header .prose p{margin:0}#header .prose::after{content:\"\";position:absolute;left:0;right:0;top:calc(100% + (var(--lead-gap) - var(--hairline-width)) / 2);border-top:var(--hairline-width) solid var(--hairline);pointer-events:none}#header+#content{margin-top:var(--lead-gap)!important}#page-context-menu button{border-color:var(--bx-line)!important;background:none!important;color:var(--bx-muted)!important;font-size:13px}#page-context-menu button:hover{border-color:var(--bx-line-strong)!important;color:var(--bx-fg)!important}#header{position:relative}#page-context-menu{position:absolute;top:-26px;right:0}#page-context-menu button{height:28px!important;padding-block:0!important}#page-context-menu>div{display:none}@media (min-width: 1024px){#content-area{padding-left:4.5rem!important}}#content{font-size:16px;line-height:28px;color:var(--bx-body)}#content p,#content li{text-wrap:pretty}#content :is(strong,b){color:var(--bx-fg)!important}#content :is(h2,h3,h4){color:var(--heading-text)!important}#content strong{font-weight:600}#content h2:not([data-component-part]){margin:56px 0 0!important;font-size:22px;line-height:30px;font-weight:600;letter-spacing:-0.01em;text-wrap:balance}#content h2:not([data-component-part]){margin-bottom:12px!important}#content h3:not([data-component-part]){margin:32px 0 0!important;font-size:18px;line-height:28px;font-weight:600}#content h3:not([data-component-part]){margin-bottom:8px!important}#content li::marker{color:var(--bx-faint)}@media (max-width: 600px){#page-title{font-size:28px!important;line-height:36px!important}#header .prose{font-size:17px;line-height:28px}#content h2:not([data-component-part]){margin-top:48px!important;font-size:20px;line-height:28px}#content h3{font-size:17px;line-height:24px}}#content a.link,#content a:not([class]),#header .prose a{color:var(--bx-link)!important;font-weight:inherit!important;border-bottom:0!important;text-decoration:underline;text-decoration-color:var(--bx-accent-line);text-decoration-thickness:1px;text-underline-offset:3px;transition:text-decoration-color 0.15s}#content a.link:hover,#content a:not([class]):hover{text-decoration-color:currentColor}#content :not(pre)>code,#header .prose code{padding:1px 5px;border:1px solid var(--bx-line);border-radius:4px;background:var(--bx-raised);color:var(--bx-fg)!important;font-weight:500;font-size:0.875em;font-family:var(--bx-font-mono);overflow-wrap:anywhere}#content :is(h2,h3,h4) code{padding:0;border:0;background:none;font-size:inherit;font-weight:inherit}#content a>code{color:inherit!important}#content :not(pre)>code::before,#content :not(pre)>code::after{content:none}#content .code-block,#content .code-group{margin:16px 0!important;border:1px solid var(--bx-line)!important;border-radius:8px!important;background:var(--bx-raised)!important;box-shadow:none!important;padding:0!important}#content .code-block [data-component-part=\"code-block-root\"]{border-radius:7px!important;background:transparent!important}#content :is(pre,code,.font-mono),#content .code-block :is(pre,code,span),#content .code-group :is(pre,code,span){font-family:var(--bx-font-mono)!important}#content .code-block pre,#content .code-group pre{font:400 14px/22px var(--bx-font-mono);background:transparent!important}#content .code-block [data-component-part=\"scroll-area-viewport\"]{padding:14px 16px!important}#content [data-floating-buttons]{top:6px!important;right:6px!important}#content [data-floating-buttons] button,#content .code-group-tab-bar button[aria-label*=\"Copy\"],#content .code-group [data-testid=\"copy-code-button\"]{background:transparent!important;color:var(--bx-muted)!important;border-radius:6px}#content [data-floating-buttons] button:hover,#content .code-group [data-testid=\"copy-code-button\"]:hover{background:var(--bx-raised-2)!important;color:var(--bx-fg)!important}#content [data-floating-buttons] svg,#content .code-group [data-testid=\"copy-code-button\"] svg{color:inherit!important}#content .code-group>[data-component-part=\"code-group-tab-bar\"]{min-height:40px;padding-right:6px;border-bottom:1px solid var(--bx-line)}#content .code-group [role=\"tab\"]{color:var(--bx-muted)!important;font-size:13px}#content .code-group [role=\"tab\"][aria-selected=\"true\"]{color:var(--bx-fg)!important}#content .code-group [role=\"tab\"]>div{color:inherit!important}#content .code-group [role=\"tab\"]:hover>div{background:transparent!important;color:var(--bx-fg)!important}#content .code-group [role=\"tab\"] .bg-primary,#content .code-group [role=\"tab\"] [class*=\"bg-primary\"]{background:var(--bx-accent)!important}#content .code-group .code-block{margin:0!important;border:0!important;border-radius:0!important;background:transparent!important}#content .code-block-fade-overlay{display:none}#content :is(.code-block,.code-group) [data-component-part=\"scroll-area-viewport\"][data-overflow-x-end]{-webkit-mask-image:linear-gradient(to right, #000 calc(100% - 40px), transparent);mask-image:linear-gradient(to right, #000 calc(100% - 40px), transparent)}#content :is(.code-block,.code-group):has(+.bx-output){margin-bottom:0!important;border-bottom-left-radius:0!important;border-bottom-right-radius:0!important}#content .bx-output{margin:0 0 16px;padding:10px 16px 12px;border:1px solid var(--bx-line);border-radius:8px;background:var(--bx-bg)}#content :is(.code-block,.code-group)+.bx-output{border-top:0;border-top-left-radius:0;border-top-right-radius:0}#content .bx-output-label{display:flex;align-items:center;gap:6px;margin:0;font-size:12px;line-height:20px;font-weight:600;color:var(--bx-muted);opacity:1}#content .bx-output-label svg{width:13px;height:13px;color:var(--bx-link)}#content .bx-output,#content .bx-output :is(.code-block,.code-group){--mint-background: var(--bx-bg)}#content .bx-output :is(.code-block,.code-group),#content .bx-output .code-group [data-component-part=\"code-block-root\"]{margin:0!important;padding:0!important;border:0!important;border-radius:0!important;background:transparent!important;box-shadow:none!important}#content .bx-output .code-group [data-component-part=\"code-group-tab-bar\"]{display:none}#content .bx-output :is(.code-block,.code-group) [data-component-part=\"scroll-area-viewport\"]{padding:4px 0 0!important}#content .bx-output [data-floating-buttons]{display:none}#content .bx-output pre{color:var(--bx-fg)}#content .callout{margin:16px 0;padding:14px 16px!important;gap:12px;border:1px solid var(--bx-line-strong)!important;border-radius:8px!important;background:var(--bx-raised)!important}#content .callout [data-component-part=\"callout-content\"]{font-size:15px;line-height:24px;color:var(--bx-body)!important}#content .callout [data-component-part=\"callout-content\"] :is(a,strong,code){color:var(--bx-fg)!important}#content .callout [data-component-part=\"callout-content\"] a{color:var(--bx-link)!important}#content .callout [data-component-part=\"callout-icon\"]{margin-top:3px;color:var(--bx-muted)}#content .callout [data-component-part=\"callout-icon\"] svg{color:inherit!important;fill:currentColor}#content .callout[data-callout-type=\"warning\"]{border-color:var(--bx-warn-line)!important;background:var(--bx-warn-wash)!important}#content .callout[data-callout-type=\"warning\"] [data-component-part=\"callout-icon\"]{color:var(--bx-warn)}#content .steps{margin:32px 0 16px 0}#content .steps [data-component-part=\"step-indicator\"]{border:1px solid var(--bx-line-strong);background:var(--bx-bg)!important;color:var(--bx-fg)!important;font-size:13px}#content .steps [data-component-part=\"step-line\"]{background:var(--bx-line)!important}#content .steps .step{padding-bottom:36px}#content .steps [data-component-part=\"step-content\"]>:first-child{margin-top:8px}#content .steps [data-component-part=\"step-content\"]>:last-child{margin-bottom:0}#content .steps .step:last-child{padding-bottom:0}#content .steps [data-component-part=\"step-title\"]{font-size:18px;line-height:28px;font-weight:600;color:var(--bx-fg)!important}#content .tabs [data-component-part=\"tabs-list\"]{border-color:var(--bx-line)!important;margin-bottom:16px}#content .tabs [data-component-part=\"tab-button\"]{color:var(--bx-site-muted)!important;font-size:14px;font-weight:500;border-bottom-width:2px;border-color:transparent!important}#content .tabs [data-component-part=\"tab-button\"]:hover{color:var(--bx-fg)!important}#content .tabs [data-component-part=\"tab-button\"][data-active=\"true\"]{color:var(--bx-fg)!important;border-color:var(--bx-accent)!important}#content table{font-size:14px;line-height:22px}#content th{padding:0 14px 8px 0;border-bottom:1px solid var(--bx-line-strong)!important;font-size:13px;font-weight:600;color:var(--bx-muted)!important}#content td{padding:10px 14px 10px 0;border-bottom:1px solid var(--bx-line)!important;vertical-align:top;color:var(--bx-body)}#content td:last-child,#content th:last-child{padding-right:0}#content tr{border:0!important}#content td code{overflow-wrap:anywhere}@media (min-width: 1280px){#content [data-component-part=\"scroll-area\"]:has(table){width:calc(100% + var(--page-padding) * 2 + 56px)}}#content .columns{gap:12px}#content .columns>.card:last-child:nth-child(odd){grid-column:1 / -1}#content .card{margin:0;border:1px solid var(--bx-line)!important;border-radius:8px!important;background:transparent!important;box-shadow:none!important;transition:border-color 0.15s, background-color 0.15s}html.dark #content .card{--primary-light: 40 45 47}html:not(.dark) #content .card{--primary: 214 217 216}html.dark #content .card [data-component-part=\"card-icon\"]{--primary-light: 150 152 154}html:not(.dark) #content .card [data-component-part=\"card-icon\"]{--primary: 96 101 99}html.dark #content .card:hover [data-component-part=\"card-icon\"]{--primary-light: 110 231 183}html:not(.dark) #content .card:hover [data-component-part=\"card-icon\"]{--primary: 4 120 87}#content .card:hover{border-color:var(--bx-line-strong)!important;background:var(--bx-raised)!important}#content .card [data-component-part=\"card-content-container\"]{padding:16px 18px}#content .card [data-component-part=\"card-icon\"],#content .card [data-component-part=\"card-icon\"] svg{width:18px;height:18px;color:var(--bx-muted);fill:currentColor;transition:color 0.15s}#content .card:hover [data-component-part=\"card-icon\"],#content .card:hover [data-component-part=\"card-icon\"] svg{color:var(--bx-link)}#content .card [data-component-part=\"card-title\"]{margin:8px 0 0!important;font-size:15px;line-height:22px;font-weight:600;color:var(--bx-fg)!important}#content .card [data-component-part=\"card-content\"]{margin-top:2px;font-size:14px;line-height:22px;color:var(--bx-muted)!important}#content .card:focus-visible{outline:2px solid var(--bx-link);outline-offset:2px}#content details{border:1px solid var(--bx-line)!important;border-radius:8px!important;background:transparent!important}#content details>summary{color:var(--bx-fg);font-size:15px;font-weight:500}#content details>summary:hover{background:var(--bx-raised)}#pagination{margin-top:64px;gap:12px}#pagination a{flex:1;padding:12px 16px;border:1px solid var(--bx-line);border-radius:8px;color:var(--bx-fg);transition:border-color 0.15s}#pagination a:hover{border-color:var(--bx-line-strong)}#pagination [data-component-part=\"pagination-title\"]{color:var(--bx-fg)!important}#pagination a[rel=\"next\"]{justify-content:flex-end;text-align:right}#sidebar .method-nav-pill>span{background:transparent!important;border:1px solid var(--bx-line-strong);color:var(--bx-muted)!important;font-family:var(--bx-font-mono)}#footer a[href*=\"mintlify.com\"],#footer div:has(>div>a[href*=\"mintlify.com\"]){display:none!important}#footer *{border-color:var(--bx-line)!important}#footer{display:block!important;max-width:none!important;margin:0!important;padding:32px 7% 36px!important;border-top:1px solid var(--bx-line)!important}#footer>div{display:block!important;max-width:none!important;margin:0!important;padding:0!important}#footer>div>div:has(+div>div>a[href*=\"mintlify.com\"]){display:none!important}#footer>div>div:first-child{display:grid!important;grid-template-columns:max-content minmax(0, 1fr);column-gap:24px;row-gap:24px;min-height:0!important}#footer>div>div:first-child>div:first-child{display:flex!important;min-width:0!important;margin-right:16px}#footer>div>div:first-child>div:last-child{display:grid!important;grid-template-columns:repeat(4, minmax(0, 1fr))!important;gap:24px}#footer>div>div:first-child>div:last-child>div{display:block!important;min-width:0;align-items:stretch!important}#footer>div>div:first-child>div:last-child>div>div{display:grid!important;align-content:start;gap:6px}#footer a[class~=\"select-none\"]{display:inline-flex!important;align-items:flex-start;gap:10px;text-decoration:none}#footer a[class~=\"select-none\"] img{flex:none;width:28px;height:28px}#footer a[class~=\"select-none\"]::after{content:\"BoxRouter\";color:var(--bx-fg);font-size:14px;font-weight:600;line-height:28px}#footer p{margin:0 0 4px!important;color:var(--bx-fg)!important;font-size:13px;line-height:1.3;font-weight:600}#footer a:not([class~=\"select-none\"]){max-width:none!important;overflow:visible!important;text-overflow:clip!important;white-space:normal!important;color:var(--bx-site-muted)!important;font-size:14px;line-height:1.625;font-weight:450}#footer a:not([class~=\"select-none\"]):hover{color:var(--bx-fg)!important}@media (max-width: 760px){#footer{padding:28px 20px 36px!important}#footer>div>div:first-child{grid-template-columns:minmax(0, 1fr)!important}#footer>div>div:first-child>div:first-child{margin-right:0}#footer>div>div:first-child>div:last-child{grid-template-columns:repeat(2, minmax(0, 1fr))!important;gap:20px 16px}}@media (max-width: 420px){#footer>div>div:first-child>div:last-child{display:flex!important;flex-direction:column}}#assistant-entry,[data-testid=\"feedback-toolbar\"],#feedback-toolbar,.feedback-toolbar{display:none!important}.doc-figure{margin:32px 0 0;container-type:inline-size;container-name:docfig}.doc-figure img{display:none;width:100%;height:auto;margin:0}.doc-figure .doc-figure-desktop{max-width:560px}.doc-figure .doc-figure-mobile.doc-figure-light,.doc-figure .doc-figure-mobile.doc-figure-dark{display:none}.doc-figure .doc-figure-desktop.doc-figure-light{display:block}.dark .doc-figure .doc-figure-desktop.doc-figure-light{display:none}.dark .doc-figure .doc-figure-desktop.doc-figure-dark{display:block}.doc-figure .doc-figure-caption{margin:10px 0 0;font-size:14px;line-height:22px;color:var(--bx-muted);opacity:1}@container docfig (max-width: 479px){.doc-figure .doc-figure-desktop.doc-figure-light,.dark .doc-figure .doc-figure-desktop.doc-figure-dark{display:none}.doc-figure .doc-figure-mobile.doc-figure-light{display:block;max-width:440px;margin-inline:auto}.dark .doc-figure .doc-figure-mobile.doc-figure-light{display:none}.dark .doc-figure .doc-figure-mobile.doc-figure-dark{display:block;max-width:440px;margin-inline:auto}}@supports not (container-type: inline-size){@media (max-width: 600px){.doc-figure .doc-figure-desktop.doc-figure-light,.dark .doc-figure .doc-figure-desktop.doc-figure-dark{display:none}.doc-figure .doc-figure-mobile.doc-figure-light{display:block;max-width:440px;margin-inline:auto}.dark .doc-figure .doc-figure-mobile.doc-figure-light{display:none}.dark .doc-figure .doc-figure-mobile.doc-figure-dark{display:block;max-width:440px;margin-inline:auto}}}.bx-diagram{margin:32px 0 0;container-type:inline-size;container-name:bxdiagram}.bx-diagram svg{display:block;width:100%;height:auto}.bx-diagram .bx-diagram-mobile{display:none}.bx-diagram-caption{margin-top:10px;font-size:14px;line-height:22px;color:var(--bx-muted)}@container bxdiagram (max-width: 559px){.bx-diagram .bx-diagram-desktop:not(:only-child){display:none}.bx-diagram .bx-diagram-mobile{display:block;max-width:440px;margin-inline:auto}}html{overflow-y:scroll}[class*=\"active:scale\"]:active{scale:none!important}html{overscroll-behavior-x:none}[data-component-part=\"scroll-area-viewport\"]{overscroll-behavior-x:contain}"}],"page":{"pagePath":"reference/destroy","slug":"/reference/destroy","pageMetadata":{"title":"Destroy a Sandbox","openapi":"openapi.json DELETE /sandboxes/{sandbox_id}","description":"You can rely on:\n- Never deletes another generation of the sandbox.\n- Returns once accepted: 204 when confirmed, else 202 with an operation that completes lifecycle work; GET /operations/{id} reports completion.\n- While a destroy is unresolved, a repeated destroy is accepted as the same pending operation and makes no second provider call; once the destroy is confirmed, a repeat returns 204 with no body.\n\nYou can set: nothing.\n\nNot promised: how long teardown takes; that the sandbox is already absent from listings on return.\n\nRequests destruction on the original upstream account, including persistent sandbox\nstorage where the provider's destroy operation removes it. Separately owned volumes\nare not deleted. DELETE returns once the provider accepts the destroy, always as 202\nwith the sandbox: `state` is `destroyed` when the provider confirmed within the request\nand `destroying` while lifecycle work remains, and `operation_id` is set while work\nremains. BoxRouter finishes an accepted destroy without the caller. GET\n/operations/{operation_id} reports the operation's outcome; for an accepted destroy this\nincludes any remaining stop, final usage, and deletion work.\n\nA repeat DELETE while destruction is unresolved returns 202 with the existing\noperation_id and makes no second provider call. Once destruction is confirmed,\nrepeat DELETEs return 202 with the destroyed sandbox and no `operation_id`. Unknown or\nunowned sandbox IDs return 404.\n","href":"/reference/destroy"},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n li: \"li\",\n p: \"p\",\n ul: \"ul\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsx(_components.p, {\n children: \"You can rely on:\"\n }), \"\\n\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsx(_components.li, {\n children: \"Never deletes another generation of the sandbox.\"\n }), \"\\n\", _jsxs(_components.li, {\n children: [\"Returns once accepted: 204 when confirmed, else 202 with an operation that completes lifecycle work; GET /operations/\", \" reports completion.\"]\n }), \"\\n\", _jsx(_components.li, {\n children: \"While a destroy is unresolved, a repeated destroy is accepted as the same pending operation and makes no second provider call; once the destroy is confirmed, a repeat returns 204 with no body.\"\n }), \"\\n\"]\n }), \"\\n\", _jsx(_components.p, {\n children: \"You can set: nothing.\"\n }), \"\\n\", _jsx(_components.p, {\n children: \"Not promised: how long teardown takes; that the sandbox is already absent from listings on return.\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Requests destruction on the original upstream account, including persistent sandbox\\nstorage where the provider’s destroy operation removes it. Separately owned volumes\\nare not deleted. DELETE returns once the provider accepts the destroy, always as 202\\nwith the sandbox: \", _jsx(_components.code, {\n children: \"state\"\n }), \" is \", _jsx(_components.code, {\n children: \"destroyed\"\n }), \" when the provider confirmed within the request\\nand \", _jsx(_components.code, {\n children: \"destroying\"\n }), \" while lifecycle work remains, and \", _jsx(_components.code, {\n children: \"operation_id\"\n }), \" is set while work\\nremains. BoxRouter finishes an accepted destroy without the caller. GET\\n/operations/\", \" reports the operation’s outcome; for an accepted destroy this\\nincludes any remaining stop, final usage, and deletion work.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"A repeat DELETE while destruction is unresolved returns 202 with the existing\\noperation_id and makes no second provider call. Once destruction is confirmed,\\nrepeat DELETEs return 202 with the destroyed sandbox and no \", _jsx(_components.code, {\n children: \"operation_id\"\n }), \". Unknown or\\nunowned sandbox IDs return 404.\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"codeStyling":{"theme":"css-variables"},"config":{},"pageMetadata":{"title":"Destroy a Sandbox","openapi":"openapi.json DELETE /sandboxes/{sandbox_id}","description":"You can rely on:\n- Never deletes another generation of the sandbox.\n- Returns once accepted: 204 when confirmed, else 202 with an operation that completes lifecycle work; GET /operations/{id} reports completion.\n- While a destroy is unresolved, a repeated destroy is accepted as the same pending operation and makes no second provider call; once the destroy is confirmed, a repeat returns 204 with no body.\n\nYou can set: nothing.\n\nNot promised: how long teardown takes; that the sandbox is already absent from listings on return.\n\nRequests destruction on the original upstream account, including persistent sandbox\nstorage where the provider's destroy operation removes it. Separately owned volumes\nare not deleted. DELETE returns once the provider accepts the destroy, always as 202\nwith the sandbox: `state` is `destroyed` when the provider confirmed within the request\nand `destroying` while lifecycle work remains, and `operation_id` is set while work\nremains. BoxRouter finishes an accepted destroy without the caller. GET\n/operations/{operation_id} reports the operation's outcome; for an accepted destroy this\nincludes any remaining stop, final usage, and deletion work.\n\nA repeat DELETE while destruction is unresolved returns 202 with the existing\noperation_id and makes no second provider call. Once destruction is confirmed,\nrepeat DELETEs return 202 with the destroyed sandbox and no `operation_id`. Unknown or\nunowned sandbox IDs return 404.\n","href":"/reference/destroy"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":["/docs/_mintlify/custom/nv-4965711d/0678d865bf98fa52/docs-search.js","/docs/_mintlify/custom/nv-4965711d/1676f8e75d3dc931/docs-header.js"],"openApiReferenceData":{"operation":{"tags":["sandboxes"],"operationId":"destroySandbox","x-boxrouter-cli-alias":"destroy","x-speakeasy-group":"sandboxes","x-speakeasy-name-override":"destroy","parameters":["54888933-865f-4963-bf05-526a140f2b72"],"summary":"Destroy a sandbox","description":"You can rely on:\n- Never deletes another generation of the sandbox.\n- Returns once accepted: 204 when confirmed, else 202 with an operation that completes lifecycle work; GET /operations/{id} reports completion.\n- While a destroy is unresolved, a repeated destroy is accepted as the same pending operation and makes no second provider call; once the destroy is confirmed, a repeat returns 204 with no body.\n\nYou can set: nothing.\n\nNot promised: how long teardown takes; that the sandbox is already absent from listings on return.\n\nRequests destruction on the original upstream account, including persistent sandbox\nstorage where the provider's destroy operation removes it. Separately owned volumes\nare not deleted. DELETE returns once the provider accepts the destroy, always as 202\nwith the sandbox: `state` is `destroyed` when the provider confirmed within the request\nand `destroying` while lifecycle work remains, and `operation_id` is set while work\nremains. BoxRouter finishes an accepted destroy without the caller. GET\n/operations/{operation_id} reports the operation's outcome; for an accepted destroy this\nincludes any remaining stop, final usage, and deletion work.\n\nA repeat DELETE while destruction is unresolved returns 202 with the existing\noperation_id and makes no second provider call. Once destruction is confirmed,\nrepeat DELETEs return 202 with the destroyed sandbox and no `operation_id`. Unknown or\nunowned sandbox IDs return 404.\n","responses":{"202":"8f966bcf-5634-4e69-92e4-36231920a6c9","404":"2eefd491-b11c-41cd-a515-1666ba0cf8b0","409":"cfb765ad-e5b8-4a09-a2c9-5717e1564483","default":"a6d0998f-d350-4316-87c5-c0dcef824b39"},"method":"delete","type":"path","servers":["38340c0e-1365-48ce-8dcd-74c64a2f69dc"],"security":["dd0c83e6-beb9-482e-9a5d-60b9e86012e1","3a6c0149-9909-4d75-82ec-be6787165396"],"path":"/sandboxes/{sandbox_id}","baseUrlOptions":["https://api.boxrouter.ai/api/v1"],"title":"Destroy a sandbox","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"54888933-865f-4963-bf05-526a140f2b72":{"name":"discard_unsaved","in":"query","required":false,"description":"Destroy even if saving the attached volume fails, discarding unsaved changes.","schema":{"type":"boolean","default":false,"isRequired":false,"description":"Destroy even if saving the attached volume fails, discarding unsaved changes.","uniqueKey":"","typeLabel":"boolean"}},"2ea58ac7-bb71-4a15-a32c-ee95143f3bc3":{"name":"sandbox_id","in":"path","required":true,"description":"Workspace-owned BoxRouter sandbox ID, not an upstream ID.","schema":{"type":"string","minLength":1,"pattern":"^[^\\u0000]*$","isRequired":true,"description":"Workspace-owned BoxRouter sandbox ID, not an upstream ID.","uniqueKey":"","typeLabel":"string"}}},"responses":{"8f966bcf-5634-4e69-92e4-36231920a6c9":{"description":"The sandbox after the provider accepted the destroy.","headers":{"Server-Timing":{"description":"Durations of server-side phases, for diagnosing slow requests. Phase names are not stable\nand may change.\n","schema":{"type":"string"},"x-boxrouter-server-timing":{"version":1,"unit":"ms","serviceAggregateMetric":"service","maxHeaderBytes":8192,"maxOperationRows":32,"decimalPlaces":3,"safeNamePattern":"^[A-Za-z0-9_.:-]{1,64}$","aggregates":[{"metric":"service","fieldStem":"cloud"},{"metric":"database","fieldStem":"database"},{"metric":"code","fieldStem":"code"},{"metric":"provider_connect","fieldStem":"provider_connect"},{"metric":"provider_wait","fieldStem":"provider_wait"},{"metric":"accept","fieldStem":"accept"},{"metric":"queue","fieldStem":"queue"},{"metric":"admission","fieldStem":"admission"},{"metric":"encode","fieldStem":"encode"}],"aggregateGrammar":{"duration":{"parameter":"dur","type":"number","finite":true,"minimum":0},"descriptionParameter":"desc","unknownDescription":"unknown","missingMeans":"unreported"},"operationGrammar":{"metric":"op","nameParameter":"desc","namePattern":"safeNamePattern","start":{"parameter":"start","type":"number","finite":true,"sign":"signed","relativeTo":"recorderWindow"},"duration":{"parameter":"dur","type":"number","finite":true,"minimum":0},"outcomeParameter":"outcome","outcomes":["returned","raised"],"requiresAggregateDependencyUnion":false},"omissionGrammar":{"metric":"op-omitted","count":{"parameter":"desc","type":"integer","minimum":0},"duration":{"parameter":"dur","type":"number","finite":true,"minimum":0,"sumOf":"knownOmittedMeasuredRows"},"requiresAggregateDependencyUnion":false},"coverageGrammar":{"metric":"op-coverage","descriptionParameter":"desc","unknownValue":"unknown","absentState":"unreported","states":["unknown","unreported"],"absenceImpliesCompleteness":false}}}},"content":{"application/json":{"schema":{"type":"object","description":"A sandbox created from a settled body, returned by create, restore, get and list.\nRequired fields are present; fields with no value are null, never absent. Optional\nfields may be absent when their source is not known. Listings do no\nprovider I/O: they show the latest durably recorded state, and native_state,\nroute.selection and recorder are null. Detail responses observe the provider live and\nrecord the normalized state unless a concurrent lifecycle change supersedes the read.\n","required":["id","state","state_reason","failure","native_state","observed_at","state_recorded_at","created_at","ready_at","ended_at","labels","lifetime","route","contract","request","hidden_secrets","tcp_ports","recorder","limits"],"properties":{"id":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[^\\u0000]*$","isRequired":true,"uniqueKey":"id","typeLabel":"string"},"state":{"type":"string","enum":["creating","running","paused","destroying","destroyed","error","unknown"],"x-boxrouter-open-enum":true,"description":"Clients must tolerate values they do not know. A sandbox the provider stopped, or one\nstopped for being idle that can be started again, reads paused; resume brings either back.\n","isRequired":true,"uniqueKey":"state","typeLabel":"enum\u003cstring>"},"state_reason":{"oneOf":[{"type":"string","enum":["requested","lifetime","retention","idle_shutdown","external",null],"x-boxrouter-open-enum":true,"description":"Why it is in this state. external is a change made at the provider, behind BoxRouter's back.","isRequired":true,"uniqueKey":"state_reason.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["requested","lifetime","retention","idle_shutdown","external",null],"x-boxrouter-open-enum":true,"description":"Why it is in this state. external is a change made at the provider, behind BoxRouter's back.","isRequired":true,"uniqueKey":"state_reason.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"state_reason","typeLabel":"enum\u003cstring> | null"},"failure":{"oneOf":[{"type":"object","description":"The provider failure recorded with state=error, or null when no recorded failure\nexplains the current state. Present on create, detail and list responses; list\nreads return the durable value without calling the provider.\n","required":["summary","provider_state","native_code","native_message","observed_at"],"properties":{"summary":{"type":"string","minLength":1,"maxLength":200,"description":"BoxRouter-authored plain language chosen from a fixed set keyed by provider and\nprovider_state. An unrecognised status uses \"The provider reported this sandbox\nas failed.\"; it never guesses a cause.\n","isRequired":true,"uniqueKey":"failure.oneOf.0.summary","typeLabel":"string"},"provider_state":{"oneOf":[{"type":"string","description":"The provider's raw failure status, the same value native_state carries, or null if none was supplied.","isRequired":true,"uniqueKey":"failure.oneOf.0.provider_state.oneOf.0","typeLabel":"string"},{"type":"null","description":"The provider's raw failure status, the same value native_state carries, or null if none was supplied.","isRequired":true,"uniqueKey":"failure.oneOf.0.provider_state.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"failure.oneOf.0.provider_state","typeLabel":"string | null"},"native_code":{"oneOf":[{"type":"string","pattern":"^[A-Za-z0-9_.:-]{1,64}$","description":"The provider's short structured failure code, or null if absent or unsafe.","isRequired":true,"uniqueKey":"failure.oneOf.0.native_code.oneOf.0","typeLabel":"string"},{"type":"null","pattern":"^[A-Za-z0-9_.:-]{1,64}$","description":"The provider's short structured failure code, or null if absent or unsafe.","isRequired":true,"uniqueKey":"failure.oneOf.0.native_code.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"failure.oneOf.0.native_code","typeLabel":"string | null"},"native_message":{"oneOf":[{"type":"string","maxLength":512,"description":"The provider's diagnostic text after redaction, or null if absent or unsafe.","isRequired":true,"uniqueKey":"failure.oneOf.0.native_message.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":512,"description":"The provider's diagnostic text after redaction, or null if absent or unsafe.","isRequired":true,"uniqueKey":"failure.oneOf.0.native_message.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"failure.oneOf.0.native_message","typeLabel":"string | null"},"observed_at":{"type":"string","format":"date-time","description":"When BoxRouter first observed this specific failure.","isRequired":true,"uniqueKey":"failure.oneOf.0.observed_at","typeLabel":"string\u003cdate-time>"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"failure.oneOf.0","typeLabel":"object"},{"type":"null","description":"The provider failure recorded with state=error, or null when no recorded failure\nexplains the current state. Present on create, detail and list responses; list\nreads return the durable value without calling the provider.\n","isRequired":true,"uniqueKey":"failure.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"failure","typeLabel":"object | null"},"native_state":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"native_state.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"native_state.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"native_state","typeLabel":"string | null"},"observed_at":{"type":"string","format":"date-time","description":"Time the state source for this response was read: the owned-record lookup time\nfor a list response, or the live provider-observation time for a detail response.\n","isRequired":true,"uniqueKey":"observed_at","typeLabel":"string\u003cdate-time>"},"state_recorded_at":{"oneOf":[{"type":"string","format":"date-time","description":"Timestamp of the durable state source used for this response. This can be an\nexisting lifecycle or lifetime record when the returned public state is derived\nfrom that source, and may predate observed_at. Null when no source timestamp is\navailable or a concurrent lifecycle change supersedes the detail read.\n","isRequired":true,"uniqueKey":"state_recorded_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"Timestamp of the durable state source used for this response. This can be an\nexisting lifecycle or lifetime record when the returned public state is derived\nfrom that source, and may predate observed_at. Null when no source timestamp is\navailable or a concurrent lifecycle change supersedes the detail read.\n","isRequired":true,"uniqueKey":"state_recorded_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"state_recorded_at","typeLabel":"string\u003cdate-time> | null"},"created_at":{"oneOf":[{"type":"string","format":"date-time","description":"Time Cloud sent the first create request when that edge is available; otherwise the sandbox record's created time.","isRequired":true,"uniqueKey":"created_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"Time Cloud sent the first create request when that edge is available; otherwise the sandbox record's created time.","isRequired":true,"uniqueKey":"created_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"created_at","typeLabel":"string\u003cdate-time> | null"},"ready_at":{"oneOf":[{"type":"string","format":"date-time","description":"Time Cloud received the first create response; when that edge is unavailable, the sandbox\nrecord's ready time. Null while creating. List and detail responses use the same value.\n","isRequired":true,"uniqueKey":"ready_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"Time Cloud received the first create response; when that edge is unavailable, the sandbox\nrecord's ready time. Null while creating. List and detail responses use the same value.\n","isRequired":true,"uniqueKey":"ready_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"ready_at","typeLabel":"string\u003cdate-time> | null"},"ended_at":{"oneOf":[{"type":"string","format":"date-time","description":"Time Cloud received the last destroy response; when that edge is unavailable, Cloud's\nrecord of confirmation or first observation that the sandbox was gone. Null while the\nsandbox has not ended. List and detail responses use the same value.\n","isRequired":true,"uniqueKey":"ended_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"Time Cloud received the last destroy response; when that edge is unavailable, Cloud's\nrecord of confirmation or first observation that the sandbox was gone. Null while the\nsandbox has not ended. List and detail responses use the same value.\n","isRequired":true,"uniqueKey":"ended_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"ended_at","typeLabel":"string\u003cdate-time> | null"},"labels":{"type":"object","additionalProperties":{"type":"string","uniqueKey":"labels.additionalProperties","typeLabel":"string"},"isRequired":true,"uniqueKey":"labels","typeLabel":"object"},"lifetime":{"type":"object","required":["seconds","remaining_seconds","ends_at","kept_until","at_end","max_seconds","extendable"],"description":"How long the sandbox may live. It counts from the provider's create, as with the\nprovider's own SDK (BoxRouter's clock starts when it sends the create). Whether paused\ntime counts depends on the provider.\n","properties":{"seconds":{"oneOf":[{"type":"integer","minimum":0,"description":"The lifetime in seconds. 0 only for a sandbox that has no lifetime record (one that\nended before lifetimes were recorded). Null for a sandbox created with no lifetime\n(`lifetime_seconds: null`), which runs until it is destroyed.\n","isRequired":true,"uniqueKey":"lifetime.seconds.oneOf.0","typeLabel":"integer"},{"type":"null","minimum":0,"description":"The lifetime in seconds. 0 only for a sandbox that has no lifetime record (one that\nended before lifetimes were recorded). Null for a sandbox created with no lifetime\n(`lifetime_seconds: null`), which runs until it is destroyed.\n","isRequired":true,"uniqueKey":"lifetime.seconds.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"lifetime.seconds","typeLabel":"integer | null"},"remaining_seconds":{"oneOf":[{"type":"integer","minimum":0,"description":"As of observed_at. Equal to seconds while creating, and frozen while the sandbox is not\nrunning. Null for a sandbox with no lifetime.\n","isRequired":true,"uniqueKey":"lifetime.remaining_seconds.oneOf.0","typeLabel":"integer"},{"type":"null","minimum":0,"description":"As of observed_at. Equal to seconds while creating, and frozen while the sandbox is not\nrunning. Null for a sandbox with no lifetime.\n","isRequired":true,"uniqueKey":"lifetime.remaining_seconds.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"lifetime.remaining_seconds","typeLabel":"integer | null"},"ends_at":{"oneOf":[{"type":"string","format":"date-time","description":"Set only while running. The end never comes before it; how soon after is not\npromised. Null while creating, paused or ended, and for a sandbox with no lifetime.\n","isRequired":true,"uniqueKey":"lifetime.ends_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"Set only while running. The end never comes before it; how soon after is not\npromised. Null while creating, paused or ended, and for a sandbox with no lifetime.\n","isRequired":true,"uniqueKey":"lifetime.ends_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"lifetime.ends_at","typeLabel":"string\u003cdate-time> | null"},"kept_until":{"oneOf":[{"type":"string","format":"date-time","description":"While paused: when the sandbox is destroyed if it is not resumed, 30\ndays after it last ran, sooner where the provider keeps it for less. Where the lifetime\nkeeps counting while paused, the sandbox ends when the lifetime runs out, so\nkept_until is that moment when it falls inside the 30 days; extending the lifetime\nmoves it. Where the clock stops while paused, the full 30 days apply.\n","isRequired":true,"uniqueKey":"lifetime.kept_until.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"While paused: when the sandbox is destroyed if it is not resumed, 30\ndays after it last ran, sooner where the provider keeps it for less. Where the lifetime\nkeeps counting while paused, the sandbox ends when the lifetime runs out, so\nkept_until is that moment when it falls inside the 30 days; extending the lifetime\nmoves it. Where the clock stops while paused, the full 30 days apply.\n","isRequired":true,"uniqueKey":"lifetime.kept_until.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"lifetime.kept_until","typeLabel":"string\u003cdate-time> | null"},"at_end":{"oneOf":[{"type":"string","enum":["destroy","pause",null],"description":"What happens when the lifetime is used up. Null for a sandbox with no lifetime.","isRequired":true,"uniqueKey":"lifetime.at_end.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["destroy","pause",null],"description":"What happens when the lifetime is used up. Null for a sandbox with no lifetime.","isRequired":true,"uniqueKey":"lifetime.at_end.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"lifetime.at_end","typeLabel":"enum\u003cstring> | null"},"max_seconds":{"oneOf":[{"type":"integer","description":"The route's longest single run, from one start to the next pause or end, as\nnarrowed for this account. A declared number: an integer, \"unlimited\", \"unknown\"\nor a floor.\n","minimum":1,"isRequired":true,"uniqueKey":"lifetime.max_seconds.oneOf.0","typeLabel":"integer"},{"type":"string","description":"The route's longest single run, from one start to the next pause or end, as\nnarrowed for this account. A declared number: an integer, \"unlimited\", \"unknown\"\nor a floor.\n","enum":["unlimited","unknown"],"isRequired":true,"uniqueKey":"lifetime.max_seconds.oneOf.1","typeLabel":"enum\u003cstring>"},{"type":"object","description":"The route's longest single run, from one start to the next pause or end, as\nnarrowed for this account. A declared number: an integer, \"unlimited\", \"unknown\"\nor a floor.\n","required":["at_least"],"properties":{"at_least":{"type":"integer","minimum":1,"isRequired":true,"uniqueKey":"lifetime.max_seconds.oneOf.2.at_least","typeLabel":"integer"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"lifetime.max_seconds.oneOf.2","typeLabel":"object"}],"isRequired":true,"uniqueKey":"lifetime.max_seconds","typeLabel":"integer | enum\u003cstring> | object"},"extendable":{"type":"boolean","isRequired":true,"uniqueKey":"lifetime.extendable","typeLabel":"boolean"}},"isRequired":true,"uniqueKey":"lifetime","typeLabel":"object"},"route":{"type":"object","required":["provider","class","adapter_version","selection"],"description":"The adapter that made this sandbox. Support questions start at adapter_version. A sandbox\nwith no recorded contract still names its provider and account; its class and\nadapter_version are null.\n","properties":{"provider":{"type":"string","isRequired":true,"uniqueKey":"route.provider","typeLabel":"string"},"class":{"oneOf":[{"type":"string","description":"The declaration's class, such as a provider's VM class; null when the adapter publishes one declaration.","isRequired":true,"uniqueKey":"route.class.oneOf.0","typeLabel":"string"},{"type":"null","description":"The declaration's class, such as a provider's VM class; null when the adapter publishes one declaration.","isRequired":true,"uniqueKey":"route.class.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"route.class","typeLabel":"string | null"},"adapter_version":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"route.adapter_version.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"route.adapter_version.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"route.adapter_version","typeLabel":"string | null"},"selection":{"oneOf":[{"type":"object","description":"Null in listings, which look at no route.","required":["considered","eligible","ranked_by","excluded","attempts"],"properties":{"considered":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"route.selection.oneOf.0.considered","typeLabel":"integer"},"eligible":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"route.selection.oneOf.0.eligible","typeLabel":"integer"},"ranked_by":{"oneOf":[{"type":"string","enum":["price","time","providers","order",null],"x-boxrouter-choices":{"price":{"label":"Price","line":"Lowest hourly price first.","measure":"price","better":"lower"},"time":{"label":"Time","line":"Shortest run time measured on reference workloads first.","measure":"time","better":"lower"},"providers":{"label":"Providers","line":"The hard list order."},"order":{"label":"Order","line":"A soft provider preference."}},"description":"The sort used; providers for the hard list order; order for a soft provider preference; or null for the router's default.","isRequired":true,"uniqueKey":"route.selection.oneOf.0.ranked_by.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["price","time","providers","order",null],"x-boxrouter-choices":{"price":{"label":"Price","line":"Lowest hourly price first.","measure":"price","better":"lower"},"time":{"label":"Time","line":"Shortest run time measured on reference workloads first.","measure":"time","better":"lower"},"providers":{"label":"Providers","line":"The hard list order."},"order":{"label":"Order","line":"A soft provider preference."}},"description":"The sort used; providers for the hard list order; order for a soft provider preference; or null for the router's default.","isRequired":true,"uniqueKey":"route.selection.oneOf.0.ranked_by.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"route.selection.oneOf.0.ranked_by","typeLabel":"enum\u003cstring> | null"},"excluded":{"type":"array","items":{"type":"object","required":["provider","class","account_id","failed"],"description":"One candidate that was not eligible, with every check it failed.","properties":{"provider":{"type":"string","isRequired":true,"uniqueKey":"route.selection.oneOf.0.excluded.items.[INDEX].provider","typeLabel":"string"},"class":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"route.selection.oneOf.0.excluded.items.[INDEX].class.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"route.selection.oneOf.0.excluded.items.[INDEX].class.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"route.selection.oneOf.0.excluded.items.[INDEX].class","typeLabel":"string | null"},"account_id":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"route.selection.oneOf.0.excluded.items.[INDEX].account_id.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"route.selection.oneOf.0.excluded.items.[INDEX].account_id.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"route.selection.oneOf.0.excluded.items.[INDEX].account_id","typeLabel":"string | null"},"failed":{"type":"array","items":{"type":"object","required":["reason"],"description":"One failed check, in the order they are made: baseline, then the gates in the spec's\norder with extras last, then conflicts, resources and basis.\n","properties":{"reason":{"type":"string","description":"gate_not_listed, gate_unsupported, gate_unavailable, knob_mismatch, knob_unknown,\nconflict, resource_mismatch, resource_unknown, not_proven, limit_exceeded,\nbound_elsewhere, extra_mismatch, declaration_unusable, variant_unusable,\nbaseline_failed, account_unchecked, account_unhealthy, standard_image_unavailable,\nnot_allowed, `not connected`, `not enabled`, price_unknown, insufficient_credit,\nspend_limit_exceeded, outside_funding_authority, unfunded or class_not_selected.\n`standard_image_unavailable` means the account has no verified copy of the standard image\nfor the route's exact region, image version and digest; its `fix` field gives the setup fix.\nIt is distinct from `baseline_failed`, which means the provider cannot meet the requested\ncontract. `price_unknown` means the payer's price is unknown; `insufficient_credit` means\nthe payer has fewer credits than required; `spend_limit_exceeded` means the applicable\nspend limit prevents the request. These typed funding refusals apply only when a payer\nexists. `unfunded` means no provider key and no credits, not merely zero available credits.\n`outside_funding_authority` means the matched route is outside the funding ceiling selected\nfor this request. `not connected` means the provider is served by this deployment but no\naccount is connected to this workspace; `not enabled` means the provider is not served by\nthis deployment. `class_not_selected` means a matched sibling class lost the\none-class-per-route selection while its route remains inside the authority ceiling; it\nexcludes the class, not the route. `open_ended_unfit` means the provider can end a\nsandbox, so it cannot serve one with `lifetime_seconds: null`; `open_ended_needs_byok`\nmeans that request was made on a credit-funded route. Clients must tolerate reasons\nthey do not know.\n","isRequired":true,"uniqueKey":"route.selection.oneOf.0.excluded.items.[INDEX].failed.items.[INDEX].reason","typeLabel":"string"},"gate":{"type":"string","uniqueKey":"route.selection.oneOf.0.excluded.items.[INDEX].failed.items.[INDEX].gate","typeLabel":"string"},"knob":{"type":"string","uniqueKey":"route.selection.oneOf.0.excluded.items.[INDEX].failed.items.[INDEX].knob","typeLabel":"string"},"resource":{"type":"string","uniqueKey":"route.selection.oneOf.0.excluded.items.[INDEX].failed.items.[INDEX].resource","typeLabel":"string"},"extra":{"type":"string","uniqueKey":"route.selection.oneOf.0.excluded.items.[INDEX].failed.items.[INDEX].extra","typeLabel":"string"},"limit":{"type":"string","uniqueKey":"route.selection.oneOf.0.excluded.items.[INDEX].failed.items.[INDEX].limit","typeLabel":"string"},"detail":{"oneOf":[{"type":"string","uniqueKey":"route.selection.oneOf.0.excluded.items.[INDEX].failed.items.[INDEX].detail.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"route.selection.oneOf.0.excluded.items.[INDEX].failed.items.[INDEX].detail.oneOf.1","typeLabel":"null"}],"uniqueKey":"route.selection.oneOf.0.excluded.items.[INDEX].failed.items.[INDEX].detail","typeLabel":"string | null"},"details":{"type":"object","description":"Structured facts for the refusal, such as available and required credits or the applicable\nspend limit.\n","additionalProperties":true,"uniqueKey":"route.selection.oneOf.0.excluded.items.[INDEX].failed.items.[INDEX].details","typeLabel":"object"},"fix":{"oneOf":[{"type":"string","description":"Setup action for this failed check, when one is available.","uniqueKey":"route.selection.oneOf.0.excluded.items.[INDEX].failed.items.[INDEX].fix.oneOf.0","typeLabel":"string"},{"type":"null","description":"Setup action for this failed check, when one is available.","uniqueKey":"route.selection.oneOf.0.excluded.items.[INDEX].failed.items.[INDEX].fix.oneOf.1","typeLabel":"null"}],"uniqueKey":"route.selection.oneOf.0.excluded.items.[INDEX].failed.items.[INDEX].fix","typeLabel":"string | null"},"asked":{"description":"What the request asked for, in the request's own form.","uniqueKey":"route.selection.oneOf.0.excluded.items.[INDEX].failed.items.[INDEX].asked","typeLabel":"any"},"offered":{"description":"What the declaration offers, in the declaration's own form.","uniqueKey":"route.selection.oneOf.0.excluded.items.[INDEX].failed.items.[INDEX].offered","typeLabel":"any"},"narrowed_by":{"oneOf":[{"type":"string","enum":["account",null],"uniqueKey":"route.selection.oneOf.0.excluded.items.[INDEX].failed.items.[INDEX].narrowed_by.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["account",null],"uniqueKey":"route.selection.oneOf.0.excluded.items.[INDEX].failed.items.[INDEX].narrowed_by.oneOf.1","typeLabel":"null"}],"uniqueKey":"route.selection.oneOf.0.excluded.items.[INDEX].failed.items.[INDEX].narrowed_by","typeLabel":"enum\u003cstring> | null"},"between":{"type":"array","items":{"type":"string","uniqueKey":"route.selection.oneOf.0.excluded.items.[INDEX].failed.items.[INDEX].between.items.[INDEX]","typeLabel":"string"},"uniqueKey":"route.selection.oneOf.0.excluded.items.[INDEX].failed.items.[INDEX].between","typeLabel":"string[]"},"value":{"description":"The one value that caused the failure, when one did.","uniqueKey":"route.selection.oneOf.0.excluded.items.[INDEX].failed.items.[INDEX].value","typeLabel":"any"}},"uniqueKey":"route.selection.oneOf.0.excluded.items.[INDEX].failed.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"route.selection.oneOf.0.excluded.items.[INDEX].failed","typeLabel":"object[]"}},"uniqueKey":"route.selection.oneOf.0.excluded.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"route.selection.oneOf.0.excluded","typeLabel":"object[]"},"attempts":{"type":"array","description":"Adapters that refused this create before the one that made it, in dispatch order. Only\ndispatches appear; routes skipped before dispatch are in `excluded`. Normally empty:\nBoxRouter tries the next eligible adapter once when a refusal is definite.\n","items":{"type":"object","required":["provider","native_code","native_status"],"properties":{"provider":{"type":"string","isRequired":true,"uniqueKey":"route.selection.oneOf.0.attempts.items.[INDEX].provider","typeLabel":"string"},"native_code":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"route.selection.oneOf.0.attempts.items.[INDEX].native_code.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"route.selection.oneOf.0.attempts.items.[INDEX].native_code.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"route.selection.oneOf.0.attempts.items.[INDEX].native_code","typeLabel":"string | null"},"native_status":{"oneOf":[{"type":"integer","isRequired":true,"uniqueKey":"route.selection.oneOf.0.attempts.items.[INDEX].native_status.oneOf.0","typeLabel":"integer"},{"type":"null","isRequired":true,"uniqueKey":"route.selection.oneOf.0.attempts.items.[INDEX].native_status.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"route.selection.oneOf.0.attempts.items.[INDEX].native_status","typeLabel":"integer | null"},"route_id":{"oneOf":[{"type":"string","maxLength":128,"description":"The route this dispatch used.","uniqueKey":"route.selection.oneOf.0.attempts.items.[INDEX].route_id.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":128,"description":"The route this dispatch used.","uniqueKey":"route.selection.oneOf.0.attempts.items.[INDEX].route_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"route.selection.oneOf.0.attempts.items.[INDEX].route_id","typeLabel":"string | null"},"account_id":{"oneOf":[{"type":"string","maxLength":128,"description":"The connected account this dispatch used.","uniqueKey":"route.selection.oneOf.0.attempts.items.[INDEX].account_id.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":128,"description":"The connected account this dispatch used.","uniqueKey":"route.selection.oneOf.0.attempts.items.[INDEX].account_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"route.selection.oneOf.0.attempts.items.[INDEX].account_id","typeLabel":"string | null"},"supply":{"oneOf":[{"type":"string","maxLength":32,"description":"The funding authority of this dispatch: byok or managed.","uniqueKey":"route.selection.oneOf.0.attempts.items.[INDEX].supply.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":32,"description":"The funding authority of this dispatch: byok or managed.","uniqueKey":"route.selection.oneOf.0.attempts.items.[INDEX].supply.oneOf.1","typeLabel":"null"}],"uniqueKey":"route.selection.oneOf.0.attempts.items.[INDEX].supply","typeLabel":"string | null"},"cause":{"type":"string","minLength":1,"maxLength":64,"enum":["key_rejected","plan_unbuildable","privacy_denied","not_ready","not_dispatched","provider_create_failed"],"x-boxrouter-open-enum":true,"description":"Why one route did not create the sandbox, in a bounded word: `key_rejected` (the provider\nrefused the saved key), `plan_unbuildable` (the route matched but its create could not be\nbuilt), `privacy_denied` (the workspace's privacy settings refused the route),\n`not_ready` (the route's provider session was not ready in time), `not_dispatched`\n(refused locally before any provider call) and `provider_create_failed` (the provider was\nasked and the create failed). Clients must tolerate values they do not know.\n","uniqueKey":"route.selection.oneOf.0.attempts.items.[INDEX].cause","typeLabel":"enum\u003cstring>"}},"uniqueKey":"route.selection.oneOf.0.attempts.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"route.selection.oneOf.0.attempts","typeLabel":"object[]"},"preparation_skips":{"type":"array","description":"Routes skipped after eligibility because image or provider preparation failed.","items":{"type":"object","additionalProperties":false,"required":["provider","reason_code"],"description":"A route skipped locally before any provider dispatch. It is not an attempt.","properties":{"provider":{"type":"string","minLength":1,"isRequired":true,"uniqueKey":"route.selection.oneOf.0.preparation_skips.items.[INDEX].provider","typeLabel":"string"},"reason_code":{"type":"string","minLength":1,"isRequired":true,"uniqueKey":"route.selection.oneOf.0.preparation_skips.items.[INDEX].reason_code","typeLabel":"string"},"route_id":{"oneOf":[{"type":"string","maxLength":128,"description":"The route that was skipped.","uniqueKey":"route.selection.oneOf.0.preparation_skips.items.[INDEX].route_id.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":128,"description":"The route that was skipped.","uniqueKey":"route.selection.oneOf.0.preparation_skips.items.[INDEX].route_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"route.selection.oneOf.0.preparation_skips.items.[INDEX].route_id","typeLabel":"string | null"},"account_id":{"oneOf":[{"type":"string","maxLength":128,"description":"The connected account of the skipped route.","uniqueKey":"route.selection.oneOf.0.preparation_skips.items.[INDEX].account_id.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":128,"description":"The connected account of the skipped route.","uniqueKey":"route.selection.oneOf.0.preparation_skips.items.[INDEX].account_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"route.selection.oneOf.0.preparation_skips.items.[INDEX].account_id","typeLabel":"string | null"},"cause":{"type":"string","minLength":1,"maxLength":64,"enum":["key_rejected","plan_unbuildable","privacy_denied","not_ready","not_dispatched","provider_create_failed"],"x-boxrouter-open-enum":true,"description":"Why one route did not create the sandbox, in a bounded word: `key_rejected` (the provider\nrefused the saved key), `plan_unbuildable` (the route matched but its create could not be\nbuilt), `privacy_denied` (the workspace's privacy settings refused the route),\n`not_ready` (the route's provider session was not ready in time), `not_dispatched`\n(refused locally before any provider call) and `provider_create_failed` (the provider was\nasked and the create failed). Clients must tolerate values they do not know.\n","uniqueKey":"route.selection.oneOf.0.preparation_skips.items.[INDEX].cause","typeLabel":"enum\u003cstring>"}},"uniqueKey":"route.selection.oneOf.0.preparation_skips.items.[INDEX]","typeLabel":"object"},"uniqueKey":"route.selection.oneOf.0.preparation_skips","typeLabel":"object[]"},"fallbacks_allowed":{"type":"boolean","description":"The effective allow_fallbacks after inheritance. Absent when the create predates this field.","uniqueKey":"route.selection.oneOf.0.fallbacks_allowed","typeLabel":"boolean"},"stopped_reason":{"oneOf":[{"type":"string","enum":["fallbacks_disabled","no_eligible_route","uncertain_outcome","authority_changed","deadline_reached","cancelled",null],"x-boxrouter-open-enum":true,"description":"Why creation stopped dispatching further routes: `fallbacks_disabled` (allow_fallbacks was\nfalse and the one permitted dispatch was refused), `no_eligible_route` (every remaining\nroute was excluded), `uncertain_outcome` (a dispatch may have allocated; never retried, reconcile\nwith the operation), `authority_changed` (account, funding or privacy authority no longer\npermits the next route), `deadline_reached` and `cancelled`. Null when a route created the\nsandbox. Clients must tolerate values they do not know.\n","uniqueKey":"route.selection.oneOf.0.stopped_reason.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["fallbacks_disabled","no_eligible_route","uncertain_outcome","authority_changed","deadline_reached","cancelled",null],"x-boxrouter-open-enum":true,"description":"Why creation stopped dispatching further routes: `fallbacks_disabled` (allow_fallbacks was\nfalse and the one permitted dispatch was refused), `no_eligible_route` (every remaining\nroute was excluded), `uncertain_outcome` (a dispatch may have allocated; never retried, reconcile\nwith the operation), `authority_changed` (account, funding or privacy authority no longer\npermits the next route), `deadline_reached` and `cancelled`. Null when a route created the\nsandbox. Clients must tolerate values they do not know.\n","uniqueKey":"route.selection.oneOf.0.stopped_reason.oneOf.1","typeLabel":"null"}],"uniqueKey":"route.selection.oneOf.0.stopped_reason","typeLabel":"enum\u003cstring> | null"},"funding_group":{"type":"string","enum":["prioritized","credits","fallback"],"x-boxrouter-open-enum":true,"description":"Frozen payer group of the selected route. Absent on older responses; definite pre-create fallback stays in this group after dispatch.","uniqueKey":"route.selection.oneOf.0.funding_group","typeLabel":"enum\u003cstring>"},"workspace_mode":{"type":"string","enum":["automatic","cheapest","fastest","custom"],"x-boxrouter-open-enum":true,"x-boxrouter-choices":{"automatic":{"label":"Auto","line":"A random draw weighted toward lower hourly price."},"cheapest":{"label":"Cheapest","line":"Lowest hourly price first.","measure":"price","better":"lower"},"fastest":{"label":"Fastest","line":"Shortest run time measured on reference workloads first.","measure":"time","better":"lower"},"custom":{"label":"Custom","line":"Your exact provider order, top to bottom."}},"description":"Effective workspace mode at admission; absent on older responses.","uniqueKey":"route.selection.oneOf.0.workspace_mode","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"route.selection.oneOf.0","typeLabel":"object"},{"type":"null","description":"Null in listings, which look at no route.","isRequired":true,"uniqueKey":"route.selection.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"route.selection","typeLabel":"object | null"},"id":{"oneOf":[{"type":"string","uniqueKey":"route.id.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"route.id.oneOf.1","typeLabel":"null"}],"uniqueKey":"route.id","typeLabel":"string | null"},"account_id":{"oneOf":[{"type":"string","uniqueKey":"route.account_id.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"route.account_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"route.account_id","typeLabel":"string | null"},"supply":{"oneOf":[{"type":"string","uniqueKey":"route.supply.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"route.supply.oneOf.1","typeLabel":"null"}],"uniqueKey":"route.supply","typeLabel":"string | null"},"region":{"oneOf":[{"type":"string","uniqueKey":"route.region.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"route.region.oneOf.1","typeLabel":"null"}],"uniqueKey":"route.region","typeLabel":"string | null"},"native_id":{"oneOf":[{"type":"string","description":"Provider-owned sandbox identifier; null when unavailable.","uniqueKey":"route.native_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"Provider-owned sandbox identifier; null when unavailable.","uniqueKey":"route.native_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"route.native_id","typeLabel":"string | null"}},"isRequired":true,"uniqueKey":"route","typeLabel":"object"},"contract":{"oneOf":[{"type":"object","description":"Null for a record with no recorded contract, such as one a provider-native route created.","required":["spec_version","gates","resources","attested"],"properties":{"spec_version":{"type":"string","pattern":"^(boxspec|sandbox-provider-spec)/[0-9]+\\.[0-9]+(-draft(\\.[0-9]+)?)?$","isRequired":true,"uniqueKey":"contract.oneOf.0.spec_version","typeLabel":"string"},"gates":{"type":"object","additionalProperties":{"type":"object","required":["variant","basis","granted","also","settings","unavailable"],"description":"One gate as granted to this sandbox.","properties":{"variant":{"type":"integer","minimum":0,"description":"Index into the declaration of route.adapter_version. Only meaningful with that version.","isRequired":true,"uniqueKey":"contract.oneOf.0.gates.additionalProperties.variant","typeLabel":"integer"},"basis":{"type":"string","enum":["implemented","proven"],"description":"The weakest basis among the granted values; for a gate granted with no named knob, the variant's own.","isRequired":true,"uniqueKey":"contract.oneOf.0.gates.additionalProperties.basis","typeLabel":"enum\u003cstring>"},"granted":{"type":"object","additionalProperties":true,"description":"One entry per knob the request named: the granted values for a pick-one knob, the\nstring \"any\" where the request said so, the boolean for a yes/no knob, the declared\nnumber for a number knob. This is what the code may rely on.\n","isRequired":true,"uniqueKey":"contract.oneOf.0.gates.additionalProperties.granted","typeLabel":"object"},"also":{"type":"object","additionalProperties":true,"description":"The variant's other answers, including declared limits, for information. Calls that depend on them are refused.","isRequired":true,"uniqueKey":"contract.oneOf.0.gates.additionalProperties.also","typeLabel":"object"},"settings":{"type":"object","additionalProperties":true,"isRequired":true,"uniqueKey":"contract.oneOf.0.gates.additionalProperties.settings","typeLabel":"object"},"unavailable":{"oneOf":[{"type":"string","description":"Set when the account has since lost the gate; that gate's calls then answer gate_unavailable.","isRequired":true,"uniqueKey":"contract.oneOf.0.gates.additionalProperties.unavailable.oneOf.0","typeLabel":"string"},{"type":"null","description":"Set when the account has since lost the gate; that gate's calls then answer gate_unavailable.","isRequired":true,"uniqueKey":"contract.oneOf.0.gates.additionalProperties.unavailable.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"contract.oneOf.0.gates.additionalProperties.unavailable","typeLabel":"string | null"}},"uniqueKey":"contract.oneOf.0.gates.additionalProperties","typeLabel":"object"},"isRequired":true,"uniqueKey":"contract.oneOf.0.gates","typeLabel":"object"},"resources":{"type":"object","additionalProperties":true,"description":"What was provisioned, plus the adapter's answers for long_running and extendable_lifetime. A value may be \"unknown\" or null.","isRequired":true,"uniqueKey":"contract.oneOf.0.resources","typeLabel":"object"},"attested":{"type":"object","description":"Which resource values rest on a dated citation rather than on adapter code.","additionalProperties":{"type":"object","required":["source","read"],"properties":{"source":{"type":"string","isRequired":true,"uniqueKey":"contract.oneOf.0.attested.additionalProperties.source","typeLabel":"string"},"read":{"type":"string","format":"date","isRequired":true,"uniqueKey":"contract.oneOf.0.attested.additionalProperties.read","typeLabel":"string\u003cdate>"}},"uniqueKey":"contract.oneOf.0.attested.additionalProperties","typeLabel":"object"},"isRequired":true,"uniqueKey":"contract.oneOf.0.attested","typeLabel":"object"}},"isRequired":true,"uniqueKey":"contract.oneOf.0","typeLabel":"object"},{"type":"null","description":"Null for a record with no recorded contract, such as one a provider-native route created.","isRequired":true,"uniqueKey":"contract.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"contract","typeLabel":"object | null"},"request":{"type":"object","additionalProperties":true,"description":"The recorded creation request after server-side expansion and defaulting, without\nrequest-only secret values, environment values or labels. A sandbox can outlive the\ncreate-request schema that was current when it was made, so this historical snapshot\naccepts fields from earlier contract versions. Clients should interpret only fields\nthey recognize and preserve unknown fields when displaying or storing the snapshot.\n","isRequired":true,"uniqueKey":"request","typeLabel":"object"},"hidden_secrets":{"oneOf":[{"type":"object","propertyNames":{"$ref":"#/components/schemas/SecretName"},"additionalProperties":{"type":"object","additionalProperties":false,"required":["placeholder","hosts"],"properties":{"placeholder":{"type":"string","minLength":1,"description":"The safe token to place where this secret should be used.","isRequired":true,"uniqueKey":"hidden_secrets.oneOf.0.additionalProperties.placeholder","typeLabel":"string"},"hosts":{"type":"array","uniqueItems":true,"items":{"oneOf":[{"type":"string","pattern":"^(?=.{1,253}(?![\\s\\S]))(?![0-9.]+(?![\\s\\S]))[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?(?:\\.[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?)*(?![\\s\\S])","uniqueKey":"hidden_secrets.oneOf.0.additionalProperties.hosts.items.[INDEX].oneOf.0","typeLabel":"string"},{"type":"string","pattern":"^(?=.{3,255}(?![\\s\\S]))\\*\\.(?![0-9.]+(?![\\s\\S]))[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?(?:\\.[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?)*(?![\\s\\S])","uniqueKey":"hidden_secrets.oneOf.0.additionalProperties.hosts.items.[INDEX].oneOf.1","typeLabel":"string"}],"uniqueKey":"hidden_secrets.oneOf.0.additionalProperties.hosts.items.[INDEX]","typeLabel":"string"},"description":"Hosts to which the adapter sends this secret.","isRequired":true,"uniqueKey":"hidden_secrets.oneOf.0.additionalProperties.hosts","typeLabel":"string[]"}},"uniqueKey":"hidden_secrets.oneOf.0.additionalProperties","typeLabel":"object"},"description":"Public metadata for the request-only secret values, keyed by their submitted names.\nEach result contains only a placeholder and its allowed hosts. Null when the create\nsubmitted no secret values.\n","isRequired":true,"uniqueKey":"hidden_secrets.oneOf.0","typeLabel":"object"},{"type":"null","propertyNames":{"$ref":"#/components/schemas/SecretName"},"additionalProperties":{"type":"object","additionalProperties":false,"required":["placeholder","hosts"],"properties":{"placeholder":{"type":"string","minLength":1,"description":"The safe token to place where this secret should be used.","uniqueKey":"hidden_secrets.oneOf.1.additionalProperties.placeholder","typeLabel":"string"},"hosts":{"type":"array","uniqueItems":true,"items":{"oneOf":[{"type":"string","pattern":"^(?=.{1,253}(?![\\s\\S]))(?![0-9.]+(?![\\s\\S]))[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?(?:\\.[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?)*(?![\\s\\S])","uniqueKey":"hidden_secrets.oneOf.1.additionalProperties.hosts.items.[INDEX].oneOf.0","typeLabel":"string"},{"type":"string","pattern":"^(?=.{3,255}(?![\\s\\S]))\\*\\.(?![0-9.]+(?![\\s\\S]))[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?(?:\\.[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?)*(?![\\s\\S])","uniqueKey":"hidden_secrets.oneOf.1.additionalProperties.hosts.items.[INDEX].oneOf.1","typeLabel":"string"}],"uniqueKey":"hidden_secrets.oneOf.1.additionalProperties.hosts.items.[INDEX]","typeLabel":"string"},"description":"Hosts to which the adapter sends this secret.","uniqueKey":"hidden_secrets.oneOf.1.additionalProperties.hosts","typeLabel":"string[]"}},"uniqueKey":"hidden_secrets.oneOf.1.additionalProperties","typeLabel":"object"},"description":"Public metadata for the request-only secret values, keyed by their submitted names.\nEach result contains only a placeholder and its allowed hosts. Null when the create\nsubmitted no secret values.\n","isRequired":true,"uniqueKey":"hidden_secrets.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"hidden_secrets","typeLabel":"object | null"},"tcp_ports":{"oneOf":[{"type":"array","items":{"type":"object","additionalProperties":false,"required":["host","port","tls"],"properties":{"host":{"type":"string","minLength":1,"isRequired":true,"uniqueKey":"tcp_ports.oneOf.0.items.[INDEX].host","typeLabel":"string"},"port":{"type":"integer","minimum":1,"maximum":65535,"isRequired":true,"uniqueKey":"tcp_ports.oneOf.0.items.[INDEX].port","typeLabel":"integer"},"tls":{"type":"string","enum":["none","terminated"],"isRequired":true,"uniqueKey":"tcp_ports.oneOf.0.items.[INDEX].tls","typeLabel":"enum\u003cstring>"}},"uniqueKey":"tcp_ports.oneOf.0.items.[INDEX]","typeLabel":"object"},"description":"Public host and port for each requested TCP listener, in request order.","isRequired":true,"uniqueKey":"tcp_ports.oneOf.0","typeLabel":"object[]"},{"type":"null","items":{"type":"object","additionalProperties":false,"required":["host","port","tls"],"properties":{"host":{"type":"string","minLength":1},"port":{"type":"integer","minimum":1,"maximum":65535},"tls":{"type":"string","enum":["none","terminated"]}}},"description":"Public host and port for each requested TCP listener, in request order.","isRequired":true,"uniqueKey":"tcp_ports.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"tcp_ports","typeLabel":"object[] | null"},"recorder":{"oneOf":[{"type":"object","description":"A tally of the gate calls made on this sandbox, allowed and refused, with the\nrequirements line those calls relied on. It only tallies: it switches no gate on.\n","isRequired":true,"uniqueKey":"recorder.oneOf.0","typeLabel":"object"},{"type":"null","description":"A tally of the gate calls made on this sandbox, allowed and refused, with the\nrequirements line those calls relied on. It only tallies: it switches no gate on.\n","isRequired":true,"uniqueKey":"recorder.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"recorder","typeLabel":"object | null"},"limits":{"type":"object","properties":{"buffered_output_bytes":{"type":"integer","minimum":1,"description":"Maximum combined stdout/stderr for the buffered command endpoint.","uniqueKey":"limits.buffered_output_bytes","typeLabel":"integer"},"file_transfer_bytes":{"type":"integer","minimum":1,"default":1048576,"description":"Maximum file size of `readFile` and `writeFile` on this route.","uniqueKey":"limits.file_transfer_bytes","typeLabel":"integer"},"upload_max_bytes":{"type":"integer","minimum":0,"description":"Per route, the largest file `createSandboxUpload` accepts.","uniqueKey":"limits.upload_max_bytes","typeLabel":"integer"},"download_max_bytes":{"type":"integer","minimum":0,"description":"Per route, the largest file `createSandboxDownload` accepts.","uniqueKey":"limits.download_max_bytes","typeLabel":"integer"},"inline_transfer_max_bytes":{"type":"integer","minimum":1,"description":"Largest file this route serves inline in one createSandboxDownload (send\n`inline_below`) or relays for upload, cheaper than its transfer link;\nabsent when the route has none.\n","uniqueKey":"limits.inline_transfer_max_bytes","typeLabel":"integer"}},"isRequired":true,"uniqueKey":"limits","typeLabel":"object"},"expires_at":{"oneOf":[{"type":"string","format":"date-time","description":"Enforced deadline from the recorded lifetime budget, including extensions. This\nis the same deadline exposed as lifetime.ends_at; null when no deadline is known.\n","uniqueKey":"expires_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"Enforced deadline from the recorded lifetime budget, including extensions. This\nis the same deadline exposed as lifetime.ends_at; null when no deadline is known.\n","uniqueKey":"expires_at.oneOf.1","typeLabel":"null"}],"uniqueKey":"expires_at","typeLabel":"string\u003cdate-time> | null"},"created_at_source":{"oneOf":[{"type":"string","description":"Where `created_at` came from. Null when `created_at` is null. Always BoxRouter's own record.","enum":["provider","published","measured","recorded","calculated","unknown"],"uniqueKey":"created_at_source.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Where `created_at` came from. Null when `created_at` is null. Always BoxRouter's own record.","uniqueKey":"created_at_source.oneOf.1","typeLabel":"null"}],"uniqueKey":"created_at_source","typeLabel":"enum\u003cstring> | null"},"created_at_how":{"oneOf":[{"type":"string","minLength":1,"description":"One sentence saying how `created_at` was determined. Null when `created_at` is null.","uniqueKey":"created_at_how.oneOf.0","typeLabel":"string"},{"type":"null","minLength":1,"description":"One sentence saying how `created_at` was determined. Null when `created_at` is null.","uniqueKey":"created_at_how.oneOf.1","typeLabel":"null"}],"uniqueKey":"created_at_how","typeLabel":"string | null"},"created_at_step":{"oneOf":[{"type":"integer","minimum":1,"description":"Null because `created_at` comes from a recorded lifecycle edge or Cloud's record.","uniqueKey":"created_at_step.oneOf.0","typeLabel":"integer"},{"type":"null","minimum":1,"description":"Null because `created_at` comes from a recorded lifecycle edge or Cloud's record.","uniqueKey":"created_at_step.oneOf.1","typeLabel":"null"}],"uniqueKey":"created_at_step","typeLabel":"integer | null"},"ready_at_source":{"oneOf":[{"type":"string","description":"Where `ready_at` came from. Null when `ready_at` is null. Lifecycle edges and Cloud's own record are `recorded`.","enum":["provider","published","measured","recorded","calculated","unknown"],"uniqueKey":"ready_at_source.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Where `ready_at` came from. Null when `ready_at` is null. Lifecycle edges and Cloud's own record are `recorded`.","uniqueKey":"ready_at_source.oneOf.1","typeLabel":"null"}],"uniqueKey":"ready_at_source","typeLabel":"enum\u003cstring> | null"},"ready_at_how":{"oneOf":[{"type":"string","minLength":1,"description":"One sentence saying how `ready_at` was determined. Null when `ready_at` is null.","uniqueKey":"ready_at_how.oneOf.0","typeLabel":"string"},{"type":"null","minLength":1,"description":"One sentence saying how `ready_at` was determined. Null when `ready_at` is null.","uniqueKey":"ready_at_how.oneOf.1","typeLabel":"null"}],"uniqueKey":"ready_at_how","typeLabel":"string | null"},"ready_at_step":{"oneOf":[{"type":"integer","minimum":1,"description":"Null because `ready_at` comes from a recorded lifecycle edge or Cloud's record.","uniqueKey":"ready_at_step.oneOf.0","typeLabel":"integer"},{"type":"null","minimum":1,"description":"Null because `ready_at` comes from a recorded lifecycle edge or Cloud's record.","uniqueKey":"ready_at_step.oneOf.1","typeLabel":"null"}],"uniqueKey":"ready_at_step","typeLabel":"integer | null"},"ended_at_source":{"oneOf":[{"type":"string","description":"Where `ended_at` came from. Null when `ended_at` is null. Lifecycle edges and Cloud's own record are `recorded`.","enum":["provider","published","measured","recorded","calculated","unknown"],"uniqueKey":"ended_at_source.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Where `ended_at` came from. Null when `ended_at` is null. Lifecycle edges and Cloud's own record are `recorded`.","uniqueKey":"ended_at_source.oneOf.1","typeLabel":"null"}],"uniqueKey":"ended_at_source","typeLabel":"enum\u003cstring> | null"},"ended_at_how":{"oneOf":[{"type":"string","minLength":1,"description":"One sentence saying how `ended_at` was determined. Null when `ended_at` is null.","uniqueKey":"ended_at_how.oneOf.0","typeLabel":"string"},{"type":"null","minLength":1,"description":"One sentence saying how `ended_at` was determined. Null when `ended_at` is null.","uniqueKey":"ended_at_how.oneOf.1","typeLabel":"null"}],"uniqueKey":"ended_at_how","typeLabel":"string | null"},"ended_at_step":{"oneOf":[{"type":"integer","minimum":1,"description":"Null because `ended_at` comes from a recorded lifecycle edge or Cloud's record.","uniqueKey":"ended_at_step.oneOf.0","typeLabel":"integer"},{"type":"null","minimum":1,"description":"Null because `ended_at` comes from a recorded lifecycle edge or Cloud's record.","uniqueKey":"ended_at_step.oneOf.1","typeLabel":"null"}],"uniqueKey":"ended_at_step","typeLabel":"integer | null"},"cost_source":{"oneOf":[{"type":"string","description":"Where `cost` came from. Null when `cost` is null. `provider` for a reported cost, `calculated` for a worked-out one, `unknown` when no cost could be worked out. The `cost_step` is 1 for a provider figure, then 2 provider times, 3 a checked billing boundary, 4 a range, 5 unknown.","enum":["provider","published","measured","recorded","calculated","unknown"],"uniqueKey":"cost_source.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Where `cost` came from. Null when `cost` is null. `provider` for a reported cost, `calculated` for a worked-out one, `unknown` when no cost could be worked out. The `cost_step` is 1 for a provider figure, then 2 provider times, 3 a checked billing boundary, 4 a range, 5 unknown.","uniqueKey":"cost_source.oneOf.1","typeLabel":"null"}],"uniqueKey":"cost_source","typeLabel":"enum\u003cstring> | null"},"cost_how":{"oneOf":[{"type":"string","minLength":1,"description":"One sentence saying how `cost` was determined. Null when `cost` is null.","uniqueKey":"cost_how.oneOf.0","typeLabel":"string"},{"type":"null","minLength":1,"description":"One sentence saying how `cost` was determined. Null when `cost` is null.","uniqueKey":"cost_how.oneOf.1","typeLabel":"null"}],"uniqueKey":"cost_how","typeLabel":"string | null"},"cost_step":{"oneOf":[{"type":"integer","minimum":1,"description":"The position of the source in BoxRouter's source order for this value, 1 being the best.\nNull when the value is BoxRouter's own record rather than a pick between sources.\n","uniqueKey":"cost_step.oneOf.0","typeLabel":"integer"},{"type":"null","minimum":1,"description":"The position of the source in BoxRouter's source order for this value, 1 being the best.\nNull when the value is BoxRouter's own record rather than a pick between sources.\n","uniqueKey":"cost_step.oneOf.1","typeLabel":"null"}],"uniqueKey":"cost_step","typeLabel":"integer | null"},"origin":{"oneOf":[{"type":"object","description":"Durable creation provenance. Omitted when the source is not known.","required":["source","run_id","job_id"],"properties":{"source":{"type":"string","enum":["github_actions"],"isRequired":true,"uniqueKey":"origin.oneOf.0.source","typeLabel":"enum\u003cstring>"},"run_id":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[^\\u0000]*$","description":"BoxRouter Actions run ID used by the Actions dashboard deep link.","isRequired":true,"uniqueKey":"origin.oneOf.0.run_id","typeLabel":"string"},"job_id":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[^\\u0000]*$","description":"BoxRouter Actions job ID.","isRequired":true,"uniqueKey":"origin.oneOf.0.job_id","typeLabel":"string"},"repository":{"type":"string","minLength":1,"description":"owner/name, from the job's GitHub webhook; for jobs admitted before the webhook was\nrecorded, from the workspace's GitHub repository binding for the same repository ID.\n","uniqueKey":"origin.oneOf.0.repository","typeLabel":"string"},"workflow":{"oneOf":[{"type":"string","minLength":1,"description":"Workflow name from the job's GitHub webhook or run.","uniqueKey":"origin.oneOf.0.workflow.oneOf.0","typeLabel":"string"},{"type":"null","minLength":1,"description":"Workflow name from the job's GitHub webhook or run.","uniqueKey":"origin.oneOf.0.workflow.oneOf.1","typeLabel":"null"}],"uniqueKey":"origin.oneOf.0.workflow","typeLabel":"string | null"},"run_number":{"oneOf":[{"type":"integer","minimum":1,"description":"GitHub run number from the run.","uniqueKey":"origin.oneOf.0.run_number.oneOf.0","typeLabel":"integer"},{"type":"null","minimum":1,"description":"GitHub run number from the run.","uniqueKey":"origin.oneOf.0.run_number.oneOf.1","typeLabel":"null"}],"uniqueKey":"origin.oneOf.0.run_number","typeLabel":"integer | null"},"job_name":{"type":"string","minLength":1,"description":"Job name from the job's GitHub webhook.","uniqueKey":"origin.oneOf.0.job_name","typeLabel":"string"},"run_url":{"type":"string","format":"uri","description":"GitHub run page, built from repository and the GitHub run ID.","uniqueKey":"origin.oneOf.0.run_url","typeLabel":"string\u003curi>"},"job_url":{"type":"string","format":"uri","description":"GitHub job page: the job's html_url from its webhook, else built from repository and\nthe GitHub run and job IDs.\n","uniqueKey":"origin.oneOf.0.job_url","typeLabel":"string\u003curi>"}},"additionalProperties":false,"uniqueKey":"origin.oneOf.0","typeLabel":"object"},{"type":"object","description":"Durable creation provenance. Omitted when the source is not known.","required":["source","launch_id","agent","agent_name"],"properties":{"source":{"type":"string","enum":["agents"],"isRequired":true,"uniqueKey":"origin.oneOf.1.source","typeLabel":"enum\u003cstring>"},"launch_id":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[^\\u0000]*$","description":"Launch operation ID, as in GET /launches/{operation_id}.","isRequired":true,"uniqueKey":"origin.oneOf.1.launch_id","typeLabel":"string"},"agent":{"type":"string","minLength":1,"description":"The launched manifest's name; the agent catalog ID for catalog agents, such as claude-code.","isRequired":true,"uniqueKey":"origin.oneOf.1.agent","typeLabel":"string"},"agent_name":{"type":"string","minLength":1,"description":"Display name from the agent catalog, such as Claude Code; the manifest name for agents outside the catalog.","isRequired":true,"uniqueKey":"origin.oneOf.1.agent_name","typeLabel":"string"},"repository":{"oneOf":[{"type":"string","minLength":1,"description":"Repository as owner/name when the launch checked out code; null or absent when it had none.","uniqueKey":"origin.oneOf.1.repository.oneOf.0","typeLabel":"string"},{"type":"null","minLength":1,"description":"Repository as owner/name when the launch checked out code; null or absent when it had none.","uniqueKey":"origin.oneOf.1.repository.oneOf.1","typeLabel":"null"}],"uniqueKey":"origin.oneOf.1.repository","typeLabel":"string | null"},"sha":{"oneOf":[{"type":"string","pattern":"^[0-9a-f]{40}$","description":"Commit checked out for the launch; null or absent when it had no code.","uniqueKey":"origin.oneOf.1.sha.oneOf.0","typeLabel":"string"},{"type":"null","pattern":"^[0-9a-f]{40}$","description":"Commit checked out for the launch; null or absent when it had no code.","uniqueKey":"origin.oneOf.1.sha.oneOf.1","typeLabel":"null"}],"uniqueKey":"origin.oneOf.1.sha","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"origin.oneOf.1","typeLabel":"object"},{"type":"null","description":"Durable creation provenance. Omitted when the source is not known.","uniqueKey":"origin.oneOf.2","typeLabel":"null"}],"uniqueKey":"origin","typeLabel":"object · object · null"},"name":{"oneOf":[{"type":"string","description":"Sandbox name from labels.name, when set.","uniqueKey":"name.oneOf.0","typeLabel":"string"},{"type":"null","description":"Sandbox name from labels.name, when set.","uniqueKey":"name.oneOf.1","typeLabel":"null"}],"uniqueKey":"name","typeLabel":"string | null"},"resources":{"type":"object","description":"Resolved CPU, memory and disk resources; null values mean unknown.","properties":{"cpu":{"oneOf":[{"type":"number","exclusiveMinimum":0,"uniqueKey":"resources.cpu.oneOf.0","typeLabel":"number"},{"type":"null","exclusiveMinimum":0,"uniqueKey":"resources.cpu.oneOf.1","typeLabel":"null"}],"uniqueKey":"resources.cpu","typeLabel":"number | null"},"memory_mib":{"oneOf":[{"type":"integer","minimum":1,"uniqueKey":"resources.memory_mib.oneOf.0","typeLabel":"integer"},{"type":"null","minimum":1,"uniqueKey":"resources.memory_mib.oneOf.1","typeLabel":"null"}],"uniqueKey":"resources.memory_mib","typeLabel":"integer | null"},"disk_mib":{"oneOf":[{"type":"integer","minimum":1,"uniqueKey":"resources.disk_mib.oneOf.0","typeLabel":"integer"},{"type":"null","minimum":1,"uniqueKey":"resources.disk_mib.oneOf.1","typeLabel":"null"}],"uniqueKey":"resources.disk_mib","typeLabel":"integer | null"}},"uniqueKey":"resources","typeLabel":"object"},"image":{"oneOf":[{"type":"object","description":"The image the sandbox runs and where that is known from. Null when nothing records\nit. Absent from responses of a Cloud that does not report it yet.\n","required":["value","source"],"properties":{"value":{"type":"string","minLength":1,"description":"`standard` when the request omitted `image` (BoxRouter's standard image), `provider_default`\nwhen it opted out, `dockerfile` for an image built from a Dockerfile, or else the OCI\nreference or provider artifact the request named.\n","isRequired":true,"uniqueKey":"image.oneOf.0.value","typeLabel":"string"},"source":{"description":"Where a fact came from. provider: the provider's API told us, about this sandbox. published: the provider's docs or pricing page, not about this sandbox in particular. measured: BoxRouter checked it itself with a clock or in its own sandboxes. recorded: BoxRouter's own record of something it did or saw. calculated: worked out from other facts, each with its own source. unknown: nobody told us and we could not check.","type":"string","enum":["provider","published","measured","recorded","calculated","unknown"],"isRequired":true,"uniqueKey":"image.oneOf.0.source","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"image.oneOf.0","typeLabel":"object"},{"type":"null","description":"The image the sandbox runs and where that is known from. Null when nothing records\nit. Absent from responses of a Cloud that does not report it yet.\n","uniqueKey":"image.oneOf.1","typeLabel":"null"}],"uniqueKey":"image","typeLabel":"object | null"},"image_setup":{"type":"object","required":["provider","duration_ms"],"properties":{"provider":{"type":"string","minLength":1,"isRequired":true,"uniqueKey":"image_setup.provider","typeLabel":"string"},"duration_ms":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"image_setup.duration_ms","typeLabel":"integer"}},"description":"Present only when this start waited for image setup on its chosen provider.","uniqueKey":"image_setup","typeLabel":"object"},"usage":{"oneOf":[{"type":"object","title":"Usage record","description":"What the sandbox used: its size, its running time per state, how often it was created,\neach fact with the source it came from. Null when nothing has been recorded or the\nresponse does not carry it. Absent from responses of a Cloud that does not report it yet.\n","required":["provider","started","region","size","intervals","creations"],"properties":{"provider":{"description":"The provider that ran the sandbox, as named in its price versions.","type":"string","pattern":"^[a-z][a-z0-9-]*$","isRequired":true,"uniqueKey":"usage.oneOf.0.provider","typeLabel":"string"},"started":{"description":"When the sandbox started. It picks the price version in effect.","type":"object","additionalProperties":false,"required":["at","source","observed_at","how"],"properties":{"at":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"usage.oneOf.0.started.at.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"usage.oneOf.0.started.at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"usage.oneOf.0.started.at","typeLabel":"string | null"},"source":{"description":"Where a fact came from. provider: the provider's API told us, about this sandbox. published: the provider's docs or pricing page, not about this sandbox in particular. measured: BoxRouter checked it itself with a clock or in its own sandboxes. recorded: BoxRouter's own record of something it did or saw. calculated: worked out from other facts, each with its own source. unknown: nobody told us and we could not check.","type":"string","enum":["provider","published","measured","recorded","calculated","unknown"],"isRequired":true,"uniqueKey":"usage.oneOf.0.started.source","typeLabel":"enum\u003cstring>"},"observed_at":{"description":"A UTC time, ending in Z.","type":"string","format":"date-time","pattern":"^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]+)?Z$","isRequired":true,"uniqueKey":"usage.oneOf.0.started.observed_at","typeLabel":"string\u003cdate-time>"},"how":{"description":"How the fact was obtained: the API call, the page URL, the record, or why it is unknown.","type":"string","minLength":1,"isRequired":true,"uniqueKey":"usage.oneOf.0.started.how","typeLabel":"string"}},"isRequired":true,"uniqueKey":"usage.oneOf.0.started","typeLabel":"object"},"region":{"description":"The region the sandbox ran in, as the provider names it.","type":"object","additionalProperties":false,"required":["name","source","observed_at","how"],"properties":{"name":{"oneOf":[{"type":"string","minLength":1,"isRequired":true,"uniqueKey":"usage.oneOf.0.region.name.oneOf.0","typeLabel":"string"},{"type":"null","minLength":1,"isRequired":true,"uniqueKey":"usage.oneOf.0.region.name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"usage.oneOf.0.region.name","typeLabel":"string | null"},"source":{"description":"Where a fact came from. provider: the provider's API told us, about this sandbox. published: the provider's docs or pricing page, not about this sandbox in particular. measured: BoxRouter checked it itself with a clock or in its own sandboxes. recorded: BoxRouter's own record of something it did or saw. calculated: worked out from other facts, each with its own source. unknown: nobody told us and we could not check.","type":"string","enum":["provider","published","measured","recorded","calculated","unknown"],"isRequired":true,"uniqueKey":"usage.oneOf.0.region.source","typeLabel":"enum\u003cstring>"},"observed_at":{"description":"A UTC time, ending in Z.","type":"string","format":"date-time","pattern":"^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]+)?Z$","isRequired":true,"uniqueKey":"usage.oneOf.0.region.observed_at","typeLabel":"string\u003cdate-time>"},"how":{"description":"How the fact was obtained: the API call, the page URL, the record, or why it is unknown.","type":"string","minLength":1,"isRequired":true,"uniqueKey":"usage.oneOf.0.region.how","typeLabel":"string"}},"isRequired":true,"uniqueKey":"usage.oneOf.0.region","typeLabel":"object"},"size":{"type":"object","description":"What the sandbox got. Each field is optional because a source may give only some of them; at least one is present unless the source is `unknown`. When GPUs are present, `gpu` and `gpu_model` are both recorded; without a GPU, both are absent.","required":["source","observed_at","how"],"conditionallyRequiredProperties":{"gpu_model":[{"when":[[{"property":"gpu"}]]}],"gpu":[{"when":[[{"property":"gpu_model"}]]},{}],"cpu":[{}],"memory_mib":[{}],"disk_mib":[{}]},"properties":{"source":{"description":"Where a fact came from. provider: the provider's API told us, about this sandbox. published: the provider's docs or pricing page, not about this sandbox in particular. measured: BoxRouter checked it itself with a clock or in its own sandboxes. recorded: BoxRouter's own record of something it did or saw. calculated: worked out from other facts, each with its own source. unknown: nobody told us and we could not check.","type":"string","enum":["provider","published","measured","recorded","calculated","unknown"],"isRequired":true,"uniqueKey":"usage.oneOf.0.size.source","typeLabel":"enum\u003cstring>"},"observed_at":{"description":"A UTC time, ending in Z.","type":"string","format":"date-time","pattern":"^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]+)?Z$","isRequired":true,"uniqueKey":"usage.oneOf.0.size.observed_at","typeLabel":"string\u003cdate-time>"},"how":{"description":"How the fact was obtained: the API call, the page URL, the record, or why it is unknown.","type":"string","minLength":1,"isRequired":true,"uniqueKey":"usage.oneOf.0.size.how","typeLabel":"string"},"cpu":{"description":"vCPUs.","type":"number","exclusiveMinimum":0,"conditionalRequirements":[{}],"uniqueKey":"usage.oneOf.0.size.cpu","typeLabel":"number"},"memory_mib":{"type":"integer","minimum":1,"conditionalRequirements":[{}],"uniqueKey":"usage.oneOf.0.size.memory_mib","typeLabel":"integer"},"disk_mib":{"type":"integer","minimum":1,"conditionalRequirements":[{}],"uniqueKey":"usage.oneOf.0.size.disk_mib","typeLabel":"integer"},"gpu":{"description":"Number of allocated GPUs.","type":"integer","minimum":1,"conditionalRequirements":[{"when":[[{"property":"gpu_model"}]]},{}],"uniqueKey":"usage.oneOf.0.size.gpu","typeLabel":"integer"},"gpu_model":{"description":"The allocated model's gpu-registry identifier.","type":"string","pattern":"^[a-z][a-z0-9-]*:[a-z0-9][a-z0-9-]*$","conditionalRequirements":[{"when":[[{"property":"gpu"}]]}],"uniqueKey":"usage.oneOf.0.size.gpu_model","typeLabel":"string"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"usage.oneOf.0.size","typeLabel":"object"},"intervals":{"description":"Time in each billed state, one entry per period, in time order. A price version's minimum and increment rules apply to each entry.","type":"array","minItems":1,"items":{"type":"object","additionalProperties":false,"required":["state","seconds","source","observed_at","how"],"properties":{"state":{"enum":["running","paused","stopped"],"type":"string","isRequired":true,"uniqueKey":"usage.oneOf.0.intervals.items.[INDEX].state","typeLabel":"enum\u003cstring>"},"seconds":{"oneOf":[{"type":"number","description":"Exact seconds, or a range when a change was noticed late and the period is only bounded.","minimum":0,"isRequired":true,"uniqueKey":"usage.oneOf.0.intervals.items.[INDEX].seconds.oneOf.0","typeLabel":"number"},{"type":"object","description":"Exact seconds, or a range when a change was noticed late and the period is only bounded.","required":["low","high"],"properties":{"low":{"type":"number","minimum":0,"isRequired":true,"uniqueKey":"usage.oneOf.0.intervals.items.[INDEX].seconds.oneOf.1.low","typeLabel":"number"},"high":{"type":"number","minimum":0,"isRequired":true,"uniqueKey":"usage.oneOf.0.intervals.items.[INDEX].seconds.oneOf.1.high","typeLabel":"number"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"usage.oneOf.0.intervals.items.[INDEX].seconds.oneOf.1","typeLabel":"object"},{"type":"null","description":"Exact seconds, or a range when a change was noticed late and the period is only bounded.","isRequired":true,"uniqueKey":"usage.oneOf.0.intervals.items.[INDEX].seconds.oneOf.2","typeLabel":"null"}],"isRequired":true,"uniqueKey":"usage.oneOf.0.intervals.items.[INDEX].seconds","typeLabel":"number | object | null"},"source":{"description":"Where a fact came from. provider: the provider's API told us, about this sandbox. published: the provider's docs or pricing page, not about this sandbox in particular. measured: BoxRouter checked it itself with a clock or in its own sandboxes. recorded: BoxRouter's own record of something it did or saw. calculated: worked out from other facts, each with its own source. unknown: nobody told us and we could not check.","type":"string","enum":["provider","published","measured","recorded","calculated","unknown"],"isRequired":true,"uniqueKey":"usage.oneOf.0.intervals.items.[INDEX].source","typeLabel":"enum\u003cstring>"},"observed_at":{"description":"A UTC time, ending in Z.","type":"string","format":"date-time","pattern":"^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]+)?Z$","isRequired":true,"uniqueKey":"usage.oneOf.0.intervals.items.[INDEX].observed_at","typeLabel":"string\u003cdate-time>"},"how":{"description":"How the fact was obtained: the API call, the page URL, the record, or why it is unknown.","type":"string","minLength":1,"isRequired":true,"uniqueKey":"usage.oneOf.0.intervals.items.[INDEX].how","typeLabel":"string"},"size":{"type":"object","description":"What the sandbox got. Each field is optional because a source may give only some of them; at least one is present unless the source is `unknown`. When GPUs are present, `gpu` and `gpu_model` are both recorded; without a GPU, both are absent.","required":["source","observed_at","how"],"conditionallyRequiredProperties":{"gpu_model":[{"when":[[{"property":"gpu"}]]}],"gpu":[{"when":[[{"property":"gpu_model"}]]},{}],"cpu":[{}],"memory_mib":[{}],"disk_mib":[{}]},"properties":{"source":{"description":"Where a fact came from. provider: the provider's API told us, about this sandbox. published: the provider's docs or pricing page, not about this sandbox in particular. measured: BoxRouter checked it itself with a clock or in its own sandboxes. recorded: BoxRouter's own record of something it did or saw. calculated: worked out from other facts, each with its own source. unknown: nobody told us and we could not check.","type":"string","enum":["provider","published","measured","recorded","calculated","unknown"],"isRequired":true,"uniqueKey":"usage.oneOf.0.intervals.items.[INDEX].size.source","typeLabel":"enum\u003cstring>"},"observed_at":{"description":"A UTC time, ending in Z.","type":"string","format":"date-time","pattern":"^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]+)?Z$","isRequired":true,"uniqueKey":"usage.oneOf.0.intervals.items.[INDEX].size.observed_at","typeLabel":"string\u003cdate-time>"},"how":{"description":"How the fact was obtained: the API call, the page URL, the record, or why it is unknown.","type":"string","minLength":1,"isRequired":true,"uniqueKey":"usage.oneOf.0.intervals.items.[INDEX].size.how","typeLabel":"string"},"cpu":{"description":"vCPUs.","type":"number","exclusiveMinimum":0,"conditionalRequirements":[{}],"uniqueKey":"usage.oneOf.0.intervals.items.[INDEX].size.cpu","typeLabel":"number"},"memory_mib":{"type":"integer","minimum":1,"conditionalRequirements":[{}],"uniqueKey":"usage.oneOf.0.intervals.items.[INDEX].size.memory_mib","typeLabel":"integer"},"disk_mib":{"type":"integer","minimum":1,"conditionalRequirements":[{}],"uniqueKey":"usage.oneOf.0.intervals.items.[INDEX].size.disk_mib","typeLabel":"integer"},"gpu":{"description":"Number of allocated GPUs.","type":"integer","minimum":1,"conditionalRequirements":[{"when":[[{"property":"gpu_model"}]]},{}],"uniqueKey":"usage.oneOf.0.intervals.items.[INDEX].size.gpu","typeLabel":"integer"},"gpu_model":{"description":"The allocated model's gpu-registry identifier.","type":"string","pattern":"^[a-z][a-z0-9-]*:[a-z0-9][a-z0-9-]*$","conditionalRequirements":[{"when":[[{"property":"gpu"}]]}],"uniqueKey":"usage.oneOf.0.intervals.items.[INDEX].size.gpu_model","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"usage.oneOf.0.intervals.items.[INDEX].size","typeLabel":"object"},"snapshot_storage":{"description":"The stored snapshot size, or its known maximum when the provider does not report the actual size.","type":"object","additionalProperties":false,"required":["source","observed_at","how"],"properties":{"source":{"description":"Where a fact came from. provider: the provider's API told us, about this sandbox. published: the provider's docs or pricing page, not about this sandbox in particular. measured: BoxRouter checked it itself with a clock or in its own sandboxes. recorded: BoxRouter's own record of something it did or saw. calculated: worked out from other facts, each with its own source. unknown: nobody told us and we could not check.","type":"string","enum":["provider","published","measured","recorded","calculated","unknown"],"isRequired":true,"uniqueKey":"usage.oneOf.0.intervals.items.[INDEX].snapshot_storage.source","typeLabel":"enum\u003cstring>"},"observed_at":{"description":"A UTC time, ending in Z.","type":"string","format":"date-time","pattern":"^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]+)?Z$","isRequired":true,"uniqueKey":"usage.oneOf.0.intervals.items.[INDEX].snapshot_storage.observed_at","typeLabel":"string\u003cdate-time>"},"how":{"description":"How the fact was obtained: the API call, the page URL, the record, or why it is unknown.","type":"string","minLength":1,"isRequired":true,"uniqueKey":"usage.oneOf.0.intervals.items.[INDEX].snapshot_storage.how","typeLabel":"string"},"gb":{"oneOf":[{"type":"number","minimum":0,"conditionalRequirements":[{}],"uniqueKey":"usage.oneOf.0.intervals.items.[INDEX].snapshot_storage.gb.oneOf.0","typeLabel":"number"},{"type":"null","minimum":0,"conditionalRequirements":[{}],"uniqueKey":"usage.oneOf.0.intervals.items.[INDEX].snapshot_storage.gb.oneOf.1","typeLabel":"null"}],"conditionalRequirements":[{}],"uniqueKey":"usage.oneOf.0.intervals.items.[INDEX].snapshot_storage.gb","typeLabel":"number | null"},"max_gb":{"oneOf":[{"type":"number","minimum":0,"uniqueKey":"usage.oneOf.0.intervals.items.[INDEX].snapshot_storage.max_gb.oneOf.0","typeLabel":"number"},{"type":"null","minimum":0,"uniqueKey":"usage.oneOf.0.intervals.items.[INDEX].snapshot_storage.max_gb.oneOf.1","typeLabel":"null"}],"uniqueKey":"usage.oneOf.0.intervals.items.[INDEX].snapshot_storage.max_gb","typeLabel":"number | null"},"bytes":{"description":"Provider snapshot sizeBytes, kept as an exact integer.","type":"integer","minimum":0,"conditionalRequirements":[{}],"uniqueKey":"usage.oneOf.0.intervals.items.[INDEX].snapshot_storage.bytes","typeLabel":"integer"}},"conditionallyRequiredProperties":{"gb":[{}],"bytes":[{}]},"uniqueKey":"usage.oneOf.0.intervals.items.[INDEX].snapshot_storage","typeLabel":"object"}},"uniqueKey":"usage.oneOf.0.intervals.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"usage.oneOf.0.intervals","typeLabel":"object[]"},"creations":{"description":"How many times the sandbox was created: 1, plus any restores that the provider charges as a creation.","type":"object","additionalProperties":false,"required":["count","source","observed_at","how"],"properties":{"count":{"oneOf":[{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"usage.oneOf.0.creations.count.oneOf.0","typeLabel":"integer"},{"type":"null","minimum":0,"isRequired":true,"uniqueKey":"usage.oneOf.0.creations.count.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"usage.oneOf.0.creations.count","typeLabel":"integer | null"},"source":{"description":"Where a fact came from. provider: the provider's API told us, about this sandbox. published: the provider's docs or pricing page, not about this sandbox in particular. measured: BoxRouter checked it itself with a clock or in its own sandboxes. recorded: BoxRouter's own record of something it did or saw. calculated: worked out from other facts, each with its own source. unknown: nobody told us and we could not check.","type":"string","enum":["provider","published","measured","recorded","calculated","unknown"],"isRequired":true,"uniqueKey":"usage.oneOf.0.creations.source","typeLabel":"enum\u003cstring>"},"observed_at":{"description":"A UTC time, ending in Z.","type":"string","format":"date-time","pattern":"^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]+)?Z$","isRequired":true,"uniqueKey":"usage.oneOf.0.creations.observed_at","typeLabel":"string\u003cdate-time>"},"how":{"description":"How the fact was obtained: the API call, the page URL, the record, or why it is unknown.","type":"string","minLength":1,"isRequired":true,"uniqueKey":"usage.oneOf.0.creations.how","typeLabel":"string"}},"isRequired":true,"uniqueKey":"usage.oneOf.0.creations","typeLabel":"object"},"class":{"description":"The sandbox's class or runtime, which picks the rate set in the price version. If absent, it may be priced only when the price version has exactly one class; otherwise the cost is unknown.","type":"object","additionalProperties":false,"required":["name","source","observed_at","how"],"properties":{"name":{"oneOf":[{"type":"string","minLength":1,"isRequired":true,"uniqueKey":"usage.oneOf.0.class.name.oneOf.0","typeLabel":"string"},{"type":"null","minLength":1,"isRequired":true,"uniqueKey":"usage.oneOf.0.class.name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"usage.oneOf.0.class.name","typeLabel":"string | null"},"source":{"description":"Where a fact came from. provider: the provider's API told us, about this sandbox. published: the provider's docs or pricing page, not about this sandbox in particular. measured: BoxRouter checked it itself with a clock or in its own sandboxes. recorded: BoxRouter's own record of something it did or saw. calculated: worked out from other facts, each with its own source. unknown: nobody told us and we could not check.","type":"string","enum":["provider","published","measured","recorded","calculated","unknown"],"isRequired":true,"uniqueKey":"usage.oneOf.0.class.source","typeLabel":"enum\u003cstring>"},"observed_at":{"description":"A UTC time, ending in Z.","type":"string","format":"date-time","pattern":"^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]+)?Z$","isRequired":true,"uniqueKey":"usage.oneOf.0.class.observed_at","typeLabel":"string\u003cdate-time>"},"how":{"description":"How the fact was obtained: the API call, the page URL, the record, or why it is unknown.","type":"string","minLength":1,"isRequired":true,"uniqueKey":"usage.oneOf.0.class.how","typeLabel":"string"}},"uniqueKey":"usage.oneOf.0.class","typeLabel":"object"},"active_cpu":{"description":"Seconds of CPU the sandbox actually used, for providers that bill active CPU. Absent where the provider does not bill it.","type":"object","additionalProperties":false,"required":["seconds","source","observed_at","how"],"properties":{"seconds":{"oneOf":[{"type":"number","minimum":0,"isRequired":true,"uniqueKey":"usage.oneOf.0.active_cpu.seconds.oneOf.0","typeLabel":"number"},{"type":"null","minimum":0,"isRequired":true,"uniqueKey":"usage.oneOf.0.active_cpu.seconds.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"usage.oneOf.0.active_cpu.seconds","typeLabel":"number | null"},"source":{"description":"Where a fact came from. provider: the provider's API told us, about this sandbox. published: the provider's docs or pricing page, not about this sandbox in particular. measured: BoxRouter checked it itself with a clock or in its own sandboxes. recorded: BoxRouter's own record of something it did or saw. calculated: worked out from other facts, each with its own source. unknown: nobody told us and we could not check.","type":"string","enum":["provider","published","measured","recorded","calculated","unknown"],"isRequired":true,"uniqueKey":"usage.oneOf.0.active_cpu.source","typeLabel":"enum\u003cstring>"},"observed_at":{"description":"A UTC time, ending in Z.","type":"string","format":"date-time","pattern":"^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]+)?Z$","isRequired":true,"uniqueKey":"usage.oneOf.0.active_cpu.observed_at","typeLabel":"string\u003cdate-time>"},"how":{"description":"How the fact was obtained: the API call, the page URL, the record, or why it is unknown.","type":"string","minLength":1,"isRequired":true,"uniqueKey":"usage.oneOf.0.active_cpu.how","typeLabel":"string"}},"uniqueKey":"usage.oneOf.0.active_cpu","typeLabel":"object"},"egress":{"description":"Bytes the sandbox sent out. Absent where the provider does not bill it.","type":"object","additionalProperties":false,"required":["bytes","source","observed_at","how"],"properties":{"bytes":{"oneOf":[{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"usage.oneOf.0.egress.bytes.oneOf.0","typeLabel":"integer"},{"type":"null","minimum":0,"isRequired":true,"uniqueKey":"usage.oneOf.0.egress.bytes.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"usage.oneOf.0.egress.bytes","typeLabel":"integer | null"},"source":{"description":"Where a fact came from. provider: the provider's API told us, about this sandbox. published: the provider's docs or pricing page, not about this sandbox in particular. measured: BoxRouter checked it itself with a clock or in its own sandboxes. recorded: BoxRouter's own record of something it did or saw. calculated: worked out from other facts, each with its own source. unknown: nobody told us and we could not check.","type":"string","enum":["provider","published","measured","recorded","calculated","unknown"],"isRequired":true,"uniqueKey":"usage.oneOf.0.egress.source","typeLabel":"enum\u003cstring>"},"observed_at":{"description":"A UTC time, ending in Z.","type":"string","format":"date-time","pattern":"^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]+)?Z$","isRequired":true,"uniqueKey":"usage.oneOf.0.egress.observed_at","typeLabel":"string\u003cdate-time>"},"how":{"description":"How the fact was obtained: the API call, the page URL, the record, or why it is unknown.","type":"string","minLength":1,"isRequired":true,"uniqueKey":"usage.oneOf.0.egress.how","typeLabel":"string"}},"uniqueKey":"usage.oneOf.0.egress","typeLabel":"object"},"snapshot_storage":{"description":"The stored snapshot size, or its known maximum when the provider does not report the actual size.","type":"object","additionalProperties":false,"required":["source","observed_at","how"],"properties":{"source":{"description":"Where a fact came from. provider: the provider's API told us, about this sandbox. published: the provider's docs or pricing page, not about this sandbox in particular. measured: BoxRouter checked it itself with a clock or in its own sandboxes. recorded: BoxRouter's own record of something it did or saw. calculated: worked out from other facts, each with its own source. unknown: nobody told us and we could not check.","type":"string","enum":["provider","published","measured","recorded","calculated","unknown"],"isRequired":true,"uniqueKey":"usage.oneOf.0.snapshot_storage.source","typeLabel":"enum\u003cstring>"},"observed_at":{"description":"A UTC time, ending in Z.","type":"string","format":"date-time","pattern":"^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]+)?Z$","isRequired":true,"uniqueKey":"usage.oneOf.0.snapshot_storage.observed_at","typeLabel":"string\u003cdate-time>"},"how":{"description":"How the fact was obtained: the API call, the page URL, the record, or why it is unknown.","type":"string","minLength":1,"isRequired":true,"uniqueKey":"usage.oneOf.0.snapshot_storage.how","typeLabel":"string"},"gb":{"oneOf":[{"type":"number","minimum":0,"conditionalRequirements":[{}],"uniqueKey":"usage.oneOf.0.snapshot_storage.gb.oneOf.0","typeLabel":"number"},{"type":"null","minimum":0,"conditionalRequirements":[{}],"uniqueKey":"usage.oneOf.0.snapshot_storage.gb.oneOf.1","typeLabel":"null"}],"conditionalRequirements":[{}],"uniqueKey":"usage.oneOf.0.snapshot_storage.gb","typeLabel":"number | null"},"max_gb":{"oneOf":[{"type":"number","minimum":0,"uniqueKey":"usage.oneOf.0.snapshot_storage.max_gb.oneOf.0","typeLabel":"number"},{"type":"null","minimum":0,"uniqueKey":"usage.oneOf.0.snapshot_storage.max_gb.oneOf.1","typeLabel":"null"}],"uniqueKey":"usage.oneOf.0.snapshot_storage.max_gb","typeLabel":"number | null"},"bytes":{"description":"Provider snapshot sizeBytes, kept as an exact integer.","type":"integer","minimum":0,"conditionalRequirements":[{}],"uniqueKey":"usage.oneOf.0.snapshot_storage.bytes","typeLabel":"integer"}},"conditionallyRequiredProperties":{"gb":[{}],"bytes":[{}]},"uniqueKey":"usage.oneOf.0.snapshot_storage","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"usage.oneOf.0","typeLabel":"Usage record · object"},{"type":"object","description":"What the sandbox used: its size, its running time per state, how often it was created,\neach fact with the source it came from. Null when nothing has been recorded or the\nresponse does not carry it. Absent from responses of a Cloud that does not report it yet.\n","required":["provider","started","region","size","intervals","creations"],"properties":{"provider":{"description":"The provider that ran the sandbox, as named in its price versions.","type":"string","pattern":"^[a-z][a-z0-9-]*$","isRequired":true,"uniqueKey":"usage.oneOf.1.provider","typeLabel":"string"},"started":{"description":"When the sandbox started. It picks the price version in effect.","type":"object","additionalProperties":false,"required":["at","source","observed_at","how"],"properties":{"at":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"usage.oneOf.1.started.at.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"usage.oneOf.1.started.at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"usage.oneOf.1.started.at","typeLabel":"string | null"},"source":{"description":"Where a fact came from. provider: the provider's API told us, about this sandbox. published: the provider's docs or pricing page, not about this sandbox in particular. measured: BoxRouter checked it itself with a clock or in its own sandboxes. recorded: BoxRouter's own record of something it did or saw. calculated: worked out from other facts, each with its own source. unknown: nobody told us and we could not check.","type":"string","enum":["provider","published","measured","recorded","calculated","unknown"],"isRequired":true,"uniqueKey":"usage.oneOf.1.started.source","typeLabel":"enum\u003cstring>"},"observed_at":{"description":"A UTC time, ending in Z.","type":"string","format":"date-time","pattern":"^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]+)?Z$","isRequired":true,"uniqueKey":"usage.oneOf.1.started.observed_at","typeLabel":"string\u003cdate-time>"},"how":{"description":"How the fact was obtained: the API call, the page URL, the record, or why it is unknown.","type":"string","minLength":1,"isRequired":true,"uniqueKey":"usage.oneOf.1.started.how","typeLabel":"string"}},"isRequired":true,"uniqueKey":"usage.oneOf.1.started","typeLabel":"object"},"region":{"description":"The region the sandbox ran in, as the provider names it.","type":"object","additionalProperties":false,"required":["name","source","observed_at","how"],"properties":{"name":{"oneOf":[{"type":"string","minLength":1,"isRequired":true,"uniqueKey":"usage.oneOf.1.region.name.oneOf.0","typeLabel":"string"},{"type":"null","minLength":1,"isRequired":true,"uniqueKey":"usage.oneOf.1.region.name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"usage.oneOf.1.region.name","typeLabel":"string | null"},"source":{"description":"Where a fact came from. provider: the provider's API told us, about this sandbox. published: the provider's docs or pricing page, not about this sandbox in particular. measured: BoxRouter checked it itself with a clock or in its own sandboxes. recorded: BoxRouter's own record of something it did or saw. calculated: worked out from other facts, each with its own source. unknown: nobody told us and we could not check.","type":"string","enum":["provider","published","measured","recorded","calculated","unknown"],"isRequired":true,"uniqueKey":"usage.oneOf.1.region.source","typeLabel":"enum\u003cstring>"},"observed_at":{"description":"A UTC time, ending in Z.","type":"string","format":"date-time","pattern":"^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]+)?Z$","isRequired":true,"uniqueKey":"usage.oneOf.1.region.observed_at","typeLabel":"string\u003cdate-time>"},"how":{"description":"How the fact was obtained: the API call, the page URL, the record, or why it is unknown.","type":"string","minLength":1,"isRequired":true,"uniqueKey":"usage.oneOf.1.region.how","typeLabel":"string"}},"isRequired":true,"uniqueKey":"usage.oneOf.1.region","typeLabel":"object"},"size":{"type":"object","required":["source","observed_at","how"],"conditionallyRequiredProperties":{"gpu_model":[{"when":[[{"property":"gpu"}]]}],"gpu":[{"when":[[{"property":"gpu_model"}]]}]},"properties":{"source":{"description":"Where a fact came from. provider: the provider's API told us, about this sandbox. published: the provider's docs or pricing page, not about this sandbox in particular. measured: BoxRouter checked it itself with a clock or in its own sandboxes. recorded: BoxRouter's own record of something it did or saw. calculated: worked out from other facts, each with its own source. unknown: nobody told us and we could not check.","type":"string","enum":["provider","published","measured","recorded","calculated","unknown"],"isRequired":true,"uniqueKey":"usage.oneOf.1.size.source","typeLabel":"enum\u003cstring>"},"observed_at":{"description":"A UTC time, ending in Z.","type":"string","format":"date-time","pattern":"^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]+)?Z$","isRequired":true,"uniqueKey":"usage.oneOf.1.size.observed_at","typeLabel":"string\u003cdate-time>"},"how":{"description":"How the fact was obtained: the API call, the page URL, the record, or why it is unknown.","type":"string","minLength":1,"isRequired":true,"uniqueKey":"usage.oneOf.1.size.how","typeLabel":"string"},"cpu":{"description":"vCPUs.","type":"number","exclusiveMinimum":0,"uniqueKey":"usage.oneOf.1.size.cpu","typeLabel":"number"},"memory_mib":{"type":"integer","minimum":1,"uniqueKey":"usage.oneOf.1.size.memory_mib","typeLabel":"integer"},"disk_mib":{"type":"integer","minimum":1,"uniqueKey":"usage.oneOf.1.size.disk_mib","typeLabel":"integer"},"gpu":{"const":0,"conditionalRequirements":[{"when":[[{"property":"gpu_model"}]]}],"uniqueKey":"usage.oneOf.1.size.gpu","typeLabel":"any"},"gpu_model":{"description":"The allocated model's gpu-registry identifier.","type":"string","pattern":"^[a-z][a-z0-9-]*:[a-z0-9][a-z0-9-]*$","conditionalRequirements":[{"when":[[{"property":"gpu"}]]}],"uniqueKey":"usage.oneOf.1.size.gpu_model","typeLabel":"string"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"usage.oneOf.1.size","typeLabel":"object"},"intervals":{"description":"Time in each billed state, one entry per period, in time order. A price version's minimum and increment rules apply to each entry.","type":"array","minItems":1,"items":{"type":"object","additionalProperties":false,"required":["state","seconds","source","observed_at","how"],"properties":{"state":{"enum":["running","paused","stopped"],"type":"string","isRequired":true,"uniqueKey":"usage.oneOf.1.intervals.items.[INDEX].state","typeLabel":"enum\u003cstring>"},"seconds":{"oneOf":[{"type":"number","description":"Exact seconds, or a range when a change was noticed late and the period is only bounded.","minimum":0,"isRequired":true,"uniqueKey":"usage.oneOf.1.intervals.items.[INDEX].seconds.oneOf.0","typeLabel":"number"},{"type":"object","description":"Exact seconds, or a range when a change was noticed late and the period is only bounded.","required":["low","high"],"properties":{"low":{"type":"number","minimum":0,"isRequired":true,"uniqueKey":"usage.oneOf.1.intervals.items.[INDEX].seconds.oneOf.1.low","typeLabel":"number"},"high":{"type":"number","minimum":0,"isRequired":true,"uniqueKey":"usage.oneOf.1.intervals.items.[INDEX].seconds.oneOf.1.high","typeLabel":"number"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"usage.oneOf.1.intervals.items.[INDEX].seconds.oneOf.1","typeLabel":"object"},{"type":"null","description":"Exact seconds, or a range when a change was noticed late and the period is only bounded.","isRequired":true,"uniqueKey":"usage.oneOf.1.intervals.items.[INDEX].seconds.oneOf.2","typeLabel":"null"}],"isRequired":true,"uniqueKey":"usage.oneOf.1.intervals.items.[INDEX].seconds","typeLabel":"number | object | null"},"source":{"description":"Where a fact came from. provider: the provider's API told us, about this sandbox. published: the provider's docs or pricing page, not about this sandbox in particular. measured: BoxRouter checked it itself with a clock or in its own sandboxes. recorded: BoxRouter's own record of something it did or saw. calculated: worked out from other facts, each with its own source. unknown: nobody told us and we could not check.","type":"string","enum":["provider","published","measured","recorded","calculated","unknown"],"isRequired":true,"uniqueKey":"usage.oneOf.1.intervals.items.[INDEX].source","typeLabel":"enum\u003cstring>"},"observed_at":{"description":"A UTC time, ending in Z.","type":"string","format":"date-time","pattern":"^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]+)?Z$","isRequired":true,"uniqueKey":"usage.oneOf.1.intervals.items.[INDEX].observed_at","typeLabel":"string\u003cdate-time>"},"how":{"description":"How the fact was obtained: the API call, the page URL, the record, or why it is unknown.","type":"string","minLength":1,"isRequired":true,"uniqueKey":"usage.oneOf.1.intervals.items.[INDEX].how","typeLabel":"string"},"size":{"type":"object","description":"What the sandbox got. Each field is optional because a source may give only some of them; at least one is present unless the source is `unknown`. When GPUs are present, `gpu` and `gpu_model` are both recorded; without a GPU, both are absent.","required":["source","observed_at","how"],"conditionallyRequiredProperties":{"gpu_model":[{"when":[[{"property":"gpu"}]]}],"gpu":[{"when":[[{"property":"gpu_model"}]]},{}],"cpu":[{}],"memory_mib":[{}],"disk_mib":[{}]},"properties":{"source":{"description":"Where a fact came from. provider: the provider's API told us, about this sandbox. published: the provider's docs or pricing page, not about this sandbox in particular. measured: BoxRouter checked it itself with a clock or in its own sandboxes. recorded: BoxRouter's own record of something it did or saw. calculated: worked out from other facts, each with its own source. unknown: nobody told us and we could not check.","type":"string","enum":["provider","published","measured","recorded","calculated","unknown"],"isRequired":true,"uniqueKey":"usage.oneOf.1.intervals.items.[INDEX].size.source","typeLabel":"enum\u003cstring>"},"observed_at":{"description":"A UTC time, ending in Z.","type":"string","format":"date-time","pattern":"^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]+)?Z$","isRequired":true,"uniqueKey":"usage.oneOf.1.intervals.items.[INDEX].size.observed_at","typeLabel":"string\u003cdate-time>"},"how":{"description":"How the fact was obtained: the API call, the page URL, the record, or why it is unknown.","type":"string","minLength":1,"isRequired":true,"uniqueKey":"usage.oneOf.1.intervals.items.[INDEX].size.how","typeLabel":"string"},"cpu":{"description":"vCPUs.","type":"number","exclusiveMinimum":0,"conditionalRequirements":[{}],"uniqueKey":"usage.oneOf.1.intervals.items.[INDEX].size.cpu","typeLabel":"number"},"memory_mib":{"type":"integer","minimum":1,"conditionalRequirements":[{}],"uniqueKey":"usage.oneOf.1.intervals.items.[INDEX].size.memory_mib","typeLabel":"integer"},"disk_mib":{"type":"integer","minimum":1,"conditionalRequirements":[{}],"uniqueKey":"usage.oneOf.1.intervals.items.[INDEX].size.disk_mib","typeLabel":"integer"},"gpu":{"description":"Number of allocated GPUs.","type":"integer","minimum":1,"conditionalRequirements":[{"when":[[{"property":"gpu_model"}]]},{}],"uniqueKey":"usage.oneOf.1.intervals.items.[INDEX].size.gpu","typeLabel":"integer"},"gpu_model":{"description":"The allocated model's gpu-registry identifier.","type":"string","pattern":"^[a-z][a-z0-9-]*:[a-z0-9][a-z0-9-]*$","conditionalRequirements":[{"when":[[{"property":"gpu"}]]}],"uniqueKey":"usage.oneOf.1.intervals.items.[INDEX].size.gpu_model","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"usage.oneOf.1.intervals.items.[INDEX].size","typeLabel":"object"},"snapshot_storage":{"description":"The stored snapshot size, or its known maximum when the provider does not report the actual size.","type":"object","additionalProperties":false,"required":["source","observed_at","how"],"properties":{"source":{"description":"Where a fact came from. provider: the provider's API told us, about this sandbox. published: the provider's docs or pricing page, not about this sandbox in particular. measured: BoxRouter checked it itself with a clock or in its own sandboxes. recorded: BoxRouter's own record of something it did or saw. calculated: worked out from other facts, each with its own source. unknown: nobody told us and we could not check.","type":"string","enum":["provider","published","measured","recorded","calculated","unknown"],"isRequired":true,"uniqueKey":"usage.oneOf.1.intervals.items.[INDEX].snapshot_storage.source","typeLabel":"enum\u003cstring>"},"observed_at":{"description":"A UTC time, ending in Z.","type":"string","format":"date-time","pattern":"^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]+)?Z$","isRequired":true,"uniqueKey":"usage.oneOf.1.intervals.items.[INDEX].snapshot_storage.observed_at","typeLabel":"string\u003cdate-time>"},"how":{"description":"How the fact was obtained: the API call, the page URL, the record, or why it is unknown.","type":"string","minLength":1,"isRequired":true,"uniqueKey":"usage.oneOf.1.intervals.items.[INDEX].snapshot_storage.how","typeLabel":"string"},"gb":{"oneOf":[{"type":"number","minimum":0,"conditionalRequirements":[{}],"uniqueKey":"usage.oneOf.1.intervals.items.[INDEX].snapshot_storage.gb.oneOf.0","typeLabel":"number"},{"type":"null","minimum":0,"conditionalRequirements":[{}],"uniqueKey":"usage.oneOf.1.intervals.items.[INDEX].snapshot_storage.gb.oneOf.1","typeLabel":"null"}],"conditionalRequirements":[{}],"uniqueKey":"usage.oneOf.1.intervals.items.[INDEX].snapshot_storage.gb","typeLabel":"number | null"},"max_gb":{"oneOf":[{"type":"number","minimum":0,"uniqueKey":"usage.oneOf.1.intervals.items.[INDEX].snapshot_storage.max_gb.oneOf.0","typeLabel":"number"},{"type":"null","minimum":0,"uniqueKey":"usage.oneOf.1.intervals.items.[INDEX].snapshot_storage.max_gb.oneOf.1","typeLabel":"null"}],"uniqueKey":"usage.oneOf.1.intervals.items.[INDEX].snapshot_storage.max_gb","typeLabel":"number | null"},"bytes":{"description":"Provider snapshot sizeBytes, kept as an exact integer.","type":"integer","minimum":0,"conditionalRequirements":[{}],"uniqueKey":"usage.oneOf.1.intervals.items.[INDEX].snapshot_storage.bytes","typeLabel":"integer"}},"conditionallyRequiredProperties":{"gb":[{}],"bytes":[{}]},"uniqueKey":"usage.oneOf.1.intervals.items.[INDEX].snapshot_storage","typeLabel":"object"}},"uniqueKey":"usage.oneOf.1.intervals.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"usage.oneOf.1.intervals","typeLabel":"object[]"},"creations":{"description":"How many times the sandbox was created: 1, plus any restores that the provider charges as a creation.","type":"object","additionalProperties":false,"required":["count","source","observed_at","how"],"properties":{"count":{"oneOf":[{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"usage.oneOf.1.creations.count.oneOf.0","typeLabel":"integer"},{"type":"null","minimum":0,"isRequired":true,"uniqueKey":"usage.oneOf.1.creations.count.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"usage.oneOf.1.creations.count","typeLabel":"integer | null"},"source":{"description":"Where a fact came from. provider: the provider's API told us, about this sandbox. published: the provider's docs or pricing page, not about this sandbox in particular. measured: BoxRouter checked it itself with a clock or in its own sandboxes. recorded: BoxRouter's own record of something it did or saw. calculated: worked out from other facts, each with its own source. unknown: nobody told us and we could not check.","type":"string","enum":["provider","published","measured","recorded","calculated","unknown"],"isRequired":true,"uniqueKey":"usage.oneOf.1.creations.source","typeLabel":"enum\u003cstring>"},"observed_at":{"description":"A UTC time, ending in Z.","type":"string","format":"date-time","pattern":"^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]+)?Z$","isRequired":true,"uniqueKey":"usage.oneOf.1.creations.observed_at","typeLabel":"string\u003cdate-time>"},"how":{"description":"How the fact was obtained: the API call, the page URL, the record, or why it is unknown.","type":"string","minLength":1,"isRequired":true,"uniqueKey":"usage.oneOf.1.creations.how","typeLabel":"string"}},"isRequired":true,"uniqueKey":"usage.oneOf.1.creations","typeLabel":"object"},"class":{"description":"The sandbox's class or runtime, which picks the rate set in the price version. If absent, it may be priced only when the price version has exactly one class; otherwise the cost is unknown.","type":"object","additionalProperties":false,"required":["name","source","observed_at","how"],"properties":{"name":{"oneOf":[{"type":"string","minLength":1,"isRequired":true,"uniqueKey":"usage.oneOf.1.class.name.oneOf.0","typeLabel":"string"},{"type":"null","minLength":1,"isRequired":true,"uniqueKey":"usage.oneOf.1.class.name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"usage.oneOf.1.class.name","typeLabel":"string | null"},"source":{"description":"Where a fact came from. provider: the provider's API told us, about this sandbox. published: the provider's docs or pricing page, not about this sandbox in particular. measured: BoxRouter checked it itself with a clock or in its own sandboxes. recorded: BoxRouter's own record of something it did or saw. calculated: worked out from other facts, each with its own source. unknown: nobody told us and we could not check.","type":"string","enum":["provider","published","measured","recorded","calculated","unknown"],"isRequired":true,"uniqueKey":"usage.oneOf.1.class.source","typeLabel":"enum\u003cstring>"},"observed_at":{"description":"A UTC time, ending in Z.","type":"string","format":"date-time","pattern":"^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]+)?Z$","isRequired":true,"uniqueKey":"usage.oneOf.1.class.observed_at","typeLabel":"string\u003cdate-time>"},"how":{"description":"How the fact was obtained: the API call, the page URL, the record, or why it is unknown.","type":"string","minLength":1,"isRequired":true,"uniqueKey":"usage.oneOf.1.class.how","typeLabel":"string"}},"uniqueKey":"usage.oneOf.1.class","typeLabel":"object"},"active_cpu":{"description":"Seconds of CPU the sandbox actually used, for providers that bill active CPU. Absent where the provider does not bill it.","type":"object","additionalProperties":false,"required":["seconds","source","observed_at","how"],"properties":{"seconds":{"oneOf":[{"type":"number","minimum":0,"isRequired":true,"uniqueKey":"usage.oneOf.1.active_cpu.seconds.oneOf.0","typeLabel":"number"},{"type":"null","minimum":0,"isRequired":true,"uniqueKey":"usage.oneOf.1.active_cpu.seconds.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"usage.oneOf.1.active_cpu.seconds","typeLabel":"number | null"},"source":{"description":"Where a fact came from. provider: the provider's API told us, about this sandbox. published: the provider's docs or pricing page, not about this sandbox in particular. measured: BoxRouter checked it itself with a clock or in its own sandboxes. recorded: BoxRouter's own record of something it did or saw. calculated: worked out from other facts, each with its own source. unknown: nobody told us and we could not check.","type":"string","enum":["provider","published","measured","recorded","calculated","unknown"],"isRequired":true,"uniqueKey":"usage.oneOf.1.active_cpu.source","typeLabel":"enum\u003cstring>"},"observed_at":{"description":"A UTC time, ending in Z.","type":"string","format":"date-time","pattern":"^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]+)?Z$","isRequired":true,"uniqueKey":"usage.oneOf.1.active_cpu.observed_at","typeLabel":"string\u003cdate-time>"},"how":{"description":"How the fact was obtained: the API call, the page URL, the record, or why it is unknown.","type":"string","minLength":1,"isRequired":true,"uniqueKey":"usage.oneOf.1.active_cpu.how","typeLabel":"string"}},"uniqueKey":"usage.oneOf.1.active_cpu","typeLabel":"object"},"egress":{"description":"Bytes the sandbox sent out. Absent where the provider does not bill it.","type":"object","additionalProperties":false,"required":["bytes","source","observed_at","how"],"properties":{"bytes":{"oneOf":[{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"usage.oneOf.1.egress.bytes.oneOf.0","typeLabel":"integer"},{"type":"null","minimum":0,"isRequired":true,"uniqueKey":"usage.oneOf.1.egress.bytes.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"usage.oneOf.1.egress.bytes","typeLabel":"integer | null"},"source":{"description":"Where a fact came from. provider: the provider's API told us, about this sandbox. published: the provider's docs or pricing page, not about this sandbox in particular. measured: BoxRouter checked it itself with a clock or in its own sandboxes. recorded: BoxRouter's own record of something it did or saw. calculated: worked out from other facts, each with its own source. unknown: nobody told us and we could not check.","type":"string","enum":["provider","published","measured","recorded","calculated","unknown"],"isRequired":true,"uniqueKey":"usage.oneOf.1.egress.source","typeLabel":"enum\u003cstring>"},"observed_at":{"description":"A UTC time, ending in Z.","type":"string","format":"date-time","pattern":"^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]+)?Z$","isRequired":true,"uniqueKey":"usage.oneOf.1.egress.observed_at","typeLabel":"string\u003cdate-time>"},"how":{"description":"How the fact was obtained: the API call, the page URL, the record, or why it is unknown.","type":"string","minLength":1,"isRequired":true,"uniqueKey":"usage.oneOf.1.egress.how","typeLabel":"string"}},"uniqueKey":"usage.oneOf.1.egress","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"usage.oneOf.1","typeLabel":"object"},{"type":"null","description":"What the sandbox used: its size, its running time per state, how often it was created,\neach fact with the source it came from. Null when nothing has been recorded or the\nresponse does not carry it. Absent from responses of a Cloud that does not report it yet.\n","uniqueKey":"usage.oneOf.2","typeLabel":"null"}],"uniqueKey":"usage","typeLabel":"Usage record · object | object | null"},"cost":{"oneOf":[{"type":"object","title":"Cost","description":"What the sandbox cost, with one word saying how far to trust it. Create and detail\nresponses carry the full cost with its working; list rows carry only its label and\ntotal, from the same calculation. One object serves both, so the schema accepts either\nshape anywhere: a client that needs the working reads the detail. Null when no cost has\nbeen worked out. Absent from responses of a Cloud that does not report it yet.\n","required":["label","total","lines","held_back_by","exclusions","price_version","as_of"],"conditionallyRequiredProperties":{"reported_figure":[{"when":[[{"property":"label","values":["reported"]}]]}]},"properties":{"label":{"description":"reported: a provider amount verified at list price; calculated: provider usage priced at stored list rates; unknown: required provider evidence or a rate is missing.","enum":["reported","calculated","unknown"],"type":"string","isRequired":true,"uniqueKey":"cost.oneOf.0.label","typeLabel":"enum\u003cstring>"},"total":{"oneOf":[{"type":"object","description":"An exact USD amount, low equal to high, or null for unknown.","required":["low","high"],"properties":{"low":{"description":"A non-negative decimal number as a string, in plain notation without an exponent.","type":"string","pattern":"^(0|[1-9][0-9]*)(\\.[0-9]+)?$","isRequired":true,"uniqueKey":"cost.oneOf.0.total.oneOf.0.low","typeLabel":"string"},"high":{"description":"A non-negative decimal number as a string, in plain notation without an exponent.","type":"string","pattern":"^(0|[1-9][0-9]*)(\\.[0-9]+)?$","isRequired":true,"uniqueKey":"cost.oneOf.0.total.oneOf.0.high","typeLabel":"string"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"cost.oneOf.0.total.oneOf.0","typeLabel":"object"},{"type":"null","description":"An exact USD amount, low equal to high, or null for unknown.","isRequired":true,"uniqueKey":"cost.oneOf.0.total.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"cost.oneOf.0.total","typeLabel":"object | null"},"lines":{"description":"The working: one line per charged resource. Empty when the provider's own figure is all we have, or when nothing could be worked out.","type":"array","items":{"type":"object","additionalProperties":false,"required":["what","quantity","unit","rate","amount","quantity_source"],"properties":{"what":{"enum":["cpu","memory","disk","gpu","machine","creation","egress","snapshot_storage"],"type":"string","isRequired":true,"uniqueKey":"cost.oneOf.0.lines.items.[INDEX].what","typeLabel":"enum\u003cstring>"},"quantity":{"description":"A non-negative decimal number as a string, in plain notation without an exponent.","type":"string","pattern":"^(0|[1-9][0-9]*)(\\.[0-9]+)?$","isRequired":true,"uniqueKey":"cost.oneOf.0.lines.items.[INDEX].quantity","typeLabel":"string"},"unit":{"description":"The price version's unit for this rate, for example vcpu-second.","type":"string","minLength":1,"isRequired":true,"uniqueKey":"cost.oneOf.0.lines.items.[INDEX].unit","typeLabel":"string"},"rate":{"description":"US dollars per unit, as the price version states it.","type":"string","pattern":"^(0|[1-9][0-9]*)(\\.[0-9]+)?$","isRequired":true,"uniqueKey":"cost.oneOf.0.lines.items.[INDEX].rate","typeLabel":"string"},"amount":{"description":"A non-negative decimal number as a string, in plain notation without an exponent.","type":"string","pattern":"^(0|[1-9][0-9]*)(\\.[0-9]+)?$","isRequired":true,"uniqueKey":"cost.oneOf.0.lines.items.[INDEX].amount","typeLabel":"string"},"quantity_source":{"description":"The source of the usage facts the quantity came from; the least certain one when it came from several.","type":"string","enum":["provider","published","measured","recorded","calculated","unknown"],"isRequired":true,"uniqueKey":"cost.oneOf.0.lines.items.[INDEX].quantity_source","typeLabel":"enum\u003cstring>"},"text":{"description":"The line as a sentence a person reads, with its numbers: the quantity, the rate and the amount.","type":"string","minLength":1,"uniqueKey":"cost.oneOf.0.lines.items.[INDEX].text","typeLabel":"string"},"sources":{"description":"Where each number of the line came from, as words: the quantity, the rate and the amount.","type":"object","additionalProperties":false,"required":["amount"],"properties":{"amount":{"type":"string","minLength":1,"isRequired":true,"uniqueKey":"cost.oneOf.0.lines.items.[INDEX].sources.amount","typeLabel":"string"},"quantity":{"type":"string","minLength":1,"uniqueKey":"cost.oneOf.0.lines.items.[INDEX].sources.quantity","typeLabel":"string"},"rate":{"type":"string","minLength":1,"uniqueKey":"cost.oneOf.0.lines.items.[INDEX].sources.rate","typeLabel":"string"}},"uniqueKey":"cost.oneOf.0.lines.items.[INDEX].sources","typeLabel":"object"}},"uniqueKey":"cost.oneOf.0.lines.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"cost.oneOf.0.lines","typeLabel":"object[]"},"held_back_by":{"description":"Reasons in plain words. Shared pricing findings are projected to their text for the HTTP response.","type":"array","items":{"type":"string","minLength":1,"uniqueKey":"cost.oneOf.0.held_back_by.items.[INDEX]","typeLabel":"string"},"isRequired":true,"uniqueKey":"cost.oneOf.0.held_back_by","typeLabel":"string[]"},"exclusions":{"description":"What the figure leaves out, such as plan fees, credits and discounts.","type":"array","items":{"type":"string","minLength":1,"uniqueKey":"cost.oneOf.0.exclusions.items.[INDEX]","typeLabel":"string"},"isRequired":true,"uniqueKey":"cost.oneOf.0.exclusions","typeLabel":"string[]"},"price_version":{"oneOf":[{"description":"The id of the price version used, which carries the quotes. Null when none was in effect.","type":"string","pattern":"^[a-z][a-z0-9-]*@[0-9]{4}-[0-9]{2}-[0-9]{2}(?:-([01][0-9]|2[0-3])[0-5][0-9][0-5][0-9]Z)?$","isRequired":true,"uniqueKey":"cost.oneOf.0.price_version.oneOf.0","typeLabel":"string"},{"description":"The id of the price version used, which carries the quotes. Null when none was in effect.","type":"null","pattern":"^[a-z][a-z0-9-]*@[0-9]{4}-[0-9]{2}-[0-9]{2}(?:-([01][0-9]|2[0-3])[0-5][0-9][0-5][0-9]Z)?$","isRequired":true,"uniqueKey":"cost.oneOf.0.price_version.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"cost.oneOf.0.price_version","typeLabel":"string | null"},"as_of":{"description":"When Cloud calculated or recorded the cost. A sandbox that has not ended has no cost yet.","type":"string","format":"date-time","pattern":"^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]+)?Z$","isRequired":true,"uniqueKey":"cost.oneOf.0.as_of","typeLabel":"string\u003cdate-time>"},"per_hour":{"type":"object","additionalProperties":false,"required":["low","high"],"properties":{"low":{"description":"A non-negative decimal number as a string, in plain notation without an exponent.","type":"string","pattern":"^(0|[1-9][0-9]*)(\\.[0-9]+)?$","isRequired":true,"uniqueKey":"cost.oneOf.0.per_hour.low","typeLabel":"string"},"high":{"description":"A non-negative decimal number as a string, in plain notation without an exponent.","type":"string","pattern":"^(0|[1-9][0-9]*)(\\.[0-9]+)?$","isRequired":true,"uniqueKey":"cost.oneOf.0.per_hour.high","typeLabel":"string"}},"description":"US dollars per hour for an ended sandbox; no hourly cost is returned while it is running.","uniqueKey":"cost.oneOf.0.per_hour","typeLabel":"object"},"reported_figure":{"description":"Where a `reported` total came from. Present exactly when the label is `reported`.","type":"object","additionalProperties":false,"required":["source","observed_at","how"],"properties":{"source":{"description":"Where a fact came from. The same six values as the usage record's source; a test keeps the two lists equal.","type":"string","enum":["provider","published","measured","recorded","calculated","unknown"],"const":"provider","isRequired":true,"uniqueKey":"cost.oneOf.0.reported_figure.source","typeLabel":"enum\u003cstring>"},"observed_at":{"description":"A UTC time, ending in Z.","type":"string","format":"date-time","pattern":"^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]+)?Z$","isRequired":true,"uniqueKey":"cost.oneOf.0.reported_figure.observed_at","typeLabel":"string\u003cdate-time>"},"how":{"description":"The API call that returned the figure.","type":"string","minLength":1,"isRequired":true,"uniqueKey":"cost.oneOf.0.reported_figure.how","typeLabel":"string"}},"conditionalRequirements":[{"when":[[{"property":"label","values":["reported"]}]]}],"uniqueKey":"cost.oneOf.0.reported_figure","typeLabel":"object"},"summary":{"description":"The total as one sentence, or why there is none. The sentences of `lines[].text` add up to it.","type":"string","minLength":1,"uniqueKey":"cost.oneOf.0.summary","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"cost.oneOf.0","typeLabel":"Cost · object"},{"type":"object","description":"What the sandbox cost, with one word saying how far to trust it. Create and detail\nresponses carry the full cost with its working; list rows carry only its label and\ntotal, from the same calculation. One object serves both, so the schema accepts either\nshape anywhere: a client that needs the working reads the detail. Null when no cost has\nbeen worked out. Absent from responses of a Cloud that does not report it yet.\n","required":["label","total"],"properties":{"label":{"description":"reported: a provider amount verified at list price; calculated: provider usage priced at stored list rates; unknown: required provider evidence or a rate is missing.","enum":["reported","calculated","unknown"],"type":"string","isRequired":true,"uniqueKey":"cost.oneOf.1.label","typeLabel":"enum\u003cstring>"},"total":{"oneOf":[{"type":"object","description":"An exact USD amount, low equal to high, or null for unknown.","required":["low","high"],"properties":{"low":{"description":"A non-negative decimal number as a string, in plain notation without an exponent.","type":"string","pattern":"^(0|[1-9][0-9]*)(\\.[0-9]+)?$","isRequired":true,"uniqueKey":"cost.oneOf.1.total.oneOf.0.low","typeLabel":"string"},"high":{"description":"A non-negative decimal number as a string, in plain notation without an exponent.","type":"string","pattern":"^(0|[1-9][0-9]*)(\\.[0-9]+)?$","isRequired":true,"uniqueKey":"cost.oneOf.1.total.oneOf.0.high","typeLabel":"string"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"cost.oneOf.1.total.oneOf.0","typeLabel":"object"},{"type":"null","description":"An exact USD amount, low equal to high, or null for unknown.","isRequired":true,"uniqueKey":"cost.oneOf.1.total.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"cost.oneOf.1.total","typeLabel":"object | null"},"summary":{"description":"The total as one sentence, or why there is none. The sentences of `lines[].text` add up to it.","type":"string","minLength":1,"uniqueKey":"cost.oneOf.1.summary","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"cost.oneOf.1","typeLabel":"object"},{"type":"null","description":"What the sandbox cost, with one word saying how far to trust it. Create and detail\nresponses carry the full cost with its working; list rows carry only its label and\ntotal, from the same calculation. One object serves both, so the schema accepts either\nshape anywhere: a client that needs the working reads the detail. Null when no cost has\nbeen worked out. Absent from responses of a Cloud that does not report it yet.\n","uniqueKey":"cost.oneOf.2","typeLabel":"null"}],"uniqueKey":"cost","typeLabel":"Cost · object | object | null"},"charge":{"oneOf":[{"type":"object","description":"What BoxRouter charged to the workspace's credits for this sandbox: the reservation\nwhile it runs, then the amount charged once the provider's records are in. Present\non credit-funded sandboxes in detail and list responses. Null for a sandbox paid with\nthe workspace's own provider account (BYOK), for a credit-funded one whose\nreservation was released without a charge, and for one whose ledger record cannot be\nverified: BoxRouter reports no charge rather than a guess. `cost` still reports the\nprovider's cost. Absent from create and other responses, and from a Cloud that does\nnot report it yet. It is the ledger's amount, never derived from `cost` or from\nBoxRouter's clock.\n","required":["status","reserved_nanodollars","held_nanodollars","lifetime_seconds"],"conditionallyRequiredProperties":{"first_charged_nanodollars":[{"when":[[{"property":"status","values":["charged"]}]]}],"amount_nanodollars":[{"when":[[{"property":"status","values":["charged"]}]]}],"returned_nanodollars":[{"when":[[{"property":"status","values":["charged"]}]]}],"settled_at":[{"when":[[{"property":"status","values":["charged"]}]]}],"corrections":[{"when":[[{"property":"status","values":["charged"]}]]}]},"properties":{"status":{"type":"string","enum":["reserved","pending","charged"],"x-boxrouter-open-enum":true,"description":"Clients must handle unknown values explicitly.","isRequired":true,"uniqueKey":"charge.oneOf.0.status","typeLabel":"enum\u003cstring>"},"reserved_nanodollars":{"type":"string","maxLength":19,"pattern":"^(0|[1-9][0-9]{0,18})$","description":"The credit reserved when the sandbox started, for the lifetime it asked for.","isRequired":true,"uniqueKey":"charge.oneOf.0.reserved_nanodollars","typeLabel":"string"},"held_nanodollars":{"type":"string","maxLength":19,"pattern":"^(0|[1-9][0-9]{0,18})$","description":"What is still reserved from the balance for this sandbox. Zero once it is charged.","isRequired":true,"uniqueKey":"charge.oneOf.0.held_nanodollars","typeLabel":"string"},"lifetime_seconds":{"oneOf":[{"type":"integer","minimum":1,"description":"The lifetime the reservation was made for. Null when it is not recorded.","isRequired":true,"uniqueKey":"charge.oneOf.0.lifetime_seconds.oneOf.0","typeLabel":"integer"},{"type":"null","minimum":1,"description":"The lifetime the reservation was made for. Null when it is not recorded.","isRequired":true,"uniqueKey":"charge.oneOf.0.lifetime_seconds.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"charge.oneOf.0.lifetime_seconds","typeLabel":"integer | null"},"funding":{"type":"string","enum":["fixed","rolling","ending_unfunded"],"x-boxrouter-open-enum":true,"description":"How the sandbox's credits are reserved. `fixed`: all of the lifetime asked for was\nreserved when the sandbox started. `rolling`: the sandbox was created without a lifetime and\ncredits are reserved one hour at a time, renewed before each hour ends; `funded_until` on\nthe sandbox says how far it is funded. `ending_unfunded`: a renewal could not be\nfunded from the balance, so the sandbox ends at `funded_until`. Clients must handle\nunknown values explicitly. Absent from a Cloud that does not report it yet.\n","uniqueKey":"charge.oneOf.0.funding","typeLabel":"enum\u003cstring>"},"first_charged_nanodollars":{"type":"string","maxLength":19,"pattern":"^(0|[1-9][0-9]{0,18})$","description":"The charge as first settled from the provider's records. Present only when charged.","conditionalRequirements":[{"when":[[{"property":"status","values":["charged"]}]]}],"uniqueKey":"charge.oneOf.0.first_charged_nanodollars","typeLabel":"string"},"amount_nanodollars":{"type":"string","maxLength":19,"pattern":"^(0|[1-9][0-9]{0,18})$","description":"The charge now: the first charge moved by every correction. Present only when charged;\na pending or reserved charge carries no amount.\n","conditionalRequirements":[{"when":[[{"property":"status","values":["charged"]}]]}],"uniqueKey":"charge.oneOf.0.amount_nanodollars","typeLabel":"string"},"returned_nanodollars":{"type":"string","maxLength":19,"pattern":"^(0|[1-9][0-9]{0,18})$","description":"What went back to the balance when the first charge was settled, the reservation less that charge. Present only when charged.","conditionalRequirements":[{"when":[[{"property":"status","values":["charged"]}]]}],"uniqueKey":"charge.oneOf.0.returned_nanodollars","typeLabel":"string"},"create_fee_nanodollars":{"type":"string","maxLength":19,"pattern":"^(0|[1-9][0-9]{0,18})$","description":"The flat per-create fee the price book added to the first charge; zero while no book\nsets one. It is inside `amount_nanodollars`, not on top of it. Present only when\ncharged, and absent from a Cloud that does not report it yet.\n","uniqueKey":"charge.oneOf.0.create_fee_nanodollars","typeLabel":"string"},"basis":{"oneOf":[{"type":"string","enum":["reported","calculated",null],"x-boxrouter-open-enum":true,"description":"How the provider's cost for this sandbox was established, as `cost.label` says for it:\n`reported` for the provider's own figure, `calculated` for one worked out from its\nusage records. Null when the cost's source is not known. Present only when charged.\n","uniqueKey":"charge.oneOf.0.basis.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["reported","calculated",null],"x-boxrouter-open-enum":true,"description":"How the provider's cost for this sandbox was established, as `cost.label` says for it:\n`reported` for the provider's own figure, `calculated` for one worked out from its\nusage records. Null when the cost's source is not known. Present only when charged.\n","uniqueKey":"charge.oneOf.0.basis.oneOf.1","typeLabel":"null"}],"uniqueKey":"charge.oneOf.0.basis","typeLabel":"enum\u003cstring> | null"},"settled_at":{"type":"string","format":"date-time","description":"When the first charge was recorded in the ledger. Present only when charged.","conditionalRequirements":[{"when":[[{"property":"status","values":["charged"]}]]}],"uniqueKey":"charge.oneOf.0.settled_at","typeLabel":"string\u003cdate-time>"},"corrections":{"type":"array","maxItems":1000,"description":"Later changes to the charge, oldest first, when the provider's records or reported cost\nfor this sandbox changed after it was first charged. Independent credits an operator\ngives are not corrections. Present only when charged; empty when none.\n","items":{"type":"object","additionalProperties":false,"required":["at","delta_nanodollars","reason"],"properties":{"at":{"type":"string","format":"date-time","description":"When the ledger recorded the correction.","isRequired":true,"uniqueKey":"charge.oneOf.0.corrections.items.[INDEX].at","typeLabel":"string\u003cdate-time>"},"delta_nanodollars":{"type":"string","maxLength":20,"pattern":"^(-?[1-9][0-9]{0,18})$","description":"The change to the charge. Positive means the charge went up and the difference was taken from the balance; negative means it went down and the difference was returned to it.","isRequired":true,"uniqueKey":"charge.oneOf.0.corrections.items.[INDEX].delta_nanodollars","typeLabel":"string"},"reason":{"type":"string","enum":["provider_revised"],"x-boxrouter-open-enum":true,"description":"Why the charge moved. `provider_revised`: the provider's records or reported cost for\nthis sandbox changed. Clients must handle unknown values explicitly.\n","isRequired":true,"uniqueKey":"charge.oneOf.0.corrections.items.[INDEX].reason","typeLabel":"enum\u003cstring>"}},"uniqueKey":"charge.oneOf.0.corrections.items.[INDEX]","typeLabel":"object"},"conditionalRequirements":[{"when":[[{"property":"status","values":["charged"]}]]}],"uniqueKey":"charge.oneOf.0.corrections","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"charge.oneOf.0","typeLabel":"object"},{"type":"null","description":"What BoxRouter charged to the workspace's credits for this sandbox: the reservation\nwhile it runs, then the amount charged once the provider's records are in. Present\non credit-funded sandboxes in detail and list responses. Null for a sandbox paid with\nthe workspace's own provider account (BYOK), for a credit-funded one whose\nreservation was released without a charge, and for one whose ledger record cannot be\nverified: BoxRouter reports no charge rather than a guess. `cost` still reports the\nprovider's cost. Absent from create and other responses, and from a Cloud that does\nnot report it yet. It is the ledger's amount, never derived from `cost` or from\nBoxRouter's clock.\n","uniqueKey":"charge.oneOf.1","typeLabel":"null"}],"uniqueKey":"charge","typeLabel":"object | null"},"funded_until":{"oneOf":[{"type":"string","format":"date-time","description":"The time up to which the workspace's credits are reserved for this sandbox. A sandbox\ncreated without `lifetime_seconds` renews its reservation hourly while the balance\ncovers it, so this moves later at each renewal; the sandbox ends at this time if the\nbalance could not cover another hour. For a sandbox created with `lifetime_seconds`\nit is the end of that lifetime. Null for a sandbox paid with the workspace's own\nprovider account (BYOK), which has no reservation. A reservation is a hold on the\nbalance, never a cost: `charge` reports the credits reserved and then charged. Present\non create and on detail and list reads; absent from a Cloud that does not report it yet.\n","uniqueKey":"funded_until.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"The time up to which the workspace's credits are reserved for this sandbox. A sandbox\ncreated without `lifetime_seconds` renews its reservation hourly while the balance\ncovers it, so this moves later at each renewal; the sandbox ends at this time if the\nbalance could not cover another hour. For a sandbox created with `lifetime_seconds`\nit is the end of that lifetime. Null for a sandbox paid with the workspace's own\nprovider account (BYOK), which has no reservation. A reservation is a hold on the\nbalance, never a cost: `charge` reports the credits reserved and then charged. Present\non create and on detail and list reads; absent from a Cloud that does not report it yet.\n","uniqueKey":"funded_until.oneOf.1","typeLabel":"null"}],"uniqueKey":"funded_until","typeLabel":"string\u003cdate-time> | null"},"connectable":{"type":"boolean","description":"Whether interactive access to this sandbox is offered: a terminal, commands, files and\nprocesses. False for a sandbox an Actions job runs in, which holds that job's token and\nsecrets; Cloud refuses these operations on it, before and after the job ends, and the\ndashboard shows no Connect action. True for every other sandbox. One rule, decided by\nCloud; clients do not infer it from `origin`, which an Actions runner that has not yet\nserved a job does not have. Present on detail and list reads; absent from a Cloud that\ndoes not report it yet.\n","uniqueKey":"connectable","typeLabel":"boolean"},"volume":{"oneOf":[{"type":"object","description":"Present when the sandbox is attached to a BoxRouter Volume.","required":["id","path","access","restored_checkpoint","restore_duration_ms"],"properties":{"id":{"type":"string","pattern":"^vol_[0-9a-f]{32}$","description":"BoxRouter-managed Volume ID. Provider-native volume requirements are not accepted.","isRequired":true,"uniqueKey":"volume.oneOf.0.id","typeLabel":"string"},"path":{"type":"string","isRequired":true,"uniqueKey":"volume.oneOf.0.path","typeLabel":"string"},"access":{"type":"string","enum":["write","read","shared","branch"],"isRequired":true,"uniqueKey":"volume.oneOf.0.access","typeLabel":"enum\u003cstring>"},"restored_checkpoint":{"oneOf":[{"type":"integer","minimum":1,"isRequired":true,"uniqueKey":"volume.oneOf.0.restored_checkpoint.oneOf.0","typeLabel":"integer"},{"type":"null","minimum":1,"isRequired":true,"uniqueKey":"volume.oneOf.0.restored_checkpoint.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"volume.oneOf.0.restored_checkpoint","typeLabel":"integer | null"},"restore_duration_ms":{"oneOf":[{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"volume.oneOf.0.restore_duration_ms.oneOf.0","typeLabel":"integer"},{"type":"null","minimum":0,"isRequired":true,"uniqueKey":"volume.oneOf.0.restore_duration_ms.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"volume.oneOf.0.restore_duration_ms","typeLabel":"integer | null"}},"additionalProperties":false,"uniqueKey":"volume.oneOf.0","typeLabel":"object"},{"type":"null","description":"Present when the sandbox is attached to a BoxRouter Volume.","uniqueKey":"volume.oneOf.1","typeLabel":"null"}],"uniqueKey":"volume","typeLabel":"object | null"},"operation_id":{"oneOf":[{"type":"string","minLength":1,"description":"Present on a destroy response: the workspace-owned destroy operation while lifecycle\nwork remains (`state` is `destroying`), null once the destroy is confirmed. Absent\nfrom every other response.\n","uniqueKey":"operation_id.oneOf.0","typeLabel":"string"},{"type":"null","minLength":1,"description":"Present on a destroy response: the workspace-owned destroy operation while lifecycle\nwork remains (`state` is `destroying`), null once the destroy is confirmed. Absent\nfrom every other response.\n","uniqueKey":"operation_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"operation_id","typeLabel":"string | null"},"account":{"type":"object","required":["healthy","detail"],"description":"Present only while the account's key no longer works (section 7); that sandbox's\ncalls then answer account_unhealthy and state is unknown.\n","properties":{"healthy":{"type":"boolean","isRequired":true,"uniqueKey":"account.healthy","typeLabel":"boolean"},"detail":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"account.detail.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"account.detail.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"account.detail","typeLabel":"string | null"}},"uniqueKey":"account","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"id":"\u003cstring>","state":"creating","state_reason":"requested","failure":{"summary":"\u003cstring>","provider_state":"\u003cstring>","native_code":"\u003cstring>","native_message":"\u003cstring>","observed_at":"2023-11-07T05:31:56Z"},"native_state":"\u003cstring>","observed_at":"2023-11-07T05:31:56Z","state_recorded_at":"2023-11-07T05:31:56Z","created_at":"2023-11-07T05:31:56Z","ready_at":"2023-11-07T05:31:56Z","ended_at":"2023-11-07T05:31:56Z","labels":{},"lifetime":{"seconds":1,"remaining_seconds":1,"ends_at":"2023-11-07T05:31:56Z","kept_until":"2023-11-07T05:31:56Z","at_end":"destroy","max_seconds":2,"extendable":true},"route":{"provider":"\u003cstring>","class":"\u003cstring>","adapter_version":"\u003cstring>","selection":{"considered":1,"eligible":1,"ranked_by":"price","excluded":[{"provider":"\u003cstring>","class":"\u003cstring>","account_id":"\u003cstring>","failed":[{"reason":"\u003cstring>","gate":"\u003cstring>","knob":"\u003cstring>","resource":"\u003cstring>","extra":"\u003cstring>","limit":"\u003cstring>","detail":"\u003cstring>","details":{},"fix":"\u003cstring>","asked":"\u003cunknown>","offered":"\u003cunknown>","narrowed_by":"account","between":["\u003cstring>"],"value":"\u003cunknown>"}]}],"attempts":[{"provider":"\u003cstring>","native_code":"\u003cstring>","native_status":123,"route_id":"\u003cstring>","account_id":"\u003cstring>","supply":"\u003cstring>","cause":"key_rejected"}],"preparation_skips":[{"provider":"\u003cstring>","reason_code":"\u003cstring>","route_id":"\u003cstring>","account_id":"\u003cstring>","cause":"key_rejected"}],"fallbacks_allowed":true,"stopped_reason":"fallbacks_disabled","funding_group":"prioritized","workspace_mode":"automatic"},"id":"\u003cstring>","account_id":"\u003cstring>","supply":"\u003cstring>","region":"\u003cstring>","native_id":"\u003cstring>"},"contract":{"spec_version":"\u003cstring>","gates":{},"resources":{},"attested":{}},"request":{},"hidden_secrets":{},"tcp_ports":[{"host":"\u003cstring>","port":32768,"tls":"none"}],"recorder":{},"limits":{"buffered_output_bytes":2,"file_transfer_bytes":1048576,"upload_max_bytes":1,"download_max_bytes":1,"inline_transfer_max_bytes":2},"expires_at":"2023-11-07T05:31:56Z","created_at_source":"provider","created_at_how":"\u003cstring>","created_at_step":2,"ready_at_source":"provider","ready_at_how":"\u003cstring>","ready_at_step":2,"ended_at_source":"provider","ended_at_how":"\u003cstring>","ended_at_step":2,"cost_source":"provider","cost_how":"\u003cstring>","cost_step":2,"origin":{"source":"github_actions","run_id":"\u003cstring>","job_id":"\u003cstring>","repository":"\u003cstring>","workflow":"\u003cstring>","run_number":2,"job_name":"\u003cstring>","run_url":"\u003cstring>","job_url":"\u003cstring>"},"name":"\u003cstring>","resources":{"cpu":123,"memory_mib":2,"disk_mib":2},"image":{"value":"\u003cstring>","source":"provider"},"image_setup":{"provider":"\u003cstring>","duration_ms":1},"usage":{"provider":"\u003cstring>","started":{"at":"\u003cstring>","source":"provider","observed_at":"2023-11-07T05:31:56Z","how":"\u003cstring>"},"region":{"name":"\u003cstring>","source":"provider","observed_at":"2023-11-07T05:31:56Z","how":"\u003cstring>"},"size":{"source":"provider","observed_at":"2023-11-07T05:31:56Z","how":"\u003cstring>","cpu":123,"memory_mib":2,"disk_mib":2,"gpu":2,"gpu_model":"\u003cstring>"},"intervals":[{"state":"running","seconds":1,"source":"provider","observed_at":"2023-11-07T05:31:56Z","how":"\u003cstring>","size":{"source":"provider","observed_at":"2023-11-07T05:31:56Z","how":"\u003cstring>","cpu":123,"memory_mib":2,"disk_mib":2,"gpu":2,"gpu_model":"\u003cstring>"},"snapshot_storage":{"source":"provider","observed_at":"2023-11-07T05:31:56Z","how":"\u003cstring>","gb":1,"max_gb":1,"bytes":1}}],"creations":{"count":1,"source":"provider","observed_at":"2023-11-07T05:31:56Z","how":"\u003cstring>"},"class":{"name":"\u003cstring>","source":"provider","observed_at":"2023-11-07T05:31:56Z","how":"\u003cstring>"},"active_cpu":{"seconds":1,"source":"provider","observed_at":"2023-11-07T05:31:56Z","how":"\u003cstring>"},"egress":{"bytes":1,"source":"provider","observed_at":"2023-11-07T05:31:56Z","how":"\u003cstring>"},"snapshot_storage":{"source":"provider","observed_at":"2023-11-07T05:31:56Z","how":"\u003cstring>","gb":1,"max_gb":1,"bytes":1}},"cost":{"label":"reported","total":{"low":"\u003cstring>","high":"\u003cstring>"},"lines":[{"what":"cpu","quantity":"\u003cstring>","unit":"\u003cstring>","rate":"\u003cstring>","amount":"\u003cstring>","quantity_source":"provider","text":"\u003cstring>","sources":{"amount":"\u003cstring>","quantity":"\u003cstring>","rate":"\u003cstring>"}}],"held_back_by":["\u003cstring>"],"exclusions":["\u003cstring>"],"price_version":"\u003cstring>","as_of":"2023-11-07T05:31:56Z","per_hour":{"low":"\u003cstring>","high":"\u003cstring>"},"reported_figure":{"source":"provider","observed_at":"2023-11-07T05:31:56Z","how":"\u003cstring>"},"summary":"\u003cstring>"},"charge":{"status":"reserved","reserved_nanodollars":"\u003cstring>","held_nanodollars":"\u003cstring>","lifetime_seconds":2,"funding":"fixed","first_charged_nanodollars":"\u003cstring>","amount_nanodollars":"\u003cstring>","returned_nanodollars":"\u003cstring>","create_fee_nanodollars":"\u003cstring>","basis":"reported","settled_at":"2023-11-07T05:31:56Z","corrections":[{"at":"2023-11-07T05:31:56Z","delta_nanodollars":"\u003cstring>","reason":"provider_revised"}]},"funded_until":"2023-11-07T05:31:56Z","connectable":true,"volume":{"id":"\u003cstring>","path":"\u003cstring>","access":"write","restored_checkpoint":2,"restore_duration_ms":1},"operation_id":"\u003cstring>","account":{"healthy":true,"detail":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"2eefd491-b11c-41cd-a515-1666ba0cf8b0":{"description":"Structured error. `retry` says whether to send the call again (`now`, `after_fix`, `inspect` or `never`) and `retry_after_seconds` how long to wait first. Unowned and unknown resource IDs both return 404. Admission overload returns 503 with code overloaded, outcome not_started and Retry-After. It reserves no operation and dispatches no provider work. Shared workspace/provider admission budgets return 429 with code rate_limited, outcome not_started and Retry-After. An incomplete request body can return 408 request_timeout before dispatch. Durable-state failures return 503 database_unavailable with outcome unknown; do not infer that execution did not occur. A read (GET or HEAD) that meets the same failure changed nothing: its message says the state is temporarily unavailable, and it is safe to repeat. A provider that cannot be reached when a create is prepared returns 502 provider_error with outcome not_started; nothing was created, and the create can be retried with the same Idempotency-Key or sent to another provider with `providers`.\nNative errors are sanitized; upstream credentials, request bodies and\nanother workspace's metadata are never included. Server-Timing is present only when the response reached Dispatcher or held-response preparation; an earlier response, including pre-Dispatcher admission overload, may omit it.\n","headers":{"X-Request-ID":{"description":"Server-generated correlation identifier; contains no credentials or payloads.","schema":{"type":"string"}},"Server-Timing":{"description":"Durations of server-side phases, for diagnosing slow requests. Phase names are not stable\nand may change.\n","schema":{"type":"string"},"x-boxrouter-server-timing":{"version":1,"unit":"ms","serviceAggregateMetric":"service","maxHeaderBytes":8192,"maxOperationRows":32,"decimalPlaces":3,"safeNamePattern":"^[A-Za-z0-9_.:-]{1,64}$","aggregates":[{"metric":"service","fieldStem":"cloud"},{"metric":"database","fieldStem":"database"},{"metric":"code","fieldStem":"code"},{"metric":"provider_connect","fieldStem":"provider_connect"},{"metric":"provider_wait","fieldStem":"provider_wait"},{"metric":"accept","fieldStem":"accept"},{"metric":"queue","fieldStem":"queue"},{"metric":"admission","fieldStem":"admission"},{"metric":"encode","fieldStem":"encode"}],"aggregateGrammar":{"duration":{"parameter":"dur","type":"number","finite":true,"minimum":0},"descriptionParameter":"desc","unknownDescription":"unknown","missingMeans":"unreported"},"operationGrammar":{"metric":"op","nameParameter":"desc","namePattern":"safeNamePattern","start":{"parameter":"start","type":"number","finite":true,"sign":"signed","relativeTo":"recorderWindow"},"duration":{"parameter":"dur","type":"number","finite":true,"minimum":0},"outcomeParameter":"outcome","outcomes":["returned","raised"],"requiresAggregateDependencyUnion":false},"omissionGrammar":{"metric":"op-omitted","count":{"parameter":"desc","type":"integer","minimum":0},"duration":{"parameter":"dur","type":"number","finite":true,"minimum":0,"sumOf":"knownOmittedMeasuredRows"},"requiresAggregateDependencyUnion":false},"coverageGrammar":{"metric":"op-coverage","descriptionParameter":"desc","unknownValue":"unknown","absentState":"unreported","states":["unknown","unreported"],"absenceImpliesCompleteness":false}}},"Retry-After":{"description":"Seconds before retrying an eligible read; not permission to replay a mutation.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"description":"The one error body every failing call answers. It leads with what to do: `retry` says whether to send the call again, `fix` says what to change, `outcome` says what happened, and `doc_url` links to the page that explains the code. Clients retry `retry: safe` for you with the same idempotency key.","x-sandbox-provider-spec-codes":["no_eligible_route","knob_not_named","unrecognised_word","invalid_request","not_named","gate_unavailable","account_unhealthy","lifetime_limit","lifetime_used_up","not_running","invalid_state","sandbox_ended","not_found","provider_error","timeout","contract_violation"],"properties":{"error":{"type":"object","required":["code","message","request_id","outcome","retry","retry_after_seconds"],"properties":{"code":{"type":"string","description":"Stable machine category. Operation failures use SandboxProviderSpec error codes,\nincluding invalid_request, invalid_state, not_found, unauthorized,\nincompatible_requirements, no_eligible_route, capacity_unavailable,\ncapability_unavailable, contract_violation, resource_limit, timeout and\nprovider_error. Hosted service failures add method_not_allowed,\nunauthenticated, forbidden, actions_sandbox_protected,\ninsufficient_credit, spend_limit_exceeded,\nprovider_not_enabled, credentials_rejected, conflict, rate_limited, provider_quota, request_timeout, overloaded,\ndatabase_unavailable, payment_method_required, payment_declined, promotion_already_redeemed, account_exists, and internal_error. unsupported_feature and\noutput_limit are earlier names still returned by some routes.\nOrganization and membership operations also use organization_changed, last_admin,\nstale_membership, directory_managed and change_in_progress. Key ownership and\ninvitation operations use idempotency_key_reused and conflict.\nCredit refunds and purchase quotes also use refund_window_closed,\nnothing_to_refund, refund_below_minimum, refund_in_progress,\npurchase_in_progress, dispute_open, already_refunded,\nrefund_amount_changed, refund_fee_unavailable, quote_changed,\nsession_required, refund_daily_limit, refund_rate_limit,\nrefund_retry_requires_support, idempotency_key_reused and fraud_review.\nCard setup adds card_setup_rate_limit (429, with Retry-After): a workspace may start five\ncard setups an hour.\nA provider that refuses the request for its own plan or quota limit answers\n429 provider_quota with the provider's words in native_message; rate_limited is\nBoxRouter's own limit.\nRouting Prevent Overrides refuses a request containing preferences.order,\npreferences.sort or preferences.allow_fallbacks with routing_overrides_forbidden,\noutcome not_started and details.fields naming the prohibited inputs. No provider\neffect occurs.\nLaunch operations also use invalid_request, secret_missing, agent_not_found,\nno_eligible_route and launch_failed.\nA process or terminal is observed by one API task. When that task stops, process\noutput, result and stdin answer 410 process_observer_lost (reading or cancelling the\nprocess still works), and a terminal on a provider that cannot reattach it answers\n410 terminal_observer_lost. invalid_observer_hop (403) refuses an internal hop\nbetween API tasks that is not signed; clients never send one.\nOpening a preview that the provider answered with other access than the request\nasked for returns 502 preview_access_refused: that preview is never returned, and\ndetails say whether it was ended.\nStarting a process with wait_for_port answers 409 port_not_listening, outcome partial,\nwhen the process exits before the port accepts connections or the port stays closed for\n30 seconds; the process is ended and details carry the output so far.\nA request that must store content (a volume, a saved artifact) under transient content\nretention answers 409 privacy_persistence_conflict with outcome not_started.\nA sandbox request that stops before anything is created also answers\nlifetime_cap_exceeded, knob_not_named and unrecognised_word (400), and price_unknown and\npolicy_denied (409), each with outcome not_started; the Actions codes job_claim_lost,\nactions_authority_changed, actions_candidate_ceiling_withdrawn and\nactions_candidate_outside_ceiling (409) say the job's claim, settings or admitted routes\nchanged; provider_budget_exhausted (409) says a run's provider budget allows no\nfurther create. A create that names an image Cloud cannot use answers 400\nimage_architecture_unsupported, image_digest_resolution_failed,\nimage_preparation_unsupported or private_image_managed_route_unavailable, and\nprivacy_admission_unavailable when privacy cannot be enforced; each says what to change.\nLaunch and source-repository refusals name the repository or manifest fault (code_ref_not_found,\ncode_repository_*, source_*, invalid_source_manifest, invalid_manifest_encoding,\ninvalid_run_spec, repository_*, reserved_env_refused, launch_run_position_conflict,\ncode_reference_moved, dockerfile_context_unsupported, image_tag_unresolved,\nrecovery_sandbox_mismatch); the GitHub-side ones (source_rate_limited,\nsource_resolution_failed, source_resolution_timeout, code_repository_resolution_failed)\nare safe to resend. image_setup_timeout, managed_funding_unavailable,\nlifetime_funding_conflict, candidate_admission_unavailable, secrets_unavailable and the\nActions candidate codes (actions_candidate_record_invalid, actions_create_budget_exhausted,\nactions_create_format_mismatch) complete the creation and extension refusals.\ndispatch_limit_reached, inline_secret_values_refused and launch_incomplete come from\nlaunch runs, provider_policy_unknown from an operation whose privacy evidence cannot be\nverified, and quota_exceeded from a full managed provider account.\nVolume operations also use volume_busy, volume_lease_lost, volume_not_attached,\nvolume_incompatible, volume_save_failed and volume_restore_failed. Creating a\nsandbox on a volume whose writer is ending waits for the release (at most 120\nseconds) before it can answer volume_busy.\nA team member's new personal API key is paused until WorkOS membership sync catches\nup: it answers 403 forbidden whose message and fix say the key becomes active once\nthe team membership syncs, usually within a minute, and the call can be retried.\nClients must preserve and handle unknown categories explicitly.\n","x-boxrouter-error-codes":{"account_exists":[409],"account_unhealthy":[402],"actions_authority_changed":[409],"actions_candidate_ceiling_withdrawn":[409],"actions_candidate_outside_ceiling":[409],"actions_candidate_record_invalid":[409],"actions_create_budget_exhausted":[409],"actions_create_format_mismatch":[409],"actions_sandbox_protected":[403],"agent_not_found":[404],"already_refunded":[409],"authorization_error":[403],"candidate_admission_unavailable":[503],"capability_unavailable":[409,503],"capability_unverified":[409],"card_setup_rate_limit":[429],"change_in_progress":[409],"code_ref_not_found":[404],"code_reference_moved":[409],"code_repository_not_authorized":[403],"code_repository_not_found":[404],"code_repository_not_private":[400],"code_repository_not_public":[404],"code_repository_resolution_failed":[502],"command_failed":[409],"command_observation_busy":[409],"conflict":[409],"contract_violation":[409],"credentials_rejected":[409,422],"database_unavailable":[503],"directory_managed":[409],"dispatch_limit_reached":[409],"dispute_open":[409],"dockerfile_context_unsupported":[400],"expired":[410],"forbidden":[403],"fraud_review":[409],"gate_unavailable":[409],"idempotency_key_reused":[409,422],"identity_unavailable":[503],"image_architecture_unsupported":[400],"image_digest_resolution_failed":[400],"image_preparation_unsupported":[400],"image_setup_timeout":[504],"image_tag_unresolved":[400],"inline_secret_values_refused":[422],"insufficient_credit":[402],"internal_error":[500],"invalid_manifest_encoding":[400],"invalid_observer_hop":[403],"invalid_request":[400,413,422,428],"invalid_run_spec":[400],"invalid_source_manifest":[400],"invalid_state":[409],"job_claim_lost":[409],"knob_not_named":[400],"last_admin":[409],"launch_failed":[409],"launch_incomplete":[409],"launch_run_position_conflict":[409],"lifetime_cap_exceeded":[400],"lifetime_funding_conflict":[409],"lifetime_limit":[409],"lifetime_used_up":[409],"managed_funding_unavailable":[503],"method_not_allowed":[405],"no_eligible_route":[409],"not_found":[404],"not_named":[409],"not_running":[409],"nothing_to_refund":[409],"organization_changed":[409],"output_limit":[413],"overloaded":[503],"payment_declined":[402],"payment_method_required":[409],"payment_provider_rejected":[502],"payment_provider_unavailable":[503],"payments_unavailable":[503],"policy_denied":[409],"port_not_listening":[409],"preview_access_refused":[502],"price_unknown":[409],"privacy_admission_unavailable":[400],"privacy_persistence_conflict":[409],"private_image_managed_route_unavailable":[400],"process_observer_lost":[410],"promotion_already_redeemed":[409],"promotion_code_invalid":[404],"provider_budget_exhausted":[409],"provider_error":[502],"provider_not_enabled":[409],"provider_policy_unknown":[409],"provider_quota":[429],"purchase_in_progress":[409],"quota_exceeded":[429],"quote_changed":[409],"rate_limited":[429],"recovery_sandbox_mismatch":[409],"refund_amount_changed":[409],"refund_below_minimum":[409],"refund_daily_limit":[429],"refund_fee_unavailable":[409],"refund_in_progress":[409],"refund_rate_limit":[429],"refund_retry_requires_support":[409],"refund_window_closed":[409],"repository_file_unsupported":[400],"repository_too_large":[400],"request_timeout":[408],"reserved_env_refused":[400,422],"resource_limit":[413,507],"routing_overrides_forbidden":[400],"run_limit_exceeded":[429],"sandbox_ended":[410],"secret_missing":[400],"secrets_unavailable":[503],"session_required":[403],"source_file_not_found":[400],"source_file_too_large":[413],"source_rate_limited":[503],"source_ref_not_found":[400],"source_repository_not_accessible":[404],"source_repository_not_found":[400],"source_repository_not_private":[400],"source_repository_not_public":[400],"source_resolution_failed":[502],"source_resolution_timeout":[504],"spend_limit_exceeded":[402],"stale_membership":[409],"terminal_closed":[410],"terminal_observer_lost":[410],"timeout":[504],"unauthenticated":[401],"unavailable":[503],"unrecognised_word":[400],"unsupported_feature":[422],"volume_busy":[409],"volume_incompatible":[409],"volume_lease_lost":[409],"volume_not_attached":[409],"volume_restore_failed":[502],"volume_save_failed":[409,502],"volume_unavailable":[409],"wrong_region":[421]},"x-boxrouter-error-retry":{"account_exists":"after_fix","account_unhealthy":"after_fix","actions_authority_changed":"after_fix","actions_candidate_ceiling_withdrawn":"after_fix","actions_candidate_outside_ceiling":"after_fix","actions_candidate_record_invalid":"after_fix","actions_create_budget_exhausted":"after_fix","actions_create_format_mismatch":"after_fix","actions_sandbox_protected":"never","agent_not_found":"after_fix","already_refunded":"never","authorization_error":"check_outcome","candidate_admission_unavailable":"never","capability_unavailable":"check_outcome","capability_unverified":"after_fix","card_setup_rate_limit":"safe","change_in_progress":"safe","code_ref_not_found":"after_fix","code_reference_moved":"after_fix","code_repository_not_authorized":"after_fix","code_repository_not_found":"after_fix","code_repository_not_private":"after_fix","code_repository_not_public":"after_fix","code_repository_resolution_failed":"safe","command_failed":"after_fix","command_observation_busy":"safe","conflict":"check_outcome","contract_violation":"check_outcome","credentials_rejected":"after_fix","database_unavailable":"check_outcome","directory_managed":"never","dispatch_limit_reached":"after_fix","dispute_open":"after_fix","dockerfile_context_unsupported":"after_fix","expired":"check_outcome","forbidden":"after_fix","fraud_review":"safe","gate_unavailable":"after_fix","idempotency_key_reused":"after_fix","identity_unavailable":"safe","image_architecture_unsupported":"after_fix","image_digest_resolution_failed":"after_fix","image_preparation_unsupported":"after_fix","image_setup_timeout":"after_fix","image_tag_unresolved":"after_fix","inline_secret_values_refused":"after_fix","insufficient_credit":"after_fix","internal_error":"never","invalid_manifest_encoding":"after_fix","invalid_observer_hop":"after_fix","invalid_request":"after_fix","invalid_run_spec":"after_fix","invalid_source_manifest":"after_fix","invalid_state":"check_outcome","job_claim_lost":"after_fix","knob_not_named":"after_fix","last_admin":"after_fix","launch_failed":"check_outcome","launch_incomplete":"check_outcome","launch_run_position_conflict":"after_fix","lifetime_cap_exceeded":"after_fix","lifetime_funding_conflict":"after_fix","lifetime_limit":"check_outcome","lifetime_used_up":"after_fix","managed_funding_unavailable":"safe","method_not_allowed":"after_fix","no_eligible_route":"after_fix","not_found":"check_outcome","not_named":"after_fix","not_running":"after_fix","nothing_to_refund":"never","organization_changed":"safe","output_limit":"check_outcome","overloaded":"safe","payment_declined":"after_fix","payment_method_required":"after_fix","payment_provider_rejected":"check_outcome","payment_provider_unavailable":"check_outcome","payments_unavailable":"safe","policy_denied":"after_fix","port_not_listening":"after_fix","preview_access_refused":"never","price_unknown":"after_fix","privacy_admission_unavailable":"after_fix","privacy_persistence_conflict":"after_fix","private_image_managed_route_unavailable":"after_fix","process_observer_lost":"check_outcome","promotion_already_redeemed":"never","promotion_code_invalid":"after_fix","provider_budget_exhausted":"never","provider_error":"check_outcome","provider_not_enabled":"after_fix","provider_policy_unknown":"after_fix","provider_quota":"after_fix","purchase_in_progress":"safe","quota_exceeded":"safe","quote_changed":"after_fix","rate_limited":"safe","recovery_sandbox_mismatch":"check_outcome","refund_amount_changed":"after_fix","refund_below_minimum":"never","refund_daily_limit":"safe","refund_fee_unavailable":"safe","refund_in_progress":"safe","refund_rate_limit":"safe","refund_retry_requires_support":"never","refund_window_closed":"never","repository_file_unsupported":"after_fix","repository_too_large":"after_fix","request_timeout":"safe","reserved_env_refused":"after_fix","resource_limit":"check_outcome","routing_overrides_forbidden":"after_fix","run_limit_exceeded":"after_fix","sandbox_ended":"check_outcome","secret_missing":"after_fix","secrets_unavailable":"never","session_required":"never","source_file_not_found":"after_fix","source_file_too_large":"after_fix","source_rate_limited":"safe","source_ref_not_found":"after_fix","source_repository_not_accessible":"after_fix","source_repository_not_found":"after_fix","source_repository_not_private":"after_fix","source_repository_not_public":"after_fix","source_resolution_failed":"safe","source_resolution_timeout":"safe","spend_limit_exceeded":"after_fix","stale_membership":"after_fix","terminal_closed":"after_fix","terminal_observer_lost":"after_fix","timeout":"check_outcome","unauthenticated":"after_fix","unavailable":"safe","unrecognised_word":"after_fix","unsupported_feature":"after_fix","volume_busy":"after_fix","volume_incompatible":"after_fix","volume_lease_lost":"after_fix","volume_not_attached":"after_fix","volume_restore_failed":"check_outcome","volume_save_failed":"check_outcome","volume_unavailable":"after_fix","wrong_region":"after_fix"},"isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"request_id":{"type":"string","isRequired":true,"uniqueKey":"error.request_id","typeLabel":"string"},"outcome":{"type":"string","enum":["not_started","completed","partial","unknown"],"description":"What is known about the requested side effect. `not_started` means nothing ran\nanywhere, at BoxRouter or at a provider; a launch-setup or process-start failure\nafter dispatch is `partial` or `unknown`. Unknown and partial forbid automatic\nreplay and always carry `retry: check_outcome`. An HTTP status alone does not establish\noutcome.\nMany refusals report not_started before the provider is asked anything. A read\n(GET or HEAD) has no side effect to be unsure about, so its failures report\nnot_started and carry the code's own retry value. A launch preparation failure\nhappens after the sandbox was created and setup commands may already have run, and\ndeleting the sandbox does not undo effects outside it: it reports partial once the\ncleanup is confirmed and unknown if it is not. A process that wait_for_port ended\nreports partial. volume_restore_failed on a resume or create,\nand volume_save_failed after the guest was read, report unknown or partial; they\ncarry the operation_id when the call was recorded, and their fix does not offer to\nsend the call again unchanged.\n","isRequired":true,"uniqueKey":"error.outcome","typeLabel":"enum\u003cstring>"},"retry":{"type":"string","enum":["safe","after_fix","check_outcome","never"],"x-boxrouter-open-enum":true,"description":"What the caller may do next, fixed per code (x-boxrouter-error-retry): safe resends the\nsame request, after_fix changes the request or setup first, check_outcome reads\n`outcome` and the resource before resending, never does not resend. Branch on this\ninstead of the HTTP status.\n","isRequired":true,"uniqueKey":"error.retry","typeLabel":"enum\u003cstring>"},"retry_after_seconds":{"oneOf":[{"type":"integer","minimum":0,"description":"How long to wait before a `retry: safe` resend, as the Retry-After header says it; null when there is no wait to name.","isRequired":true,"uniqueKey":"error.retry_after_seconds.oneOf.0","typeLabel":"integer"},{"type":"null","minimum":0,"description":"How long to wait before a `retry: safe` resend, as the Retry-After header says it; null when there is no wait to name.","isRequired":true,"uniqueKey":"error.retry_after_seconds.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"error.retry_after_seconds","typeLabel":"integer | null"},"details":{"type":"object","description":"Code-specific context, spelled for programs. no_eligible_route carries considered,\nexcluded, closest and nearest; knob_not_named the knob and its values;\nunrecognised_word the path, the word and the known ones; not_named the gate, what\nthe call needed beyond the grant and the corrected requirements line; gate_unavailable\nthe gate and account; lifetime_limit the ceiling and this run. A creation that\nstopped before a sandbox existed may also carry `fallbacks_allowed`, `stopped_reason`\nand `attempts`, spelled and bounded as in the sandbox route selection.\ncapability_unavailable may identify the needed capability. A launch preparation failure can follow sandbox creation;\ninspect outcome and cleanup details before creating another. Clients must\npreserve fields they do not know.\n","properties":{"selection_version":{"type":"integer","minimum":0,"description":"Current selected organization version for organization_changed.","uniqueKey":"error.details.selection_version","typeLabel":"integer"},"considered":{"type":"integer","minimum":0,"description":"no_eligible_route only; how many routes were considered.","uniqueKey":"error.details.considered","typeLabel":"integer"},"excluded":{"type":"array","description":"no_eligible_route only; every considered route that cannot serve the request. Each entry names its `provider` and the checks it failed (`failed` for a sandbox request, `reasons` and `exclusions` for a launch); clients must preserve fields they do not know.","items":{"type":"object","required":["provider"],"properties":{"provider":{"type":"string","isRequired":true,"uniqueKey":"error.details.excluded.items.[INDEX].provider","typeLabel":"string"}},"uniqueKey":"error.details.excluded.items.[INDEX]","typeLabel":"object"},"uniqueKey":"error.details.excluded","typeLabel":"object[]"},"closest":{"oneOf":[{"type":"object","description":"no_eligible_route only; the excluded route that fails fewest checks, or null.","uniqueKey":"error.details.closest.oneOf.0","typeLabel":"object"},{"type":"null","description":"no_eligible_route only; the excluded route that fails fewest checks, or null.","uniqueKey":"error.details.closest.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.details.closest","typeLabel":"object | null"},"nearest":{"type":"array","description":"no_eligible_route only; the smallest changes that would make a route eligible, nearest first. An entry names the change (`change` and `then_eligible` for a sandbox request, `provider`, `distance` and `failing` for a launch); clients must preserve fields they do not know.","items":{"type":"object","uniqueKey":"error.details.nearest.items.[INDEX]","typeLabel":"object"},"uniqueKey":"error.details.nearest","typeLabel":"object[]"},"requirement":{"type":"string","description":"The SandboxProviderSpec family whose requirement would make this operation available.","uniqueKey":"error.details.requirement","typeLabel":"string"},"purchase_id":{"type":"string","description":"Retained failed credit purchase ID, when a saved-card charge was declined.","uniqueKey":"error.details.purchase_id","typeLabel":"string"},"preview":{"type":"object","additionalProperties":false,"required":["unused","held_excluded","fee","principal","tax","total","card"],"properties":{"unused":{"type":"integer","minimum":0,"description":"Unused purchased credit in US cents, before held credit is excluded.","isRequired":true,"uniqueKey":"error.details.preview.unused","typeLabel":"integer"},"held_excluded":{"type":"integer","minimum":0,"description":"Credit held for running sandboxes, in US cents.","isRequired":true,"uniqueKey":"error.details.preview.held_excluded","typeLabel":"integer"},"fee":{"type":"integer","minimum":0,"description":"Original Stripe processing fee retained, in US cents.","isRequired":true,"uniqueKey":"error.details.preview.fee","typeLabel":"integer"},"principal":{"type":"integer","minimum":0,"description":"Tax-exclusive principal returned to the original card, in US cents.","isRequired":true,"uniqueKey":"error.details.preview.principal","typeLabel":"integer"},"tax":{"type":"integer","minimum":0,"description":"Tax Stripe adds to the credit note, in US cents.","isRequired":true,"uniqueKey":"error.details.preview.tax","typeLabel":"integer"},"total":{"type":"integer","minimum":0,"description":"Total Stripe will refund, in US cents.","isRequired":true,"uniqueKey":"error.details.preview.total","typeLabel":"integer"},"card":{"type":"object","conditionallyRequiredProperties":{"email":[{"when":[[{"property":"type","values":["link"]}]]}],"brand":[{"when":[[{"property":"type","values":["card"]}]]}],"last4":[{"when":[[{"property":"type","values":["card"]}]]}]},"properties":{"brand":{"oneOf":[{"type":"string","description":"Card brand; absent for Link methods.","conditionalRequirements":[{"when":[[{"property":"type","values":["card"]}]]}],"uniqueKey":"error.details.preview.card.brand.oneOf.0","typeLabel":"string"},{"type":"null","description":"Card brand; absent for Link methods.","conditionalRequirements":[{"when":[[{"property":"type","values":["card"]}]]}],"uniqueKey":"error.details.preview.card.brand.oneOf.1","typeLabel":"null"}],"conditionalRequirements":[{"when":[[{"property":"type","values":["card"]}]]}],"uniqueKey":"error.details.preview.card.brand","typeLabel":"string | null"},"last4":{"oneOf":[{"type":"string","pattern":"^[0-9]{4}$","description":"Last four card digits; absent for Link methods.","conditionalRequirements":[{"when":[[{"property":"type","values":["card"]}]]}],"uniqueKey":"error.details.preview.card.last4.oneOf.0","typeLabel":"string"},{"type":"null","pattern":"^[0-9]{4}$","description":"Last four card digits; absent for Link methods.","conditionalRequirements":[{"when":[[{"property":"type","values":["card"]}]]}],"uniqueKey":"error.details.preview.card.last4.oneOf.1","typeLabel":"null"}],"conditionalRequirements":[{"when":[[{"property":"type","values":["card"]}]]}],"uniqueKey":"error.details.preview.card.last4","typeLabel":"string | null"},"type":{"type":"string","enum":["card","link"],"x-boxrouter-open-enum":true,"uniqueKey":"error.details.preview.card.type","typeLabel":"enum\u003cstring>"},"email":{"type":"string","format":"email","description":"Link account email; present only when type is link.","conditionalRequirements":[{"when":[[{"property":"type","values":["link"]}]]}],"uniqueKey":"error.details.preview.card.email","typeLabel":"string\u003cemail>"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"error.details.preview.card","typeLabel":"object"}},"description":"Current refund preview returned with 409 refund_amount_changed.","uniqueKey":"error.details.preview","typeLabel":"object"},"quote":{"type":"object","additionalProperties":false,"required":["amount","tax","total","address_required"],"properties":{"amount":{"type":"integer","minimum":1,"description":"Tax-exclusive credit amount in US cents; this is what is added to the balance.","isRequired":true,"uniqueKey":"error.details.quote.amount","typeLabel":"integer"},"tax":{"type":"integer","minimum":0,"description":"Estimated tax in US cents, on the credits and the fee.","isRequired":true,"uniqueKey":"error.details.quote.tax","typeLabel":"integer"},"total":{"type":"integer","minimum":1,"description":"Estimated total to charge in US cents: amount plus fee_minor plus tax.","isRequired":true,"uniqueKey":"error.details.quote.total","typeLabel":"integer"},"address_required":{"type":"boolean","isRequired":true,"uniqueKey":"error.details.quote.address_required","typeLabel":"boolean"},"fee_minor":{"type":"integer","minimum":0,"description":"BoxRouter's purchase fee in US cents, computed by the server and charged on top of amount. Tax applies to amount plus fee. Absent on older services.","uniqueKey":"error.details.quote.fee_minor","typeLabel":"integer"},"missing":{"type":"array","items":{"type":"string","uniqueKey":"error.details.quote.missing.items.[INDEX]","typeLabel":"string"},"description":"Required billing address fields missing for an exact tax quote.","uniqueKey":"error.details.quote.missing","typeLabel":"string[]"}},"description":"Current purchase quote returned with 409 quote_changed.","uniqueKey":"error.details.quote","typeLabel":"object"},"redemption":{"type":"object","additionalProperties":false,"required":["code","amount_nanodollars","description","redeemed_at"],"properties":{"code":{"type":"string","description":"The code in its canonical upper-case form.","isRequired":true,"uniqueKey":"error.details.redemption.code","typeLabel":"string"},"amount_nanodollars":{"type":"string","maxLength":19,"pattern":"^(?:[1-9][0-9]{0,17}|[1-8][0-9]{18}|9[0-1][0-9]{17}|92[0-1][0-9]{16}|922[0-2][0-9]{15}|9223[0-2][0-9]{14}|92233[0-6][0-9]{13}|922337[0-1][0-9]{12}|92233720[0-2][0-9]{10}|922337203[0-5][0-9]{9}|9223372036[0-7][0-9]{8}|92233720368[0-4][0-9]{7}|922337203685[0-3][0-9]{6}|9223372036854[0-6][0-9]{5}|92233720368547[0-6][0-9]{4}|922337203685477[0-4][0-9]{3}|9223372036854775[0-7][0-9]{2}|922337203685477580[0-7])$","description":"Credit granted, in billionths of a US dollar, as a canonical positive signed 64-bit nanodollar string.","isRequired":true,"uniqueKey":"error.details.redemption.amount_nanodollars","typeLabel":"string"},"description":{"type":"string","description":"What the credit is for, as the promotion describes it.","isRequired":true,"uniqueKey":"error.details.redemption.description","typeLabel":"string"},"redeemed_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"error.details.redemption.redeemed_at","typeLabel":"string\u003cdate-time>"}},"description":"Original promotion redemption returned with 409 promotion_already_redeemed.","uniqueKey":"error.details.redemption","typeLabel":"object"},"scope":{"type":"string","enum":["workspace"],"description":"spend_limit_exceeded only; which configured cap refused admission.","uniqueKey":"error.details.scope","typeLabel":"enum\u003cstring>"},"period":{"type":"string","enum":["total","daily","monthly"],"description":"spend_limit_exceeded only; the cap period that applies.","uniqueKey":"error.details.period","typeLabel":"enum\u003cstring>"},"limit_nanodollars":{"type":"integer","minimum":1,"description":"spend_limit_exceeded only; exact configured USD nanodollars.","uniqueKey":"error.details.limit_nanodollars","typeLabel":"integer"},"requested_nanodollars":{"type":"integer","minimum":1,"description":"spend_limit_exceeded only; exact proposed managed hold.","uniqueKey":"error.details.requested_nanodollars","typeLabel":"integer"},"sign_in_method":{"type":"string","description":"account_exists only: how the existing account with this verified address signs in (google, github, email or other).","uniqueKey":"error.details.sign_in_method","typeLabel":"string"},"masked_email":{"type":"string","description":"account_exists only: that account's address, masked as `t…@gmail.com`.","uniqueKey":"error.details.masked_email","typeLabel":"string"},"failure_reason":{"type":"string","maxLength":100,"description":"Short safe card-decline reason; raw Stripe messages are not returned.","uniqueKey":"error.details.failure_reason","typeLabel":"string"},"names":{"type":"array","uniqueItems":true,"items":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Z][A-Z0-9_]{0,127}$","uniqueKey":"error.details.names.items.[INDEX]","typeLabel":"string"},"description":"All manifest secret names that could not be resolved.","uniqueKey":"error.details.names","typeLabel":"string[]"},"fields":{"type":"array","uniqueItems":true,"items":{"type":"string","enum":["preferences.order","preferences.sort","preferences.allow_fallbacks"],"uniqueKey":"error.details.fields.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"routing_overrides_forbidden only; the prohibited request inputs.","uniqueKey":"error.details.fields","typeLabel":"enum\u003cstring>[]"},"volume_id":{"type":"string","description":"BoxRouter Volume ID involved in the error.","uniqueKey":"error.details.volume_id","typeLabel":"string"},"writer_sandbox_id":{"type":"string","description":"volume_busy only; the sandbox that holds the volume's writer lease, when it is a recorded sandbox.","uniqueKey":"error.details.writer_sandbox_id","typeLabel":"string"},"checkpoint":{"type":"integer","minimum":1,"description":"Volume checkpoint involved in the error.","uniqueKey":"error.details.checkpoint","typeLabel":"integer"},"limit_bytes":{"type":"integer","minimum":0,"uniqueKey":"error.details.limit_bytes","typeLabel":"integer"},"observed_bytes":{"type":"integer","minimum":0,"uniqueKey":"error.details.observed_bytes","typeLabel":"integer"},"mismatch":{"type":"object","additionalProperties":false,"required":["field","recorded","requested"],"properties":{"field":{"type":"string","enum":["image","arch"],"isRequired":true,"uniqueKey":"error.details.mismatch.field","typeLabel":"enum\u003cstring>"},"recorded":{"type":"string","isRequired":true,"uniqueKey":"error.details.mismatch.recorded","typeLabel":"string"},"requested":{"type":"string","isRequired":true,"uniqueKey":"error.details.mismatch.requested","typeLabel":"string"}},"uniqueKey":"error.details.mismatch","typeLabel":"object"},"volume_phase":{"type":"string","enum":["check","branch","lease","identity","install","credential","mount","metadata","checkpoint","commit","write"],"uniqueKey":"error.details.volume_phase","typeLabel":"enum\u003cstring>"},"phase":{"type":"string","enum":["code","setup","files","background","previews"],"description":"Preparation phase that failed.","uniqueKey":"error.details.phase","typeLabel":"enum\u003cstring>"},"command":{"type":"string","description":"Command whose nonzero exit stopped launch preparation.","uniqueKey":"error.details.command","typeLabel":"string"},"exit_code":{"type":"integer","description":"Exit code of the failed command, or of the process that exited before its port listened.","uniqueKey":"error.details.exit_code","typeLabel":"integer"},"stderr_tail":{"type":"string","description":"At most the final 4 KiB of stderr from the failed command, with resolved secret values\nredacted. port_not_listening carries the same tail of the process's stderr.\n","uniqueKey":"error.details.stderr_tail","typeLabel":"string"},"stdout_tail":{"type":"string","description":"port_not_listening only; at most the final 4 KiB of the process's stdout.","uniqueKey":"error.details.stdout_tail","typeLabel":"string"},"agent":{"type":"string","description":"Unknown catalog agent name.","uniqueKey":"error.details.agent","typeLabel":"string"},"port":{"type":"integer","minimum":1,"maximum":65535,"description":"The sandbox port whose preview was refused (preview_access_refused) or that never accepted connections (port_not_listening).","uniqueKey":"error.details.port","typeLabel":"integer"},"revoked":{"type":"boolean","description":"preview_access_refused only; true when the unwanted preview was ended and no\naccess to the port remains. False: it may still be reachable (outcome unknown).\n","uniqueKey":"error.details.revoked","typeLabel":"boolean"},"preview_id":{"type":"string","description":"preview_access_refused only; the identifier the provider gave the preview that may\nstill be reachable. Present only for a public preview.\n","uniqueKey":"error.details.preview_id","typeLabel":"string"},"url":{"type":"string","format":"uri","description":"preview_access_refused only; the address of a public preview that may still be\nreachable. Never present for a private preview, whose address holds a credential,\nand never when it was ended.\n","uniqueKey":"error.details.url","typeLabel":"string\u003curi>"}},"uniqueKey":"error.details","typeLabel":"object"},"doc_url":{"oneOf":[{"type":"string","format":"uri","description":"Where the documentation explains this code: `https://boxrouter.ai/docs/error-codes#` followed by the code, for example `https://boxrouter.ai/docs/error-codes#no_eligible_route`. The page has one anchored row per code with what it means and what to do. BoxRouter sends it with every error; it is null for a code that has no documented row. Clients must accept an error body that omits it.","uniqueKey":"error.doc_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","format":"uri","description":"Where the documentation explains this code: `https://boxrouter.ai/docs/error-codes#` followed by the code, for example `https://boxrouter.ai/docs/error-codes#no_eligible_route`. The page has one anchored row per code with what it means and what to do. BoxRouter sends it with every error; it is null for a code that has no documented row. Clients must accept an error body that omits it.","uniqueKey":"error.doc_url.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.doc_url","typeLabel":"string\u003curi> | null"},"fix":{"oneOf":[{"type":"string","minLength":1,"description":"Actionable change for the caller when the request cannot be completed. A refusal (4xx) always carries one; a server or provider fault, including an error event that ends a terminal or process stream, can answer null.","uniqueKey":"error.fix.oneOf.0","typeLabel":"string"},{"type":"null","minLength":1,"description":"Actionable change for the caller when the request cannot be completed. A refusal (4xx) always carries one; a server or provider fault, including an error event that ends a terminal or process stream, can answer null.","uniqueKey":"error.fix.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.fix","typeLabel":"string | null"},"operation_id":{"oneOf":[{"type":"string","description":"Durable server operation ID for reconciliation after uncertain mutations.","uniqueKey":"error.operation_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"Durable server operation ID for reconciliation after uncertain mutations.","uniqueKey":"error.operation_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.operation_id","typeLabel":"string | null"},"provider":{"oneOf":[{"type":"string","uniqueKey":"error.provider.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"error.provider.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.provider","typeLabel":"string | null"},"native_code":{"oneOf":[{"type":"string","description":"The provider's machine-readable error code, unchanged, when it reports one.","uniqueKey":"error.native_code.oneOf.0","typeLabel":"string"},{"type":"null","description":"The provider's machine-readable error code, unchanged, when it reports one.","uniqueKey":"error.native_code.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.native_code","typeLabel":"string | null"},"native_status":{"oneOf":[{"type":"integer","description":"The provider's HTTP status, unchanged, when the failure came from a provider response.","uniqueKey":"error.native_status.oneOf.0","typeLabel":"integer"},{"type":"null","description":"The provider's HTTP status, unchanged, when the failure came from a provider response.","uniqueKey":"error.native_status.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.native_status","typeLabel":"integer | null"},"native_message":{"oneOf":[{"type":"string","maxLength":4096,"description":"The provider's own error message when it answered with an HTTP 4xx refusal (for example a plan limit); null otherwise. Capped at 512 characters, with whitespace collapsed. Credential secrets and token-shaped strings are removed before return. The literal `[redacted]` marker is used when all credential secret fields are at least 12 characters; legacy saved secrets shorter than 12 characters are removed without the marker.","uniqueKey":"error.native_message.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":4096,"description":"The provider's own error message when it answered with an HTTP 4xx refusal (for example a plan limit); null otherwise. Capped at 512 characters, with whitespace collapsed. Credential secrets and token-shaped strings are removed before return. The literal `[redacted]` marker is used when all credential secret fields are at least 12 characters; legacy saved secrets shorter than 12 characters are removed without the marker.","uniqueKey":"error.native_message.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.native_message","typeLabel":"string | null"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"\u003cstring>","message":"\u003cstring>","request_id":"\u003cstring>","outcome":"not_started","retry":"safe","retry_after_seconds":1,"details":{"selection_version":1,"considered":1,"excluded":[{"provider":"\u003cstring>"}],"closest":{},"nearest":[{}],"requirement":"\u003cstring>","purchase_id":"\u003cstring>","preview":{"unused":1,"held_excluded":1,"fee":1,"principal":1,"tax":1,"total":1,"card":{"brand":"\u003cstring>","last4":"\u003cstring>","type":"card","email":"jsmith@example.com"}},"quote":{"amount":2,"tax":1,"total":2,"address_required":true,"fee_minor":1,"missing":["\u003cstring>"]},"redemption":{"code":"\u003cstring>","amount_nanodollars":"\u003cstring>","description":"\u003cstring>","redeemed_at":"2023-11-07T05:31:56Z"},"scope":"workspace","period":"total","limit_nanodollars":2,"requested_nanodollars":2,"sign_in_method":"\u003cstring>","masked_email":"\u003cstring>","failure_reason":"\u003cstring>","names":["\u003cstring>"],"fields":["preferences.order"],"volume_id":"\u003cstring>","writer_sandbox_id":"\u003cstring>","checkpoint":2,"limit_bytes":1,"observed_bytes":1,"mismatch":{"field":"image","recorded":"\u003cstring>","requested":"\u003cstring>"},"volume_phase":"check","phase":"code","command":"\u003cstring>","exit_code":123,"stderr_tail":"\u003cstring>","stdout_tail":"\u003cstring>","agent":"\u003cstring>","port":32768,"revoked":true,"preview_id":"\u003cstring>","url":"\u003cstring>"},"doc_url":"\u003cstring>","fix":"\u003cstring>","operation_id":"\u003cstring>","provider":"\u003cstring>","native_code":"\u003cstring>","native_status":123,"native_message":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"cfb765ad-e5b8-4a09-a2c9-5717e1564483":{"description":"Structured error. `retry` says whether to send the call again (`now`, `after_fix`, `inspect` or `never`) and `retry_after_seconds` how long to wait first. Unowned and unknown resource IDs both return 404. Admission overload returns 503 with code overloaded, outcome not_started and Retry-After. It reserves no operation and dispatches no provider work. Shared workspace/provider admission budgets return 429 with code rate_limited, outcome not_started and Retry-After. An incomplete request body can return 408 request_timeout before dispatch. Durable-state failures return 503 database_unavailable with outcome unknown; do not infer that execution did not occur. A read (GET or HEAD) that meets the same failure changed nothing: its message says the state is temporarily unavailable, and it is safe to repeat. A provider that cannot be reached when a create is prepared returns 502 provider_error with outcome not_started; nothing was created, and the create can be retried with the same Idempotency-Key or sent to another provider with `providers`.\nNative errors are sanitized; upstream credentials, request bodies and\nanother workspace's metadata are never included. Server-Timing is present only when the response reached Dispatcher or held-response preparation; an earlier response, including pre-Dispatcher admission overload, may omit it.\n","headers":{"X-Request-ID":{"description":"Server-generated correlation identifier; contains no credentials or payloads.","schema":{"type":"string"}},"Server-Timing":{"description":"Durations of server-side phases, for diagnosing slow requests. Phase names are not stable\nand may change.\n","schema":{"type":"string"},"x-boxrouter-server-timing":{"version":1,"unit":"ms","serviceAggregateMetric":"service","maxHeaderBytes":8192,"maxOperationRows":32,"decimalPlaces":3,"safeNamePattern":"^[A-Za-z0-9_.:-]{1,64}$","aggregates":[{"metric":"service","fieldStem":"cloud"},{"metric":"database","fieldStem":"database"},{"metric":"code","fieldStem":"code"},{"metric":"provider_connect","fieldStem":"provider_connect"},{"metric":"provider_wait","fieldStem":"provider_wait"},{"metric":"accept","fieldStem":"accept"},{"metric":"queue","fieldStem":"queue"},{"metric":"admission","fieldStem":"admission"},{"metric":"encode","fieldStem":"encode"}],"aggregateGrammar":{"duration":{"parameter":"dur","type":"number","finite":true,"minimum":0},"descriptionParameter":"desc","unknownDescription":"unknown","missingMeans":"unreported"},"operationGrammar":{"metric":"op","nameParameter":"desc","namePattern":"safeNamePattern","start":{"parameter":"start","type":"number","finite":true,"sign":"signed","relativeTo":"recorderWindow"},"duration":{"parameter":"dur","type":"number","finite":true,"minimum":0},"outcomeParameter":"outcome","outcomes":["returned","raised"],"requiresAggregateDependencyUnion":false},"omissionGrammar":{"metric":"op-omitted","count":{"parameter":"desc","type":"integer","minimum":0},"duration":{"parameter":"dur","type":"number","finite":true,"minimum":0,"sumOf":"knownOmittedMeasuredRows"},"requiresAggregateDependencyUnion":false},"coverageGrammar":{"metric":"op-coverage","descriptionParameter":"desc","unknownValue":"unknown","absentState":"unreported","states":["unknown","unreported"],"absenceImpliesCompleteness":false}}},"Retry-After":{"description":"Seconds before retrying an eligible read; not permission to replay a mutation.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"description":"The one error body every failing call answers. It leads with what to do: `retry` says whether to send the call again, `fix` says what to change, `outcome` says what happened, and `doc_url` links to the page that explains the code. Clients retry `retry: safe` for you with the same idempotency key.","x-sandbox-provider-spec-codes":["no_eligible_route","knob_not_named","unrecognised_word","invalid_request","not_named","gate_unavailable","account_unhealthy","lifetime_limit","lifetime_used_up","not_running","invalid_state","sandbox_ended","not_found","provider_error","timeout","contract_violation"],"properties":{"error":{"type":"object","required":["code","message","request_id","outcome","retry","retry_after_seconds"],"properties":{"code":{"type":"string","description":"Stable machine category. Operation failures use SandboxProviderSpec error codes,\nincluding invalid_request, invalid_state, not_found, unauthorized,\nincompatible_requirements, no_eligible_route, capacity_unavailable,\ncapability_unavailable, contract_violation, resource_limit, timeout and\nprovider_error. Hosted service failures add method_not_allowed,\nunauthenticated, forbidden, actions_sandbox_protected,\ninsufficient_credit, spend_limit_exceeded,\nprovider_not_enabled, credentials_rejected, conflict, rate_limited, provider_quota, request_timeout, overloaded,\ndatabase_unavailable, payment_method_required, payment_declined, promotion_already_redeemed, account_exists, and internal_error. unsupported_feature and\noutput_limit are earlier names still returned by some routes.\nOrganization and membership operations also use organization_changed, last_admin,\nstale_membership, directory_managed and change_in_progress. Key ownership and\ninvitation operations use idempotency_key_reused and conflict.\nCredit refunds and purchase quotes also use refund_window_closed,\nnothing_to_refund, refund_below_minimum, refund_in_progress,\npurchase_in_progress, dispute_open, already_refunded,\nrefund_amount_changed, refund_fee_unavailable, quote_changed,\nsession_required, refund_daily_limit, refund_rate_limit,\nrefund_retry_requires_support, idempotency_key_reused and fraud_review.\nCard setup adds card_setup_rate_limit (429, with Retry-After): a workspace may start five\ncard setups an hour.\nA provider that refuses the request for its own plan or quota limit answers\n429 provider_quota with the provider's words in native_message; rate_limited is\nBoxRouter's own limit.\nRouting Prevent Overrides refuses a request containing preferences.order,\npreferences.sort or preferences.allow_fallbacks with routing_overrides_forbidden,\noutcome not_started and details.fields naming the prohibited inputs. No provider\neffect occurs.\nLaunch operations also use invalid_request, secret_missing, agent_not_found,\nno_eligible_route and launch_failed.\nA process or terminal is observed by one API task. When that task stops, process\noutput, result and stdin answer 410 process_observer_lost (reading or cancelling the\nprocess still works), and a terminal on a provider that cannot reattach it answers\n410 terminal_observer_lost. invalid_observer_hop (403) refuses an internal hop\nbetween API tasks that is not signed; clients never send one.\nOpening a preview that the provider answered with other access than the request\nasked for returns 502 preview_access_refused: that preview is never returned, and\ndetails say whether it was ended.\nStarting a process with wait_for_port answers 409 port_not_listening, outcome partial,\nwhen the process exits before the port accepts connections or the port stays closed for\n30 seconds; the process is ended and details carry the output so far.\nA request that must store content (a volume, a saved artifact) under transient content\nretention answers 409 privacy_persistence_conflict with outcome not_started.\nA sandbox request that stops before anything is created also answers\nlifetime_cap_exceeded, knob_not_named and unrecognised_word (400), and price_unknown and\npolicy_denied (409), each with outcome not_started; the Actions codes job_claim_lost,\nactions_authority_changed, actions_candidate_ceiling_withdrawn and\nactions_candidate_outside_ceiling (409) say the job's claim, settings or admitted routes\nchanged; provider_budget_exhausted (409) says a run's provider budget allows no\nfurther create. A create that names an image Cloud cannot use answers 400\nimage_architecture_unsupported, image_digest_resolution_failed,\nimage_preparation_unsupported or private_image_managed_route_unavailable, and\nprivacy_admission_unavailable when privacy cannot be enforced; each says what to change.\nLaunch and source-repository refusals name the repository or manifest fault (code_ref_not_found,\ncode_repository_*, source_*, invalid_source_manifest, invalid_manifest_encoding,\ninvalid_run_spec, repository_*, reserved_env_refused, launch_run_position_conflict,\ncode_reference_moved, dockerfile_context_unsupported, image_tag_unresolved,\nrecovery_sandbox_mismatch); the GitHub-side ones (source_rate_limited,\nsource_resolution_failed, source_resolution_timeout, code_repository_resolution_failed)\nare safe to resend. image_setup_timeout, managed_funding_unavailable,\nlifetime_funding_conflict, candidate_admission_unavailable, secrets_unavailable and the\nActions candidate codes (actions_candidate_record_invalid, actions_create_budget_exhausted,\nactions_create_format_mismatch) complete the creation and extension refusals.\ndispatch_limit_reached, inline_secret_values_refused and launch_incomplete come from\nlaunch runs, provider_policy_unknown from an operation whose privacy evidence cannot be\nverified, and quota_exceeded from a full managed provider account.\nVolume operations also use volume_busy, volume_lease_lost, volume_not_attached,\nvolume_incompatible, volume_save_failed and volume_restore_failed. Creating a\nsandbox on a volume whose writer is ending waits for the release (at most 120\nseconds) before it can answer volume_busy.\nA team member's new personal API key is paused until WorkOS membership sync catches\nup: it answers 403 forbidden whose message and fix say the key becomes active once\nthe team membership syncs, usually within a minute, and the call can be retried.\nClients must preserve and handle unknown categories explicitly.\n","x-boxrouter-error-codes":{"account_exists":[409],"account_unhealthy":[402],"actions_authority_changed":[409],"actions_candidate_ceiling_withdrawn":[409],"actions_candidate_outside_ceiling":[409],"actions_candidate_record_invalid":[409],"actions_create_budget_exhausted":[409],"actions_create_format_mismatch":[409],"actions_sandbox_protected":[403],"agent_not_found":[404],"already_refunded":[409],"authorization_error":[403],"candidate_admission_unavailable":[503],"capability_unavailable":[409,503],"capability_unverified":[409],"card_setup_rate_limit":[429],"change_in_progress":[409],"code_ref_not_found":[404],"code_reference_moved":[409],"code_repository_not_authorized":[403],"code_repository_not_found":[404],"code_repository_not_private":[400],"code_repository_not_public":[404],"code_repository_resolution_failed":[502],"command_failed":[409],"command_observation_busy":[409],"conflict":[409],"contract_violation":[409],"credentials_rejected":[409,422],"database_unavailable":[503],"directory_managed":[409],"dispatch_limit_reached":[409],"dispute_open":[409],"dockerfile_context_unsupported":[400],"expired":[410],"forbidden":[403],"fraud_review":[409],"gate_unavailable":[409],"idempotency_key_reused":[409,422],"identity_unavailable":[503],"image_architecture_unsupported":[400],"image_digest_resolution_failed":[400],"image_preparation_unsupported":[400],"image_setup_timeout":[504],"image_tag_unresolved":[400],"inline_secret_values_refused":[422],"insufficient_credit":[402],"internal_error":[500],"invalid_manifest_encoding":[400],"invalid_observer_hop":[403],"invalid_request":[400,413,422,428],"invalid_run_spec":[400],"invalid_source_manifest":[400],"invalid_state":[409],"job_claim_lost":[409],"knob_not_named":[400],"last_admin":[409],"launch_failed":[409],"launch_incomplete":[409],"launch_run_position_conflict":[409],"lifetime_cap_exceeded":[400],"lifetime_funding_conflict":[409],"lifetime_limit":[409],"lifetime_used_up":[409],"managed_funding_unavailable":[503],"method_not_allowed":[405],"no_eligible_route":[409],"not_found":[404],"not_named":[409],"not_running":[409],"nothing_to_refund":[409],"organization_changed":[409],"output_limit":[413],"overloaded":[503],"payment_declined":[402],"payment_method_required":[409],"payment_provider_rejected":[502],"payment_provider_unavailable":[503],"payments_unavailable":[503],"policy_denied":[409],"port_not_listening":[409],"preview_access_refused":[502],"price_unknown":[409],"privacy_admission_unavailable":[400],"privacy_persistence_conflict":[409],"private_image_managed_route_unavailable":[400],"process_observer_lost":[410],"promotion_already_redeemed":[409],"promotion_code_invalid":[404],"provider_budget_exhausted":[409],"provider_error":[502],"provider_not_enabled":[409],"provider_policy_unknown":[409],"provider_quota":[429],"purchase_in_progress":[409],"quota_exceeded":[429],"quote_changed":[409],"rate_limited":[429],"recovery_sandbox_mismatch":[409],"refund_amount_changed":[409],"refund_below_minimum":[409],"refund_daily_limit":[429],"refund_fee_unavailable":[409],"refund_in_progress":[409],"refund_rate_limit":[429],"refund_retry_requires_support":[409],"refund_window_closed":[409],"repository_file_unsupported":[400],"repository_too_large":[400],"request_timeout":[408],"reserved_env_refused":[400,422],"resource_limit":[413,507],"routing_overrides_forbidden":[400],"run_limit_exceeded":[429],"sandbox_ended":[410],"secret_missing":[400],"secrets_unavailable":[503],"session_required":[403],"source_file_not_found":[400],"source_file_too_large":[413],"source_rate_limited":[503],"source_ref_not_found":[400],"source_repository_not_accessible":[404],"source_repository_not_found":[400],"source_repository_not_private":[400],"source_repository_not_public":[400],"source_resolution_failed":[502],"source_resolution_timeout":[504],"spend_limit_exceeded":[402],"stale_membership":[409],"terminal_closed":[410],"terminal_observer_lost":[410],"timeout":[504],"unauthenticated":[401],"unavailable":[503],"unrecognised_word":[400],"unsupported_feature":[422],"volume_busy":[409],"volume_incompatible":[409],"volume_lease_lost":[409],"volume_not_attached":[409],"volume_restore_failed":[502],"volume_save_failed":[409,502],"volume_unavailable":[409],"wrong_region":[421]},"x-boxrouter-error-retry":{"account_exists":"after_fix","account_unhealthy":"after_fix","actions_authority_changed":"after_fix","actions_candidate_ceiling_withdrawn":"after_fix","actions_candidate_outside_ceiling":"after_fix","actions_candidate_record_invalid":"after_fix","actions_create_budget_exhausted":"after_fix","actions_create_format_mismatch":"after_fix","actions_sandbox_protected":"never","agent_not_found":"after_fix","already_refunded":"never","authorization_error":"check_outcome","candidate_admission_unavailable":"never","capability_unavailable":"check_outcome","capability_unverified":"after_fix","card_setup_rate_limit":"safe","change_in_progress":"safe","code_ref_not_found":"after_fix","code_reference_moved":"after_fix","code_repository_not_authorized":"after_fix","code_repository_not_found":"after_fix","code_repository_not_private":"after_fix","code_repository_not_public":"after_fix","code_repository_resolution_failed":"safe","command_failed":"after_fix","command_observation_busy":"safe","conflict":"check_outcome","contract_violation":"check_outcome","credentials_rejected":"after_fix","database_unavailable":"check_outcome","directory_managed":"never","dispatch_limit_reached":"after_fix","dispute_open":"after_fix","dockerfile_context_unsupported":"after_fix","expired":"check_outcome","forbidden":"after_fix","fraud_review":"safe","gate_unavailable":"after_fix","idempotency_key_reused":"after_fix","identity_unavailable":"safe","image_architecture_unsupported":"after_fix","image_digest_resolution_failed":"after_fix","image_preparation_unsupported":"after_fix","image_setup_timeout":"after_fix","image_tag_unresolved":"after_fix","inline_secret_values_refused":"after_fix","insufficient_credit":"after_fix","internal_error":"never","invalid_manifest_encoding":"after_fix","invalid_observer_hop":"after_fix","invalid_request":"after_fix","invalid_run_spec":"after_fix","invalid_source_manifest":"after_fix","invalid_state":"check_outcome","job_claim_lost":"after_fix","knob_not_named":"after_fix","last_admin":"after_fix","launch_failed":"check_outcome","launch_incomplete":"check_outcome","launch_run_position_conflict":"after_fix","lifetime_cap_exceeded":"after_fix","lifetime_funding_conflict":"after_fix","lifetime_limit":"check_outcome","lifetime_used_up":"after_fix","managed_funding_unavailable":"safe","method_not_allowed":"after_fix","no_eligible_route":"after_fix","not_found":"check_outcome","not_named":"after_fix","not_running":"after_fix","nothing_to_refund":"never","organization_changed":"safe","output_limit":"check_outcome","overloaded":"safe","payment_declined":"after_fix","payment_method_required":"after_fix","payment_provider_rejected":"check_outcome","payment_provider_unavailable":"check_outcome","payments_unavailable":"safe","policy_denied":"after_fix","port_not_listening":"after_fix","preview_access_refused":"never","price_unknown":"after_fix","privacy_admission_unavailable":"after_fix","privacy_persistence_conflict":"after_fix","private_image_managed_route_unavailable":"after_fix","process_observer_lost":"check_outcome","promotion_already_redeemed":"never","promotion_code_invalid":"after_fix","provider_budget_exhausted":"never","provider_error":"check_outcome","provider_not_enabled":"after_fix","provider_policy_unknown":"after_fix","provider_quota":"after_fix","purchase_in_progress":"safe","quota_exceeded":"safe","quote_changed":"after_fix","rate_limited":"safe","recovery_sandbox_mismatch":"check_outcome","refund_amount_changed":"after_fix","refund_below_minimum":"never","refund_daily_limit":"safe","refund_fee_unavailable":"safe","refund_in_progress":"safe","refund_rate_limit":"safe","refund_retry_requires_support":"never","refund_window_closed":"never","repository_file_unsupported":"after_fix","repository_too_large":"after_fix","request_timeout":"safe","reserved_env_refused":"after_fix","resource_limit":"check_outcome","routing_overrides_forbidden":"after_fix","run_limit_exceeded":"after_fix","sandbox_ended":"check_outcome","secret_missing":"after_fix","secrets_unavailable":"never","session_required":"never","source_file_not_found":"after_fix","source_file_too_large":"after_fix","source_rate_limited":"safe","source_ref_not_found":"after_fix","source_repository_not_accessible":"after_fix","source_repository_not_found":"after_fix","source_repository_not_private":"after_fix","source_repository_not_public":"after_fix","source_resolution_failed":"safe","source_resolution_timeout":"safe","spend_limit_exceeded":"after_fix","stale_membership":"after_fix","terminal_closed":"after_fix","terminal_observer_lost":"after_fix","timeout":"check_outcome","unauthenticated":"after_fix","unavailable":"safe","unrecognised_word":"after_fix","unsupported_feature":"after_fix","volume_busy":"after_fix","volume_incompatible":"after_fix","volume_lease_lost":"after_fix","volume_not_attached":"after_fix","volume_restore_failed":"check_outcome","volume_save_failed":"check_outcome","volume_unavailable":"after_fix","wrong_region":"after_fix"},"isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"request_id":{"type":"string","isRequired":true,"uniqueKey":"error.request_id","typeLabel":"string"},"outcome":{"type":"string","enum":["not_started","completed","partial","unknown"],"description":"What is known about the requested side effect. `not_started` means nothing ran\nanywhere, at BoxRouter or at a provider; a launch-setup or process-start failure\nafter dispatch is `partial` or `unknown`. Unknown and partial forbid automatic\nreplay and always carry `retry: check_outcome`. An HTTP status alone does not establish\noutcome.\nMany refusals report not_started before the provider is asked anything. A read\n(GET or HEAD) has no side effect to be unsure about, so its failures report\nnot_started and carry the code's own retry value. A launch preparation failure\nhappens after the sandbox was created and setup commands may already have run, and\ndeleting the sandbox does not undo effects outside it: it reports partial once the\ncleanup is confirmed and unknown if it is not. A process that wait_for_port ended\nreports partial. volume_restore_failed on a resume or create,\nand volume_save_failed after the guest was read, report unknown or partial; they\ncarry the operation_id when the call was recorded, and their fix does not offer to\nsend the call again unchanged.\n","isRequired":true,"uniqueKey":"error.outcome","typeLabel":"enum\u003cstring>"},"retry":{"type":"string","enum":["safe","after_fix","check_outcome","never"],"x-boxrouter-open-enum":true,"description":"What the caller may do next, fixed per code (x-boxrouter-error-retry): safe resends the\nsame request, after_fix changes the request or setup first, check_outcome reads\n`outcome` and the resource before resending, never does not resend. Branch on this\ninstead of the HTTP status.\n","isRequired":true,"uniqueKey":"error.retry","typeLabel":"enum\u003cstring>"},"retry_after_seconds":{"oneOf":[{"type":"integer","minimum":0,"description":"How long to wait before a `retry: safe` resend, as the Retry-After header says it; null when there is no wait to name.","isRequired":true,"uniqueKey":"error.retry_after_seconds.oneOf.0","typeLabel":"integer"},{"type":"null","minimum":0,"description":"How long to wait before a `retry: safe` resend, as the Retry-After header says it; null when there is no wait to name.","isRequired":true,"uniqueKey":"error.retry_after_seconds.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"error.retry_after_seconds","typeLabel":"integer | null"},"details":{"type":"object","description":"Code-specific context, spelled for programs. no_eligible_route carries considered,\nexcluded, closest and nearest; knob_not_named the knob and its values;\nunrecognised_word the path, the word and the known ones; not_named the gate, what\nthe call needed beyond the grant and the corrected requirements line; gate_unavailable\nthe gate and account; lifetime_limit the ceiling and this run. A creation that\nstopped before a sandbox existed may also carry `fallbacks_allowed`, `stopped_reason`\nand `attempts`, spelled and bounded as in the sandbox route selection.\ncapability_unavailable may identify the needed capability. A launch preparation failure can follow sandbox creation;\ninspect outcome and cleanup details before creating another. Clients must\npreserve fields they do not know.\n","properties":{"selection_version":{"type":"integer","minimum":0,"description":"Current selected organization version for organization_changed.","uniqueKey":"error.details.selection_version","typeLabel":"integer"},"considered":{"type":"integer","minimum":0,"description":"no_eligible_route only; how many routes were considered.","uniqueKey":"error.details.considered","typeLabel":"integer"},"excluded":{"type":"array","description":"no_eligible_route only; every considered route that cannot serve the request. Each entry names its `provider` and the checks it failed (`failed` for a sandbox request, `reasons` and `exclusions` for a launch); clients must preserve fields they do not know.","items":{"type":"object","required":["provider"],"properties":{"provider":{"type":"string","isRequired":true,"uniqueKey":"error.details.excluded.items.[INDEX].provider","typeLabel":"string"}},"uniqueKey":"error.details.excluded.items.[INDEX]","typeLabel":"object"},"uniqueKey":"error.details.excluded","typeLabel":"object[]"},"closest":{"oneOf":[{"type":"object","description":"no_eligible_route only; the excluded route that fails fewest checks, or null.","uniqueKey":"error.details.closest.oneOf.0","typeLabel":"object"},{"type":"null","description":"no_eligible_route only; the excluded route that fails fewest checks, or null.","uniqueKey":"error.details.closest.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.details.closest","typeLabel":"object | null"},"nearest":{"type":"array","description":"no_eligible_route only; the smallest changes that would make a route eligible, nearest first. An entry names the change (`change` and `then_eligible` for a sandbox request, `provider`, `distance` and `failing` for a launch); clients must preserve fields they do not know.","items":{"type":"object","uniqueKey":"error.details.nearest.items.[INDEX]","typeLabel":"object"},"uniqueKey":"error.details.nearest","typeLabel":"object[]"},"requirement":{"type":"string","description":"The SandboxProviderSpec family whose requirement would make this operation available.","uniqueKey":"error.details.requirement","typeLabel":"string"},"purchase_id":{"type":"string","description":"Retained failed credit purchase ID, when a saved-card charge was declined.","uniqueKey":"error.details.purchase_id","typeLabel":"string"},"preview":{"type":"object","additionalProperties":false,"required":["unused","held_excluded","fee","principal","tax","total","card"],"properties":{"unused":{"type":"integer","minimum":0,"description":"Unused purchased credit in US cents, before held credit is excluded.","isRequired":true,"uniqueKey":"error.details.preview.unused","typeLabel":"integer"},"held_excluded":{"type":"integer","minimum":0,"description":"Credit held for running sandboxes, in US cents.","isRequired":true,"uniqueKey":"error.details.preview.held_excluded","typeLabel":"integer"},"fee":{"type":"integer","minimum":0,"description":"Original Stripe processing fee retained, in US cents.","isRequired":true,"uniqueKey":"error.details.preview.fee","typeLabel":"integer"},"principal":{"type":"integer","minimum":0,"description":"Tax-exclusive principal returned to the original card, in US cents.","isRequired":true,"uniqueKey":"error.details.preview.principal","typeLabel":"integer"},"tax":{"type":"integer","minimum":0,"description":"Tax Stripe adds to the credit note, in US cents.","isRequired":true,"uniqueKey":"error.details.preview.tax","typeLabel":"integer"},"total":{"type":"integer","minimum":0,"description":"Total Stripe will refund, in US cents.","isRequired":true,"uniqueKey":"error.details.preview.total","typeLabel":"integer"},"card":{"type":"object","conditionallyRequiredProperties":{"email":[{"when":[[{"property":"type","values":["link"]}]]}],"brand":[{"when":[[{"property":"type","values":["card"]}]]}],"last4":[{"when":[[{"property":"type","values":["card"]}]]}]},"properties":{"brand":{"oneOf":[{"type":"string","description":"Card brand; absent for Link methods.","conditionalRequirements":[{"when":[[{"property":"type","values":["card"]}]]}],"uniqueKey":"error.details.preview.card.brand.oneOf.0","typeLabel":"string"},{"type":"null","description":"Card brand; absent for Link methods.","conditionalRequirements":[{"when":[[{"property":"type","values":["card"]}]]}],"uniqueKey":"error.details.preview.card.brand.oneOf.1","typeLabel":"null"}],"conditionalRequirements":[{"when":[[{"property":"type","values":["card"]}]]}],"uniqueKey":"error.details.preview.card.brand","typeLabel":"string | null"},"last4":{"oneOf":[{"type":"string","pattern":"^[0-9]{4}$","description":"Last four card digits; absent for Link methods.","conditionalRequirements":[{"when":[[{"property":"type","values":["card"]}]]}],"uniqueKey":"error.details.preview.card.last4.oneOf.0","typeLabel":"string"},{"type":"null","pattern":"^[0-9]{4}$","description":"Last four card digits; absent for Link methods.","conditionalRequirements":[{"when":[[{"property":"type","values":["card"]}]]}],"uniqueKey":"error.details.preview.card.last4.oneOf.1","typeLabel":"null"}],"conditionalRequirements":[{"when":[[{"property":"type","values":["card"]}]]}],"uniqueKey":"error.details.preview.card.last4","typeLabel":"string | null"},"type":{"type":"string","enum":["card","link"],"x-boxrouter-open-enum":true,"uniqueKey":"error.details.preview.card.type","typeLabel":"enum\u003cstring>"},"email":{"type":"string","format":"email","description":"Link account email; present only when type is link.","conditionalRequirements":[{"when":[[{"property":"type","values":["link"]}]]}],"uniqueKey":"error.details.preview.card.email","typeLabel":"string\u003cemail>"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"error.details.preview.card","typeLabel":"object"}},"description":"Current refund preview returned with 409 refund_amount_changed.","uniqueKey":"error.details.preview","typeLabel":"object"},"quote":{"type":"object","additionalProperties":false,"required":["amount","tax","total","address_required"],"properties":{"amount":{"type":"integer","minimum":1,"description":"Tax-exclusive credit amount in US cents; this is what is added to the balance.","isRequired":true,"uniqueKey":"error.details.quote.amount","typeLabel":"integer"},"tax":{"type":"integer","minimum":0,"description":"Estimated tax in US cents, on the credits and the fee.","isRequired":true,"uniqueKey":"error.details.quote.tax","typeLabel":"integer"},"total":{"type":"integer","minimum":1,"description":"Estimated total to charge in US cents: amount plus fee_minor plus tax.","isRequired":true,"uniqueKey":"error.details.quote.total","typeLabel":"integer"},"address_required":{"type":"boolean","isRequired":true,"uniqueKey":"error.details.quote.address_required","typeLabel":"boolean"},"fee_minor":{"type":"integer","minimum":0,"description":"BoxRouter's purchase fee in US cents, computed by the server and charged on top of amount. Tax applies to amount plus fee. Absent on older services.","uniqueKey":"error.details.quote.fee_minor","typeLabel":"integer"},"missing":{"type":"array","items":{"type":"string","uniqueKey":"error.details.quote.missing.items.[INDEX]","typeLabel":"string"},"description":"Required billing address fields missing for an exact tax quote.","uniqueKey":"error.details.quote.missing","typeLabel":"string[]"}},"description":"Current purchase quote returned with 409 quote_changed.","uniqueKey":"error.details.quote","typeLabel":"object"},"redemption":{"type":"object","additionalProperties":false,"required":["code","amount_nanodollars","description","redeemed_at"],"properties":{"code":{"type":"string","description":"The code in its canonical upper-case form.","isRequired":true,"uniqueKey":"error.details.redemption.code","typeLabel":"string"},"amount_nanodollars":{"type":"string","maxLength":19,"pattern":"^(?:[1-9][0-9]{0,17}|[1-8][0-9]{18}|9[0-1][0-9]{17}|92[0-1][0-9]{16}|922[0-2][0-9]{15}|9223[0-2][0-9]{14}|92233[0-6][0-9]{13}|922337[0-1][0-9]{12}|92233720[0-2][0-9]{10}|922337203[0-5][0-9]{9}|9223372036[0-7][0-9]{8}|92233720368[0-4][0-9]{7}|922337203685[0-3][0-9]{6}|9223372036854[0-6][0-9]{5}|92233720368547[0-6][0-9]{4}|922337203685477[0-4][0-9]{3}|9223372036854775[0-7][0-9]{2}|922337203685477580[0-7])$","description":"Credit granted, in billionths of a US dollar, as a canonical positive signed 64-bit nanodollar string.","isRequired":true,"uniqueKey":"error.details.redemption.amount_nanodollars","typeLabel":"string"},"description":{"type":"string","description":"What the credit is for, as the promotion describes it.","isRequired":true,"uniqueKey":"error.details.redemption.description","typeLabel":"string"},"redeemed_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"error.details.redemption.redeemed_at","typeLabel":"string\u003cdate-time>"}},"description":"Original promotion redemption returned with 409 promotion_already_redeemed.","uniqueKey":"error.details.redemption","typeLabel":"object"},"scope":{"type":"string","enum":["workspace"],"description":"spend_limit_exceeded only; which configured cap refused admission.","uniqueKey":"error.details.scope","typeLabel":"enum\u003cstring>"},"period":{"type":"string","enum":["total","daily","monthly"],"description":"spend_limit_exceeded only; the cap period that applies.","uniqueKey":"error.details.period","typeLabel":"enum\u003cstring>"},"limit_nanodollars":{"type":"integer","minimum":1,"description":"spend_limit_exceeded only; exact configured USD nanodollars.","uniqueKey":"error.details.limit_nanodollars","typeLabel":"integer"},"requested_nanodollars":{"type":"integer","minimum":1,"description":"spend_limit_exceeded only; exact proposed managed hold.","uniqueKey":"error.details.requested_nanodollars","typeLabel":"integer"},"sign_in_method":{"type":"string","description":"account_exists only: how the existing account with this verified address signs in (google, github, email or other).","uniqueKey":"error.details.sign_in_method","typeLabel":"string"},"masked_email":{"type":"string","description":"account_exists only: that account's address, masked as `t…@gmail.com`.","uniqueKey":"error.details.masked_email","typeLabel":"string"},"failure_reason":{"type":"string","maxLength":100,"description":"Short safe card-decline reason; raw Stripe messages are not returned.","uniqueKey":"error.details.failure_reason","typeLabel":"string"},"names":{"type":"array","uniqueItems":true,"items":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Z][A-Z0-9_]{0,127}$","uniqueKey":"error.details.names.items.[INDEX]","typeLabel":"string"},"description":"All manifest secret names that could not be resolved.","uniqueKey":"error.details.names","typeLabel":"string[]"},"fields":{"type":"array","uniqueItems":true,"items":{"type":"string","enum":["preferences.order","preferences.sort","preferences.allow_fallbacks"],"uniqueKey":"error.details.fields.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"routing_overrides_forbidden only; the prohibited request inputs.","uniqueKey":"error.details.fields","typeLabel":"enum\u003cstring>[]"},"volume_id":{"type":"string","description":"BoxRouter Volume ID involved in the error.","uniqueKey":"error.details.volume_id","typeLabel":"string"},"writer_sandbox_id":{"type":"string","description":"volume_busy only; the sandbox that holds the volume's writer lease, when it is a recorded sandbox.","uniqueKey":"error.details.writer_sandbox_id","typeLabel":"string"},"checkpoint":{"type":"integer","minimum":1,"description":"Volume checkpoint involved in the error.","uniqueKey":"error.details.checkpoint","typeLabel":"integer"},"limit_bytes":{"type":"integer","minimum":0,"uniqueKey":"error.details.limit_bytes","typeLabel":"integer"},"observed_bytes":{"type":"integer","minimum":0,"uniqueKey":"error.details.observed_bytes","typeLabel":"integer"},"mismatch":{"type":"object","additionalProperties":false,"required":["field","recorded","requested"],"properties":{"field":{"type":"string","enum":["image","arch"],"isRequired":true,"uniqueKey":"error.details.mismatch.field","typeLabel":"enum\u003cstring>"},"recorded":{"type":"string","isRequired":true,"uniqueKey":"error.details.mismatch.recorded","typeLabel":"string"},"requested":{"type":"string","isRequired":true,"uniqueKey":"error.details.mismatch.requested","typeLabel":"string"}},"uniqueKey":"error.details.mismatch","typeLabel":"object"},"volume_phase":{"type":"string","enum":["check","branch","lease","identity","install","credential","mount","metadata","checkpoint","commit","write"],"uniqueKey":"error.details.volume_phase","typeLabel":"enum\u003cstring>"},"phase":{"type":"string","enum":["code","setup","files","background","previews"],"description":"Preparation phase that failed.","uniqueKey":"error.details.phase","typeLabel":"enum\u003cstring>"},"command":{"type":"string","description":"Command whose nonzero exit stopped launch preparation.","uniqueKey":"error.details.command","typeLabel":"string"},"exit_code":{"type":"integer","description":"Exit code of the failed command, or of the process that exited before its port listened.","uniqueKey":"error.details.exit_code","typeLabel":"integer"},"stderr_tail":{"type":"string","description":"At most the final 4 KiB of stderr from the failed command, with resolved secret values\nredacted. port_not_listening carries the same tail of the process's stderr.\n","uniqueKey":"error.details.stderr_tail","typeLabel":"string"},"stdout_tail":{"type":"string","description":"port_not_listening only; at most the final 4 KiB of the process's stdout.","uniqueKey":"error.details.stdout_tail","typeLabel":"string"},"agent":{"type":"string","description":"Unknown catalog agent name.","uniqueKey":"error.details.agent","typeLabel":"string"},"port":{"type":"integer","minimum":1,"maximum":65535,"description":"The sandbox port whose preview was refused (preview_access_refused) or that never accepted connections (port_not_listening).","uniqueKey":"error.details.port","typeLabel":"integer"},"revoked":{"type":"boolean","description":"preview_access_refused only; true when the unwanted preview was ended and no\naccess to the port remains. False: it may still be reachable (outcome unknown).\n","uniqueKey":"error.details.revoked","typeLabel":"boolean"},"preview_id":{"type":"string","description":"preview_access_refused only; the identifier the provider gave the preview that may\nstill be reachable. Present only for a public preview.\n","uniqueKey":"error.details.preview_id","typeLabel":"string"},"url":{"type":"string","format":"uri","description":"preview_access_refused only; the address of a public preview that may still be\nreachable. Never present for a private preview, whose address holds a credential,\nand never when it was ended.\n","uniqueKey":"error.details.url","typeLabel":"string\u003curi>"}},"uniqueKey":"error.details","typeLabel":"object"},"doc_url":{"oneOf":[{"type":"string","format":"uri","description":"Where the documentation explains this code: `https://boxrouter.ai/docs/error-codes#` followed by the code, for example `https://boxrouter.ai/docs/error-codes#no_eligible_route`. The page has one anchored row per code with what it means and what to do. BoxRouter sends it with every error; it is null for a code that has no documented row. Clients must accept an error body that omits it.","uniqueKey":"error.doc_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","format":"uri","description":"Where the documentation explains this code: `https://boxrouter.ai/docs/error-codes#` followed by the code, for example `https://boxrouter.ai/docs/error-codes#no_eligible_route`. The page has one anchored row per code with what it means and what to do. BoxRouter sends it with every error; it is null for a code that has no documented row. Clients must accept an error body that omits it.","uniqueKey":"error.doc_url.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.doc_url","typeLabel":"string\u003curi> | null"},"fix":{"oneOf":[{"type":"string","minLength":1,"description":"Actionable change for the caller when the request cannot be completed. A refusal (4xx) always carries one; a server or provider fault, including an error event that ends a terminal or process stream, can answer null.","uniqueKey":"error.fix.oneOf.0","typeLabel":"string"},{"type":"null","minLength":1,"description":"Actionable change for the caller when the request cannot be completed. A refusal (4xx) always carries one; a server or provider fault, including an error event that ends a terminal or process stream, can answer null.","uniqueKey":"error.fix.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.fix","typeLabel":"string | null"},"operation_id":{"oneOf":[{"type":"string","description":"Durable server operation ID for reconciliation after uncertain mutations.","uniqueKey":"error.operation_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"Durable server operation ID for reconciliation after uncertain mutations.","uniqueKey":"error.operation_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.operation_id","typeLabel":"string | null"},"provider":{"oneOf":[{"type":"string","uniqueKey":"error.provider.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"error.provider.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.provider","typeLabel":"string | null"},"native_code":{"oneOf":[{"type":"string","description":"The provider's machine-readable error code, unchanged, when it reports one.","uniqueKey":"error.native_code.oneOf.0","typeLabel":"string"},{"type":"null","description":"The provider's machine-readable error code, unchanged, when it reports one.","uniqueKey":"error.native_code.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.native_code","typeLabel":"string | null"},"native_status":{"oneOf":[{"type":"integer","description":"The provider's HTTP status, unchanged, when the failure came from a provider response.","uniqueKey":"error.native_status.oneOf.0","typeLabel":"integer"},{"type":"null","description":"The provider's HTTP status, unchanged, when the failure came from a provider response.","uniqueKey":"error.native_status.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.native_status","typeLabel":"integer | null"},"native_message":{"oneOf":[{"type":"string","maxLength":4096,"description":"The provider's own error message when it answered with an HTTP 4xx refusal (for example a plan limit); null otherwise. Capped at 512 characters, with whitespace collapsed. Credential secrets and token-shaped strings are removed before return. The literal `[redacted]` marker is used when all credential secret fields are at least 12 characters; legacy saved secrets shorter than 12 characters are removed without the marker.","uniqueKey":"error.native_message.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":4096,"description":"The provider's own error message when it answered with an HTTP 4xx refusal (for example a plan limit); null otherwise. Capped at 512 characters, with whitespace collapsed. Credential secrets and token-shaped strings are removed before return. The literal `[redacted]` marker is used when all credential secret fields are at least 12 characters; legacy saved secrets shorter than 12 characters are removed without the marker.","uniqueKey":"error.native_message.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.native_message","typeLabel":"string | null"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"\u003cstring>","message":"\u003cstring>","request_id":"\u003cstring>","outcome":"not_started","retry":"safe","retry_after_seconds":1,"details":{"selection_version":1,"considered":1,"excluded":[{"provider":"\u003cstring>"}],"closest":{},"nearest":[{}],"requirement":"\u003cstring>","purchase_id":"\u003cstring>","preview":{"unused":1,"held_excluded":1,"fee":1,"principal":1,"tax":1,"total":1,"card":{"brand":"\u003cstring>","last4":"\u003cstring>","type":"card","email":"jsmith@example.com"}},"quote":{"amount":2,"tax":1,"total":2,"address_required":true,"fee_minor":1,"missing":["\u003cstring>"]},"redemption":{"code":"\u003cstring>","amount_nanodollars":"\u003cstring>","description":"\u003cstring>","redeemed_at":"2023-11-07T05:31:56Z"},"scope":"workspace","period":"total","limit_nanodollars":2,"requested_nanodollars":2,"sign_in_method":"\u003cstring>","masked_email":"\u003cstring>","failure_reason":"\u003cstring>","names":["\u003cstring>"],"fields":["preferences.order"],"volume_id":"\u003cstring>","writer_sandbox_id":"\u003cstring>","checkpoint":2,"limit_bytes":1,"observed_bytes":1,"mismatch":{"field":"image","recorded":"\u003cstring>","requested":"\u003cstring>"},"volume_phase":"check","phase":"code","command":"\u003cstring>","exit_code":123,"stderr_tail":"\u003cstring>","stdout_tail":"\u003cstring>","agent":"\u003cstring>","port":32768,"revoked":true,"preview_id":"\u003cstring>","url":"\u003cstring>"},"doc_url":"\u003cstring>","fix":"\u003cstring>","operation_id":"\u003cstring>","provider":"\u003cstring>","native_code":"\u003cstring>","native_status":123,"native_message":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"a6d0998f-d350-4316-87c5-c0dcef824b39":{"description":"Structured error. `retry` says whether to send the call again (`now`, `after_fix`, `inspect` or `never`) and `retry_after_seconds` how long to wait first. Unowned and unknown resource IDs both return 404. Admission overload returns 503 with code overloaded, outcome not_started and Retry-After. It reserves no operation and dispatches no provider work. Shared workspace/provider admission budgets return 429 with code rate_limited, outcome not_started and Retry-After. An incomplete request body can return 408 request_timeout before dispatch. Durable-state failures return 503 database_unavailable with outcome unknown; do not infer that execution did not occur. A read (GET or HEAD) that meets the same failure changed nothing: its message says the state is temporarily unavailable, and it is safe to repeat. A provider that cannot be reached when a create is prepared returns 502 provider_error with outcome not_started; nothing was created, and the create can be retried with the same Idempotency-Key or sent to another provider with `providers`.\nNative errors are sanitized; upstream credentials, request bodies and\nanother workspace's metadata are never included. Server-Timing is present only when the response reached Dispatcher or held-response preparation; an earlier response, including pre-Dispatcher admission overload, may omit it.\n","headers":{"X-Request-ID":{"description":"Server-generated correlation identifier; contains no credentials or payloads.","schema":{"type":"string"}},"Server-Timing":{"description":"Durations of server-side phases, for diagnosing slow requests. Phase names are not stable\nand may change.\n","schema":{"type":"string"},"x-boxrouter-server-timing":{"version":1,"unit":"ms","serviceAggregateMetric":"service","maxHeaderBytes":8192,"maxOperationRows":32,"decimalPlaces":3,"safeNamePattern":"^[A-Za-z0-9_.:-]{1,64}$","aggregates":[{"metric":"service","fieldStem":"cloud"},{"metric":"database","fieldStem":"database"},{"metric":"code","fieldStem":"code"},{"metric":"provider_connect","fieldStem":"provider_connect"},{"metric":"provider_wait","fieldStem":"provider_wait"},{"metric":"accept","fieldStem":"accept"},{"metric":"queue","fieldStem":"queue"},{"metric":"admission","fieldStem":"admission"},{"metric":"encode","fieldStem":"encode"}],"aggregateGrammar":{"duration":{"parameter":"dur","type":"number","finite":true,"minimum":0},"descriptionParameter":"desc","unknownDescription":"unknown","missingMeans":"unreported"},"operationGrammar":{"metric":"op","nameParameter":"desc","namePattern":"safeNamePattern","start":{"parameter":"start","type":"number","finite":true,"sign":"signed","relativeTo":"recorderWindow"},"duration":{"parameter":"dur","type":"number","finite":true,"minimum":0},"outcomeParameter":"outcome","outcomes":["returned","raised"],"requiresAggregateDependencyUnion":false},"omissionGrammar":{"metric":"op-omitted","count":{"parameter":"desc","type":"integer","minimum":0},"duration":{"parameter":"dur","type":"number","finite":true,"minimum":0,"sumOf":"knownOmittedMeasuredRows"},"requiresAggregateDependencyUnion":false},"coverageGrammar":{"metric":"op-coverage","descriptionParameter":"desc","unknownValue":"unknown","absentState":"unreported","states":["unknown","unreported"],"absenceImpliesCompleteness":false}}},"Retry-After":{"description":"Seconds before retrying an eligible read; not permission to replay a mutation.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"description":"The one error body every failing call answers. It leads with what to do: `retry` says whether to send the call again, `fix` says what to change, `outcome` says what happened, and `doc_url` links to the page that explains the code. Clients retry `retry: safe` for you with the same idempotency key.","x-sandbox-provider-spec-codes":["no_eligible_route","knob_not_named","unrecognised_word","invalid_request","not_named","gate_unavailable","account_unhealthy","lifetime_limit","lifetime_used_up","not_running","invalid_state","sandbox_ended","not_found","provider_error","timeout","contract_violation"],"properties":{"error":{"type":"object","required":["code","message","request_id","outcome","retry","retry_after_seconds"],"properties":{"code":{"type":"string","description":"Stable machine category. Operation failures use SandboxProviderSpec error codes,\nincluding invalid_request, invalid_state, not_found, unauthorized,\nincompatible_requirements, no_eligible_route, capacity_unavailable,\ncapability_unavailable, contract_violation, resource_limit, timeout and\nprovider_error. Hosted service failures add method_not_allowed,\nunauthenticated, forbidden, actions_sandbox_protected,\ninsufficient_credit, spend_limit_exceeded,\nprovider_not_enabled, credentials_rejected, conflict, rate_limited, provider_quota, request_timeout, overloaded,\ndatabase_unavailable, payment_method_required, payment_declined, promotion_already_redeemed, account_exists, and internal_error. unsupported_feature and\noutput_limit are earlier names still returned by some routes.\nOrganization and membership operations also use organization_changed, last_admin,\nstale_membership, directory_managed and change_in_progress. Key ownership and\ninvitation operations use idempotency_key_reused and conflict.\nCredit refunds and purchase quotes also use refund_window_closed,\nnothing_to_refund, refund_below_minimum, refund_in_progress,\npurchase_in_progress, dispute_open, already_refunded,\nrefund_amount_changed, refund_fee_unavailable, quote_changed,\nsession_required, refund_daily_limit, refund_rate_limit,\nrefund_retry_requires_support, idempotency_key_reused and fraud_review.\nCard setup adds card_setup_rate_limit (429, with Retry-After): a workspace may start five\ncard setups an hour.\nA provider that refuses the request for its own plan or quota limit answers\n429 provider_quota with the provider's words in native_message; rate_limited is\nBoxRouter's own limit.\nRouting Prevent Overrides refuses a request containing preferences.order,\npreferences.sort or preferences.allow_fallbacks with routing_overrides_forbidden,\noutcome not_started and details.fields naming the prohibited inputs. No provider\neffect occurs.\nLaunch operations also use invalid_request, secret_missing, agent_not_found,\nno_eligible_route and launch_failed.\nA process or terminal is observed by one API task. When that task stops, process\noutput, result and stdin answer 410 process_observer_lost (reading or cancelling the\nprocess still works), and a terminal on a provider that cannot reattach it answers\n410 terminal_observer_lost. invalid_observer_hop (403) refuses an internal hop\nbetween API tasks that is not signed; clients never send one.\nOpening a preview that the provider answered with other access than the request\nasked for returns 502 preview_access_refused: that preview is never returned, and\ndetails say whether it was ended.\nStarting a process with wait_for_port answers 409 port_not_listening, outcome partial,\nwhen the process exits before the port accepts connections or the port stays closed for\n30 seconds; the process is ended and details carry the output so far.\nA request that must store content (a volume, a saved artifact) under transient content\nretention answers 409 privacy_persistence_conflict with outcome not_started.\nA sandbox request that stops before anything is created also answers\nlifetime_cap_exceeded, knob_not_named and unrecognised_word (400), and price_unknown and\npolicy_denied (409), each with outcome not_started; the Actions codes job_claim_lost,\nactions_authority_changed, actions_candidate_ceiling_withdrawn and\nactions_candidate_outside_ceiling (409) say the job's claim, settings or admitted routes\nchanged; provider_budget_exhausted (409) says a run's provider budget allows no\nfurther create. A create that names an image Cloud cannot use answers 400\nimage_architecture_unsupported, image_digest_resolution_failed,\nimage_preparation_unsupported or private_image_managed_route_unavailable, and\nprivacy_admission_unavailable when privacy cannot be enforced; each says what to change.\nLaunch and source-repository refusals name the repository or manifest fault (code_ref_not_found,\ncode_repository_*, source_*, invalid_source_manifest, invalid_manifest_encoding,\ninvalid_run_spec, repository_*, reserved_env_refused, launch_run_position_conflict,\ncode_reference_moved, dockerfile_context_unsupported, image_tag_unresolved,\nrecovery_sandbox_mismatch); the GitHub-side ones (source_rate_limited,\nsource_resolution_failed, source_resolution_timeout, code_repository_resolution_failed)\nare safe to resend. image_setup_timeout, managed_funding_unavailable,\nlifetime_funding_conflict, candidate_admission_unavailable, secrets_unavailable and the\nActions candidate codes (actions_candidate_record_invalid, actions_create_budget_exhausted,\nactions_create_format_mismatch) complete the creation and extension refusals.\ndispatch_limit_reached, inline_secret_values_refused and launch_incomplete come from\nlaunch runs, provider_policy_unknown from an operation whose privacy evidence cannot be\nverified, and quota_exceeded from a full managed provider account.\nVolume operations also use volume_busy, volume_lease_lost, volume_not_attached,\nvolume_incompatible, volume_save_failed and volume_restore_failed. Creating a\nsandbox on a volume whose writer is ending waits for the release (at most 120\nseconds) before it can answer volume_busy.\nA team member's new personal API key is paused until WorkOS membership sync catches\nup: it answers 403 forbidden whose message and fix say the key becomes active once\nthe team membership syncs, usually within a minute, and the call can be retried.\nClients must preserve and handle unknown categories explicitly.\n","x-boxrouter-error-codes":{"account_exists":[409],"account_unhealthy":[402],"actions_authority_changed":[409],"actions_candidate_ceiling_withdrawn":[409],"actions_candidate_outside_ceiling":[409],"actions_candidate_record_invalid":[409],"actions_create_budget_exhausted":[409],"actions_create_format_mismatch":[409],"actions_sandbox_protected":[403],"agent_not_found":[404],"already_refunded":[409],"authorization_error":[403],"candidate_admission_unavailable":[503],"capability_unavailable":[409,503],"capability_unverified":[409],"card_setup_rate_limit":[429],"change_in_progress":[409],"code_ref_not_found":[404],"code_reference_moved":[409],"code_repository_not_authorized":[403],"code_repository_not_found":[404],"code_repository_not_private":[400],"code_repository_not_public":[404],"code_repository_resolution_failed":[502],"command_failed":[409],"command_observation_busy":[409],"conflict":[409],"contract_violation":[409],"credentials_rejected":[409,422],"database_unavailable":[503],"directory_managed":[409],"dispatch_limit_reached":[409],"dispute_open":[409],"dockerfile_context_unsupported":[400],"expired":[410],"forbidden":[403],"fraud_review":[409],"gate_unavailable":[409],"idempotency_key_reused":[409,422],"identity_unavailable":[503],"image_architecture_unsupported":[400],"image_digest_resolution_failed":[400],"image_preparation_unsupported":[400],"image_setup_timeout":[504],"image_tag_unresolved":[400],"inline_secret_values_refused":[422],"insufficient_credit":[402],"internal_error":[500],"invalid_manifest_encoding":[400],"invalid_observer_hop":[403],"invalid_request":[400,413,422,428],"invalid_run_spec":[400],"invalid_source_manifest":[400],"invalid_state":[409],"job_claim_lost":[409],"knob_not_named":[400],"last_admin":[409],"launch_failed":[409],"launch_incomplete":[409],"launch_run_position_conflict":[409],"lifetime_cap_exceeded":[400],"lifetime_funding_conflict":[409],"lifetime_limit":[409],"lifetime_used_up":[409],"managed_funding_unavailable":[503],"method_not_allowed":[405],"no_eligible_route":[409],"not_found":[404],"not_named":[409],"not_running":[409],"nothing_to_refund":[409],"organization_changed":[409],"output_limit":[413],"overloaded":[503],"payment_declined":[402],"payment_method_required":[409],"payment_provider_rejected":[502],"payment_provider_unavailable":[503],"payments_unavailable":[503],"policy_denied":[409],"port_not_listening":[409],"preview_access_refused":[502],"price_unknown":[409],"privacy_admission_unavailable":[400],"privacy_persistence_conflict":[409],"private_image_managed_route_unavailable":[400],"process_observer_lost":[410],"promotion_already_redeemed":[409],"promotion_code_invalid":[404],"provider_budget_exhausted":[409],"provider_error":[502],"provider_not_enabled":[409],"provider_policy_unknown":[409],"provider_quota":[429],"purchase_in_progress":[409],"quota_exceeded":[429],"quote_changed":[409],"rate_limited":[429],"recovery_sandbox_mismatch":[409],"refund_amount_changed":[409],"refund_below_minimum":[409],"refund_daily_limit":[429],"refund_fee_unavailable":[409],"refund_in_progress":[409],"refund_rate_limit":[429],"refund_retry_requires_support":[409],"refund_window_closed":[409],"repository_file_unsupported":[400],"repository_too_large":[400],"request_timeout":[408],"reserved_env_refused":[400,422],"resource_limit":[413,507],"routing_overrides_forbidden":[400],"run_limit_exceeded":[429],"sandbox_ended":[410],"secret_missing":[400],"secrets_unavailable":[503],"session_required":[403],"source_file_not_found":[400],"source_file_too_large":[413],"source_rate_limited":[503],"source_ref_not_found":[400],"source_repository_not_accessible":[404],"source_repository_not_found":[400],"source_repository_not_private":[400],"source_repository_not_public":[400],"source_resolution_failed":[502],"source_resolution_timeout":[504],"spend_limit_exceeded":[402],"stale_membership":[409],"terminal_closed":[410],"terminal_observer_lost":[410],"timeout":[504],"unauthenticated":[401],"unavailable":[503],"unrecognised_word":[400],"unsupported_feature":[422],"volume_busy":[409],"volume_incompatible":[409],"volume_lease_lost":[409],"volume_not_attached":[409],"volume_restore_failed":[502],"volume_save_failed":[409,502],"volume_unavailable":[409],"wrong_region":[421]},"x-boxrouter-error-retry":{"account_exists":"after_fix","account_unhealthy":"after_fix","actions_authority_changed":"after_fix","actions_candidate_ceiling_withdrawn":"after_fix","actions_candidate_outside_ceiling":"after_fix","actions_candidate_record_invalid":"after_fix","actions_create_budget_exhausted":"after_fix","actions_create_format_mismatch":"after_fix","actions_sandbox_protected":"never","agent_not_found":"after_fix","already_refunded":"never","authorization_error":"check_outcome","candidate_admission_unavailable":"never","capability_unavailable":"check_outcome","capability_unverified":"after_fix","card_setup_rate_limit":"safe","change_in_progress":"safe","code_ref_not_found":"after_fix","code_reference_moved":"after_fix","code_repository_not_authorized":"after_fix","code_repository_not_found":"after_fix","code_repository_not_private":"after_fix","code_repository_not_public":"after_fix","code_repository_resolution_failed":"safe","command_failed":"after_fix","command_observation_busy":"safe","conflict":"check_outcome","contract_violation":"check_outcome","credentials_rejected":"after_fix","database_unavailable":"check_outcome","directory_managed":"never","dispatch_limit_reached":"after_fix","dispute_open":"after_fix","dockerfile_context_unsupported":"after_fix","expired":"check_outcome","forbidden":"after_fix","fraud_review":"safe","gate_unavailable":"after_fix","idempotency_key_reused":"after_fix","identity_unavailable":"safe","image_architecture_unsupported":"after_fix","image_digest_resolution_failed":"after_fix","image_preparation_unsupported":"after_fix","image_setup_timeout":"after_fix","image_tag_unresolved":"after_fix","inline_secret_values_refused":"after_fix","insufficient_credit":"after_fix","internal_error":"never","invalid_manifest_encoding":"after_fix","invalid_observer_hop":"after_fix","invalid_request":"after_fix","invalid_run_spec":"after_fix","invalid_source_manifest":"after_fix","invalid_state":"check_outcome","job_claim_lost":"after_fix","knob_not_named":"after_fix","last_admin":"after_fix","launch_failed":"check_outcome","launch_incomplete":"check_outcome","launch_run_position_conflict":"after_fix","lifetime_cap_exceeded":"after_fix","lifetime_funding_conflict":"after_fix","lifetime_limit":"check_outcome","lifetime_used_up":"after_fix","managed_funding_unavailable":"safe","method_not_allowed":"after_fix","no_eligible_route":"after_fix","not_found":"check_outcome","not_named":"after_fix","not_running":"after_fix","nothing_to_refund":"never","organization_changed":"safe","output_limit":"check_outcome","overloaded":"safe","payment_declined":"after_fix","payment_method_required":"after_fix","payment_provider_rejected":"check_outcome","payment_provider_unavailable":"check_outcome","payments_unavailable":"safe","policy_denied":"after_fix","port_not_listening":"after_fix","preview_access_refused":"never","price_unknown":"after_fix","privacy_admission_unavailable":"after_fix","privacy_persistence_conflict":"after_fix","private_image_managed_route_unavailable":"after_fix","process_observer_lost":"check_outcome","promotion_already_redeemed":"never","promotion_code_invalid":"after_fix","provider_budget_exhausted":"never","provider_error":"check_outcome","provider_not_enabled":"after_fix","provider_policy_unknown":"after_fix","provider_quota":"after_fix","purchase_in_progress":"safe","quota_exceeded":"safe","quote_changed":"after_fix","rate_limited":"safe","recovery_sandbox_mismatch":"check_outcome","refund_amount_changed":"after_fix","refund_below_minimum":"never","refund_daily_limit":"safe","refund_fee_unavailable":"safe","refund_in_progress":"safe","refund_rate_limit":"safe","refund_retry_requires_support":"never","refund_window_closed":"never","repository_file_unsupported":"after_fix","repository_too_large":"after_fix","request_timeout":"safe","reserved_env_refused":"after_fix","resource_limit":"check_outcome","routing_overrides_forbidden":"after_fix","run_limit_exceeded":"after_fix","sandbox_ended":"check_outcome","secret_missing":"after_fix","secrets_unavailable":"never","session_required":"never","source_file_not_found":"after_fix","source_file_too_large":"after_fix","source_rate_limited":"safe","source_ref_not_found":"after_fix","source_repository_not_accessible":"after_fix","source_repository_not_found":"after_fix","source_repository_not_private":"after_fix","source_repository_not_public":"after_fix","source_resolution_failed":"safe","source_resolution_timeout":"safe","spend_limit_exceeded":"after_fix","stale_membership":"after_fix","terminal_closed":"after_fix","terminal_observer_lost":"after_fix","timeout":"check_outcome","unauthenticated":"after_fix","unavailable":"safe","unrecognised_word":"after_fix","unsupported_feature":"after_fix","volume_busy":"after_fix","volume_incompatible":"after_fix","volume_lease_lost":"after_fix","volume_not_attached":"after_fix","volume_restore_failed":"check_outcome","volume_save_failed":"check_outcome","volume_unavailable":"after_fix","wrong_region":"after_fix"},"isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"request_id":{"type":"string","isRequired":true,"uniqueKey":"error.request_id","typeLabel":"string"},"outcome":{"type":"string","enum":["not_started","completed","partial","unknown"],"description":"What is known about the requested side effect. `not_started` means nothing ran\nanywhere, at BoxRouter or at a provider; a launch-setup or process-start failure\nafter dispatch is `partial` or `unknown`. Unknown and partial forbid automatic\nreplay and always carry `retry: check_outcome`. An HTTP status alone does not establish\noutcome.\nMany refusals report not_started before the provider is asked anything. A read\n(GET or HEAD) has no side effect to be unsure about, so its failures report\nnot_started and carry the code's own retry value. A launch preparation failure\nhappens after the sandbox was created and setup commands may already have run, and\ndeleting the sandbox does not undo effects outside it: it reports partial once the\ncleanup is confirmed and unknown if it is not. A process that wait_for_port ended\nreports partial. volume_restore_failed on a resume or create,\nand volume_save_failed after the guest was read, report unknown or partial; they\ncarry the operation_id when the call was recorded, and their fix does not offer to\nsend the call again unchanged.\n","isRequired":true,"uniqueKey":"error.outcome","typeLabel":"enum\u003cstring>"},"retry":{"type":"string","enum":["safe","after_fix","check_outcome","never"],"x-boxrouter-open-enum":true,"description":"What the caller may do next, fixed per code (x-boxrouter-error-retry): safe resends the\nsame request, after_fix changes the request or setup first, check_outcome reads\n`outcome` and the resource before resending, never does not resend. Branch on this\ninstead of the HTTP status.\n","isRequired":true,"uniqueKey":"error.retry","typeLabel":"enum\u003cstring>"},"retry_after_seconds":{"oneOf":[{"type":"integer","minimum":0,"description":"How long to wait before a `retry: safe` resend, as the Retry-After header says it; null when there is no wait to name.","isRequired":true,"uniqueKey":"error.retry_after_seconds.oneOf.0","typeLabel":"integer"},{"type":"null","minimum":0,"description":"How long to wait before a `retry: safe` resend, as the Retry-After header says it; null when there is no wait to name.","isRequired":true,"uniqueKey":"error.retry_after_seconds.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"error.retry_after_seconds","typeLabel":"integer | null"},"details":{"type":"object","description":"Code-specific context, spelled for programs. no_eligible_route carries considered,\nexcluded, closest and nearest; knob_not_named the knob and its values;\nunrecognised_word the path, the word and the known ones; not_named the gate, what\nthe call needed beyond the grant and the corrected requirements line; gate_unavailable\nthe gate and account; lifetime_limit the ceiling and this run. A creation that\nstopped before a sandbox existed may also carry `fallbacks_allowed`, `stopped_reason`\nand `attempts`, spelled and bounded as in the sandbox route selection.\ncapability_unavailable may identify the needed capability. A launch preparation failure can follow sandbox creation;\ninspect outcome and cleanup details before creating another. Clients must\npreserve fields they do not know.\n","properties":{"selection_version":{"type":"integer","minimum":0,"description":"Current selected organization version for organization_changed.","uniqueKey":"error.details.selection_version","typeLabel":"integer"},"considered":{"type":"integer","minimum":0,"description":"no_eligible_route only; how many routes were considered.","uniqueKey":"error.details.considered","typeLabel":"integer"},"excluded":{"type":"array","description":"no_eligible_route only; every considered route that cannot serve the request. Each entry names its `provider` and the checks it failed (`failed` for a sandbox request, `reasons` and `exclusions` for a launch); clients must preserve fields they do not know.","items":{"type":"object","required":["provider"],"properties":{"provider":{"type":"string","isRequired":true,"uniqueKey":"error.details.excluded.items.[INDEX].provider","typeLabel":"string"}},"uniqueKey":"error.details.excluded.items.[INDEX]","typeLabel":"object"},"uniqueKey":"error.details.excluded","typeLabel":"object[]"},"closest":{"oneOf":[{"type":"object","description":"no_eligible_route only; the excluded route that fails fewest checks, or null.","uniqueKey":"error.details.closest.oneOf.0","typeLabel":"object"},{"type":"null","description":"no_eligible_route only; the excluded route that fails fewest checks, or null.","uniqueKey":"error.details.closest.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.details.closest","typeLabel":"object | null"},"nearest":{"type":"array","description":"no_eligible_route only; the smallest changes that would make a route eligible, nearest first. An entry names the change (`change` and `then_eligible` for a sandbox request, `provider`, `distance` and `failing` for a launch); clients must preserve fields they do not know.","items":{"type":"object","uniqueKey":"error.details.nearest.items.[INDEX]","typeLabel":"object"},"uniqueKey":"error.details.nearest","typeLabel":"object[]"},"requirement":{"type":"string","description":"The SandboxProviderSpec family whose requirement would make this operation available.","uniqueKey":"error.details.requirement","typeLabel":"string"},"purchase_id":{"type":"string","description":"Retained failed credit purchase ID, when a saved-card charge was declined.","uniqueKey":"error.details.purchase_id","typeLabel":"string"},"preview":{"type":"object","additionalProperties":false,"required":["unused","held_excluded","fee","principal","tax","total","card"],"properties":{"unused":{"type":"integer","minimum":0,"description":"Unused purchased credit in US cents, before held credit is excluded.","isRequired":true,"uniqueKey":"error.details.preview.unused","typeLabel":"integer"},"held_excluded":{"type":"integer","minimum":0,"description":"Credit held for running sandboxes, in US cents.","isRequired":true,"uniqueKey":"error.details.preview.held_excluded","typeLabel":"integer"},"fee":{"type":"integer","minimum":0,"description":"Original Stripe processing fee retained, in US cents.","isRequired":true,"uniqueKey":"error.details.preview.fee","typeLabel":"integer"},"principal":{"type":"integer","minimum":0,"description":"Tax-exclusive principal returned to the original card, in US cents.","isRequired":true,"uniqueKey":"error.details.preview.principal","typeLabel":"integer"},"tax":{"type":"integer","minimum":0,"description":"Tax Stripe adds to the credit note, in US cents.","isRequired":true,"uniqueKey":"error.details.preview.tax","typeLabel":"integer"},"total":{"type":"integer","minimum":0,"description":"Total Stripe will refund, in US cents.","isRequired":true,"uniqueKey":"error.details.preview.total","typeLabel":"integer"},"card":{"type":"object","conditionallyRequiredProperties":{"email":[{"when":[[{"property":"type","values":["link"]}]]}],"brand":[{"when":[[{"property":"type","values":["card"]}]]}],"last4":[{"when":[[{"property":"type","values":["card"]}]]}]},"properties":{"brand":{"oneOf":[{"type":"string","description":"Card brand; absent for Link methods.","conditionalRequirements":[{"when":[[{"property":"type","values":["card"]}]]}],"uniqueKey":"error.details.preview.card.brand.oneOf.0","typeLabel":"string"},{"type":"null","description":"Card brand; absent for Link methods.","conditionalRequirements":[{"when":[[{"property":"type","values":["card"]}]]}],"uniqueKey":"error.details.preview.card.brand.oneOf.1","typeLabel":"null"}],"conditionalRequirements":[{"when":[[{"property":"type","values":["card"]}]]}],"uniqueKey":"error.details.preview.card.brand","typeLabel":"string | null"},"last4":{"oneOf":[{"type":"string","pattern":"^[0-9]{4}$","description":"Last four card digits; absent for Link methods.","conditionalRequirements":[{"when":[[{"property":"type","values":["card"]}]]}],"uniqueKey":"error.details.preview.card.last4.oneOf.0","typeLabel":"string"},{"type":"null","pattern":"^[0-9]{4}$","description":"Last four card digits; absent for Link methods.","conditionalRequirements":[{"when":[[{"property":"type","values":["card"]}]]}],"uniqueKey":"error.details.preview.card.last4.oneOf.1","typeLabel":"null"}],"conditionalRequirements":[{"when":[[{"property":"type","values":["card"]}]]}],"uniqueKey":"error.details.preview.card.last4","typeLabel":"string | null"},"type":{"type":"string","enum":["card","link"],"x-boxrouter-open-enum":true,"uniqueKey":"error.details.preview.card.type","typeLabel":"enum\u003cstring>"},"email":{"type":"string","format":"email","description":"Link account email; present only when type is link.","conditionalRequirements":[{"when":[[{"property":"type","values":["link"]}]]}],"uniqueKey":"error.details.preview.card.email","typeLabel":"string\u003cemail>"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"error.details.preview.card","typeLabel":"object"}},"description":"Current refund preview returned with 409 refund_amount_changed.","uniqueKey":"error.details.preview","typeLabel":"object"},"quote":{"type":"object","additionalProperties":false,"required":["amount","tax","total","address_required"],"properties":{"amount":{"type":"integer","minimum":1,"description":"Tax-exclusive credit amount in US cents; this is what is added to the balance.","isRequired":true,"uniqueKey":"error.details.quote.amount","typeLabel":"integer"},"tax":{"type":"integer","minimum":0,"description":"Estimated tax in US cents, on the credits and the fee.","isRequired":true,"uniqueKey":"error.details.quote.tax","typeLabel":"integer"},"total":{"type":"integer","minimum":1,"description":"Estimated total to charge in US cents: amount plus fee_minor plus tax.","isRequired":true,"uniqueKey":"error.details.quote.total","typeLabel":"integer"},"address_required":{"type":"boolean","isRequired":true,"uniqueKey":"error.details.quote.address_required","typeLabel":"boolean"},"fee_minor":{"type":"integer","minimum":0,"description":"BoxRouter's purchase fee in US cents, computed by the server and charged on top of amount. Tax applies to amount plus fee. Absent on older services.","uniqueKey":"error.details.quote.fee_minor","typeLabel":"integer"},"missing":{"type":"array","items":{"type":"string","uniqueKey":"error.details.quote.missing.items.[INDEX]","typeLabel":"string"},"description":"Required billing address fields missing for an exact tax quote.","uniqueKey":"error.details.quote.missing","typeLabel":"string[]"}},"description":"Current purchase quote returned with 409 quote_changed.","uniqueKey":"error.details.quote","typeLabel":"object"},"redemption":{"type":"object","additionalProperties":false,"required":["code","amount_nanodollars","description","redeemed_at"],"properties":{"code":{"type":"string","description":"The code in its canonical upper-case form.","isRequired":true,"uniqueKey":"error.details.redemption.code","typeLabel":"string"},"amount_nanodollars":{"type":"string","maxLength":19,"pattern":"^(?:[1-9][0-9]{0,17}|[1-8][0-9]{18}|9[0-1][0-9]{17}|92[0-1][0-9]{16}|922[0-2][0-9]{15}|9223[0-2][0-9]{14}|92233[0-6][0-9]{13}|922337[0-1][0-9]{12}|92233720[0-2][0-9]{10}|922337203[0-5][0-9]{9}|9223372036[0-7][0-9]{8}|92233720368[0-4][0-9]{7}|922337203685[0-3][0-9]{6}|9223372036854[0-6][0-9]{5}|92233720368547[0-6][0-9]{4}|922337203685477[0-4][0-9]{3}|9223372036854775[0-7][0-9]{2}|922337203685477580[0-7])$","description":"Credit granted, in billionths of a US dollar, as a canonical positive signed 64-bit nanodollar string.","isRequired":true,"uniqueKey":"error.details.redemption.amount_nanodollars","typeLabel":"string"},"description":{"type":"string","description":"What the credit is for, as the promotion describes it.","isRequired":true,"uniqueKey":"error.details.redemption.description","typeLabel":"string"},"redeemed_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"error.details.redemption.redeemed_at","typeLabel":"string\u003cdate-time>"}},"description":"Original promotion redemption returned with 409 promotion_already_redeemed.","uniqueKey":"error.details.redemption","typeLabel":"object"},"scope":{"type":"string","enum":["workspace"],"description":"spend_limit_exceeded only; which configured cap refused admission.","uniqueKey":"error.details.scope","typeLabel":"enum\u003cstring>"},"period":{"type":"string","enum":["total","daily","monthly"],"description":"spend_limit_exceeded only; the cap period that applies.","uniqueKey":"error.details.period","typeLabel":"enum\u003cstring>"},"limit_nanodollars":{"type":"integer","minimum":1,"description":"spend_limit_exceeded only; exact configured USD nanodollars.","uniqueKey":"error.details.limit_nanodollars","typeLabel":"integer"},"requested_nanodollars":{"type":"integer","minimum":1,"description":"spend_limit_exceeded only; exact proposed managed hold.","uniqueKey":"error.details.requested_nanodollars","typeLabel":"integer"},"sign_in_method":{"type":"string","description":"account_exists only: how the existing account with this verified address signs in (google, github, email or other).","uniqueKey":"error.details.sign_in_method","typeLabel":"string"},"masked_email":{"type":"string","description":"account_exists only: that account's address, masked as `t…@gmail.com`.","uniqueKey":"error.details.masked_email","typeLabel":"string"},"failure_reason":{"type":"string","maxLength":100,"description":"Short safe card-decline reason; raw Stripe messages are not returned.","uniqueKey":"error.details.failure_reason","typeLabel":"string"},"names":{"type":"array","uniqueItems":true,"items":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Z][A-Z0-9_]{0,127}$","uniqueKey":"error.details.names.items.[INDEX]","typeLabel":"string"},"description":"All manifest secret names that could not be resolved.","uniqueKey":"error.details.names","typeLabel":"string[]"},"fields":{"type":"array","uniqueItems":true,"items":{"type":"string","enum":["preferences.order","preferences.sort","preferences.allow_fallbacks"],"uniqueKey":"error.details.fields.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"routing_overrides_forbidden only; the prohibited request inputs.","uniqueKey":"error.details.fields","typeLabel":"enum\u003cstring>[]"},"volume_id":{"type":"string","description":"BoxRouter Volume ID involved in the error.","uniqueKey":"error.details.volume_id","typeLabel":"string"},"writer_sandbox_id":{"type":"string","description":"volume_busy only; the sandbox that holds the volume's writer lease, when it is a recorded sandbox.","uniqueKey":"error.details.writer_sandbox_id","typeLabel":"string"},"checkpoint":{"type":"integer","minimum":1,"description":"Volume checkpoint involved in the error.","uniqueKey":"error.details.checkpoint","typeLabel":"integer"},"limit_bytes":{"type":"integer","minimum":0,"uniqueKey":"error.details.limit_bytes","typeLabel":"integer"},"observed_bytes":{"type":"integer","minimum":0,"uniqueKey":"error.details.observed_bytes","typeLabel":"integer"},"mismatch":{"type":"object","additionalProperties":false,"required":["field","recorded","requested"],"properties":{"field":{"type":"string","enum":["image","arch"],"isRequired":true,"uniqueKey":"error.details.mismatch.field","typeLabel":"enum\u003cstring>"},"recorded":{"type":"string","isRequired":true,"uniqueKey":"error.details.mismatch.recorded","typeLabel":"string"},"requested":{"type":"string","isRequired":true,"uniqueKey":"error.details.mismatch.requested","typeLabel":"string"}},"uniqueKey":"error.details.mismatch","typeLabel":"object"},"volume_phase":{"type":"string","enum":["check","branch","lease","identity","install","credential","mount","metadata","checkpoint","commit","write"],"uniqueKey":"error.details.volume_phase","typeLabel":"enum\u003cstring>"},"phase":{"type":"string","enum":["code","setup","files","background","previews"],"description":"Preparation phase that failed.","uniqueKey":"error.details.phase","typeLabel":"enum\u003cstring>"},"command":{"type":"string","description":"Command whose nonzero exit stopped launch preparation.","uniqueKey":"error.details.command","typeLabel":"string"},"exit_code":{"type":"integer","description":"Exit code of the failed command, or of the process that exited before its port listened.","uniqueKey":"error.details.exit_code","typeLabel":"integer"},"stderr_tail":{"type":"string","description":"At most the final 4 KiB of stderr from the failed command, with resolved secret values\nredacted. port_not_listening carries the same tail of the process's stderr.\n","uniqueKey":"error.details.stderr_tail","typeLabel":"string"},"stdout_tail":{"type":"string","description":"port_not_listening only; at most the final 4 KiB of the process's stdout.","uniqueKey":"error.details.stdout_tail","typeLabel":"string"},"agent":{"type":"string","description":"Unknown catalog agent name.","uniqueKey":"error.details.agent","typeLabel":"string"},"port":{"type":"integer","minimum":1,"maximum":65535,"description":"The sandbox port whose preview was refused (preview_access_refused) or that never accepted connections (port_not_listening).","uniqueKey":"error.details.port","typeLabel":"integer"},"revoked":{"type":"boolean","description":"preview_access_refused only; true when the unwanted preview was ended and no\naccess to the port remains. False: it may still be reachable (outcome unknown).\n","uniqueKey":"error.details.revoked","typeLabel":"boolean"},"preview_id":{"type":"string","description":"preview_access_refused only; the identifier the provider gave the preview that may\nstill be reachable. Present only for a public preview.\n","uniqueKey":"error.details.preview_id","typeLabel":"string"},"url":{"type":"string","format":"uri","description":"preview_access_refused only; the address of a public preview that may still be\nreachable. Never present for a private preview, whose address holds a credential,\nand never when it was ended.\n","uniqueKey":"error.details.url","typeLabel":"string\u003curi>"}},"uniqueKey":"error.details","typeLabel":"object"},"doc_url":{"oneOf":[{"type":"string","format":"uri","description":"Where the documentation explains this code: `https://boxrouter.ai/docs/error-codes#` followed by the code, for example `https://boxrouter.ai/docs/error-codes#no_eligible_route`. The page has one anchored row per code with what it means and what to do. BoxRouter sends it with every error; it is null for a code that has no documented row. Clients must accept an error body that omits it.","uniqueKey":"error.doc_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","format":"uri","description":"Where the documentation explains this code: `https://boxrouter.ai/docs/error-codes#` followed by the code, for example `https://boxrouter.ai/docs/error-codes#no_eligible_route`. The page has one anchored row per code with what it means and what to do. BoxRouter sends it with every error; it is null for a code that has no documented row. Clients must accept an error body that omits it.","uniqueKey":"error.doc_url.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.doc_url","typeLabel":"string\u003curi> | null"},"fix":{"oneOf":[{"type":"string","minLength":1,"description":"Actionable change for the caller when the request cannot be completed. A refusal (4xx) always carries one; a server or provider fault, including an error event that ends a terminal or process stream, can answer null.","uniqueKey":"error.fix.oneOf.0","typeLabel":"string"},{"type":"null","minLength":1,"description":"Actionable change for the caller when the request cannot be completed. A refusal (4xx) always carries one; a server or provider fault, including an error event that ends a terminal or process stream, can answer null.","uniqueKey":"error.fix.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.fix","typeLabel":"string | null"},"operation_id":{"oneOf":[{"type":"string","description":"Durable server operation ID for reconciliation after uncertain mutations.","uniqueKey":"error.operation_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"Durable server operation ID for reconciliation after uncertain mutations.","uniqueKey":"error.operation_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.operation_id","typeLabel":"string | null"},"provider":{"oneOf":[{"type":"string","uniqueKey":"error.provider.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"error.provider.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.provider","typeLabel":"string | null"},"native_code":{"oneOf":[{"type":"string","description":"The provider's machine-readable error code, unchanged, when it reports one.","uniqueKey":"error.native_code.oneOf.0","typeLabel":"string"},{"type":"null","description":"The provider's machine-readable error code, unchanged, when it reports one.","uniqueKey":"error.native_code.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.native_code","typeLabel":"string | null"},"native_status":{"oneOf":[{"type":"integer","description":"The provider's HTTP status, unchanged, when the failure came from a provider response.","uniqueKey":"error.native_status.oneOf.0","typeLabel":"integer"},{"type":"null","description":"The provider's HTTP status, unchanged, when the failure came from a provider response.","uniqueKey":"error.native_status.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.native_status","typeLabel":"integer | null"},"native_message":{"oneOf":[{"type":"string","maxLength":4096,"description":"The provider's own error message when it answered with an HTTP 4xx refusal (for example a plan limit); null otherwise. Capped at 512 characters, with whitespace collapsed. Credential secrets and token-shaped strings are removed before return. The literal `[redacted]` marker is used when all credential secret fields are at least 12 characters; legacy saved secrets shorter than 12 characters are removed without the marker.","uniqueKey":"error.native_message.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":4096,"description":"The provider's own error message when it answered with an HTTP 4xx refusal (for example a plan limit); null otherwise. Capped at 512 characters, with whitespace collapsed. Credential secrets and token-shaped strings are removed before return. The literal `[redacted]` marker is used when all credential secret fields are at least 12 characters; legacy saved secrets shorter than 12 characters are removed without the marker.","uniqueKey":"error.native_message.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.native_message","typeLabel":"string | null"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"\u003cstring>","message":"\u003cstring>","request_id":"\u003cstring>","outcome":"not_started","retry":"safe","retry_after_seconds":1,"details":{"selection_version":1,"considered":1,"excluded":[{"provider":"\u003cstring>"}],"closest":{},"nearest":[{}],"requirement":"\u003cstring>","purchase_id":"\u003cstring>","preview":{"unused":1,"held_excluded":1,"fee":1,"principal":1,"tax":1,"total":1,"card":{"brand":"\u003cstring>","last4":"\u003cstring>","type":"card","email":"jsmith@example.com"}},"quote":{"amount":2,"tax":1,"total":2,"address_required":true,"fee_minor":1,"missing":["\u003cstring>"]},"redemption":{"code":"\u003cstring>","amount_nanodollars":"\u003cstring>","description":"\u003cstring>","redeemed_at":"2023-11-07T05:31:56Z"},"scope":"workspace","period":"total","limit_nanodollars":2,"requested_nanodollars":2,"sign_in_method":"\u003cstring>","masked_email":"\u003cstring>","failure_reason":"\u003cstring>","names":["\u003cstring>"],"fields":["preferences.order"],"volume_id":"\u003cstring>","writer_sandbox_id":"\u003cstring>","checkpoint":2,"limit_bytes":1,"observed_bytes":1,"mismatch":{"field":"image","recorded":"\u003cstring>","requested":"\u003cstring>"},"volume_phase":"check","phase":"code","command":"\u003cstring>","exit_code":123,"stderr_tail":"\u003cstring>","stdout_tail":"\u003cstring>","agent":"\u003cstring>","port":32768,"revoked":true,"preview_id":"\u003cstring>","url":"\u003cstring>"},"doc_url":"\u003cstring>","fix":"\u003cstring>","operation_id":"\u003cstring>","provider":"\u003cstring>","native_code":"\u003cstring>","native_status":123,"native_message":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"dd0c83e6-beb9-482e-9a5d-60b9e86012e1":{"BoxRouterKey":{"type":"http","scheme":"bearer","description":"BoxRouter API key; never an upstream provider key.","scopes":[],"schemeName":"BoxRouterKey"}},"3a6c0149-9909-4d75-82ec-be6787165396":{"BrowserSession":{"type":"apiKey","in":"cookie","name":"__Host-boxrouter_session","description":"HttpOnly server-side session. Local HTTP uses boxrouter_session. Browser mutations require the session CSRF token and the configured Origin; execution API keys cannot administer sessions or customer keys.","scopes":[],"schemeName":"BrowserSession"}}},"servers":{"38340c0e-1365-48ce-8dcd-74c64a2f69dc":{"url":"https://api.boxrouter.ai/api/v1"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","description":"BoxRouter API key; never an upstream provider key.","scopes":[],"schemeName":"BoxRouterKey"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"BoxRouter API key; never an upstream provider key.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"BoxRouterKey","name":"Authorization"}],"title":"BoxRouterKey"},{"schemes":[{"scheme":{"type":"apiKey","in":"cookie","name":"__Host-boxrouter_session","description":"HttpOnly server-side session. Local HTTP uses boxrouter_session. Browser mutations require the session CSRF token and the configured Origin; execution API keys cannot administer sessions or customer keys.","scopes":[],"schemeName":"BrowserSession"},"schema":{"title":"__Host-boxrouter_session","type":"string","description":"HttpOnly server-side session. Local HTTP uses boxrouter_session. Browser mutations require the session CSRF token and the configured Origin; execution API keys cannot administer sessions or customer keys.","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"BrowserSession","name":"__Host-boxrouter_session"}],"title":"BrowserSession"}]},"originalFileLocation":"openapi.json"},"subdomain":"nv-4965711d","siteName":"BoxRouter","title":"Destroy a Sandbox - BoxRouter","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-14T04:28:52.980Z","originalFileLocation":"reference/destroy.md"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"dark\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"You can rely on: - Never deletes another generation of the sandbox. - Returns once accepted: 204 when confirmed, else 202 with an operation that completes lifecycle work; GET /operations/{id} reports completion. - While a destroy is unresolved, a repeated destroy is accepted as the same pending operation and makes no second provider call; once the destroy is confirmed, a repeat returns 204 with no body. You can set: nothing. Not promised: how long teardown takes; that the sandbox is already absent from listings on return. Requests destruction on the original upstream account, including persistent sandbox storage where the provider\u0026#x27;s destroy operation removes it. Separately owned volumes are not deleted. DELETE returns once the provider accepts the destroy, always as 202 with the sandbox: state is destroyed when the provider confirmed within the request and destroying while lifecycle work remains, and operation_id is set while work remains. BoxRouter finishes an accepted destroy without the caller. GET /operations/{operation_id} reports the operation\u0026#x27;s outcome; for an accepted destroy this includes any remaining stop, final usage, and deletion work. A repeat DELETE while destruction is unresolved returns 202 with the existing operation_id and makes no second provider call. Once destruction is confirmed, repeat DELETEs return 202 with the destroyed sandbox and no operation_id. Unknown or unowned sandbox IDs return 404.\">\u003cmeta data-mint-head name=\"application-name\" content=\"BoxRouter\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/docs/mintlify-assets/_mintlify/favicons/nv-4965711d/q9ftyRpgQlu0T30E/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/docs/mintlify-assets/_mintlify/favicons/nv-4965711d/q9ftyRpgQlu0T30E/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/docs/mintlify-assets/_mintlify/favicons/nv-4965711d/q9ftyRpgQlu0T30E/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/docs/mintlify-assets/_mintlify/favicons/nv-4965711d/q9ftyRpgQlu0T30E/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/docs/mintlify-assets/_mintlify/favicons/nv-4965711d/q9ftyRpgQlu0T30E/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/docs/mintlify-assets/_mintlify/favicons/nv-4965711d/q9ftyRpgQlu0T30E/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/docs/mintlify-assets/_mintlify/favicons/nv-4965711d/q9ftyRpgQlu0T30E/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/docs/mintlify-assets/_mintlify/favicons/nv-4965711d/q9ftyRpgQlu0T30E/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/docs/mintlify-assets/_mintlify/favicons/nv-4965711d/q9ftyRpgQlu0T30E/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Destroy a Sandbox - BoxRouter\">\u003cmeta data-mint-head property=\"og:description\" content=\"You can rely on: - Never deletes another generation of the sandbox. - Returns once accepted: 204 when confirmed, else 202 with an operation that completes lifecycle work; GET /operations/{id} reports completion. - While a destroy is unresolved, a repeated destroy is accepted as the same pending operation and makes no second provider call; once the destroy is confirmed, a repeat returns 204 with no body. You can set: nothing. Not promised: how long teardown takes; that the sandbox is already absent from listings on return. Requests destruction on the original upstream account, including persistent sandbox storage where the provider\u0026#x27;s destroy operation removes it. Separately owned volumes are not deleted. DELETE returns once the provider accepts the destroy, always as 202 with the sandbox: state is destroyed when the provider confirmed within the request and destroying while lifecycle work remains, and operation_id is set while work remains. BoxRouter finishes an accepted destroy without the caller. GET /operations/{operation_id} reports the operation\u0026#x27;s outcome; for an accepted destroy this includes any remaining stop, final usage, and deletion work. A repeat DELETE while destruction is unresolved returns 202 with the existing operation_id and makes no second provider call. Once destruction is confirmed, repeat DELETEs return 202 with the destroyed sandbox and no operation_id. Unknown or unowned sandbox IDs return 404.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"BoxRouter\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://boxrouter.ai/docs/reference/destroy\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://nv-4965711d.mintlify.site/docs/_mintlify/api/og/v2?division=Sandboxes\u0026amp;title=Destroy+a+Sandbox\u0026amp;description=You+can+rely+on%3A%0A-+Never+deletes+another+generation+of+the+sandbox.%0A-+Returns+once+accepted%3A+204+when+confirmed%2C+else+202+with+an+operation+that+completes+lifec\u0026amp;theme=231fc68973f7c9fcdf02f0c3\u0026amp;signature=f328186f0983e0977d15e74581e7ed4d1adadb269577a4d929658a61de09f985\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Destroy a Sandbox - BoxRouter\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"You can rely on: - Never deletes another generation of the sandbox. - Returns once accepted: 204 when confirmed, else 202 with an operation that completes lifecycle work; GET /operations/{id} reports completion. - While a destroy is unresolved, a repeated destroy is accepted as the same pending operation and makes no second provider call; once the destroy is confirmed, a repeat returns 204 with no body. You can set: nothing. Not promised: how long teardown takes; that the sandbox is already absent from listings on return. Requests destruction on the original upstream account, including persistent sandbox storage where the provider\u0026#x27;s destroy operation removes it. Separately owned volumes are not deleted. DELETE returns once the provider accepts the destroy, always as 202 with the sandbox: state is destroyed when the provider confirmed within the request and destroying while lifecycle work remains, and operation_id is set while work remains. BoxRouter finishes an accepted destroy without the caller. GET /operations/{operation_id} reports the operation\u0026#x27;s outcome; for an accepted destroy this includes any remaining stop, final usage, and deletion work. A repeat DELETE while destruction is unresolved returns 202 with the existing operation_id and makes no second provider call. Once destruction is confirmed, repeat DELETEs return 202 with the destroyed sandbox and no operation_id. Unknown or unowned sandbox IDs return 404.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://nv-4965711d.mintlify.site/docs/_mintlify/api/og/v2?division=Sandboxes\u0026amp;title=Destroy+a+Sandbox\u0026amp;description=You+can+rely+on%3A%0A-+Never+deletes+another+generation+of+the+sandbox.%0A-+Returns+once+accepted%3A+204+when+confirmed%2C+else+202+with+an+operation+that+completes+lifec\u0026amp;theme=231fc68973f7c9fcdf02f0c3\u0026amp;signature=f328186f0983e0977d15e74581e7ed4d1adadb269577a4d929658a61de09f985\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/docs/mintlify-assets/_mintlify/favicons/nv-4965711d/q9ftyRpgQlu0T30E/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"BoxRouter\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#047857\">\u003clink data-mint-head rel=\"canonical\" href=\"https://boxrouter.ai/docs/reference/destroy\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/docs/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/docs/reference/destroy.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://boxrouter.ai/#organization\",\"name\":\"BoxRouter\",\"url\":\"https://boxrouter.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/nv-4965711d/xqQLsJs3vPQQ6w_V/brand-mark.svg?fit=max\u0026auto=format\u0026n=xqQLsJs3vPQQ6w_V\u0026q=85\u0026s=34456eec220b466fd4503f478e120e5b\"}},{\"@type\":\"WebSite\",\"@id\":\"https://boxrouter.ai/docs#website\",\"name\":\"BoxRouter\",\"url\":\"https://boxrouter.ai/docs\",\"publisher\":{\"@id\":\"https://boxrouter.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://boxrouter.ai/docs/reference/destroy#webpage\",\"url\":\"https://boxrouter.ai/docs/reference/destroy\",\"name\":\"Destroy a Sandbox\",\"description\":\"You can rely on: - Never deletes another generation of the sandbox. - Returns once accepted: 204 when confirmed, else 202 with an operation that completes lifecycle work; GET /operations/{id} reports completion. - While a destroy is unresolved, a repeated destroy is accepted as the same pending operation and makes no second provider call; once the destroy is confirmed, a repeat returns 204 with no body. You can set: nothing. Not promised: how long teardown takes; that the sandbox is already absent from listings on return. Requests destruction on the original upstream account, including persistent sandbox storage where the provider's destroy operation removes it. Separately owned volumes are not deleted. DELETE returns once the provider accepts the destroy, always as 202 with the sandbox: state is destroyed when the provider confirmed within the request and destroying while lifecycle work remains, and operation_id is set while work remains. BoxRouter finishes an accepted destroy without the caller. GET /operations/{operation_id} reports the operation's outcome; for an accepted destroy this includes any remaining stop, final usage, and deletion work. A repeat DELETE while destruction is unresolved returns 202 with the existing operation_id and makes no second provider call. Once destruction is confirmed, repeat DELETEs return 202 with the destroyed sandbox and no operation_id. Unknown or unowned sandbox IDs return 404.\",\"dateModified\":\"2026-11-14T04:28:52.980Z\",\"isPartOf\":{\"@id\":\"https://boxrouter.ai/docs#website\"},\"breadcrumb\":{\"@id\":\"https://boxrouter.ai/docs/reference/destroy#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://boxrouter.ai/docs/reference/destroy#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Sandboxes\",\"item\":\"https://boxrouter.ai/docs/reference/create\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Destroy a Sandbox\",\"item\":\"https://boxrouter.ai/docs/reference/destroy\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://boxrouter.ai/docs/reference/destroy#apireference\",\"headline\":\"Destroy a Sandbox\",\"name\":\"Destroy a Sandbox\",\"description\":\"You can rely on: - Never deletes another generation of the sandbox. - Returns once accepted: 204 when confirmed, else 202 with an operation that completes lifecycle work; GET /operations/{id} reports completion. - While a destroy is unresolved, a repeated destroy is accepted as the same pending operation and makes no second provider call; once the destroy is confirmed, a repeat returns 204 with no body. You can set: nothing. Not promised: how long teardown takes; that the sandbox is already absent from listings on return. Requests destruction on the original upstream account, including persistent sandbox storage where the provider's destroy operation removes it. Separately owned volumes are not deleted. DELETE returns once the provider accepts the destroy, always as 202 with the sandbox: state is destroyed when the provider confirmed within the request and destroying while lifecycle work remains, and operation_id is set while work remains. BoxRouter finishes an accepted destroy without the caller. GET /operations/{operation_id} reports the operation's outcome; for an accepted destroy this includes any remaining stop, final usage, and deletion work. A repeat DELETE while destruction is unresolved returns 202 with the existing operation_id and makes no second provider call. Once destruction is confirmed, repeat DELETEs return 202 with the destroyed sandbox and no operation_id. Unknown or unowned sandbox IDs return 404.\",\"url\":\"https://boxrouter.ai/docs/reference/destroy\",\"mainEntityOfPage\":{\"@id\":\"https://boxrouter.ai/docs/reference/destroy#webpage\"},\"dateModified\":\"2026-11-14T04:28:52.980Z\",\"publisher\":{\"@id\":\"https://boxrouter.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://boxrouter.ai/docs#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"BoxRouter\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"BoxRouter\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/docs/reference/destroy.md","siteName":"BoxRouter","nav":{"global":null,"tabs":[{"tab":"Guides","pages":[{"title":"Guides","href":""}]},{"tab":"Agents","pages":[{"title":"Agents","href":"/launch/quickstart"}]},{"tab":"GitHub Actions","pages":[{"title":"GitHub Actions","href":"/actions/quickstart"}]},{"tab":"API Reference","groups":[{"group":"Overview","pages":[{"title":"Call the BoxRouter API","sidebarTitle":"Overview","href":"/api-overview"},{"title":"Error Codes","href":"/error-codes"}]},{"group":"Sandboxes","pages":[{"title":"Create a Sandbox","openapi":"openapi.json POST /sandboxes","href":"/reference/create"},{"title":"List Workspace Sandboxes","openapi":"openapi.json GET /sandboxes","href":"/reference/list-sandboxes"},{"title":"Get a Sandbox","openapi":"openapi.json GET /sandboxes/{sandbox_id}","description":"You can rely on:\n- Returns a handle for the id, or not_found.\n\nYou can set: sandbox id.\n\nReturns the sandbox with its current state, checked with the provider, without resuming it.\n`observed_at` is when the provider was checked. `state_recorded_at` is when BoxRouter last\nrecorded the state it returns; it is null if a concurrent change replaced the state during\nthe read. `origin` says what created the sandbox and stays readable after the sandbox ends or\nis removed, even when the provider can no longer be checked.\n","href":"/reference/get"},{"title":"Destroy a Sandbox","openapi":"openapi.json DELETE /sandboxes/{sandbox_id}","href":"/reference/destroy"},{"title":"Explain Routing without Creating","openapi":"openapi.json POST /sandboxes/match","description":"You can rely on:\n- Evaluates the body exactly as create would and returns the routes create would try, in order, without provisioning, reserving or recording anything.\n\nYou can set: creation body.\n\nNot promised: that a later create finds the same routes eligible.\n\nEach eligible route carries the contract it would grant, every excluded route the\nchecks it failed, and the nearest changes are listed; a later creation checks again.\nA workspace with nothing to match against, that is no provider keys and no credits,\nor a `preferences.only` pin on a provider the workspace has not connected, answers 409 no_eligible_route with the same fix\nPOST /sandboxes gives, because a dry run answers what the creation it stands for\nwould.\n","href":"/reference/match"},{"title":"Prove a Headless Chromium in the Sandbox","openapi":"openapi.json POST /sandboxes/{sandbox_id}/browser","href":"/reference/ensure-browser"},{"title":"Pause a Sandbox and Keep It","openapi":"openapi.json POST /sandboxes/{sandbox_id}/pause","href":"/reference/pause-sandbox"},{"title":"Resume the Same Paused Sandbox","openapi":"openapi.json POST /sandboxes/{sandbox_id}/resume","href":"/reference/resume-sandbox"},{"title":"Extend a Sandbox Lifetime","openapi":"openapi.json POST /sandboxes/{sandbox_id}/lifetime","href":"/reference/extend-sandbox-lifetime"},{"title":"Change a Running Sandbox's Outbound Network Policy","openapi":"openapi.json POST /sandboxes/{sandbox_id}/network-policy","href":"/reference/update-network-policy"}]},{"group":"Commands","pages":[{"title":"Run a Buffered Command","openapi":"openapi.json POST /sandboxes/{sandbox_id}/commands","href":"/reference/exec"}]},{"group":"Processes","pages":[{"title":"Start a Durable Background Command","openapi":"openapi.json POST /sandboxes/{sandbox_id}/processes","href":"/reference/process-start"},{"title":"Read Process Output from Byte Offsets","openapi":"openapi.json GET /sandboxes/{sandbox_id}/processes/{process_id}","href":"/reference/read-process"},{"title":"Delete a Finished Process's Retained Output","openapi":"openapi.json DELETE /sandboxes/{sandbox_id}/processes/{process_id}","href":"/reference/remove-process"},{"title":"Write Process Input","openapi":"openapi.json POST /sandboxes/{sandbox_id}/processes/{process_id}/stdin","href":"/reference/process-stdin"},{"title":"Send Stdin EOF","openapi":"openapi.json POST /sandboxes/{sandbox_id}/processes/{process_id}/stdin/close","href":"/reference/process-stdin-close"},{"title":"Cancel a Durable Process","openapi":"openapi.json POST /sandboxes/{sandbox_id}/processes/{process_id}/cancel","href":"/reference/process-cancel"}]},{"group":"Files","pages":[{"title":"Read Exact File Bytes","openapi":"openapi.json GET /sandboxes/{sandbox_id}/files/content","href":"/reference/read"},{"title":"Write Exact File Bytes","openapi":"openapi.json PUT /sandboxes/{sandbox_id}/files/content","href":"/reference/write"},{"title":"Create a Sandbox File Upload","openapi":"openapi.json POST /sandboxes/{sandbox_id}/files/uploads","href":"/reference/create-sandbox-upload"},{"title":"Complete a Sandbox File Upload","openapi":"openapi.json POST /sandboxes/{sandbox_id}/files/uploads/{upload_id}/complete","href":"/reference/complete-sandbox-upload"},{"title":"Abort a Sandbox File Upload","openapi":"openapi.json DELETE /sandboxes/{sandbox_id}/files/uploads/{upload_id}","href":"/reference/abort-sandbox-upload"},{"title":"Create a Sandbox File Download","openapi":"openapi.json POST /sandboxes/{sandbox_id}/files/downloads","href":"/reference/create-sandbox-download"},{"title":"List the Immediate Entries of a Directory","openapi":"openapi.json GET /sandboxes/{sandbox_id}/files/directories","href":"/reference/list-directory"},{"title":"Create a Directory","openapi":"openapi.json POST /sandboxes/{sandbox_id}/files/directories","href":"/reference/create-directory"},{"title":"Check for an Accessible Filesystem Target","openapi":"openapi.json GET /sandboxes/{sandbox_id}/files/exists","href":"/reference/path-exists"},{"title":"Remove a File, Symbolic Link or Directory","openapi":"openapi.json POST /sandboxes/{sandbox_id}/files/remove","href":"/reference/remove-path"}]},{"group":"Terminals","pages":[{"title":"Open a Terminal","openapi":"openapi.json POST /sandboxes/{sandbox_id}/terminals","href":"/reference/open-terminal"},{"title":"Get Observed Terminal State","openapi":"openapi.json GET /sandboxes/{sandbox_id}/terminals/{terminal_id}","href":"/reference/get-terminal"},{"title":"Stream Terminal Output and Its End","openapi":"openapi.json GET /sandboxes/{sandbox_id}/terminals/{terminal_id}/events","href":"/reference/stream-terminal-events"},{"title":"Write Terminal Input","openapi":"openapi.json POST /sandboxes/{sandbox_id}/terminals/{terminal_id}/input","href":"/reference/write-terminal-input"},{"title":"Resize the Terminal Window","openapi":"openapi.json POST /sandboxes/{sandbox_id}/terminals/{terminal_id}/resize","href":"/reference/resize-terminal"},{"title":"Hang up the Terminal without Destroying Its Sandbox","openapi":"openapi.json POST /sandboxes/{sandbox_id}/terminals/{terminal_id}/kill","href":"/reference/kill-terminal"}]},{"group":"Previews","pages":[{"title":"List a Sandbox's Open Previews","openapi":"openapi.json GET /sandboxes/{sandbox_id}/previews","href":"/reference/list-previews"},{"title":"Get a URL for a Sandbox Port","openapi":"openapi.json POST /sandboxes/{sandbox_id}/previews","href":"/reference/open-preview"},{"title":"Revoke a Preview","openapi":"openapi.json DELETE /sandboxes/{sandbox_id}/previews/{preview_id}","href":"/reference/revoke-preview"}]},{"group":"Volumes","pages":[{"title":"List Volumes","openapi":"openapi.json GET /volumes","href":"/reference/list-volumes"},{"title":"Create a Volume","openapi":"openapi.json POST /volumes","href":"/reference/create-volume"},{"title":"Get a Volume","openapi":"openapi.json GET /volumes/{volume_id}","href":"/reference/get-volume"},{"title":"Delete a Volume and Its Checkpoints","openapi":"openapi.json DELETE /volumes/{volume_id}","href":"/reference/delete-volume"},{"title":"List Volume Checkpoints","openapi":"openapi.json GET /volumes/{volume_id}/checkpoints","href":"/reference/list-volume-checkpoints"},{"title":"Save a Volume Checkpoint","openapi":"openapi.json POST /volumes/{volume_id}/checkpoints","href":"/reference/save-volume"},{"title":"Get a Volume Checkpoint","openapi":"openapi.json GET /volumes/{volume_id}/checkpoints/{checkpoint}","href":"/reference/get-volume-checkpoint"},{"title":"Delete a Checkpoint","openapi":"openapi.json DELETE /volumes/{volume_id}/checkpoints/{checkpoint}","href":"/reference/delete-volume-checkpoint"},{"title":"Release a Volume's Writer Lease","openapi":"openapi.json DELETE /volumes/{volume_id}/lease","href":"/reference/release-volume-lease"},{"title":"Create a Volume File Upload","openapi":"openapi.json POST /volumes/{volume_id}/uploads","href":"/reference/create-volume-upload"},{"title":"Complete a Volume File Upload","openapi":"openapi.json POST /volumes/{volume_id}/uploads/{upload_id}/complete","href":"/reference/complete-volume-upload"},{"title":"Abort a Volume File Upload","openapi":"openapi.json DELETE /volumes/{volume_id}/uploads/{upload_id}","href":"/reference/abort-volume-upload"},{"title":"Create a Volume File Download","openapi":"openapi.json POST /volumes/{volume_id}/downloads","href":"/reference/create-volume-download"},{"title":"List Files in a Volume","openapi":"openapi.json GET /volumes/{volume_id}/files","href":"/reference/list-volume-files"},{"title":"Delete a Volume File","openapi":"openapi.json DELETE /volumes/{volume_id}/files","href":"/reference/delete-volume-file"}]},{"group":"Images","pages":[{"title":"Prepare an Image on Selected Providers","openapi":"openapi.json POST /images/prepare","href":"/reference/prepare-image"},{"title":"Read Image Preparation Status","openapi":"openapi.json GET /images/preparations","href":"/reference/get-image-preparations"},{"title":"Remove This Workspace's Prepared Image Copies","openapi":"openapi.json POST /images/unprepare","href":"/reference/unprepare-image"}]},{"group":"Operations","pages":[{"title":"List Recorded Workspace Operations","openapi":"openapi.json GET /operations","href":"/reference/list-operations"},{"title":"Get a Mutation's Known Outcome","openapi":"openapi.json GET /operations/{operation_id}","href":"/reference/operation"}]},{"group":"Routing Settings","pages":[{"title":"Read Workspace Routing and Provider Funding","openapi":"openapi.json GET /routing/settings","href":"/reference/get-routing-settings"},{"title":"Update One Workspace Routing Section","openapi":"openapi.json PUT /routing/settings","href":"/reference/update-routing-settings"},{"title":"Preview Workspace Route Availability without Dispatch","openapi":"openapi.json GET /routing/preview","href":"/reference/get-routing-preview"}]},{"group":"Providers","pages":[{"title":"List Available Provider Routes","openapi":"openapi.json GET /providers","href":"/reference/list-providers"}]},{"group":"Price Versions","pages":[{"title":"List the Providers' Live Price Versions","openapi":"openapi.json GET /price-versions","href":"/reference/list-price-versions"}]},{"group":"Agent Catalog","pages":[{"title":"List Launch Agents","openapi":"openapi.json GET /agents","href":"/reference/agents-list"},{"title":"Get a Launch Agent Manifest","openapi":"openapi.json GET /agents/{name}","href":"/reference/agents-get"}]},{"group":"Agent Launches","pages":[{"title":"Create an Agent Launch","openapi":"openapi.json POST /launches","href":"/reference/launch-create"},{"title":"Get Launch Status and Phase Progress","openapi":"openapi.json GET /launches/{operation_id}","href":"/reference/get-launch-operation"},{"title":"Get What a Launch Asked For","openapi":"openapi.json GET /launches/{operation_id}/settings","href":"/reference/get-launch-settings"},{"title":"Get Unattended Command State","openapi":"openapi.json GET /launches/{operation_id}/command","href":"/reference/get-launch-command"},{"title":"Check Whether This Workspace Can Read a Repository","openapi":"openapi.json GET /repositories/{owner}/{repo}/access","href":"/reference/check-repository-access"}]},{"group":"Launch Runs","pages":[{"title":"List Launch Runs","openapi":"openapi.json GET /launch-runs","href":"/reference/list-launch-runs"},{"title":"Start an Unattended Launch Run","openapi":"openapi.json POST /launch-runs","href":"/reference/create-launch-run"},{"title":"Read Launch Run Metadata","openapi":"openapi.json GET /launch-runs/{run_id}","href":"/reference/get-launch-run"},{"title":"Stop a Launch Run","openapi":"openapi.json POST /launch-runs/{run_id}/stop","href":"/reference/stop-launch-run"},{"title":"Destroy One Launch-Run Copy","openapi":"openapi.json POST /launch-runs/{run_id}/copies/{copy_index}/destroy","href":"/reference/destroy-launch-run-copy"}]},{"group":"Workspace Secrets","pages":[{"title":"List Workspace Secret Names","openapi":"openapi.json GET /secrets","href":"/reference/secrets-list"},{"title":"Store a Workspace Secret","openapi":"openapi.json PUT /secrets/{name}","href":"/reference/secrets-put"},{"title":"Delete a Workspace Secret","openapi":"openapi.json DELETE /secrets/{name}","href":"/reference/secrets-delete"}]},{"group":"Artifacts","pages":[{"title":"Upload a Staged Input","openapi":"openapi.json POST /artifacts","href":"/reference/upload-artifact"},{"title":"Inspect a Staged Artifact","openapi":"openapi.json GET /artifacts/{artifact_id}","href":"/reference/get-artifact"},{"title":"Remove a Staged Artifact","openapi":"openapi.json DELETE /artifacts/{artifact_id}","href":"/reference/delete-artifact"}]},{"group":"GitHub","pages":[{"title":"List GitHub App Installations Linked to This Workspace","openapi":"openapi.json GET /github/installations","href":"/reference/list-github-installations"},{"title":"Unlink a GitHub App Installation from This Workspace","openapi":"openapi.json DELETE /github/installations/{installation_id}","href":"/reference/unlink-github-installation"},{"title":"List Repositories Visible through a Linked Installation","openapi":"openapi.json GET /github/repositories","href":"/reference/list-github-repositories"}]},{"group":"GitHub Actions","pages":[{"title":"Batch Actions Enablement and Defaults for the Given Repositories","openapi":"openapi.json GET /actions/repositories","href":"/reference/list-actions-repositories"},{"title":"Get Actions Enablement and Defaults for a Repository","openapi":"openapi.json GET /actions/repositories/{repository_id}","href":"/reference/get-actions-repository"},{"title":"Enable or Update Actions Defaults for a Repository","openapi":"openapi.json PUT /actions/repositories/{repository_id}","href":"/reference/update-actions-repository"},{"title":"Read Actions Runner and Workspace Funding Readiness","openapi":"openapi.json GET /actions/readiness","href":"/reference/get-actions-readiness"},{"title":"Read the Recommended Actions Runner Labels and Resource Floors","openapi":"openapi.json GET /actions/runner-catalog","href":"/reference/get-actions-runner-catalog"},{"title":"List Workspace Actions Policies","openapi":"openapi.json GET /actions/policies","href":"/reference/list-actions-policies"},{"title":"Create a Named Workspace Actions Policy","openapi":"openapi.json POST /actions/policies","href":"/reference/create-actions-policy"},{"title":"Get a Workspace Actions Policy","openapi":"openapi.json GET /actions/policies/{policy_id}","href":"/reference/get-actions-policy"},{"title":"Replace a Workspace Actions Policy","openapi":"openapi.json PUT /actions/policies/{policy_id}","href":"/reference/update-actions-policy"},{"title":"Delete an Unused Workspace Actions Policy","openapi":"openapi.json DELETE /actions/policies/{policy_id}","href":"/reference/delete-actions-policy"},{"title":"Preview Actions Label and Policy Eligibility","openapi":"openapi.json POST /actions/preview","href":"/reference/preview-actions"},{"title":"List Workspace Actions Workflow-Run Projections","openapi":"openapi.json GET /actions/runs","href":"/reference/list-actions-runs"},{"title":"Count the Values Each Run Filter Offers","openapi":"openapi.json GET /actions/runs/facets","href":"/reference/list-actions-run-facets"},{"title":"Get the Billed Time of Runners That Served No Job","openapi":"openapi.json GET /actions/pool-idle-time","href":"/reference/get-actions-pool-idle-time"},{"title":"Get a Workflow-Run Projection and Aggregate Billing Evidence","openapi":"openapi.json GET /actions/runs/{run_id}","href":"/reference/get-actions-run"},{"title":"List GitHub Jobs Projected for a Workflow Run","openapi":"openapi.json GET /actions/runs/{run_id}/jobs","href":"/reference/list-actions-run-jobs"},{"title":"List Placements Attempted for a Workflow Run","openapi":"openapi.json GET /actions/runs/{run_id}/placements","href":"/reference/list-actions-run-placements"},{"title":"Get an Actions Job Projection","openapi":"openapi.json GET /actions/jobs/{job_id}","href":"/reference/get-actions-job"},{"title":"Get GitHub Workflow Steps for an Actions Job","openapi":"openapi.json GET /actions/jobs/{job_id}/steps","href":"/reference/get-actions-job-steps"},{"title":"Read a Bounded Prefix of the Selected GitHub Job Log","openapi":"openapi.json GET /actions/jobs/{job_id}/logs","href":"/reference/get-actions-job-logs"},{"title":"Read a Bounded Prefix of One GitHub Step Log","openapi":"openapi.json GET /actions/jobs/{job_id}/steps/{step_position}/logs","href":"/reference/get-actions-job-step-logs"},{"title":"List Actions Step Events for a Job","openapi":"openapi.json GET /actions/jobs/{job_id}/events","href":"/reference/get-actions-job-events"},{"title":"Get an Actions Placement and Its Cost and Cleanup Evidence","openapi":"openapi.json GET /actions/placements/{placement_id}","href":"/reference/get-actions-placement"},{"title":"Ask GitHub to Cancel the Entire Workflow Run","openapi":"openapi.json POST /actions/runs/{run_id}/cancel","href":"/reference/cancel-actions-run"},{"title":"Ask GitHub to Rerun the Entire Workflow","openapi":"openapi.json POST /actions/runs/{run_id}/rerun","href":"/reference/rerun-actions-run"},{"title":"Ask GitHub to Rerun Failed Jobs and Their Dependents","openapi":"openapi.json POST /actions/runs/{run_id}/rerun-failed-jobs","href":"/reference/rerun-actions-run-failed-jobs"}]},{"group":"Provider Accounts","pages":[{"title":"Connect a Provider Account","openapi":"openapi.json POST /provider-accounts","href":"/reference/connect-provider-account"},{"title":"List Connected Accounts","openapi":"openapi.json GET /provider-accounts","href":"/reference/list-provider-accounts"},{"title":"Test Provider Credentials without Saving Them","openapi":"openapi.json POST /provider-accounts/test","href":"/reference/test-provider-credentials"},{"title":"Get Connected-Account Metadata","openapi":"openapi.json GET /provider-accounts/{account_id}","href":"/reference/get-provider-account"},{"title":"Remove a Connected Account","openapi":"openapi.json DELETE /provider-accounts/{account_id}","href":"/reference/disconnect-provider-account"},{"title":"Rotate a Connected Account's Credentials","openapi":"openapi.json PUT /provider-accounts/{account_id}/credentials","href":"/reference/replace-provider-credentials"},{"title":"Test a Saved Provider Account","openapi":"openapi.json POST /provider-accounts/{account_id}/test","href":"/reference/test-provider-account"},{"title":"Run the Standard Image Setup Proof","openapi":"openapi.json POST /provider-accounts/{account_id}/standard-image/setup","href":"/reference/setup-provider-standard-image"}]},{"group":"Credits and Billing","pages":[{"title":"Get the Workspace Credit Balance","openapi":"openapi.json GET /credits","href":"/reference/get-credits"},{"title":"Start a Credit Purchase through Checkout or a Saved Card","openapi":"openapi.json POST /credits/purchases","href":"/reference/create-credit-purchase"},{"title":"List Recent Credit Purchases","openapi":"openapi.json GET /credits/purchases","href":"/reference/list-credit-purchases"},{"title":"Preview a Credit Purchase and Its Tax","openapi":"openapi.json POST /credits/purchases/quote","href":"/reference/quote-credit-purchase"},{"title":"List Managed-Compute Credit Movements","openapi":"openapi.json GET /credits/usage","href":"/reference/list-credit-usage"},{"title":"List Grouped Managed and BYOK Sandbox Usage","openapi":"openapi.json GET /usage","href":"/reference/list-usage-report"},{"title":"Export Grouped Managed and BYOK Sandbox Usage as CSV","openapi":"openapi.json GET /usage.csv","href":"/reference/export-usage-report-csv"},{"title":"Get One Credit Purchase","openapi":"openapi.json GET /credits/purchases/{purchase_id}","href":"/reference/get-credit-purchase"},{"title":"Close an Unpaid Checkout Session","openapi":"openapi.json POST /credits/purchases/{purchase_id}/cancel","href":"/reference/cancel-credit-purchase"},{"title":"Redeem a Promotion Code for Free Credit","openapi":"openapi.json POST /credits/promotions","href":"/reference/redeem-credit-promotion"},{"title":"List Redeemed Promotion Codes","openapi":"openapi.json GET /credits/promotions","href":"/reference/list-credit-promotions"},{"title":"Get Workspace Billing Details","openapi":"openapi.json GET /credits/billing-details","href":"/reference/get-credit-billing-details"},{"title":"Replace Workspace Billing Details","openapi":"openapi.json PUT /credits/billing-details","href":"/reference/update-credit-billing-details"},{"title":"Get Workspace Credit Alert Settings","openapi":"openapi.json GET /credits/alerts","href":"/reference/get-credit-alerts"},{"title":"Replace Workspace Credit Alert Settings","openapi":"openapi.json PUT /credits/alerts","href":"/reference/update-credit-alerts"},{"title":"List Saved Workspace Payment Methods","openapi":"openapi.json GET /credits/payment-methods","href":"/reference/list-credit-payment-methods"},{"title":"Start Hosted Setup for a Saved Payment Method","openapi":"openapi.json POST /credits/payment-methods/setup","href":"/reference/create-credit-payment-method-setup"},{"title":"Start in-Page Saved Card Setup","openapi":"openapi.json POST /credits/payment-methods/setup-intent","href":"/reference/create-credit-payment-method-setup-intent"},{"title":"Set Saved Card Charge Order","openapi":"openapi.json PUT /credits/payment-methods/order","href":"/reference/reorder-credit-payment-methods"},{"title":"Get a Saved Payment Method Setup Status","openapi":"openapi.json GET /credits/payment-method-setups/{setup_id}","href":"/reference/get-credit-payment-method-setup"},{"title":"Remove a Saved Workspace Payment Method","openapi":"openapi.json DELETE /credits/payment-methods/{payment_method_id}","href":"/reference/delete-credit-payment-method"},{"title":"Set the Workspace's Default Saved Card","openapi":"openapi.json POST /credits/payment-methods/{payment_method_id}/default","href":"/reference/set-credit-default-payment-method"},{"title":"Get Automatic Credit Top-up Settings","openapi":"openapi.json GET /credits/auto-top-up","href":"/reference/get-credit-auto-top-up"},{"title":"Replace Automatic Credit Top-up Settings","openapi":"openapi.json PUT /credits/auto-top-up","href":"/reference/update-credit-auto-top-up"}]},{"group":"Spend Limits","pages":[{"title":"List Managed-Compute Spend Limits","openapi":"openapi.json GET /spend-limits","href":"/reference/list-spend-limits"},{"title":"Set a Managed-Compute Spend Cap","openapi":"openapi.json PUT /spend-limits/{scope}","href":"/reference/set-spend-limit"},{"title":"Clear a Managed-Compute Spend Cap","openapi":"openapi.json DELETE /spend-limits/{scope}","href":"/reference/clear-spend-limit"}]}]}]},"basePath":"","title":"Destroy a Sandbox - BoxRouter","buildId":"dpl_Aw98ji4XvBsgtZwL1VrkUF9ehFqz","deploymentId":"dpl_Aw98ji4XvBsgtZwL1VrkUF9ehFqz","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-CQGbdtm4.js","utils-D88A1f-Z.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-ChqWdz1A.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-yBrxdh_6.js","snippetPresets-BgqDrFJC.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","conditional-requirements-CFM0id0Q.js","ApiExamples-Duxc2rZw.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-C7jidOil.js","shallow-xkjpHm-U.js","getApiPlaygroundDisplay-fE3rVpvL.js","CodeSnippet-LgxljKed.js","CodeSnippets-D-pXWDHq.js","Page-C2-BijcO.js","getPastedJson-CLRcu-uo.js","icon-Cxirpjgo.js","MethodPill-D49eqY5e.js","DuplicateIcon-CivCz5Rp.js","createIcon-D71qL3f5.js","DynamicMarkdown-BcGRTrw6.js","SectionHeading-DzaqmmSD.js","axios-vUo_bRtp.js","Markdown-CZqUYmMp.js","clsx-B6IZIRsp.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-B0ZV6X5T.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-MqLyPtsW.js"]}