Rename, resize (vCPUs, memory, disk) a stopped sandbox, or set its idle pause and metadata.
Synchronous. Absent fields are unchanged. autoSuspendAfterSeconds and metadata apply in any state, also while an operation runs, and do not change revision: metadata replaces the metadata ({} clears it).
name renames the sandbox in any state, also while an operation runs. Its ID, public port URLs and SSH certificates stay the same; the old name stops resolving at once. A name another live sandbox of the org has is 409 operation_conflict. The guest hostname (instabox-<name>) follows at the sandbox’s next start or resume, ~/MACHINE.md at its next start from stopped.
Resizing (persistentDiskGiB) grows a paid sandbox’s disk (/data) up to the plan’s maxDiskGiB (pro 200, builder 500, team and enterprise 1024) and the stored-data limit, and the org must be under that limit (429 quota_exceeded). A free sandbox’s size is fixed (400 spec_not_allowed). An admin can override that per user (diskResize) and, from a signed-in session, grow any sandbox without the limit. Each size is 1-1024 GiB (more is 400 bad_request), and needs no operation in progress (else 409 operation_conflict). The disk (/data) of a running sandbox grows online: no restart, files and processes stay; when it can’t (rare: the sandbox is unreachable or its host is older) it is 409 grow_needs_stop: stop it and send the size again. A stopped sandbox’s disk grows at its next start. It shrinks only while stopped (else 409 operation_conflict) and only when the used data plus 10% (at least 1 GiB) fits (else 409 disk_too_small, nothing changes); the shrink applies at the next start, which keeps the larger size if the data has grown past it by then. The system disk (rootDiskGiB, admins) only grows (a smaller size is 400 bad_request), and only while stopped. Growing either disk needs a template with the root-grow capability (else 400 bad_request); a shrink does not. At create the disks come with the size; this is the way to get bigger ones.
vcpus and memMiB change a paid sandbox’s size to another of its workspace’s sizes (allowedSpecs of GET /v1/orgs/{id}), named as at create: one field picks the one size that matches it, else name both. The sandbox must be stopped with no operation in progress (else 409 operation_conflict); the new size applies at its next start, which boots it fresh (files stay), and running time is rated at the new size from then on. That start’s operation fails, and the sandbox stays stopped at its new size, when its host has no room for the new size (no_capacity) or runs an older node-agent that cannot resize (host_unavailable), both retryable; resize it back or start it later. A size the plan does not offer and the free sandbox are 400 spec_not_allowed in any state (checked before the 409); the same size changes nothing. Admins may give any size within the API’s ranges. As at create, a field it does not know is 400 unknown_field and nothing changes, so diskGiB here is refused.
apply: "restart" lets a running or paused sandbox take a change that needs a stop (vcpus/memMiB, a /data shrink, a system-disk grow, or a grow it can’t do online) instead of the 409: the reply is 202 with one resize operation, under this request’s idempotency key, that stops it (resuming a paused one first; its running processes end), applies the size and starts it again (phases stopping, resizing, booting). The server finishes it even if the caller goes away, so a sandbox can resize itself. When it can’t start at the new size, it starts again at the old one and the operation fails with the reason. A change it can take as it is (a stopped sandbox, an online grow) is the usual 200. GET /v1/meresizeRestart says the server takes it; a server that does not yet answers 400 resize_restart_off. It is checked against the settings this request leaves: maxRunMinutes: 0 with it is 400 max_run_disabled (resize, then set it). The operation boots under the max-run it was accepted with. API keys: needs one of the scopes machines:write.
PATCH
/
v1
/
machines
/
{id}
Rename, resize (vCPUs, memory, disk) a stopped sandbox, or set its idle pause and metadata.
Client-generated key, 1-200 printable ASCII characters, scoped to the
user. Same key and same method+path+body returns the original response;
same key with a different request returns 409 idempotency_conflict.
Records are kept for 7 days.
A body key that is none of these is refused with 400 unknown_field (keys match case-insensitively). The retired lifetime timeout (timeoutSeconds, onTimeout or timeout, any value but null) is 400 unknown_field naming maxRunMinutes and autoSuspendAfterSeconds instead (to an instabox-cli/<version>User-Agent, that the CLI is out of date and the commands instabox max-run, auto-suspend and rm), and nothing changes.
Maximum continuous runtime in minutes. -1 is unlimited; 0 sleeps immediately. Independent of idle auto-pause; whichever condition is reached first pauses the sandbox. Free machines default to 480 and only an admin session can change them. The service manages free runtime and may pause a run earlier. The response reports the current limit from runStartedAt; it can change during the run. Paid machines default to -1 and their users can change this setting. Max-run suspension starts a cooldown, returning 409 machine_cooldown with Retry-After on every wake path. By default it is 5 to 20 minutes (5 plus a random 0 to 15) on a paid plan and for the first such pause in a row on the free plan. Back-to-back pauses on the free plan rest longer (60 to 75, then 120 to 135 minutes): "Longer cooldowns on the free plan" at https://instabox.sh/docs/machines/auto-pause#longer-cooldowns-on-the-free-plan. Once cooldown ends, 0 still refuses wake with 409 max_run_disabled until changed.
Admins only: new root filesystem size in GiB (the template sizes it). From anyone else it is 400 spec_not_allowed; grow the disk with persistentDiskGiB.
New vCPUs of a stopped paid sandbox: with memMiB, one of the workspace's allowedSpecs (alone: the one size with that many vCPUs); 0 or absent: unchanged. Applied at its next start (see the operation). Running is 409 operation_conflict (stop it first), and so is paused (resume it, then stop it); another size, or the free sandbox, is 400 spec_not_allowed.
New disk (/data) size in GiB, 1-1024, up to the plan's maxDiskGiB; 0 or absent: unchanged. Grow: a running box grows online (no restart, processes keep running); if it can't (rare: the box is unreachable or its host is older), 409 grow_needs_stop (stop it and send the size again); a stopped box grows at its next start. Shrink: only while stopped (else 409 operation_conflict), and only when the used data plus 10% (at least 1 GiB) fits; else 409 disk_too_small, with the smallest size that fits in the message, and the box unchanged. Past 1024 is 400 bad_request, and so is growing on a template without the root-grow capability (a shrink needs none); a free box's disk is fixed (400 spec_not_allowed, running or stopped). The Python SDK's machines.resize(m, disk_gib) sends this field.
The plan's rule (AutoSuspendAfterSeconds): a paid sandbox takes 300-1800 in whole minutes, as sent, or 0 (off) where the plan allows always on; below 300, above 1800 or not a multiple of 60 is 400 bad_request; the free sandbox takes only 1800 (else 403 spec_not_allowed), and 0 without always on is 403 spec_not_allowed too. A refused value leaves the setting unchanged; the reply shows the effective value. API keys follow the owner's policy. Separately, with manual lifecycle (GET /v1/me) or an admin sign-in session: 120-86400, or 0 (off). Absent: unchanged.
restart: a running or paused sandbox whose change needs a stop is stopped, resized and started again by one resize operation (202); see the operation. Absent: such a change is 409. Anything else is 400 bad_request.
The running sandbox is paused once it has been idle this many seconds (no agent working, no terminal input or output, little CPU); null: off. Pause, resume, stop and start keep it.
Maximum continuous runtime in minutes. -1 is unlimited; 0 sleeps immediately. Independent of idle auto-pause; whichever condition is reached first pauses the sandbox. Free machines default to 480 and only an admin session can change them. The service manages free runtime and may pause a run earlier. The response reports the current limit from runStartedAt; it can change during the run. Paid machines default to -1 and their users can change this setting. Max-run suspension starts a cooldown, returning 409 machine_cooldown with Retry-After on every wake path. By default it is 5 to 20 minutes (5 plus a random 0 to 15) on a paid plan and for the first such pause in a row on the free plan. Back-to-back pauses on the free plan rest longer (60 to 75, then 120 to 135 minutes): "Longer cooldowns on the free plan" at https://instabox.sh/docs/machines/auto-pause#longer-cooldowns-on-the-free-plan. Once cooldown ends, 0 still refuses wake with 409 max_run_disabled until changed.
All wake paths are refused until this deadline, including admin actions: after a max-run suspension, or the 24-hour lock of an automatic abuse check's pause (cooldownReason).
The Linux user in the sandbox that SSH sessions, exec and the terminal log in as, fixed at create: the guestUser the create named, else user (a create from a snapshot: the snapshot's user). dev on sandboxes from templates without the guest-user capability, and on every sandbox created before the field.
When the sandbox is stopped if it is running (set at creation with archiveSeconds): its files are kept and a start brings it back. Resuming does not clear it; a sandbox that is not running when it passes only has it cleared. Absent: none.
When the sandbox is deleted, whatever its state (set at creation with deleteAfterSeconds). The delete is an ordinary delete operation (trigger: delete_at), queued at deleteAt (within about a second) once no other operation is in progress. Absent: never.
When the running sandbox last became ready (runtime.ready turned true: SSH, exec and files work). For a new sandbox, readyAt minus createdAt is its create time; after a start or resume it is that start's. Absent while the sandbox is not ready, and on a sandbox that was already ready before the field existed (until its next start or resume).
While cooldownUntil has not passed, the automatic abuse check whose pause locks the sandbox, the same as a wake's 409 machine_cooldown Error.reason: abuse_egress_blocklist (it tried to connect to a blocked destination on the egress blocklist, not a DNS lookup), abuse_network_flows (scanning or attack traffic), abuse_cpu (mining). Absent for a max-run cooldown, and once the lock ends.
A free-tier org's sandbox (docs/pricing.md): never billed, pauses after 30 idle minutes (another autoSuspendAfterSeconds is refused with 403). On a paid plan every sandbox is billed.
Set on a stopped or paused free sandbox that cannot be started because its org's early free-sandbox allowance ended and as many free sandboxes as the standard limit allows are running: a start is refused (402 early_allowance_ended) until one is paused or deleted. Absent otherwise.
Processes the sandbox's kernel OOM killer killed since the sandbox was created (out of memory, or a memory cgroup's limit). Read from the sandbox about once a minute while it runs, and after an exec that exits non-zero; 0 on sandboxes whose host or guest agent predates the reading (absent from older servers).
The newest OOM kill (absent until one is seen, or when the kernel log no longer held it).
Show child attributes
Was this page helpful?
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"InstaBox","description":"A Linux machine of its own in the cloud for every agent.","colors":{"primary":"#0A0A0A","light":"#FAFAFA","dark":"#0A0A0A"},"logo":{"light":"https://instacloud.mintlify.site/docs/logo/light.svg","dark":"https://instacloud.mintlify.site/docs/logo/dark.svg","href":"https://instabox.sh"},"favicon":"https://mintlify.s3.us-west-1.amazonaws.com/instacloud/instabox/favicon.svg","appearance":{"default":"dark"},"navbar":{"links":[{"href":"https://instabox.sh/pricing","label":"Pricing"},{"href":"https://instabox.sh/changelog","label":"Changelog"}],"primary":{"type":"button","label":"Dashboard","href":"https://dashboard.instabox.sh"}},"footer":{"socials":{"github":"https://github.com/InsForge"}},"icons":{"library":"lucide"},"contextual":{"options":["copy","view","chatgpt","claude","cursor","vscode","mcp"],"display":"header"},"styling":{"latex":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"instacloud","hasAudioNarration":false,"actualSubdomain":"instacloud","customDomains":["instabox.sh"],"gitSource":{"type":"github","owner":"insforge","repo":"instabox","deployBranch":"main","contentDirectory":"docs-site","isPrivate":true,"mountPath":"instabox","label":"","_id":"6aed4ce60814409ea4a899b5"},"feedback":{"thumbs":true,"contextualFeedback":{"allowEmail":false}},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"REMOVE_BRANDING":{"status":"ENABLED"},"CONTEXTUAL_FEEDBACK":{"status":"ENABLED"},"CODE_SNIPPET_FEEDBACK":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6af24f2490cec7c60d18d067","clientVersion":"0.0.4094","searchFilterCounts":[{"language":"default","tag":"API reference","count":86},{"language":"default","tag":"Documentation","count":34},{"language":"default","tag":"Machines","count":15},{"language":"default","tag":"Use cases","count":9},{"language":"default","tag":"SDK reference","count":8},{"language":"default","tag":"Lifecycle","count":8},{"language":"default","tag":"Secrets","count":7},{"language":"default","tag":"Account","count":6},{"language":"default","tag":"TypeScript","count":6},{"language":"default","tag":"Get started","count":5}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"/docs","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","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":"llms-txt-v2","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":"comment-mode","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/machines/rename-resize-vcpus-memory-disk-a-stopped-sandbox-or-set-its-idle-pause-and-metadata","slug":"/api-reference/machines/rename-resize-vcpus-memory-disk-a-stopped-sandbox-or-set-its-idle-pause-and-metadata","pageMetadata":{"title":"Rename, resize (vCPUs, memory, disk) a stopped sandbox, or set its idle pause and metadata.","description":"Synchronous. Absent fields are unchanged. `autoSuspendAfterSeconds` and `metadata` apply in any state, also while an operation runs, and do not change `revision`: `metadata` replaces the metadata (`{}` clears it).\n`name` renames the sandbox in any state, also while an operation runs. Its ID, public port URLs and SSH certificates stay the same; the old name stops resolving at once. A name another live sandbox of the org has is `409 operation_conflict`. The guest hostname (`instabox-\u003cname>`) follows at the sandbox's next start or resume, `~/MACHINE.md` at its next start from stopped.\nResizing (`persistentDiskGiB`) grows a paid sandbox's disk (`/data`) up to the plan's `maxDiskGiB` (pro 200, builder 500, team and enterprise 1024) and the stored-data limit, and the org must be under that limit (`429 quota_exceeded`). A free sandbox's size is fixed (`400 spec_not_allowed`). An admin can override that per user (`diskResize`) and, from a signed-in session, grow any sandbox without the limit. Each size is 1-1024 GiB (more is `400 bad_request`), and needs no operation in progress (else `409 operation_conflict`). The disk (`/data`) of a running sandbox grows online: no restart, files and processes stay; when it can't (rare: the sandbox is unreachable or its host is older) it is `409 grow_needs_stop`: stop it and send the size again. A stopped sandbox's disk grows at its next start. It shrinks only while stopped (else `409 operation_conflict`) and only when the used data plus 10% (at least 1 GiB) fits (else `409 disk_too_small`, nothing changes); the shrink applies at the next start, which keeps the larger size if the data has grown past it by then. The system disk (`rootDiskGiB`, admins) only grows (a smaller size is `400 bad_request`), and only while stopped. Growing either disk needs a template with the `root-grow` capability (else `400 bad_request`); a shrink does not. At create the disks come with the size; this is the way to get bigger ones.\n`vcpus` and `memMiB` change a paid sandbox's size to another of its workspace's sizes (`allowedSpecs` of `GET /v1/orgs/{id}`), named as at create: one field picks the one size that matches it, else name both. The sandbox must be stopped with no operation in progress (else `409 operation_conflict`); the new size applies at its next start, which boots it fresh (files stay), and running time is rated at the new size from then on. That start's operation fails, and the sandbox stays stopped at its new size, when its host has no room for the new size (`no_capacity`) or runs an older node-agent that cannot resize (`host_unavailable`), both retryable; resize it back or start it later. A size the plan does not offer and the free sandbox are `400 spec_not_allowed` in any state (checked before the 409); the same size changes nothing. Admins may give any size within the API's ranges. As at create, a field it does not know is `400 unknown_field` and nothing changes, so `diskGiB` here is refused.\n`apply: \"restart\"` lets a running or paused sandbox take a change that needs a stop (`vcpus`/`memMiB`, a `/data` shrink, a system-disk grow, or a grow it can't do online) instead of the `409`: the reply is `202` with one `resize` operation, under this request's idempotency key, that stops it (resuming a paused one first; its running processes end), applies the size and starts it again (phases `stopping`, `resizing`, `booting`). The server finishes it even if the caller goes away, so a sandbox can resize itself. When it can't start at the new size, it starts again at the old one and the operation fails with the reason. A change it can take as it is (a stopped sandbox, an online grow) is the usual `200`. `GET /v1/me` `resizeRestart` says the server takes it; a server that does not yet answers `400 resize_restart_off`. It is checked against the settings this request leaves: `maxRunMinutes: 0` with it is `400 max_run_disabled` (resize, then set it). The operation boots under the max-run it was accepted with. API keys: needs one of the scopes `machines:write`.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml patch /v1/machines/{id}","href":"/api-reference/machines/rename-resize-vcpus-memory-disk-a-stopped-sandbox-or-set-its-idle-pause-and-metadata","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_components.p, {\n children: [\"Synchronous. Absent fields are unchanged. \", _jsx(_components.code, {\n children: \"autoSuspendAfterSeconds\"\n }), \" and \", _jsx(_components.code, {\n children: \"metadata\"\n }), \" apply in any state, also while an operation runs, and do not change \", _jsx(_components.code, {\n children: \"revision\"\n }), \": \", _jsx(_components.code, {\n children: \"metadata\"\n }), \" replaces the metadata (\", _jsx(_components.code, {\n children: \"{}\"\n }), \" clears it).\\n\", _jsx(_components.code, {\n children: \"name\"\n }), \" renames the sandbox in any state, also while an operation runs. Its ID, public port URLs and SSH certificates stay the same; the old name stops resolving at once. A name another live sandbox of the org has is \", _jsx(_components.code, {\n children: \"409 operation_conflict\"\n }), \". The guest hostname (\", _jsx(_components.code, {\n children: \"instabox-\u003cname>\"\n }), \") follows at the sandbox’s next start or resume, \", _jsx(_components.code, {\n children: \"~/MACHINE.md\"\n }), \" at its next start from stopped.\\nResizing (\", _jsx(_components.code, {\n children: \"persistentDiskGiB\"\n }), \") grows a paid sandbox’s disk (\", _jsx(_components.code, {\n children: \"/data\"\n }), \") up to the plan’s \", _jsx(_components.code, {\n children: \"maxDiskGiB\"\n }), \" (pro 200, builder 500, team and enterprise 1024) and the stored-data limit, and the org must be under that limit (\", _jsx(_components.code, {\n children: \"429 quota_exceeded\"\n }), \"). A free sandbox’s size is fixed (\", _jsx(_components.code, {\n children: \"400 spec_not_allowed\"\n }), \"). An admin can override that per user (\", _jsx(_components.code, {\n children: \"diskResize\"\n }), \") and, from a signed-in session, grow any sandbox without the limit. Each size is 1-1024 GiB (more is \", _jsx(_components.code, {\n children: \"400 bad_request\"\n }), \"), and needs no operation in progress (else \", _jsx(_components.code, {\n children: \"409 operation_conflict\"\n }), \"). The disk (\", _jsx(_components.code, {\n children: \"/data\"\n }), \") of a running sandbox grows online: no restart, files and processes stay; when it can’t (rare: the sandbox is unreachable or its host is older) it is \", _jsx(_components.code, {\n children: \"409 grow_needs_stop\"\n }), \": stop it and send the size again. A stopped sandbox’s disk grows at its next start. It shrinks only while stopped (else \", _jsx(_components.code, {\n children: \"409 operation_conflict\"\n }), \") and only when the used data plus 10% (at least 1 GiB) fits (else \", _jsx(_components.code, {\n children: \"409 disk_too_small\"\n }), \", nothing changes); the shrink applies at the next start, which keeps the larger size if the data has grown past it by then. The system disk (\", _jsx(_components.code, {\n children: \"rootDiskGiB\"\n }), \", admins) only grows (a smaller size is \", _jsx(_components.code, {\n children: \"400 bad_request\"\n }), \"), and only while stopped. Growing either disk needs a template with the \", _jsx(_components.code, {\n children: \"root-grow\"\n }), \" capability (else \", _jsx(_components.code, {\n children: \"400 bad_request\"\n }), \"); a shrink does not. At create the disks come with the size; this is the way to get bigger ones.\\n\", _jsx(_components.code, {\n children: \"vcpus\"\n }), \" and \", _jsx(_components.code, {\n children: \"memMiB\"\n }), \" change a paid sandbox’s size to another of its workspace’s sizes (\", _jsx(_components.code, {\n children: \"allowedSpecs\"\n }), \" of \", _jsx(_components.code, {\n children: \"GET /v1/orgs/{id}\"\n }), \"), named as at create: one field picks the one size that matches it, else name both. The sandbox must be stopped with no operation in progress (else \", _jsx(_components.code, {\n children: \"409 operation_conflict\"\n }), \"); the new size applies at its next start, which boots it fresh (files stay), and running time is rated at the new size from then on. That start’s operation fails, and the sandbox stays stopped at its new size, when its host has no room for the new size (\", _jsx(_components.code, {\n children: \"no_capacity\"\n }), \") or runs an older node-agent that cannot resize (\", _jsx(_components.code, {\n children: \"host_unavailable\"\n }), \"), both retryable; resize it back or start it later. A size the plan does not offer and the free sandbox are \", _jsx(_components.code, {\n children: \"400 spec_not_allowed\"\n }), \" in any state (checked before the 409); the same size changes nothing. Admins may give any size within the API’s ranges. As at create, a field it does not know is \", _jsx(_components.code, {\n children: \"400 unknown_field\"\n }), \" and nothing changes, so \", _jsx(_components.code, {\n children: \"diskGiB\"\n }), \" here is refused.\\n\", _jsx(_components.code, {\n children: \"apply: \\\"restart\\\"\"\n }), \" lets a running or paused sandbox take a change that needs a stop (\", _jsx(_components.code, {\n children: \"vcpus\"\n }), \"/\", _jsx(_components.code, {\n children: \"memMiB\"\n }), \", a \", _jsx(_components.code, {\n children: \"/data\"\n }), \" shrink, a system-disk grow, or a grow it can’t do online) instead of the \", _jsx(_components.code, {\n children: \"409\"\n }), \": the reply is \", _jsx(_components.code, {\n children: \"202\"\n }), \" with one \", _jsx(_components.code, {\n children: \"resize\"\n }), \" operation, under this request’s idempotency key, that stops it (resuming a paused one first; its running processes end), applies the size and starts it again (phases \", _jsx(_components.code, {\n children: \"stopping\"\n }), \", \", _jsx(_components.code, {\n children: \"resizing\"\n }), \", \", _jsx(_components.code, {\n children: \"booting\"\n }), \"). The server finishes it even if the caller goes away, so a sandbox can resize itself. When it can’t start at the new size, it starts again at the old one and the operation fails with the reason. A change it can take as it is (a stopped sandbox, an online grow) is the usual \", _jsx(_components.code, {\n children: \"200\"\n }), \". \", _jsx(_components.code, {\n children: \"GET /v1/me\"\n }), \" \", _jsx(_components.code, {\n children: \"resizeRestart\"\n }), \" says the server takes it; a server that does not yet answers \", _jsx(_components.code, {\n children: \"400 resize_restart_off\"\n }), \". It is checked against the settings this request leaves: \", _jsx(_components.code, {\n children: \"maxRunMinutes: 0\"\n }), \" with it is \", _jsx(_components.code, {\n children: \"400 max_run_disabled\"\n }), \" (resize, then set it). The operation boots under the max-run it was accepted with. API keys: needs one of the scopes \", _jsx(_components.code, {\n children: \"machines:write\"\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":{"config":{},"pageMetadata":{"title":"Rename, resize (vCPUs, memory, disk) a stopped sandbox, or set its idle pause and metadata.","description":"Synchronous. Absent fields are unchanged. `autoSuspendAfterSeconds` and `metadata` apply in any state, also while an operation runs, and do not change `revision`: `metadata` replaces the metadata (`{}` clears it).\n`name` renames the sandbox in any state, also while an operation runs. Its ID, public port URLs and SSH certificates stay the same; the old name stops resolving at once. A name another live sandbox of the org has is `409 operation_conflict`. The guest hostname (`instabox-\u003cname>`) follows at the sandbox's next start or resume, `~/MACHINE.md` at its next start from stopped.\nResizing (`persistentDiskGiB`) grows a paid sandbox's disk (`/data`) up to the plan's `maxDiskGiB` (pro 200, builder 500, team and enterprise 1024) and the stored-data limit, and the org must be under that limit (`429 quota_exceeded`). A free sandbox's size is fixed (`400 spec_not_allowed`). An admin can override that per user (`diskResize`) and, from a signed-in session, grow any sandbox without the limit. Each size is 1-1024 GiB (more is `400 bad_request`), and needs no operation in progress (else `409 operation_conflict`). The disk (`/data`) of a running sandbox grows online: no restart, files and processes stay; when it can't (rare: the sandbox is unreachable or its host is older) it is `409 grow_needs_stop`: stop it and send the size again. A stopped sandbox's disk grows at its next start. It shrinks only while stopped (else `409 operation_conflict`) and only when the used data plus 10% (at least 1 GiB) fits (else `409 disk_too_small`, nothing changes); the shrink applies at the next start, which keeps the larger size if the data has grown past it by then. The system disk (`rootDiskGiB`, admins) only grows (a smaller size is `400 bad_request`), and only while stopped. Growing either disk needs a template with the `root-grow` capability (else `400 bad_request`); a shrink does not. At create the disks come with the size; this is the way to get bigger ones.\n`vcpus` and `memMiB` change a paid sandbox's size to another of its workspace's sizes (`allowedSpecs` of `GET /v1/orgs/{id}`), named as at create: one field picks the one size that matches it, else name both. The sandbox must be stopped with no operation in progress (else `409 operation_conflict`); the new size applies at its next start, which boots it fresh (files stay), and running time is rated at the new size from then on. That start's operation fails, and the sandbox stays stopped at its new size, when its host has no room for the new size (`no_capacity`) or runs an older node-agent that cannot resize (`host_unavailable`), both retryable; resize it back or start it later. A size the plan does not offer and the free sandbox are `400 spec_not_allowed` in any state (checked before the 409); the same size changes nothing. Admins may give any size within the API's ranges. As at create, a field it does not know is `400 unknown_field` and nothing changes, so `diskGiB` here is refused.\n`apply: \"restart\"` lets a running or paused sandbox take a change that needs a stop (`vcpus`/`memMiB`, a `/data` shrink, a system-disk grow, or a grow it can't do online) instead of the `409`: the reply is `202` with one `resize` operation, under this request's idempotency key, that stops it (resuming a paused one first; its running processes end), applies the size and starts it again (phases `stopping`, `resizing`, `booting`). The server finishes it even if the caller goes away, so a sandbox can resize itself. When it can't start at the new size, it starts again at the old one and the operation fails with the reason. A change it can take as it is (a stopped sandbox, an online grow) is the usual `200`. `GET /v1/me` `resizeRestart` says the server takes it; a server that does not yet answers `400 resize_restart_off`. It is checked against the settings this request leaves: `maxRunMinutes: 0` with it is `400 max_run_disabled` (resize, then set it). The operation boots under the max-run it was accepted with. API keys: needs one of the scopes `machines:write`.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml patch /v1/machines/{id}","href":"/api-reference/machines/rename-resize-vcpus-memory-disk-a-stopped-sandbox-or-set-its-idle-pause-and-metadata","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"tags":["machines"],"operationId":"updateMachine","summary":"Rename, resize (vCPUs, memory, disk) a stopped sandbox, or set its idle pause and metadata.","security":["27f69a76-6376-499f-bba9-22ced47568ec","403a6e6d-9b62-42ae-a65e-8580752011ba","74ea9795-556a-4187-a497-6c8a83b045b9"],"description":"Synchronous. Absent fields are unchanged. `autoSuspendAfterSeconds` and `metadata` apply in any state, also while an operation runs, and do not change `revision`: `metadata` replaces the metadata (`{}` clears it).\n`name` renames the sandbox in any state, also while an operation runs. Its ID, public port URLs and SSH certificates stay the same; the old name stops resolving at once. A name another live sandbox of the org has is `409 operation_conflict`. The guest hostname (`instabox-\u003cname>`) follows at the sandbox's next start or resume, `~/MACHINE.md` at its next start from stopped.\nResizing (`persistentDiskGiB`) grows a paid sandbox's disk (`/data`) up to the plan's `maxDiskGiB` (pro 200, builder 500, team and enterprise 1024) and the stored-data limit, and the org must be under that limit (`429 quota_exceeded`). A free sandbox's size is fixed (`400 spec_not_allowed`). An admin can override that per user (`diskResize`) and, from a signed-in session, grow any sandbox without the limit. Each size is 1-1024 GiB (more is `400 bad_request`), and needs no operation in progress (else `409 operation_conflict`). The disk (`/data`) of a running sandbox grows online: no restart, files and processes stay; when it can't (rare: the sandbox is unreachable or its host is older) it is `409 grow_needs_stop`: stop it and send the size again. A stopped sandbox's disk grows at its next start. It shrinks only while stopped (else `409 operation_conflict`) and only when the used data plus 10% (at least 1 GiB) fits (else `409 disk_too_small`, nothing changes); the shrink applies at the next start, which keeps the larger size if the data has grown past it by then. The system disk (`rootDiskGiB`, admins) only grows (a smaller size is `400 bad_request`), and only while stopped. Growing either disk needs a template with the `root-grow` capability (else `400 bad_request`); a shrink does not. At create the disks come with the size; this is the way to get bigger ones.\n`vcpus` and `memMiB` change a paid sandbox's size to another of its workspace's sizes (`allowedSpecs` of `GET /v1/orgs/{id}`), named as at create: one field picks the one size that matches it, else name both. The sandbox must be stopped with no operation in progress (else `409 operation_conflict`); the new size applies at its next start, which boots it fresh (files stay), and running time is rated at the new size from then on. That start's operation fails, and the sandbox stays stopped at its new size, when its host has no room for the new size (`no_capacity`) or runs an older node-agent that cannot resize (`host_unavailable`), both retryable; resize it back or start it later. A size the plan does not offer and the free sandbox are `400 spec_not_allowed` in any state (checked before the 409); the same size changes nothing. Admins may give any size within the API's ranges. As at create, a field it does not know is `400 unknown_field` and nothing changes, so `diskGiB` here is refused.\n`apply: \"restart\"` lets a running or paused sandbox take a change that needs a stop (`vcpus`/`memMiB`, a `/data` shrink, a system-disk grow, or a grow it can't do online) instead of the `409`: the reply is `202` with one `resize` operation, under this request's idempotency key, that stops it (resuming a paused one first; its running processes end), applies the size and starts it again (phases `stopping`, `resizing`, `booting`). The server finishes it even if the caller goes away, so a sandbox can resize itself. When it can't start at the new size, it starts again at the old one and the operation fails with the reason. A change it can take as it is (a stopped sandbox, an online grow) is the usual `200`. `GET /v1/me` `resizeRestart` says the server takes it; a server that does not yet answers `400 resize_restart_off`. It is checked against the settings this request leaves: `maxRunMinutes: 0` with it is `400 max_run_disabled` (resize, then set it). The operation boots under the max-run it was accepted with. API keys: needs one of the scopes `machines:write`.","parameters":["c91e52f8-54c2-44e0-8f7c-1aa50886568f"],"requestBody":"5d8ff364-1918-409c-a0e5-856132c769f6","responses":{"200":"6c5e140c-80d9-4f1d-b78c-8e0a6a74cd39","202":"2823e8ac-681f-4e98-b37b-5f76ad4c8ab7","400":"9f0340b1-20b7-49f2-b50c-482589da3ec1","401":"24eb3848-80ef-4dab-80f4-4f6c37e056d3","402":"ec9c1946-6694-4e63-a9b6-4a608fc8433b","404":"37f0633e-e2c5-4339-a106-62365e40d19d","409":"8eabc561-267f-423d-8833-3406d9c01f94","429":"7619fc5f-87a6-4a50-be18-ac35cda22b51"},"method":"patch","type":"path","servers":["e2c665bb-4b53-46fa-8dd3-3dba6e3ac4a8"],"path":"/v1/machines/{id}","baseUrlOptions":["https://api.instabox.sh"],"title":"Rename, resize (vCPUs, memory, disk) a stopped sandbox, or set its idle pause and metadata.","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"c91e52f8-54c2-44e0-8f7c-1aa50886568f":{"name":"Idempotency-Key","in":"header","required":true,"description":"Client-generated key, 1-200 printable ASCII characters, scoped to the\nuser. Same key and same method+path+body returns the original response;\nsame key with a different request returns `409 idempotency_conflict`.\nRecords are kept for 7 days.\n","schema":{"type":"string","minLength":1,"maxLength":200,"pattern":"^[\\x21-\\x7e]+$","isRequired":true,"description":"Client-generated key, 1-200 printable ASCII characters, scoped to the\nuser. Same key and same method+path+body returns the original response;\nsame key with a different request returns `409 idempotency_conflict`.\nRecords are kept for 7 days.\n","uniqueKey":"","typeLabel":"string"}},"717879ea-99d7-4460-8953-6267ab66f66d":{"name":"id","in":"path","required":true,"description":"Sandbox ID (`m_` + 26 lowercase base32 characters).","schema":{"type":"string","pattern":"^m_[a-z2-7]{26}$","isRequired":true,"description":"Sandbox ID (`m_` + 26 lowercase base32 characters).","uniqueKey":"","typeLabel":"string"}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"description":"A body key that is none of these is refused with `400 unknown_field` (keys match case-insensitively). The retired lifetime timeout (`timeoutSeconds`, `onTimeout` or `timeout`, any value but null) is `400 unknown_field` naming `maxRunMinutes` and `autoSuspendAfterSeconds` instead (to an `instabox-cli/\u003cversion>` `User-Agent`, that the CLI is out of date and the commands `instabox max-run`, `auto-suspend` and `rm`), and nothing changes.","properties":{"maxRunMinutes":{"type":"integer","minimum":-1,"maximum":2147483647,"description":"Maximum continuous runtime in minutes. -1 is unlimited; 0 sleeps immediately. Independent of idle auto-pause; whichever condition is reached first pauses the sandbox. Free machines default to 480 and only an admin session can change them. The service manages free runtime and may pause a run earlier. The response reports the current limit from runStartedAt; it can change during the run. Paid machines default to -1 and their users can change this setting. Max-run suspension starts a cooldown, returning 409 machine_cooldown with Retry-After on every wake path. By default it is 5 to 20 minutes (5 plus a random 0 to 15) on a paid plan and for the first such pause in a row on the free plan. Back-to-back pauses on the free plan rest longer (60 to 75, then 120 to 135 minutes): \"Longer cooldowns on the free plan\" at https://instabox.sh/docs/machines/auto-pause#longer-cooldowns-on-the-free-plan. Once cooldown ends, 0 still refuses wake with 409 max_run_disabled until changed.","uniqueKey":"maxRunMinutes","typeLabel":"integer"},"name":{"type":"string","description":"New name, unique among the org's live sandboxes; 1-63 of a-z, 0-9, '-', starting with a letter or digit. Absent: unchanged.","uniqueKey":"name","typeLabel":"string"},"rootDiskGiB":{"type":"integer","minimum":0,"maximum":1024,"description":"Admins only: new root filesystem size in GiB (the template sizes it). From anyone else it is `400 spec_not_allowed`; grow the disk with `persistentDiskGiB`.","uniqueKey":"rootDiskGiB","typeLabel":"integer"},"vcpus":{"type":"integer","minimum":0,"maximum":32,"description":"New vCPUs of a stopped paid sandbox: with `memMiB`, one of the workspace's `allowedSpecs` (alone: the one size with that many vCPUs); 0 or absent: unchanged. Applied at its next start (see the operation). Running is `409 operation_conflict` (stop it first), and so is paused (resume it, then stop it); another size, or the free sandbox, is `400 spec_not_allowed`.","uniqueKey":"vcpus","typeLabel":"integer"},"memMiB":{"type":"integer","minimum":0,"maximum":131072,"description":"New memory (MiB) of a stopped paid sandbox, as `vcpus`; 0 or absent: unchanged.","uniqueKey":"memMiB","typeLabel":"integer"},"persistentDiskGiB":{"type":"integer","minimum":0,"maximum":1024,"description":"New disk (`/data`) size in GiB, 1-1024, up to the plan's `maxDiskGiB`; 0 or absent: unchanged. Grow: a running box grows online (no restart, processes keep running); if it can't (rare: the box is unreachable or its host is older), `409 grow_needs_stop` (stop it and send the size again); a stopped box grows at its next start. Shrink: only while stopped (else `409 operation_conflict`), and only when the used data plus 10% (at least 1 GiB) fits; else `409 disk_too_small`, with the smallest size that fits in the message, and the box unchanged. Past 1024 is `400 bad_request`, and so is growing on a template without the `root-grow` capability (a shrink needs none); a free box's disk is fixed (`400 spec_not_allowed`, running or stopped). The Python SDK's `machines.resize(m, disk_gib)` sends this field.","uniqueKey":"persistentDiskGiB","typeLabel":"integer"},"metadata":{"oneOf":[{"type":"object","additionalProperties":{"type":"string","uniqueKey":"metadata.oneOf.0.additionalProperties","typeLabel":"string"},"description":"Replaces the metadata (same limits as `Metadata`); {} clears it; null or absent: unchanged.","uniqueKey":"metadata.oneOf.0","typeLabel":"object"},{"type":"null","additionalProperties":{"type":"string","uniqueKey":"metadata.oneOf.1.additionalProperties","typeLabel":"string"},"description":"Replaces the metadata (same limits as `Metadata`); {} clears it; null or absent: unchanged.","uniqueKey":"metadata.oneOf.1","typeLabel":"null"}],"uniqueKey":"metadata","typeLabel":"object | null"},"autoSuspendAfterSeconds":{"type":"integer","description":"The plan's rule (`AutoSuspendAfterSeconds`): a paid sandbox takes 300-1800 in whole minutes, as sent, or 0 (off) where the plan allows always on; below 300, above 1800 or not a multiple of 60 is `400 bad_request`; the free sandbox takes only 1800 (else `403 spec_not_allowed`), and 0 without always on is `403 spec_not_allowed` too. A refused value leaves the setting unchanged; the reply shows the effective value. API keys follow the owner's policy. Separately, with manual lifecycle (`GET /v1/me`) or an admin sign-in session: 120-86400, or 0 (off). Absent: unchanged.","uniqueKey":"autoSuspendAfterSeconds","typeLabel":"integer"},"vault":{"type":"boolean","description":"False disables legacy Vault delivery; true cannot re-enable the legacy flag; absent is unchanged. Org Secret selections are independent.","uniqueKey":"vault","typeLabel":"boolean"},"apply":{"type":"string","enum":["restart"],"description":"`restart`: a running or paused sandbox whose change needs a stop is stopped, resized and started again by one `resize` operation (`202`); see the operation. Absent: such a change is `409`. Anything else is `400 bad_request`.","uniqueKey":"apply","typeLabel":"enum\u003cstring>"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"maxRunMinutes":1073741823,"name":"\u003cstring>","rootDiskGiB":512,"vcpus":16,"memMiB":65536,"persistentDiskGiB":512,"metadata":{},"autoSuspendAfterSeconds":123,"vault":true,"apply":"restart"}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"6c5e140c-80d9-4f1d-b78c-8e0a6a74cd39":{"description":"The sandbox, updated.","content":{"application/json":{"schema":{"type":"object","description":"A sandbox.","required":["id","name","desiredState","state","revision","operationId","template","spec","storage","runtime","autoSuspendAfterSeconds","maxRunMinutes","runStartedAt","cooldownUntil","metadata","vault","guestUser","orgId","createdAt","updatedAt"],"properties":{"id":{"type":"string","isRequired":true,"uniqueKey":"id","typeLabel":"string"},"name":{"type":"string","isRequired":true,"uniqueKey":"name","typeLabel":"string"},"desiredState":{"type":"string","enum":["creating","starting","running","stopping","stopped","suspending","suspended","resuming","deleting","deleted","error"],"isRequired":true,"uniqueKey":"desiredState","typeLabel":"enum\u003cstring>"},"state":{"type":"string","enum":["creating","starting","running","stopping","stopped","suspending","suspended","resuming","deleting","deleted","error"],"isRequired":true,"uniqueKey":"state","typeLabel":"enum\u003cstring>"},"revision":{"type":"integer","format":"int64","description":"Increases with each accepted change.","isRequired":true,"uniqueKey":"revision","typeLabel":"integer\u003cint64>"},"operationId":{"oneOf":[{"type":"string","description":"The active operation, if any.","isRequired":true,"uniqueKey":"operationId.oneOf.0","typeLabel":"string"},{"type":"null","description":"The active operation, if any.","isRequired":true,"uniqueKey":"operationId.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"operationId","typeLabel":"string | null"},"template":{"type":"object","required":["id","version","digest"],"properties":{"id":{"type":"string","isRequired":true,"uniqueKey":"template.id","typeLabel":"string"},"version":{"type":"string","isRequired":true,"uniqueKey":"template.version","typeLabel":"string"},"digest":{"type":"string","isRequired":true,"uniqueKey":"template.digest","typeLabel":"string"},"kernel":{"type":"string","description":"The guest kernel the sandbox is pinned to, `sha256:\u003chex>`; absent: the host's default.","uniqueKey":"template.kernel","typeLabel":"string"}},"isRequired":true,"uniqueKey":"template","typeLabel":"object"},"spec":{"type":"object","description":"A sandbox's size.","required":["vcpus","memMiB","persistentDiskGiB"],"properties":{"vcpus":{"type":"integer","isRequired":true,"uniqueKey":"spec.vcpus","typeLabel":"integer"},"memMiB":{"type":"integer","description":"Memory in MiB.","isRequired":true,"uniqueKey":"spec.memMiB","typeLabel":"integer"},"persistentDiskGiB":{"type":"integer","description":"Disk (`/data`) size in GiB.","isRequired":true,"uniqueKey":"spec.persistentDiskGiB","typeLabel":"integer"},"rootDiskGiB":{"type":"integer","description":"System disk size in GiB, set by the template (only admins change it); absent: the template's.","uniqueKey":"spec.rootDiskGiB","typeLabel":"integer"}},"isRequired":true,"uniqueKey":"spec","typeLabel":"object"},"storage":{"type":"object","description":"The sandbox's storage (`/data`, where HOME lives).","required":["sizeGiB","mountPath","persistent","synced"],"properties":{"sizeGiB":{"type":"integer","isRequired":true,"uniqueKey":"storage.sizeGiB","typeLabel":"integer"},"mountPath":{"type":"string","examples":["/data"],"isRequired":true,"uniqueKey":"storage.mountPath","typeLabel":"string"},"persistent":{"type":"boolean","isRequired":true,"uniqueKey":"storage.persistent","typeLabel":"boolean"},"synced":{"type":"boolean","description":"False while the latest state of a stopped or paused sandbox is still being saved: for a few seconds after a stop or pause, or longer if saving fails (it is retried). A snapshot waits until it is true.","isRequired":true,"uniqueKey":"storage.synced","typeLabel":"boolean"},"snapshotSeq":{"type":"integer","format":"int64","description":"Sequence number of the sandbox's latest saved state; absent before the first stop or pause.","uniqueKey":"storage.snapshotSeq","typeLabel":"integer\u003cint64>"}},"isRequired":true,"uniqueKey":"storage","typeLabel":"object"},"runtime":{"type":"object","required":["ready"],"properties":{"ready":{"type":"boolean","description":"True only when the sandbox is running, reports all checks passing and, as checked when it boots or resumes, accepts exec, file and SSH connections.","isRequired":true,"uniqueKey":"runtime.ready","typeLabel":"boolean"},"processesPreserved":{"type":"boolean","description":"Set after a start or resume. False means the paused programs could not be brought back and the sandbox booted fresh (files are kept).","uniqueKey":"runtime.processesPreserved","typeLabel":"boolean"}},"isRequired":true,"uniqueKey":"runtime","typeLabel":"object"},"autoSuspendAfterSeconds":{"oneOf":[{"type":"integer","description":"The running sandbox is paused once it has been idle this many seconds (no agent working, no terminal input or output, little CPU); null: off. Pause, resume, stop and start keep it.","isRequired":true,"uniqueKey":"autoSuspendAfterSeconds.oneOf.0","typeLabel":"integer"},{"type":"null","description":"The running sandbox is paused once it has been idle this many seconds (no agent working, no terminal input or output, little CPU); null: off. Pause, resume, stop and start keep it.","isRequired":true,"uniqueKey":"autoSuspendAfterSeconds.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"autoSuspendAfterSeconds","typeLabel":"integer | null"},"maxRunMinutes":{"type":"integer","minimum":-1,"maximum":2147483647,"description":"Maximum continuous runtime in minutes. -1 is unlimited; 0 sleeps immediately. Independent of idle auto-pause; whichever condition is reached first pauses the sandbox. Free machines default to 480 and only an admin session can change them. The service manages free runtime and may pause a run earlier. The response reports the current limit from runStartedAt; it can change during the run. Paid machines default to -1 and their users can change this setting. Max-run suspension starts a cooldown, returning 409 machine_cooldown with Retry-After on every wake path. By default it is 5 to 20 minutes (5 plus a random 0 to 15) on a paid plan and for the first such pause in a row on the free plan. Back-to-back pauses on the free plan rest longer (60 to 75, then 120 to 135 minutes): \"Longer cooldowns on the free plan\" at https://instabox.sh/docs/machines/auto-pause#longer-cooldowns-on-the-free-plan. Once cooldown ends, 0 still refuses wake with 409 max_run_disabled until changed.","isRequired":true,"uniqueKey":"maxRunMinutes","typeLabel":"integer"},"runStartedAt":{"oneOf":[{"type":"string","format":"date-time","description":"Start of the current continuous run, conservatively initialized on a first error observation too; resets only after confirmed sleep.","isRequired":true,"uniqueKey":"runStartedAt.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"Start of the current continuous run, conservatively initialized on a first error observation too; resets only after confirmed sleep.","isRequired":true,"uniqueKey":"runStartedAt.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"runStartedAt","typeLabel":"string\u003cdate-time> | null"},"cooldownUntil":{"oneOf":[{"type":"string","format":"date-time","description":"All wake paths are refused until this deadline, including admin actions: after a max-run suspension, or the 24-hour lock of an automatic abuse check's pause (cooldownReason).","isRequired":true,"uniqueKey":"cooldownUntil.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"All wake paths are refused until this deadline, including admin actions: after a max-run suspension, or the 24-hour lock of an automatic abuse check's pause (cooldownReason).","isRequired":true,"uniqueKey":"cooldownUntil.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"cooldownUntil","typeLabel":"string\u003cdate-time> | null"},"metadata":{"type":"object","description":"String labels. At most 32 keys of 1-64 characters `[A-Za-z0-9_.-]`, values of at most 512 characters, 8 KiB as JSON.","additionalProperties":{"type":"string","uniqueKey":"metadata.additionalProperties","typeLabel":"string"},"isRequired":true,"uniqueKey":"metadata","typeLabel":"object"},"vault":{"type":"boolean","description":"Whether legacy Vault delivery is enabled. Independent of org Secret selections and delivery status at the sandbox's /secrets endpoint.","isRequired":true,"uniqueKey":"vault","typeLabel":"boolean"},"guestUser":{"type":"string","readOnly":true,"examples":["alice"],"description":"The Linux user in the sandbox that SSH sessions, exec and the terminal log in as, fixed at create: the `guestUser` the create named, else `user` (a create from a snapshot: the snapshot's user). `dev` on sandboxes from templates without the `guest-user` capability, and on every sandbox created before the field.","isRequired":true,"uniqueKey":"guestUser","typeLabel":"string"},"orgId":{"type":"string","readOnly":true,"description":"The org the sandbox counts against (docs/orgs.md).","isRequired":true,"uniqueKey":"orgId","typeLabel":"string"},"createdAt":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"createdAt","typeLabel":"string\u003cdate-time>"},"updatedAt":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"updatedAt","typeLabel":"string\u003cdate-time>"},"snapshot":{"type":"object","required":["id"],"properties":{"id":{"type":"string","isRequired":true,"uniqueKey":"snapshot.id","typeLabel":"string"}},"uniqueKey":"snapshot","typeLabel":"object"},"image":{"type":"object","description":"Deprecated: `snapshot`, under its old name (same value).","required":["id"],"deprecated":true,"properties":{"id":{"type":"string","isRequired":true,"uniqueKey":"image.id","typeLabel":"string"}},"uniqueKey":"image","typeLabel":"object"},"lastError":{"type":"object","required":["code","message","requestId","retryable","operationId"],"properties":{"code":{"type":"string","description":"Machine-readable code. HTTP status per code is fixed.","enum":["unauthenticated","missing_key","malformed_key","invalid_key","expired_key","revoked_key","session_expired","missing_scope","permission_denied","not_found","bad_request","feature_disabled","unknown_field","operation_conflict","idempotency_conflict","machine_not_running","restore_unavailable","delete_confirmation_required","fork_unavailable","machine_cooldown","max_run_disabled","desktop_not_running","disk_too_small","grow_needs_stop","resize_restart_off","private_ports_unavailable","quota_exceeded","no_capacity","host_unavailable","metrics_unavailable","restore_failed","internal","authorization_pending","slow_down","expired_token","access_denied","invalid_grant","invite_required","invite_invalid","invite_email_mismatch","api_key_expired","api_key_revoked","insufficient_scope","orca_unsupported","runtime_not_ready","spec_not_allowed","template_not_allowed","template_limit","kernel_unavailable","template_unavailable","invalid_guest_user","vault_unavailable","vault_retired","credit_exhausted","spend_limit_reached","subscription_required","payment_method_required","early_allowance_ended","rate_limited","concurrency_limit","payment_failed","missing_parent","not_a_file","no_space","too_large","data_disk_not_browsable","support_unavailable","host_oom","vmm_crashed","guest_reboot_loop"],"isRequired":true,"uniqueKey":"lastError.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","isRequired":true,"uniqueKey":"lastError.message","typeLabel":"string"},"requestId":{"type":"string","isRequired":true,"uniqueKey":"lastError.requestId","typeLabel":"string"},"retryable":{"type":"boolean","description":"True if the same request may succeed later.","isRequired":true,"uniqueKey":"lastError.retryable","typeLabel":"boolean"},"operationId":{"oneOf":[{"type":"string","description":"For `operation_conflict`, the active operation.","isRequired":true,"uniqueKey":"lastError.operationId.oneOf.0","typeLabel":"string"},{"type":"null","description":"For `operation_conflict`, the active operation.","isRequired":true,"uniqueKey":"lastError.operationId.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"lastError.operationId","typeLabel":"string | null"},"reason":{"type":"string","description":"The same as `code` for credential errors (401 `missing_key`, `malformed_key`, `invalid_key`, `expired_key`, `revoked_key`, `session_expired`; 403 `missing_scope`). For 409 `machine_cooldown`, the automatic abuse check whose pause locks the sandbox: `abuse_egress_blocklist` (it tried to connect to a blocked destination on the egress blocklist, not a DNS lookup), `abuse_network_flows` (scanning or attack traffic), `abuse_cpu` (mining); absent for a max-run cooldown. For a retryable 409 `fork_unavailable`, why the source's host cannot take the fork: `source_host_unavailable` (it takes no new sandboxes) or `source_host_full` (no room now). Absent on other errors and from older servers.","enum":["missing_key","malformed_key","invalid_key","expired_key","revoked_key","session_expired","missing_scope","abuse_egress_blocklist","abuse_network_flows","abuse_cpu","source_host_unavailable","source_host_full"],"uniqueKey":"lastError.reason","typeLabel":"enum\u003cstring>"},"hint":{"type":"string","description":"The next step that fixes the error (credential errors). Absent otherwise.","uniqueKey":"lastError.hint","typeLabel":"string"},"docs":{"type":"string","format":"uri","description":"A URL documenting the error (credential errors). Absent otherwise.","uniqueKey":"lastError.docs","typeLabel":"string\u003curi>"},"docs_url":{"type":"string","format":"uri","description":"The code's entry on the errors page, on every error response: https://instabox.sh/docs/errors#\u003ccode> with underscores as dashes (e.g. #credit-exhausted): its HTTP status, whether to retry and what to do. Snake case, unlike the other fields. Absent from a failed operation's `error` and from older servers.","uniqueKey":"lastError.docs_url","typeLabel":"string\u003curi>"},"requiredScopes":{"type":"array","items":{"type":"string","uniqueKey":"lastError.requiredScopes.items.[INDEX]","typeLabel":"string"},"description":"For `missing_scope`, the scopes the route accepts; the key needs one of them.","uniqueKey":"lastError.requiredScopes","typeLabel":"string[]"},"retryAfterSeconds":{"type":"integer","minimum":1,"description":"Seconds to wait before trying again: a retryable `no_capacity` (60, as a 503 or on a failed operation's `error`), `rate_limited`, `machine_cooldown` and agent sign-up `quota_exceeded`. An error response also sends it as the `Retry-After` header; a failed operation's `error` has only this field. Absent otherwise and from older servers.","uniqueKey":"lastError.retryAfterSeconds","typeLabel":"integer"},"at":{"type":"string","format":"date-time","description":"When it happened, for a stop the platform found (a sandbox's `lastError` with code `host_oom`, `vmm_crashed` or `guest_reboot_loop`; `hint` says what to do). The next successful start clears the error. Absent otherwise and from older servers.","uniqueKey":"lastError.at","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"lastError","typeLabel":"object"},"archiveAt":{"oneOf":[{"type":"string","format":"date-time","description":"When the sandbox is stopped if it is running (set at creation with `archiveSeconds`): its files are kept and a start brings it back. Resuming does not clear it; a sandbox that is not running when it passes only has it cleared. Absent: none.","uniqueKey":"archiveAt.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When the sandbox is stopped if it is running (set at creation with `archiveSeconds`): its files are kept and a start brings it back. Resuming does not clear it; a sandbox that is not running when it passes only has it cleared. Absent: none.","uniqueKey":"archiveAt.oneOf.1","typeLabel":"null"}],"uniqueKey":"archiveAt","typeLabel":"string\u003cdate-time> | null"},"deleteAt":{"oneOf":[{"type":"string","format":"date-time","description":"When the sandbox is deleted, whatever its state (set at creation with `deleteAfterSeconds`). The delete is an ordinary `delete` operation (`trigger: delete_at`), queued at `deleteAt` (within about a second) once no other operation is in progress. Absent: never.","uniqueKey":"deleteAt.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When the sandbox is deleted, whatever its state (set at creation with `deleteAfterSeconds`). The delete is an ordinary `delete` operation (`trigger: delete_at`), queued at `deleteAt` (within about a second) once no other operation is in progress. Absent: never.","uniqueKey":"deleteAt.oneOf.1","typeLabel":"null"}],"uniqueKey":"deleteAt","typeLabel":"string\u003cdate-time> | null"},"readyAt":{"type":"string","format":"date-time","readOnly":true,"description":"When the running sandbox last became ready (`runtime.ready` turned true: SSH, exec and files work). For a new sandbox, `readyAt` minus `createdAt` is its create time; after a start or resume it is that start's. Absent while the sandbox is not ready, and on a sandbox that was already ready before the field existed (until its next start or resume).","uniqueKey":"readyAt","typeLabel":"string\u003cdate-time>"},"cooldownReason":{"type":"string","enum":["abuse_egress_blocklist","abuse_network_flows","abuse_cpu"],"description":"While cooldownUntil has not passed, the automatic abuse check whose pause locks the sandbox, the same as a wake's 409 `machine_cooldown` Error.reason: `abuse_egress_blocklist` (it tried to connect to a blocked destination on the egress blocklist, not a DNS lookup), `abuse_network_flows` (scanning or attack traffic), `abuse_cpu` (mining). Absent for a max-run cooldown, and once the lock ends.","uniqueKey":"cooldownReason","typeLabel":"enum\u003cstring>"},"abuseLock":{"type":"object","description":"With cooldownReason: what the owner is told about the pause behind the lock. Absent when cooldownReason is.","required":["at","explanation","what","appeal"],"properties":{"at":{"type":"string","format":"date-time","description":"When the sandbox was paused.","isRequired":true,"uniqueKey":"abuseLock.at","typeLabel":"string\u003cdate-time>"},"explanation":{"type":"string","description":"One plain sentence on what the sandbox did (\"was reaching known abuse addresses ...\").","isRequired":true,"uniqueKey":"abuseLock.explanation","typeLabel":"string"},"what":{"type":"string","description":"The finding with its exact address and counts (\"connected to blocked 47.91.89.3\", \"30 connections to 198.51.100.7:22 (brute force)\", \"swept port 22 across 500 destinations\").","isRequired":true,"uniqueKey":"abuseLock.what","typeLabel":"string"},"appeal":{"type":"string","description":"How to contest the pause.","isRequired":true,"uniqueKey":"abuseLock.appeal","typeLabel":"string"},"dst":{"type":"string","description":"The blocked destination, the brute-forced or scanned address.","uniqueKey":"abuseLock.dst","typeLabel":"string"},"port":{"type":"integer","description":"A brute force's destination port, or the swept port. A blocked destination's port is not recorded (the node keeps the address alone).","uniqueKey":"abuseLock.port","typeLabel":"integer"},"kind":{"type":"string","description":"A network-flows finding's kind: sweep, scan, brute or fanout.","uniqueKey":"abuseLock.kind","typeLabel":"string"},"count":{"type":"integer","description":"A network-flows finding's destinations, ports or connections.","uniqueKey":"abuseLock.count","typeLabel":"integer"},"coreShare":{"type":"number","description":"The CPU check's mean share of the sandbox's vCPUs.","uniqueKey":"abuseLock.coreShare","typeLabel":"number"},"process":{"type":"string","description":"The mining program the CPU check found running, when it confirmed one.","uniqueKey":"abuseLock.process","typeLabel":"string"},"pool":{"type":"string","description":"That program's pool.","uniqueKey":"abuseLock.pool","typeLabel":"string"}},"uniqueKey":"abuseLock","typeLabel":"object"},"autoSuspendedAt":{"type":"string","format":"date-time","description":"When the sandbox was queued to pause automatically; a successful automatic resume or its next explicit operation clears it. Absent: none.","uniqueKey":"autoSuspendedAt","typeLabel":"string\u003cdate-time>"},"envNames":{"type":"array","items":{"type":"string","uniqueKey":"envNames.items.[INDEX]","typeLabel":"string"},"description":"The names of the sandbox's create-time `env`, sorted. Absent when it has none. The values are never shown: read them in the sandbox.","uniqueKey":"envNames","typeLabel":"string[]"},"free":{"type":"boolean","readOnly":true,"description":"A free-tier org's sandbox (docs/pricing.md): never billed, pauses after 30 idle minutes (another `autoSuspendAfterSeconds` is refused with 403). On a paid plan every sandbox is billed.","uniqueKey":"free","typeLabel":"boolean"},"earlyAllowanceEnded":{"type":"boolean","readOnly":true,"description":"Set on a stopped or paused free sandbox that cannot be started because its org's early free-sandbox allowance ended and as many free sandboxes as the standard limit allows are running: a start is refused (`402 early_allowance_ended`) until one is paused or deleted. Absent otherwise.","uniqueKey":"earlyAllowanceEnded","typeLabel":"boolean"},"oomKills":{"type":"integer","format":"int64","readOnly":true,"description":"Processes the sandbox's kernel OOM killer killed since the sandbox was created (out of memory, or a memory cgroup's limit). Read from the sandbox about once a minute while it runs, and after an exec that exits non-zero; 0 on sandboxes whose host or guest agent predates the reading (absent from older servers).","uniqueKey":"oomKills","typeLabel":"integer\u003cint64>"},"lastOom":{"type":"object","description":"The newest OOM kill (absent until one is seen, or when the kernel log no longer held it).","required":["at","pid","process","rssBytes","anonRssBytes","cgroup"],"properties":{"at":{"type":"string","format":"date-time","description":"When it was killed (to about a second).","isRequired":true,"uniqueKey":"lastOom.at","typeLabel":"string\u003cdate-time>"},"pid":{"type":"integer","isRequired":true,"uniqueKey":"lastOom.pid","typeLabel":"integer"},"process":{"type":"string","description":"The killed process's name: its comm (at most 15 bytes from the kernel), capped at 64 bytes.","isRequired":true,"uniqueKey":"lastOom.process","typeLabel":"string"},"rssBytes":{"type":"integer","format":"int64","description":"Its resident memory when it was killed (anonymous, file and shared).","isRequired":true,"uniqueKey":"lastOom.rssBytes","typeLabel":"integer\u003cint64>"},"anonRssBytes":{"type":"integer","format":"int64","description":"The anonymous part of rssBytes.","isRequired":true,"uniqueKey":"lastOom.anonRssBytes","typeLabel":"integer\u003cint64>"},"cgroup":{"type":"boolean","description":"A memory cgroup's limit killed it (a container, a unit's MemoryMax), not the sandbox running out of memory.","isRequired":true,"uniqueKey":"lastOom.cgroup","typeLabel":"boolean"},"uid":{"type":"integer","description":"The killed process's user ID, when the kernel logged it.","uniqueKey":"lastOom.uid","typeLabel":"integer"}},"uniqueKey":"lastOom","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"id":"\u003cstring>","name":"\u003cstring>","desiredState":"creating","state":"creating","revision":123,"operationId":"\u003cstring>","template":{"id":"\u003cstring>","version":"\u003cstring>","digest":"\u003cstring>","kernel":"\u003cstring>"},"spec":{"vcpus":123,"memMiB":123,"persistentDiskGiB":123,"rootDiskGiB":123},"storage":{"sizeGiB":123,"mountPath":"/data","persistent":true,"synced":true,"snapshotSeq":123},"runtime":{"ready":true,"processesPreserved":true},"autoSuspendAfterSeconds":123,"maxRunMinutes":1073741823,"runStartedAt":"2023-11-07T05:31:56Z","cooldownUntil":"2023-11-07T05:31:56Z","metadata":{},"vault":true,"guestUser":"alice","orgId":"\u003cstring>","createdAt":"2023-11-07T05:31:56Z","updatedAt":"2023-11-07T05:31:56Z","snapshot":{"id":"\u003cstring>"},"image":{"id":"\u003cstring>"},"lastError":{"code":"unauthenticated","message":"\u003cstring>","requestId":"\u003cstring>","retryable":true,"operationId":"\u003cstring>","reason":"missing_key","hint":"\u003cstring>","docs":"\u003cstring>","docs_url":"\u003cstring>","requiredScopes":["\u003cstring>"],"retryAfterSeconds":2,"at":"2023-11-07T05:31:56Z"},"archiveAt":"2023-11-07T05:31:56Z","deleteAt":"2023-11-07T05:31:56Z","readyAt":"2023-11-07T05:31:56Z","cooldownReason":"abuse_egress_blocklist","abuseLock":{"at":"2023-11-07T05:31:56Z","explanation":"\u003cstring>","what":"\u003cstring>","appeal":"\u003cstring>","dst":"\u003cstring>","port":123,"kind":"\u003cstring>","count":123,"coreShare":123,"process":"\u003cstring>","pool":"\u003cstring>"},"autoSuspendedAt":"2023-11-07T05:31:56Z","envNames":["\u003cstring>"],"free":true,"earlyAllowanceEnded":true,"oomKills":123,"lastOom":{"at":"2023-11-07T05:31:56Z","pid":123,"process":"\u003cstring>","rssBytes":123,"anonRssBytes":123,"cgroup":true,"uid":123}}}},"exampleType":"generated"}},"exampleType":"generated"},"2823e8ac-681f-4e98-b37b-5f76ad4c8ab7":{"description":"The mutation was accepted (or replayed for the same idempotency key). Poll the operation.","content":{"application/json":{"schema":{"type":"object","description":"The progress of a change to a sandbox (`suspend` is pause; `restore` puts its disks back to a snapshot's; `move`, admin only, copies it to another host pool). It does not return the request it was queued with (a start's `vcpus`/`memMiB` show in the sandbox's `spec`).","required":["id","machineId","type","state","error","createdAt","updatedAt"],"properties":{"id":{"type":"string","isRequired":true,"uniqueKey":"id","typeLabel":"string"},"machineId":{"type":"string","isRequired":true,"uniqueKey":"machineId","typeLabel":"string"},"type":{"type":"string","enum":["create","start","stop","suspend","resume","delete","restore","resize","move"],"isRequired":true,"uniqueKey":"type","typeLabel":"enum\u003cstring>"},"state":{"type":"string","enum":["queued","running","succeeded","failed"],"description":"`succeeded` and `failed` are terminal.","isRequired":true,"uniqueKey":"state","typeLabel":"enum\u003cstring>"},"error":{"oneOf":[{"type":"object","required":["code","message","requestId","retryable","operationId"],"properties":{"code":{"type":"string","description":"Machine-readable code. HTTP status per code is fixed.","enum":["unauthenticated","missing_key","malformed_key","invalid_key","expired_key","revoked_key","session_expired","missing_scope","permission_denied","not_found","bad_request","feature_disabled","unknown_field","operation_conflict","idempotency_conflict","machine_not_running","restore_unavailable","delete_confirmation_required","fork_unavailable","machine_cooldown","max_run_disabled","desktop_not_running","disk_too_small","grow_needs_stop","resize_restart_off","private_ports_unavailable","quota_exceeded","no_capacity","host_unavailable","metrics_unavailable","restore_failed","internal","authorization_pending","slow_down","expired_token","access_denied","invalid_grant","invite_required","invite_invalid","invite_email_mismatch","api_key_expired","api_key_revoked","insufficient_scope","orca_unsupported","runtime_not_ready","spec_not_allowed","template_not_allowed","template_limit","kernel_unavailable","template_unavailable","invalid_guest_user","vault_unavailable","vault_retired","credit_exhausted","spend_limit_reached","subscription_required","payment_method_required","early_allowance_ended","rate_limited","concurrency_limit","payment_failed","missing_parent","not_a_file","no_space","too_large","data_disk_not_browsable","support_unavailable","host_oom","vmm_crashed","guest_reboot_loop"],"isRequired":true,"uniqueKey":"error.oneOf.0.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.oneOf.0.message","typeLabel":"string"},"requestId":{"type":"string","isRequired":true,"uniqueKey":"error.oneOf.0.requestId","typeLabel":"string"},"retryable":{"type":"boolean","description":"True if the same request may succeed later.","isRequired":true,"uniqueKey":"error.oneOf.0.retryable","typeLabel":"boolean"},"operationId":{"oneOf":[{"type":"string","description":"For `operation_conflict`, the active operation.","isRequired":true,"uniqueKey":"error.oneOf.0.operationId.oneOf.0","typeLabel":"string"},{"type":"null","description":"For `operation_conflict`, the active operation.","isRequired":true,"uniqueKey":"error.oneOf.0.operationId.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"error.oneOf.0.operationId","typeLabel":"string | null"},"reason":{"type":"string","description":"The same as `code` for credential errors (401 `missing_key`, `malformed_key`, `invalid_key`, `expired_key`, `revoked_key`, `session_expired`; 403 `missing_scope`). For 409 `machine_cooldown`, the automatic abuse check whose pause locks the sandbox: `abuse_egress_blocklist` (it tried to connect to a blocked destination on the egress blocklist, not a DNS lookup), `abuse_network_flows` (scanning or attack traffic), `abuse_cpu` (mining); absent for a max-run cooldown. For a retryable 409 `fork_unavailable`, why the source's host cannot take the fork: `source_host_unavailable` (it takes no new sandboxes) or `source_host_full` (no room now). Absent on other errors and from older servers.","enum":["missing_key","malformed_key","invalid_key","expired_key","revoked_key","session_expired","missing_scope","abuse_egress_blocklist","abuse_network_flows","abuse_cpu","source_host_unavailable","source_host_full"],"uniqueKey":"error.oneOf.0.reason","typeLabel":"enum\u003cstring>"},"hint":{"type":"string","description":"The next step that fixes the error (credential errors). Absent otherwise.","uniqueKey":"error.oneOf.0.hint","typeLabel":"string"},"docs":{"type":"string","format":"uri","description":"A URL documenting the error (credential errors). Absent otherwise.","uniqueKey":"error.oneOf.0.docs","typeLabel":"string\u003curi>"},"docs_url":{"type":"string","format":"uri","description":"The code's entry on the errors page, on every error response: https://instabox.sh/docs/errors#\u003ccode> with underscores as dashes (e.g. #credit-exhausted): its HTTP status, whether to retry and what to do. Snake case, unlike the other fields. Absent from a failed operation's `error` and from older servers.","uniqueKey":"error.oneOf.0.docs_url","typeLabel":"string\u003curi>"},"requiredScopes":{"type":"array","items":{"type":"string","uniqueKey":"error.oneOf.0.requiredScopes.items.[INDEX]","typeLabel":"string"},"description":"For `missing_scope`, the scopes the route accepts; the key needs one of them.","uniqueKey":"error.oneOf.0.requiredScopes","typeLabel":"string[]"},"retryAfterSeconds":{"type":"integer","minimum":1,"description":"Seconds to wait before trying again: a retryable `no_capacity` (60, as a 503 or on a failed operation's `error`), `rate_limited`, `machine_cooldown` and agent sign-up `quota_exceeded`. An error response also sends it as the `Retry-After` header; a failed operation's `error` has only this field. Absent otherwise and from older servers.","uniqueKey":"error.oneOf.0.retryAfterSeconds","typeLabel":"integer"},"at":{"type":"string","format":"date-time","description":"When it happened, for a stop the platform found (a sandbox's `lastError` with code `host_oom`, `vmm_crashed` or `guest_reboot_loop`; `hint` says what to do). The next successful start clears the error. Absent otherwise and from older servers.","uniqueKey":"error.oneOf.0.at","typeLabel":"string\u003cdate-time>"}},"isRequired":true,"uniqueKey":"error.oneOf.0","typeLabel":"object"},{"type":"null","isRequired":true,"uniqueKey":"error.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"error","typeLabel":"object | null"},"createdAt":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"createdAt","typeLabel":"string\u003cdate-time>"},"updatedAt":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"updatedAt","typeLabel":"string\u003cdate-time>"},"phase":{"type":"string","description":"Free text progress, e.g. scheduling, booting, waiting_ready, snapshotting.","uniqueKey":"phase","typeLabel":"string"},"forkInherited":{"type":"boolean","description":"On the answer to `POST /v1/machines/{id}/fork`: the control host that took it keeps the source's delete deadline, idle auto-suspend, max run and metadata, and takes `autoSuspendAfterSeconds` and `maxRunMinutes`. Absent: a host from before that (during a rolling control deploy), which gave the fork its defaults with only the request's `metadata` and `deleteAfterSeconds`; set the idle auto-suspend and max run with `PATCH /v1/machines/{id}`.","uniqueKey":"forkInherited","typeLabel":"boolean"},"trigger":{"type":"string","enum":["idle","max_run","memory_pressure","timeout","archive","delete_at","drain","request","wake","user_delete","user_disable","admin","admin_delete","credit","spend_cap","downgrade","subscription_ended","payment_method","members","early_allowance_ended","abuse_pool","abuse_cpu","abuse_scan","abuse_proxy"],"description":"Set when instabox started the operation itself: `idle` (paused when idle), `max_run` (maximum continuous runtime), `memory_pressure` (paused, its processes kept, because the host it ran on was running out of memory; the next use wakes it, as after `idle`), `request` (wake on use), `wake` (POST /v1/machines/{id}/wake), `timeout`, `archive`, `delete_at` (the sandbox's `deleteAt` passed), `drain` (maintenance by an admin), `user_delete` (an admin deleted the owner), `user_disable` (an admin disabled the owner), `admin` (an admin stopped or paused the sandbox), `admin_delete` (an admin deleted the sandbox), `credit` (its free-tier org used up the month's included usage), `spend_cap`, `downgrade`, `subscription_ended`, `payment_method` (its free workspace has no card on file), `members` (its free workspace has more members than the free plan allows), `early_allowance_ended` (paused because the account's early free-sandbox allowance ended and it has more free sandboxes than the free plan runs), `abuse_pool` (paused because the sandbox tried to connect to a blocked destination on the egress blocklist, such as a crypto-mining pool; a DNS lookup of a listed domain never suspends) or `abuse_cpu` (paused by the CPU abuse detector: a restricted account's sandbox ran flat out for an hour with no memory use, no public port, nobody using it and a connection to a mining port) or `abuse_scan` (paused by the flow detector: a restricted account's sandbox swept one port across many hosts, scanned many ports of one host or brute-forced a login port). Absent: a client request.","uniqueKey":"trigger","typeLabel":"enum\u003cstring>"},"machine":{"type":"object","description":"The sandbox as it is when `GET /v1/operations/{id}` is read. Included when the operation `succeeded`, the sandbox still exists, and the caller may read sandboxes (`machines:read` for API keys). Later operations can change it; it is not a record of the state at completion. Absent otherwise, and from older servers.","required":["id","name","desiredState","state","revision","operationId","template","spec","storage","runtime","autoSuspendAfterSeconds","maxRunMinutes","runStartedAt","cooldownUntil","metadata","vault","guestUser","orgId","createdAt","updatedAt"],"properties":{"id":{"type":"string","isRequired":true,"uniqueKey":"machine.id","typeLabel":"string"},"name":{"type":"string","isRequired":true,"uniqueKey":"machine.name","typeLabel":"string"},"desiredState":{"type":"string","enum":["creating","starting","running","stopping","stopped","suspending","suspended","resuming","deleting","deleted","error"],"isRequired":true,"uniqueKey":"machine.desiredState","typeLabel":"enum\u003cstring>"},"state":{"type":"string","enum":["creating","starting","running","stopping","stopped","suspending","suspended","resuming","deleting","deleted","error"],"isRequired":true,"uniqueKey":"machine.state","typeLabel":"enum\u003cstring>"},"revision":{"type":"integer","format":"int64","description":"Increases with each accepted change.","isRequired":true,"uniqueKey":"machine.revision","typeLabel":"integer\u003cint64>"},"operationId":{"oneOf":[{"type":"string","description":"The active operation, if any.","isRequired":true,"uniqueKey":"machine.operationId.oneOf.0","typeLabel":"string"},{"type":"null","description":"The active operation, if any.","isRequired":true,"uniqueKey":"machine.operationId.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"machine.operationId","typeLabel":"string | null"},"template":{"type":"object","required":["id","version","digest"],"properties":{"id":{"type":"string","isRequired":true,"uniqueKey":"machine.template.id","typeLabel":"string"},"version":{"type":"string","isRequired":true,"uniqueKey":"machine.template.version","typeLabel":"string"},"digest":{"type":"string","isRequired":true,"uniqueKey":"machine.template.digest","typeLabel":"string"},"kernel":{"type":"string","description":"The guest kernel the sandbox is pinned to, `sha256:\u003chex>`; absent: the host's default.","uniqueKey":"machine.template.kernel","typeLabel":"string"}},"isRequired":true,"uniqueKey":"machine.template","typeLabel":"object"},"spec":{"type":"object","description":"A sandbox's size.","required":["vcpus","memMiB","persistentDiskGiB"],"properties":{"vcpus":{"type":"integer","isRequired":true,"uniqueKey":"machine.spec.vcpus","typeLabel":"integer"},"memMiB":{"type":"integer","description":"Memory in MiB.","isRequired":true,"uniqueKey":"machine.spec.memMiB","typeLabel":"integer"},"persistentDiskGiB":{"type":"integer","description":"Disk (`/data`) size in GiB.","isRequired":true,"uniqueKey":"machine.spec.persistentDiskGiB","typeLabel":"integer"},"rootDiskGiB":{"type":"integer","description":"System disk size in GiB, set by the template (only admins change it); absent: the template's.","uniqueKey":"machine.spec.rootDiskGiB","typeLabel":"integer"}},"isRequired":true,"uniqueKey":"machine.spec","typeLabel":"object"},"storage":{"type":"object","description":"The sandbox's storage (`/data`, where HOME lives).","required":["sizeGiB","mountPath","persistent","synced"],"properties":{"sizeGiB":{"type":"integer","isRequired":true,"uniqueKey":"machine.storage.sizeGiB","typeLabel":"integer"},"mountPath":{"type":"string","examples":["/data"],"isRequired":true,"uniqueKey":"machine.storage.mountPath","typeLabel":"string"},"persistent":{"type":"boolean","isRequired":true,"uniqueKey":"machine.storage.persistent","typeLabel":"boolean"},"synced":{"type":"boolean","description":"False while the latest state of a stopped or paused sandbox is still being saved: for a few seconds after a stop or pause, or longer if saving fails (it is retried). A snapshot waits until it is true.","isRequired":true,"uniqueKey":"machine.storage.synced","typeLabel":"boolean"},"snapshotSeq":{"type":"integer","format":"int64","description":"Sequence number of the sandbox's latest saved state; absent before the first stop or pause.","uniqueKey":"machine.storage.snapshotSeq","typeLabel":"integer\u003cint64>"}},"isRequired":true,"uniqueKey":"machine.storage","typeLabel":"object"},"runtime":{"type":"object","required":["ready"],"properties":{"ready":{"type":"boolean","description":"True only when the sandbox is running, reports all checks passing and, as checked when it boots or resumes, accepts exec, file and SSH connections.","isRequired":true,"uniqueKey":"machine.runtime.ready","typeLabel":"boolean"},"processesPreserved":{"type":"boolean","description":"Set after a start or resume. False means the paused programs could not be brought back and the sandbox booted fresh (files are kept).","uniqueKey":"machine.runtime.processesPreserved","typeLabel":"boolean"}},"isRequired":true,"uniqueKey":"machine.runtime","typeLabel":"object"},"autoSuspendAfterSeconds":{"oneOf":[{"type":"integer","description":"The running sandbox is paused once it has been idle this many seconds (no agent working, no terminal input or output, little CPU); null: off. Pause, resume, stop and start keep it.","isRequired":true,"uniqueKey":"machine.autoSuspendAfterSeconds.oneOf.0","typeLabel":"integer"},{"type":"null","description":"The running sandbox is paused once it has been idle this many seconds (no agent working, no terminal input or output, little CPU); null: off. Pause, resume, stop and start keep it.","isRequired":true,"uniqueKey":"machine.autoSuspendAfterSeconds.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"machine.autoSuspendAfterSeconds","typeLabel":"integer | null"},"maxRunMinutes":{"type":"integer","minimum":-1,"maximum":2147483647,"description":"Maximum continuous runtime in minutes. -1 is unlimited; 0 sleeps immediately. Independent of idle auto-pause; whichever condition is reached first pauses the sandbox. Free machines default to 480 and only an admin session can change them. The service manages free runtime and may pause a run earlier. The response reports the current limit from runStartedAt; it can change during the run. Paid machines default to -1 and their users can change this setting. Max-run suspension starts a cooldown, returning 409 machine_cooldown with Retry-After on every wake path. By default it is 5 to 20 minutes (5 plus a random 0 to 15) on a paid plan and for the first such pause in a row on the free plan. Back-to-back pauses on the free plan rest longer (60 to 75, then 120 to 135 minutes): \"Longer cooldowns on the free plan\" at https://instabox.sh/docs/machines/auto-pause#longer-cooldowns-on-the-free-plan. Once cooldown ends, 0 still refuses wake with 409 max_run_disabled until changed.","isRequired":true,"uniqueKey":"machine.maxRunMinutes","typeLabel":"integer"},"runStartedAt":{"oneOf":[{"type":"string","format":"date-time","description":"Start of the current continuous run, conservatively initialized on a first error observation too; resets only after confirmed sleep.","isRequired":true,"uniqueKey":"machine.runStartedAt.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"Start of the current continuous run, conservatively initialized on a first error observation too; resets only after confirmed sleep.","isRequired":true,"uniqueKey":"machine.runStartedAt.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"machine.runStartedAt","typeLabel":"string\u003cdate-time> | null"},"cooldownUntil":{"oneOf":[{"type":"string","format":"date-time","description":"All wake paths are refused until this deadline, including admin actions: after a max-run suspension, or the 24-hour lock of an automatic abuse check's pause (cooldownReason).","isRequired":true,"uniqueKey":"machine.cooldownUntil.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"All wake paths are refused until this deadline, including admin actions: after a max-run suspension, or the 24-hour lock of an automatic abuse check's pause (cooldownReason).","isRequired":true,"uniqueKey":"machine.cooldownUntil.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"machine.cooldownUntil","typeLabel":"string\u003cdate-time> | null"},"metadata":{"type":"object","description":"String labels. At most 32 keys of 1-64 characters `[A-Za-z0-9_.-]`, values of at most 512 characters, 8 KiB as JSON.","additionalProperties":{"type":"string","uniqueKey":"machine.metadata.additionalProperties","typeLabel":"string"},"isRequired":true,"uniqueKey":"machine.metadata","typeLabel":"object"},"vault":{"type":"boolean","description":"Whether legacy Vault delivery is enabled. Independent of org Secret selections and delivery status at the sandbox's /secrets endpoint.","isRequired":true,"uniqueKey":"machine.vault","typeLabel":"boolean"},"guestUser":{"type":"string","readOnly":true,"examples":["alice"],"description":"The Linux user in the sandbox that SSH sessions, exec and the terminal log in as, fixed at create: the `guestUser` the create named, else `user` (a create from a snapshot: the snapshot's user). `dev` on sandboxes from templates without the `guest-user` capability, and on every sandbox created before the field.","isRequired":true,"uniqueKey":"machine.guestUser","typeLabel":"string"},"orgId":{"type":"string","readOnly":true,"description":"The org the sandbox counts against (docs/orgs.md).","isRequired":true,"uniqueKey":"machine.orgId","typeLabel":"string"},"createdAt":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"machine.createdAt","typeLabel":"string\u003cdate-time>"},"updatedAt":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"machine.updatedAt","typeLabel":"string\u003cdate-time>"},"snapshot":{"type":"object","required":["id"],"properties":{"id":{"type":"string","isRequired":true,"uniqueKey":"machine.snapshot.id","typeLabel":"string"}},"uniqueKey":"machine.snapshot","typeLabel":"object"},"image":{"type":"object","description":"Deprecated: `snapshot`, under its old name (same value).","required":["id"],"deprecated":true,"properties":{"id":{"type":"string","isRequired":true,"uniqueKey":"machine.image.id","typeLabel":"string"}},"uniqueKey":"machine.image","typeLabel":"object"},"lastError":{"type":"object","required":["code","message","requestId","retryable","operationId"],"properties":{"code":{"type":"string","description":"Machine-readable code. HTTP status per code is fixed.","enum":["unauthenticated","missing_key","malformed_key","invalid_key","expired_key","revoked_key","session_expired","missing_scope","permission_denied","not_found","bad_request","feature_disabled","unknown_field","operation_conflict","idempotency_conflict","machine_not_running","restore_unavailable","delete_confirmation_required","fork_unavailable","machine_cooldown","max_run_disabled","desktop_not_running","disk_too_small","grow_needs_stop","resize_restart_off","private_ports_unavailable","quota_exceeded","no_capacity","host_unavailable","metrics_unavailable","restore_failed","internal","authorization_pending","slow_down","expired_token","access_denied","invalid_grant","invite_required","invite_invalid","invite_email_mismatch","api_key_expired","api_key_revoked","insufficient_scope","orca_unsupported","runtime_not_ready","spec_not_allowed","template_not_allowed","template_limit","kernel_unavailable","template_unavailable","invalid_guest_user","vault_unavailable","vault_retired","credit_exhausted","spend_limit_reached","subscription_required","payment_method_required","early_allowance_ended","rate_limited","concurrency_limit","payment_failed","missing_parent","not_a_file","no_space","too_large","data_disk_not_browsable","support_unavailable","host_oom","vmm_crashed","guest_reboot_loop"],"isRequired":true,"uniqueKey":"machine.lastError.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","isRequired":true,"uniqueKey":"machine.lastError.message","typeLabel":"string"},"requestId":{"type":"string","isRequired":true,"uniqueKey":"machine.lastError.requestId","typeLabel":"string"},"retryable":{"type":"boolean","description":"True if the same request may succeed later.","isRequired":true,"uniqueKey":"machine.lastError.retryable","typeLabel":"boolean"},"operationId":{"oneOf":[{"type":"string","description":"For `operation_conflict`, the active operation.","isRequired":true,"uniqueKey":"machine.lastError.operationId.oneOf.0","typeLabel":"string"},{"type":"null","description":"For `operation_conflict`, the active operation.","isRequired":true,"uniqueKey":"machine.lastError.operationId.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"machine.lastError.operationId","typeLabel":"string | null"},"reason":{"type":"string","description":"The same as `code` for credential errors (401 `missing_key`, `malformed_key`, `invalid_key`, `expired_key`, `revoked_key`, `session_expired`; 403 `missing_scope`). For 409 `machine_cooldown`, the automatic abuse check whose pause locks the sandbox: `abuse_egress_blocklist` (it tried to connect to a blocked destination on the egress blocklist, not a DNS lookup), `abuse_network_flows` (scanning or attack traffic), `abuse_cpu` (mining); absent for a max-run cooldown. For a retryable 409 `fork_unavailable`, why the source's host cannot take the fork: `source_host_unavailable` (it takes no new sandboxes) or `source_host_full` (no room now). Absent on other errors and from older servers.","enum":["missing_key","malformed_key","invalid_key","expired_key","revoked_key","session_expired","missing_scope","abuse_egress_blocklist","abuse_network_flows","abuse_cpu","source_host_unavailable","source_host_full"],"uniqueKey":"machine.lastError.reason","typeLabel":"enum\u003cstring>"},"hint":{"type":"string","description":"The next step that fixes the error (credential errors). Absent otherwise.","uniqueKey":"machine.lastError.hint","typeLabel":"string"},"docs":{"type":"string","format":"uri","description":"A URL documenting the error (credential errors). Absent otherwise.","uniqueKey":"machine.lastError.docs","typeLabel":"string\u003curi>"},"docs_url":{"type":"string","format":"uri","description":"The code's entry on the errors page, on every error response: https://instabox.sh/docs/errors#\u003ccode> with underscores as dashes (e.g. #credit-exhausted): its HTTP status, whether to retry and what to do. Snake case, unlike the other fields. Absent from a failed operation's `error` and from older servers.","uniqueKey":"machine.lastError.docs_url","typeLabel":"string\u003curi>"},"requiredScopes":{"type":"array","items":{"type":"string","uniqueKey":"machine.lastError.requiredScopes.items.[INDEX]","typeLabel":"string"},"description":"For `missing_scope`, the scopes the route accepts; the key needs one of them.","uniqueKey":"machine.lastError.requiredScopes","typeLabel":"string[]"},"retryAfterSeconds":{"type":"integer","minimum":1,"description":"Seconds to wait before trying again: a retryable `no_capacity` (60, as a 503 or on a failed operation's `error`), `rate_limited`, `machine_cooldown` and agent sign-up `quota_exceeded`. An error response also sends it as the `Retry-After` header; a failed operation's `error` has only this field. Absent otherwise and from older servers.","uniqueKey":"machine.lastError.retryAfterSeconds","typeLabel":"integer"},"at":{"type":"string","format":"date-time","description":"When it happened, for a stop the platform found (a sandbox's `lastError` with code `host_oom`, `vmm_crashed` or `guest_reboot_loop`; `hint` says what to do). The next successful start clears the error. Absent otherwise and from older servers.","uniqueKey":"machine.lastError.at","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"machine.lastError","typeLabel":"object"},"archiveAt":{"oneOf":[{"type":"string","format":"date-time","description":"When the sandbox is stopped if it is running (set at creation with `archiveSeconds`): its files are kept and a start brings it back. Resuming does not clear it; a sandbox that is not running when it passes only has it cleared. Absent: none.","uniqueKey":"machine.archiveAt.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When the sandbox is stopped if it is running (set at creation with `archiveSeconds`): its files are kept and a start brings it back. Resuming does not clear it; a sandbox that is not running when it passes only has it cleared. Absent: none.","uniqueKey":"machine.archiveAt.oneOf.1","typeLabel":"null"}],"uniqueKey":"machine.archiveAt","typeLabel":"string\u003cdate-time> | null"},"deleteAt":{"oneOf":[{"type":"string","format":"date-time","description":"When the sandbox is deleted, whatever its state (set at creation with `deleteAfterSeconds`). The delete is an ordinary `delete` operation (`trigger: delete_at`), queued at `deleteAt` (within about a second) once no other operation is in progress. Absent: never.","uniqueKey":"machine.deleteAt.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When the sandbox is deleted, whatever its state (set at creation with `deleteAfterSeconds`). The delete is an ordinary `delete` operation (`trigger: delete_at`), queued at `deleteAt` (within about a second) once no other operation is in progress. Absent: never.","uniqueKey":"machine.deleteAt.oneOf.1","typeLabel":"null"}],"uniqueKey":"machine.deleteAt","typeLabel":"string\u003cdate-time> | null"},"readyAt":{"type":"string","format":"date-time","readOnly":true,"description":"When the running sandbox last became ready (`runtime.ready` turned true: SSH, exec and files work). For a new sandbox, `readyAt` minus `createdAt` is its create time; after a start or resume it is that start's. Absent while the sandbox is not ready, and on a sandbox that was already ready before the field existed (until its next start or resume).","uniqueKey":"machine.readyAt","typeLabel":"string\u003cdate-time>"},"cooldownReason":{"type":"string","enum":["abuse_egress_blocklist","abuse_network_flows","abuse_cpu"],"description":"While cooldownUntil has not passed, the automatic abuse check whose pause locks the sandbox, the same as a wake's 409 `machine_cooldown` Error.reason: `abuse_egress_blocklist` (it tried to connect to a blocked destination on the egress blocklist, not a DNS lookup), `abuse_network_flows` (scanning or attack traffic), `abuse_cpu` (mining). Absent for a max-run cooldown, and once the lock ends.","uniqueKey":"machine.cooldownReason","typeLabel":"enum\u003cstring>"},"abuseLock":{"type":"object","description":"With cooldownReason: what the owner is told about the pause behind the lock. Absent when cooldownReason is.","required":["at","explanation","what","appeal"],"properties":{"at":{"type":"string","format":"date-time","description":"When the sandbox was paused.","isRequired":true,"uniqueKey":"machine.abuseLock.at","typeLabel":"string\u003cdate-time>"},"explanation":{"type":"string","description":"One plain sentence on what the sandbox did (\"was reaching known abuse addresses ...\").","isRequired":true,"uniqueKey":"machine.abuseLock.explanation","typeLabel":"string"},"what":{"type":"string","description":"The finding with its exact address and counts (\"connected to blocked 47.91.89.3\", \"30 connections to 198.51.100.7:22 (brute force)\", \"swept port 22 across 500 destinations\").","isRequired":true,"uniqueKey":"machine.abuseLock.what","typeLabel":"string"},"appeal":{"type":"string","description":"How to contest the pause.","isRequired":true,"uniqueKey":"machine.abuseLock.appeal","typeLabel":"string"},"dst":{"type":"string","description":"The blocked destination, the brute-forced or scanned address.","uniqueKey":"machine.abuseLock.dst","typeLabel":"string"},"port":{"type":"integer","description":"A brute force's destination port, or the swept port. A blocked destination's port is not recorded (the node keeps the address alone).","uniqueKey":"machine.abuseLock.port","typeLabel":"integer"},"kind":{"type":"string","description":"A network-flows finding's kind: sweep, scan, brute or fanout.","uniqueKey":"machine.abuseLock.kind","typeLabel":"string"},"count":{"type":"integer","description":"A network-flows finding's destinations, ports or connections.","uniqueKey":"machine.abuseLock.count","typeLabel":"integer"},"coreShare":{"type":"number","description":"The CPU check's mean share of the sandbox's vCPUs.","uniqueKey":"machine.abuseLock.coreShare","typeLabel":"number"},"process":{"type":"string","description":"The mining program the CPU check found running, when it confirmed one.","uniqueKey":"machine.abuseLock.process","typeLabel":"string"},"pool":{"type":"string","description":"That program's pool.","uniqueKey":"machine.abuseLock.pool","typeLabel":"string"}},"uniqueKey":"machine.abuseLock","typeLabel":"object"},"autoSuspendedAt":{"type":"string","format":"date-time","description":"When the sandbox was queued to pause automatically; a successful automatic resume or its next explicit operation clears it. Absent: none.","uniqueKey":"machine.autoSuspendedAt","typeLabel":"string\u003cdate-time>"},"envNames":{"type":"array","items":{"type":"string","uniqueKey":"machine.envNames.items.[INDEX]","typeLabel":"string"},"description":"The names of the sandbox's create-time `env`, sorted. Absent when it has none. The values are never shown: read them in the sandbox.","uniqueKey":"machine.envNames","typeLabel":"string[]"},"free":{"type":"boolean","readOnly":true,"description":"A free-tier org's sandbox (docs/pricing.md): never billed, pauses after 30 idle minutes (another `autoSuspendAfterSeconds` is refused with 403). On a paid plan every sandbox is billed.","uniqueKey":"machine.free","typeLabel":"boolean"},"earlyAllowanceEnded":{"type":"boolean","readOnly":true,"description":"Set on a stopped or paused free sandbox that cannot be started because its org's early free-sandbox allowance ended and as many free sandboxes as the standard limit allows are running: a start is refused (`402 early_allowance_ended`) until one is paused or deleted. Absent otherwise.","uniqueKey":"machine.earlyAllowanceEnded","typeLabel":"boolean"},"oomKills":{"type":"integer","format":"int64","readOnly":true,"description":"Processes the sandbox's kernel OOM killer killed since the sandbox was created (out of memory, or a memory cgroup's limit). Read from the sandbox about once a minute while it runs, and after an exec that exits non-zero; 0 on sandboxes whose host or guest agent predates the reading (absent from older servers).","uniqueKey":"machine.oomKills","typeLabel":"integer\u003cint64>"},"lastOom":{"type":"object","description":"The newest OOM kill (absent until one is seen, or when the kernel log no longer held it).","required":["at","pid","process","rssBytes","anonRssBytes","cgroup"],"properties":{"at":{"type":"string","format":"date-time","description":"When it was killed (to about a second).","isRequired":true,"uniqueKey":"machine.lastOom.at","typeLabel":"string\u003cdate-time>"},"pid":{"type":"integer","isRequired":true,"uniqueKey":"machine.lastOom.pid","typeLabel":"integer"},"process":{"type":"string","description":"The killed process's name: its comm (at most 15 bytes from the kernel), capped at 64 bytes.","isRequired":true,"uniqueKey":"machine.lastOom.process","typeLabel":"string"},"rssBytes":{"type":"integer","format":"int64","description":"Its resident memory when it was killed (anonymous, file and shared).","isRequired":true,"uniqueKey":"machine.lastOom.rssBytes","typeLabel":"integer\u003cint64>"},"anonRssBytes":{"type":"integer","format":"int64","description":"The anonymous part of rssBytes.","isRequired":true,"uniqueKey":"machine.lastOom.anonRssBytes","typeLabel":"integer\u003cint64>"},"cgroup":{"type":"boolean","description":"A memory cgroup's limit killed it (a container, a unit's MemoryMax), not the sandbox running out of memory.","isRequired":true,"uniqueKey":"machine.lastOom.cgroup","typeLabel":"boolean"},"uid":{"type":"integer","description":"The killed process's user ID, when the kernel logged it.","uniqueKey":"machine.lastOom.uid","typeLabel":"integer"}},"uniqueKey":"machine.lastOom","typeLabel":"object"}},"uniqueKey":"machine","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"id":"\u003cstring>","machineId":"\u003cstring>","type":"create","state":"queued","error":{"code":"unauthenticated","message":"\u003cstring>","requestId":"\u003cstring>","retryable":true,"operationId":"\u003cstring>","reason":"missing_key","hint":"\u003cstring>","docs":"\u003cstring>","docs_url":"\u003cstring>","requiredScopes":["\u003cstring>"],"retryAfterSeconds":2,"at":"2023-11-07T05:31:56Z"},"createdAt":"2023-11-07T05:31:56Z","updatedAt":"2023-11-07T05:31:56Z","phase":"\u003cstring>","forkInherited":true,"trigger":"idle","machine":{"id":"\u003cstring>","name":"\u003cstring>","desiredState":"creating","state":"creating","revision":123,"operationId":"\u003cstring>","template":{"id":"\u003cstring>","version":"\u003cstring>","digest":"\u003cstring>","kernel":"\u003cstring>"},"spec":{"vcpus":123,"memMiB":123,"persistentDiskGiB":123,"rootDiskGiB":123},"storage":{"sizeGiB":123,"mountPath":"/data","persistent":true,"synced":true,"snapshotSeq":123},"runtime":{"ready":true,"processesPreserved":true},"autoSuspendAfterSeconds":123,"maxRunMinutes":1073741823,"runStartedAt":"2023-11-07T05:31:56Z","cooldownUntil":"2023-11-07T05:31:56Z","metadata":{},"vault":true,"guestUser":"alice","orgId":"\u003cstring>","createdAt":"2023-11-07T05:31:56Z","updatedAt":"2023-11-07T05:31:56Z","snapshot":{"id":"\u003cstring>"},"image":{"id":"\u003cstring>"},"lastError":{"code":"unauthenticated","message":"\u003cstring>","requestId":"\u003cstring>","retryable":true,"operationId":"\u003cstring>","reason":"missing_key","hint":"\u003cstring>","docs":"\u003cstring>","docs_url":"\u003cstring>","requiredScopes":["\u003cstring>"],"retryAfterSeconds":2,"at":"2023-11-07T05:31:56Z"},"archiveAt":"2023-11-07T05:31:56Z","deleteAt":"2023-11-07T05:31:56Z","readyAt":"2023-11-07T05:31:56Z","cooldownReason":"abuse_egress_blocklist","abuseLock":{"at":"2023-11-07T05:31:56Z","explanation":"\u003cstring>","what":"\u003cstring>","appeal":"\u003cstring>","dst":"\u003cstring>","port":123,"kind":"\u003cstring>","count":123,"coreShare":123,"process":"\u003cstring>","pool":"\u003cstring>"},"autoSuspendedAt":"2023-11-07T05:31:56Z","envNames":["\u003cstring>"],"free":true,"earlyAllowanceEnded":true,"oomKills":123,"lastOom":{"at":"2023-11-07T05:31:56Z","pid":123,"process":"\u003cstring>","rssBytes":123,"anonRssBytes":123,"cgroup":true,"uid":123}}}}},"exampleType":"generated"}},"exampleType":"generated"},"9f0340b1-20b7-49f2-b50c-482589da3ec1":{"description":"`bad_request`: invalid input or missing Idempotency-Key. `unknown_field`: a body key that is no field of the request's schema (create, fork, restore, start, stop, suspend, resume, wake and `PATCH` of a sandbox); the message names it and the closest known field (`did you mean \"templateId\"?`) and lists the known ones. Nothing is changed. `spec_not_allowed`: sandbox sizes are fixed (4 vCPUs, 8 GiB memory by default; `limits.machineSpec`) and the request names another size (create, create from a snapshot), or someone other than an admin tries to grow the disk of a free sandbox or of a sandbox whose owner may not resize disks. On `PATCH /v1/machines/{id}` it is also a `vcpus`/`memMiB` size the workspace's plan does not offer (the message lists the plan's sizes) or any new size for a free sandbox, whose size is fixed. The message gives the size the sandbox gets; leaving the size fields out always works. `invalid_guest_user`: a create's `guestUser` is not a valid Linux user name or is reserved (`root`, `instabox`, the Debian base system's users and groups such as `sudo`, `systemd-*`). `vault_unavailable` (503): a Vault item was sealed under a master key this server does not have (docs/vault.md).","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","requestId","retryable","operationId"],"properties":{"code":{"type":"string","description":"Machine-readable code. HTTP status per code is fixed.","enum":["unauthenticated","missing_key","malformed_key","invalid_key","expired_key","revoked_key","session_expired","missing_scope","permission_denied","not_found","bad_request","feature_disabled","unknown_field","operation_conflict","idempotency_conflict","machine_not_running","restore_unavailable","delete_confirmation_required","fork_unavailable","machine_cooldown","max_run_disabled","desktop_not_running","disk_too_small","grow_needs_stop","resize_restart_off","private_ports_unavailable","quota_exceeded","no_capacity","host_unavailable","metrics_unavailable","restore_failed","internal","authorization_pending","slow_down","expired_token","access_denied","invalid_grant","invite_required","invite_invalid","invite_email_mismatch","api_key_expired","api_key_revoked","insufficient_scope","orca_unsupported","runtime_not_ready","spec_not_allowed","template_not_allowed","template_limit","kernel_unavailable","template_unavailable","invalid_guest_user","vault_unavailable","vault_retired","credit_exhausted","spend_limit_reached","subscription_required","payment_method_required","early_allowance_ended","rate_limited","concurrency_limit","payment_failed","missing_parent","not_a_file","no_space","too_large","data_disk_not_browsable","support_unavailable","host_oom","vmm_crashed","guest_reboot_loop"],"isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"requestId":{"type":"string","isRequired":true,"uniqueKey":"error.requestId","typeLabel":"string"},"retryable":{"type":"boolean","description":"True if the same request may succeed later.","isRequired":true,"uniqueKey":"error.retryable","typeLabel":"boolean"},"operationId":{"oneOf":[{"type":"string","description":"For `operation_conflict`, the active operation.","isRequired":true,"uniqueKey":"error.operationId.oneOf.0","typeLabel":"string"},{"type":"null","description":"For `operation_conflict`, the active operation.","isRequired":true,"uniqueKey":"error.operationId.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"error.operationId","typeLabel":"string | null"},"reason":{"type":"string","description":"The same as `code` for credential errors (401 `missing_key`, `malformed_key`, `invalid_key`, `expired_key`, `revoked_key`, `session_expired`; 403 `missing_scope`). For 409 `machine_cooldown`, the automatic abuse check whose pause locks the sandbox: `abuse_egress_blocklist` (it tried to connect to a blocked destination on the egress blocklist, not a DNS lookup), `abuse_network_flows` (scanning or attack traffic), `abuse_cpu` (mining); absent for a max-run cooldown. For a retryable 409 `fork_unavailable`, why the source's host cannot take the fork: `source_host_unavailable` (it takes no new sandboxes) or `source_host_full` (no room now). Absent on other errors and from older servers.","enum":["missing_key","malformed_key","invalid_key","expired_key","revoked_key","session_expired","missing_scope","abuse_egress_blocklist","abuse_network_flows","abuse_cpu","source_host_unavailable","source_host_full"],"uniqueKey":"error.reason","typeLabel":"enum\u003cstring>"},"hint":{"type":"string","description":"The next step that fixes the error (credential errors). Absent otherwise.","uniqueKey":"error.hint","typeLabel":"string"},"docs":{"type":"string","format":"uri","description":"A URL documenting the error (credential errors). Absent otherwise.","uniqueKey":"error.docs","typeLabel":"string\u003curi>"},"docs_url":{"type":"string","format":"uri","description":"The code's entry on the errors page, on every error response: https://instabox.sh/docs/errors#\u003ccode> with underscores as dashes (e.g. #credit-exhausted): its HTTP status, whether to retry and what to do. Snake case, unlike the other fields. Absent from a failed operation's `error` and from older servers.","uniqueKey":"error.docs_url","typeLabel":"string\u003curi>"},"requiredScopes":{"type":"array","items":{"type":"string","uniqueKey":"error.requiredScopes.items.[INDEX]","typeLabel":"string"},"description":"For `missing_scope`, the scopes the route accepts; the key needs one of them.","uniqueKey":"error.requiredScopes","typeLabel":"string[]"},"retryAfterSeconds":{"type":"integer","minimum":1,"description":"Seconds to wait before trying again: a retryable `no_capacity` (60, as a 503 or on a failed operation's `error`), `rate_limited`, `machine_cooldown` and agent sign-up `quota_exceeded`. An error response also sends it as the `Retry-After` header; a failed operation's `error` has only this field. Absent otherwise and from older servers.","uniqueKey":"error.retryAfterSeconds","typeLabel":"integer"},"at":{"type":"string","format":"date-time","description":"When it happened, for a stop the platform found (a sandbox's `lastError` with code `host_oom`, `vmm_crashed` or `guest_reboot_loop`; `hint` says what to do). The next successful start clears the error. Absent otherwise and from older servers.","uniqueKey":"error.at","typeLabel":"string\u003cdate-time>"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"unauthenticated","message":"\u003cstring>","requestId":"\u003cstring>","retryable":true,"operationId":"\u003cstring>","reason":"missing_key","hint":"\u003cstring>","docs":"\u003cstring>","docs_url":"\u003cstring>","requiredScopes":["\u003cstring>"],"retryAfterSeconds":2,"at":"2023-11-07T05:31:56Z"}}}},"exampleType":"generated"}},"exampleType":"generated"},"24eb3848-80ef-4dab-80f4-4f6c37e056d3":{"description":"A credential 401 has its own code: `missing_key`, `malformed_key`, `invalid_key`, `expired_key`, `revoked_key` or `session_expired`, with `hint` and `docs` (older servers sent `unauthenticated`, `api_key_expired` or `api_key_revoked`). Other 401s (refresh tokens, tickets) are `unauthenticated`. For a missing or bad API key or access token the message ends with how to get a key (session and refresh-token 401s say to sign in again instead), e.g. `create an API key at https://dashboard.instabox.sh/dashboard/api-keys and send it as \"Authorization: Bearer \u003ckey>\" or \"X-API-Key: \u003ckey>\"`.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","requestId","retryable","operationId"],"properties":{"code":{"type":"string","description":"Machine-readable code. HTTP status per code is fixed.","enum":["unauthenticated","missing_key","malformed_key","invalid_key","expired_key","revoked_key","session_expired","missing_scope","permission_denied","not_found","bad_request","feature_disabled","unknown_field","operation_conflict","idempotency_conflict","machine_not_running","restore_unavailable","delete_confirmation_required","fork_unavailable","machine_cooldown","max_run_disabled","desktop_not_running","disk_too_small","grow_needs_stop","resize_restart_off","private_ports_unavailable","quota_exceeded","no_capacity","host_unavailable","metrics_unavailable","restore_failed","internal","authorization_pending","slow_down","expired_token","access_denied","invalid_grant","invite_required","invite_invalid","invite_email_mismatch","api_key_expired","api_key_revoked","insufficient_scope","orca_unsupported","runtime_not_ready","spec_not_allowed","template_not_allowed","template_limit","kernel_unavailable","template_unavailable","invalid_guest_user","vault_unavailable","vault_retired","credit_exhausted","spend_limit_reached","subscription_required","payment_method_required","early_allowance_ended","rate_limited","concurrency_limit","payment_failed","missing_parent","not_a_file","no_space","too_large","data_disk_not_browsable","support_unavailable","host_oom","vmm_crashed","guest_reboot_loop"],"isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"requestId":{"type":"string","isRequired":true,"uniqueKey":"error.requestId","typeLabel":"string"},"retryable":{"type":"boolean","description":"True if the same request may succeed later.","isRequired":true,"uniqueKey":"error.retryable","typeLabel":"boolean"},"operationId":{"oneOf":[{"type":"string","description":"For `operation_conflict`, the active operation.","isRequired":true,"uniqueKey":"error.operationId.oneOf.0","typeLabel":"string"},{"type":"null","description":"For `operation_conflict`, the active operation.","isRequired":true,"uniqueKey":"error.operationId.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"error.operationId","typeLabel":"string | null"},"reason":{"type":"string","description":"The same as `code` for credential errors (401 `missing_key`, `malformed_key`, `invalid_key`, `expired_key`, `revoked_key`, `session_expired`; 403 `missing_scope`). For 409 `machine_cooldown`, the automatic abuse check whose pause locks the sandbox: `abuse_egress_blocklist` (it tried to connect to a blocked destination on the egress blocklist, not a DNS lookup), `abuse_network_flows` (scanning or attack traffic), `abuse_cpu` (mining); absent for a max-run cooldown. For a retryable 409 `fork_unavailable`, why the source's host cannot take the fork: `source_host_unavailable` (it takes no new sandboxes) or `source_host_full` (no room now). Absent on other errors and from older servers.","enum":["missing_key","malformed_key","invalid_key","expired_key","revoked_key","session_expired","missing_scope","abuse_egress_blocklist","abuse_network_flows","abuse_cpu","source_host_unavailable","source_host_full"],"uniqueKey":"error.reason","typeLabel":"enum\u003cstring>"},"hint":{"type":"string","description":"The next step that fixes the error (credential errors). Absent otherwise.","uniqueKey":"error.hint","typeLabel":"string"},"docs":{"type":"string","format":"uri","description":"A URL documenting the error (credential errors). Absent otherwise.","uniqueKey":"error.docs","typeLabel":"string\u003curi>"},"docs_url":{"type":"string","format":"uri","description":"The code's entry on the errors page, on every error response: https://instabox.sh/docs/errors#\u003ccode> with underscores as dashes (e.g. #credit-exhausted): its HTTP status, whether to retry and what to do. Snake case, unlike the other fields. Absent from a failed operation's `error` and from older servers.","uniqueKey":"error.docs_url","typeLabel":"string\u003curi>"},"requiredScopes":{"type":"array","items":{"type":"string","uniqueKey":"error.requiredScopes.items.[INDEX]","typeLabel":"string"},"description":"For `missing_scope`, the scopes the route accepts; the key needs one of them.","uniqueKey":"error.requiredScopes","typeLabel":"string[]"},"retryAfterSeconds":{"type":"integer","minimum":1,"description":"Seconds to wait before trying again: a retryable `no_capacity` (60, as a 503 or on a failed operation's `error`), `rate_limited`, `machine_cooldown` and agent sign-up `quota_exceeded`. An error response also sends it as the `Retry-After` header; a failed operation's `error` has only this field. Absent otherwise and from older servers.","uniqueKey":"error.retryAfterSeconds","typeLabel":"integer"},"at":{"type":"string","format":"date-time","description":"When it happened, for a stop the platform found (a sandbox's `lastError` with code `host_oom`, `vmm_crashed` or `guest_reboot_loop`; `hint` says what to do). The next successful start clears the error. Absent otherwise and from older servers.","uniqueKey":"error.at","typeLabel":"string\u003cdate-time>"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"unauthenticated","message":"\u003cstring>","requestId":"\u003cstring>","retryable":true,"operationId":"\u003cstring>","reason":"missing_key","hint":"\u003cstring>","docs":"\u003cstring>","docs_url":"\u003cstring>","requiredScopes":["\u003cstring>"],"retryAfterSeconds":2,"at":"2023-11-07T05:31:56Z"}}}},"exampleType":"generated"}},"exampleType":"generated"},"ec9c1946-6694-4e63-a9b6-4a608fc8433b":{"description":"`credit_exhausted`: the account's free sandbox used its hours for the month (when the server enforces a cap); it can run again next month (UTC). `spend_limit_reached`: the sandbox's paid org reached its spend cap for the month. `subscription_required`: the org's subscription ended. `payment_failed`: the charge a plan change needed did not succeed; the plan is unchanged.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","requestId","retryable","operationId"],"properties":{"code":{"type":"string","description":"Machine-readable code. HTTP status per code is fixed.","enum":["unauthenticated","missing_key","malformed_key","invalid_key","expired_key","revoked_key","session_expired","missing_scope","permission_denied","not_found","bad_request","feature_disabled","unknown_field","operation_conflict","idempotency_conflict","machine_not_running","restore_unavailable","delete_confirmation_required","fork_unavailable","machine_cooldown","max_run_disabled","desktop_not_running","disk_too_small","grow_needs_stop","resize_restart_off","private_ports_unavailable","quota_exceeded","no_capacity","host_unavailable","metrics_unavailable","restore_failed","internal","authorization_pending","slow_down","expired_token","access_denied","invalid_grant","invite_required","invite_invalid","invite_email_mismatch","api_key_expired","api_key_revoked","insufficient_scope","orca_unsupported","runtime_not_ready","spec_not_allowed","template_not_allowed","template_limit","kernel_unavailable","template_unavailable","invalid_guest_user","vault_unavailable","vault_retired","credit_exhausted","spend_limit_reached","subscription_required","payment_method_required","early_allowance_ended","rate_limited","concurrency_limit","payment_failed","missing_parent","not_a_file","no_space","too_large","data_disk_not_browsable","support_unavailable","host_oom","vmm_crashed","guest_reboot_loop"],"isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"requestId":{"type":"string","isRequired":true,"uniqueKey":"error.requestId","typeLabel":"string"},"retryable":{"type":"boolean","description":"True if the same request may succeed later.","isRequired":true,"uniqueKey":"error.retryable","typeLabel":"boolean"},"operationId":{"oneOf":[{"type":"string","description":"For `operation_conflict`, the active operation.","isRequired":true,"uniqueKey":"error.operationId.oneOf.0","typeLabel":"string"},{"type":"null","description":"For `operation_conflict`, the active operation.","isRequired":true,"uniqueKey":"error.operationId.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"error.operationId","typeLabel":"string | null"},"reason":{"type":"string","description":"The same as `code` for credential errors (401 `missing_key`, `malformed_key`, `invalid_key`, `expired_key`, `revoked_key`, `session_expired`; 403 `missing_scope`). For 409 `machine_cooldown`, the automatic abuse check whose pause locks the sandbox: `abuse_egress_blocklist` (it tried to connect to a blocked destination on the egress blocklist, not a DNS lookup), `abuse_network_flows` (scanning or attack traffic), `abuse_cpu` (mining); absent for a max-run cooldown. For a retryable 409 `fork_unavailable`, why the source's host cannot take the fork: `source_host_unavailable` (it takes no new sandboxes) or `source_host_full` (no room now). Absent on other errors and from older servers.","enum":["missing_key","malformed_key","invalid_key","expired_key","revoked_key","session_expired","missing_scope","abuse_egress_blocklist","abuse_network_flows","abuse_cpu","source_host_unavailable","source_host_full"],"uniqueKey":"error.reason","typeLabel":"enum\u003cstring>"},"hint":{"type":"string","description":"The next step that fixes the error (credential errors). Absent otherwise.","uniqueKey":"error.hint","typeLabel":"string"},"docs":{"type":"string","format":"uri","description":"A URL documenting the error (credential errors). Absent otherwise.","uniqueKey":"error.docs","typeLabel":"string\u003curi>"},"docs_url":{"type":"string","format":"uri","description":"The code's entry on the errors page, on every error response: https://instabox.sh/docs/errors#\u003ccode> with underscores as dashes (e.g. #credit-exhausted): its HTTP status, whether to retry and what to do. Snake case, unlike the other fields. Absent from a failed operation's `error` and from older servers.","uniqueKey":"error.docs_url","typeLabel":"string\u003curi>"},"requiredScopes":{"type":"array","items":{"type":"string","uniqueKey":"error.requiredScopes.items.[INDEX]","typeLabel":"string"},"description":"For `missing_scope`, the scopes the route accepts; the key needs one of them.","uniqueKey":"error.requiredScopes","typeLabel":"string[]"},"retryAfterSeconds":{"type":"integer","minimum":1,"description":"Seconds to wait before trying again: a retryable `no_capacity` (60, as a 503 or on a failed operation's `error`), `rate_limited`, `machine_cooldown` and agent sign-up `quota_exceeded`. An error response also sends it as the `Retry-After` header; a failed operation's `error` has only this field. Absent otherwise and from older servers.","uniqueKey":"error.retryAfterSeconds","typeLabel":"integer"},"at":{"type":"string","format":"date-time","description":"When it happened, for a stop the platform found (a sandbox's `lastError` with code `host_oom`, `vmm_crashed` or `guest_reboot_loop`; `hint` says what to do). The next successful start clears the error. Absent otherwise and from older servers.","uniqueKey":"error.at","typeLabel":"string\u003cdate-time>"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"unauthenticated","message":"\u003cstring>","requestId":"\u003cstring>","retryable":true,"operationId":"\u003cstring>","reason":"missing_key","hint":"\u003cstring>","docs":"\u003cstring>","docs_url":"\u003cstring>","requiredScopes":["\u003cstring>"],"retryAfterSeconds":2,"at":"2023-11-07T05:31:56Z"}}}},"exampleType":"generated"}},"exampleType":"generated"},"37f0633e-e2c5-4339-a106-62365e40d19d":{"description":"`not_found`: no such resource (also for deleted sandboxes).","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","requestId","retryable","operationId"],"properties":{"code":{"type":"string","description":"Machine-readable code. HTTP status per code is fixed.","enum":["unauthenticated","missing_key","malformed_key","invalid_key","expired_key","revoked_key","session_expired","missing_scope","permission_denied","not_found","bad_request","feature_disabled","unknown_field","operation_conflict","idempotency_conflict","machine_not_running","restore_unavailable","delete_confirmation_required","fork_unavailable","machine_cooldown","max_run_disabled","desktop_not_running","disk_too_small","grow_needs_stop","resize_restart_off","private_ports_unavailable","quota_exceeded","no_capacity","host_unavailable","metrics_unavailable","restore_failed","internal","authorization_pending","slow_down","expired_token","access_denied","invalid_grant","invite_required","invite_invalid","invite_email_mismatch","api_key_expired","api_key_revoked","insufficient_scope","orca_unsupported","runtime_not_ready","spec_not_allowed","template_not_allowed","template_limit","kernel_unavailable","template_unavailable","invalid_guest_user","vault_unavailable","vault_retired","credit_exhausted","spend_limit_reached","subscription_required","payment_method_required","early_allowance_ended","rate_limited","concurrency_limit","payment_failed","missing_parent","not_a_file","no_space","too_large","data_disk_not_browsable","support_unavailable","host_oom","vmm_crashed","guest_reboot_loop"],"isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"requestId":{"type":"string","isRequired":true,"uniqueKey":"error.requestId","typeLabel":"string"},"retryable":{"type":"boolean","description":"True if the same request may succeed later.","isRequired":true,"uniqueKey":"error.retryable","typeLabel":"boolean"},"operationId":{"oneOf":[{"type":"string","description":"For `operation_conflict`, the active operation.","isRequired":true,"uniqueKey":"error.operationId.oneOf.0","typeLabel":"string"},{"type":"null","description":"For `operation_conflict`, the active operation.","isRequired":true,"uniqueKey":"error.operationId.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"error.operationId","typeLabel":"string | null"},"reason":{"type":"string","description":"The same as `code` for credential errors (401 `missing_key`, `malformed_key`, `invalid_key`, `expired_key`, `revoked_key`, `session_expired`; 403 `missing_scope`). For 409 `machine_cooldown`, the automatic abuse check whose pause locks the sandbox: `abuse_egress_blocklist` (it tried to connect to a blocked destination on the egress blocklist, not a DNS lookup), `abuse_network_flows` (scanning or attack traffic), `abuse_cpu` (mining); absent for a max-run cooldown. For a retryable 409 `fork_unavailable`, why the source's host cannot take the fork: `source_host_unavailable` (it takes no new sandboxes) or `source_host_full` (no room now). Absent on other errors and from older servers.","enum":["missing_key","malformed_key","invalid_key","expired_key","revoked_key","session_expired","missing_scope","abuse_egress_blocklist","abuse_network_flows","abuse_cpu","source_host_unavailable","source_host_full"],"uniqueKey":"error.reason","typeLabel":"enum\u003cstring>"},"hint":{"type":"string","description":"The next step that fixes the error (credential errors). Absent otherwise.","uniqueKey":"error.hint","typeLabel":"string"},"docs":{"type":"string","format":"uri","description":"A URL documenting the error (credential errors). Absent otherwise.","uniqueKey":"error.docs","typeLabel":"string\u003curi>"},"docs_url":{"type":"string","format":"uri","description":"The code's entry on the errors page, on every error response: https://instabox.sh/docs/errors#\u003ccode> with underscores as dashes (e.g. #credit-exhausted): its HTTP status, whether to retry and what to do. Snake case, unlike the other fields. Absent from a failed operation's `error` and from older servers.","uniqueKey":"error.docs_url","typeLabel":"string\u003curi>"},"requiredScopes":{"type":"array","items":{"type":"string","uniqueKey":"error.requiredScopes.items.[INDEX]","typeLabel":"string"},"description":"For `missing_scope`, the scopes the route accepts; the key needs one of them.","uniqueKey":"error.requiredScopes","typeLabel":"string[]"},"retryAfterSeconds":{"type":"integer","minimum":1,"description":"Seconds to wait before trying again: a retryable `no_capacity` (60, as a 503 or on a failed operation's `error`), `rate_limited`, `machine_cooldown` and agent sign-up `quota_exceeded`. An error response also sends it as the `Retry-After` header; a failed operation's `error` has only this field. Absent otherwise and from older servers.","uniqueKey":"error.retryAfterSeconds","typeLabel":"integer"},"at":{"type":"string","format":"date-time","description":"When it happened, for a stop the platform found (a sandbox's `lastError` with code `host_oom`, `vmm_crashed` or `guest_reboot_loop`; `hint` says what to do). The next successful start clears the error. Absent otherwise and from older servers.","uniqueKey":"error.at","typeLabel":"string\u003cdate-time>"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"unauthenticated","message":"\u003cstring>","requestId":"\u003cstring>","retryable":true,"operationId":"\u003cstring>","reason":"missing_key","hint":"\u003cstring>","docs":"\u003cstring>","docs_url":"\u003cstring>","requiredScopes":["\u003cstring>"],"retryAfterSeconds":2,"at":"2023-11-07T05:31:56Z"}}}},"exampleType":"generated"}},"exampleType":"generated"},"8eabc561-267f-423d-8833-3406d9c01f94":{"description":"`operation_conflict` (another operation is active; `operationId` names it,\nor the transition is not allowed), `idempotency_conflict` (key reused for\na different request), `delete_confirmation_required` (a delete's\n`X-Confirm-Delete` header is not the sandbox's or snapshot's ID or name,\nor a key that must send it left it out),\n`machine_not_running` (the sandbox is not running), `desktop_not_running` (the\nVNC endpoint before the desktop started), or for Orca connections\n`orca_unsupported` and `runtime_not_ready` (retryable).\n","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","requestId","retryable","operationId"],"properties":{"code":{"type":"string","description":"Machine-readable code. HTTP status per code is fixed.","enum":["unauthenticated","missing_key","malformed_key","invalid_key","expired_key","revoked_key","session_expired","missing_scope","permission_denied","not_found","bad_request","feature_disabled","unknown_field","operation_conflict","idempotency_conflict","machine_not_running","restore_unavailable","delete_confirmation_required","fork_unavailable","machine_cooldown","max_run_disabled","desktop_not_running","disk_too_small","grow_needs_stop","resize_restart_off","private_ports_unavailable","quota_exceeded","no_capacity","host_unavailable","metrics_unavailable","restore_failed","internal","authorization_pending","slow_down","expired_token","access_denied","invalid_grant","invite_required","invite_invalid","invite_email_mismatch","api_key_expired","api_key_revoked","insufficient_scope","orca_unsupported","runtime_not_ready","spec_not_allowed","template_not_allowed","template_limit","kernel_unavailable","template_unavailable","invalid_guest_user","vault_unavailable","vault_retired","credit_exhausted","spend_limit_reached","subscription_required","payment_method_required","early_allowance_ended","rate_limited","concurrency_limit","payment_failed","missing_parent","not_a_file","no_space","too_large","data_disk_not_browsable","support_unavailable","host_oom","vmm_crashed","guest_reboot_loop"],"isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"requestId":{"type":"string","isRequired":true,"uniqueKey":"error.requestId","typeLabel":"string"},"retryable":{"type":"boolean","description":"True if the same request may succeed later.","isRequired":true,"uniqueKey":"error.retryable","typeLabel":"boolean"},"operationId":{"oneOf":[{"type":"string","description":"For `operation_conflict`, the active operation.","isRequired":true,"uniqueKey":"error.operationId.oneOf.0","typeLabel":"string"},{"type":"null","description":"For `operation_conflict`, the active operation.","isRequired":true,"uniqueKey":"error.operationId.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"error.operationId","typeLabel":"string | null"},"reason":{"type":"string","description":"The same as `code` for credential errors (401 `missing_key`, `malformed_key`, `invalid_key`, `expired_key`, `revoked_key`, `session_expired`; 403 `missing_scope`). For 409 `machine_cooldown`, the automatic abuse check whose pause locks the sandbox: `abuse_egress_blocklist` (it tried to connect to a blocked destination on the egress blocklist, not a DNS lookup), `abuse_network_flows` (scanning or attack traffic), `abuse_cpu` (mining); absent for a max-run cooldown. For a retryable 409 `fork_unavailable`, why the source's host cannot take the fork: `source_host_unavailable` (it takes no new sandboxes) or `source_host_full` (no room now). Absent on other errors and from older servers.","enum":["missing_key","malformed_key","invalid_key","expired_key","revoked_key","session_expired","missing_scope","abuse_egress_blocklist","abuse_network_flows","abuse_cpu","source_host_unavailable","source_host_full"],"uniqueKey":"error.reason","typeLabel":"enum\u003cstring>"},"hint":{"type":"string","description":"The next step that fixes the error (credential errors). Absent otherwise.","uniqueKey":"error.hint","typeLabel":"string"},"docs":{"type":"string","format":"uri","description":"A URL documenting the error (credential errors). Absent otherwise.","uniqueKey":"error.docs","typeLabel":"string\u003curi>"},"docs_url":{"type":"string","format":"uri","description":"The code's entry on the errors page, on every error response: https://instabox.sh/docs/errors#\u003ccode> with underscores as dashes (e.g. #credit-exhausted): its HTTP status, whether to retry and what to do. Snake case, unlike the other fields. Absent from a failed operation's `error` and from older servers.","uniqueKey":"error.docs_url","typeLabel":"string\u003curi>"},"requiredScopes":{"type":"array","items":{"type":"string","uniqueKey":"error.requiredScopes.items.[INDEX]","typeLabel":"string"},"description":"For `missing_scope`, the scopes the route accepts; the key needs one of them.","uniqueKey":"error.requiredScopes","typeLabel":"string[]"},"retryAfterSeconds":{"type":"integer","minimum":1,"description":"Seconds to wait before trying again: a retryable `no_capacity` (60, as a 503 or on a failed operation's `error`), `rate_limited`, `machine_cooldown` and agent sign-up `quota_exceeded`. An error response also sends it as the `Retry-After` header; a failed operation's `error` has only this field. Absent otherwise and from older servers.","uniqueKey":"error.retryAfterSeconds","typeLabel":"integer"},"at":{"type":"string","format":"date-time","description":"When it happened, for a stop the platform found (a sandbox's `lastError` with code `host_oom`, `vmm_crashed` or `guest_reboot_loop`; `hint` says what to do). The next successful start clears the error. Absent otherwise and from older servers.","uniqueKey":"error.at","typeLabel":"string\u003cdate-time>"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"unauthenticated","message":"\u003cstring>","requestId":"\u003cstring>","retryable":true,"operationId":"\u003cstring>","reason":"missing_key","hint":"\u003cstring>","docs":"\u003cstring>","docs_url":"\u003cstring>","requiredScopes":["\u003cstring>"],"retryAfterSeconds":2,"at":"2023-11-07T05:31:56Z"}}}},"exampleType":"generated"}},"exampleType":"generated"},"7619fc5f-87a6-4a50-be18-ac35cda22b51":{"description":"`quota_exceeded`: one of your limits was reached: the number of sandboxes (on the free plan 1, in any state, stopped and paused included; Pro 500; Builder 1000), stored data (on the free plan 200 GiB), snapshots (on the free plan 5), API keys, execs or terminals. The message says which, e.g. \"sandbox limit reached (1 of 1) in org alice (free plan): delete a sandbox first\". Delete a sandbox or snapshot, upgrade the plan, or ask an admin to raise your limit.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","requestId","retryable","operationId"],"properties":{"code":{"type":"string","description":"Machine-readable code. HTTP status per code is fixed.","enum":["unauthenticated","missing_key","malformed_key","invalid_key","expired_key","revoked_key","session_expired","missing_scope","permission_denied","not_found","bad_request","feature_disabled","unknown_field","operation_conflict","idempotency_conflict","machine_not_running","restore_unavailable","delete_confirmation_required","fork_unavailable","machine_cooldown","max_run_disabled","desktop_not_running","disk_too_small","grow_needs_stop","resize_restart_off","private_ports_unavailable","quota_exceeded","no_capacity","host_unavailable","metrics_unavailable","restore_failed","internal","authorization_pending","slow_down","expired_token","access_denied","invalid_grant","invite_required","invite_invalid","invite_email_mismatch","api_key_expired","api_key_revoked","insufficient_scope","orca_unsupported","runtime_not_ready","spec_not_allowed","template_not_allowed","template_limit","kernel_unavailable","template_unavailable","invalid_guest_user","vault_unavailable","vault_retired","credit_exhausted","spend_limit_reached","subscription_required","payment_method_required","early_allowance_ended","rate_limited","concurrency_limit","payment_failed","missing_parent","not_a_file","no_space","too_large","data_disk_not_browsable","support_unavailable","host_oom","vmm_crashed","guest_reboot_loop"],"isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"requestId":{"type":"string","isRequired":true,"uniqueKey":"error.requestId","typeLabel":"string"},"retryable":{"type":"boolean","description":"True if the same request may succeed later.","isRequired":true,"uniqueKey":"error.retryable","typeLabel":"boolean"},"operationId":{"oneOf":[{"type":"string","description":"For `operation_conflict`, the active operation.","isRequired":true,"uniqueKey":"error.operationId.oneOf.0","typeLabel":"string"},{"type":"null","description":"For `operation_conflict`, the active operation.","isRequired":true,"uniqueKey":"error.operationId.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"error.operationId","typeLabel":"string | null"},"reason":{"type":"string","description":"The same as `code` for credential errors (401 `missing_key`, `malformed_key`, `invalid_key`, `expired_key`, `revoked_key`, `session_expired`; 403 `missing_scope`). For 409 `machine_cooldown`, the automatic abuse check whose pause locks the sandbox: `abuse_egress_blocklist` (it tried to connect to a blocked destination on the egress blocklist, not a DNS lookup), `abuse_network_flows` (scanning or attack traffic), `abuse_cpu` (mining); absent for a max-run cooldown. For a retryable 409 `fork_unavailable`, why the source's host cannot take the fork: `source_host_unavailable` (it takes no new sandboxes) or `source_host_full` (no room now). Absent on other errors and from older servers.","enum":["missing_key","malformed_key","invalid_key","expired_key","revoked_key","session_expired","missing_scope","abuse_egress_blocklist","abuse_network_flows","abuse_cpu","source_host_unavailable","source_host_full"],"uniqueKey":"error.reason","typeLabel":"enum\u003cstring>"},"hint":{"type":"string","description":"The next step that fixes the error (credential errors). Absent otherwise.","uniqueKey":"error.hint","typeLabel":"string"},"docs":{"type":"string","format":"uri","description":"A URL documenting the error (credential errors). Absent otherwise.","uniqueKey":"error.docs","typeLabel":"string\u003curi>"},"docs_url":{"type":"string","format":"uri","description":"The code's entry on the errors page, on every error response: https://instabox.sh/docs/errors#\u003ccode> with underscores as dashes (e.g. #credit-exhausted): its HTTP status, whether to retry and what to do. Snake case, unlike the other fields. Absent from a failed operation's `error` and from older servers.","uniqueKey":"error.docs_url","typeLabel":"string\u003curi>"},"requiredScopes":{"type":"array","items":{"type":"string","uniqueKey":"error.requiredScopes.items.[INDEX]","typeLabel":"string"},"description":"For `missing_scope`, the scopes the route accepts; the key needs one of them.","uniqueKey":"error.requiredScopes","typeLabel":"string[]"},"retryAfterSeconds":{"type":"integer","minimum":1,"description":"Seconds to wait before trying again: a retryable `no_capacity` (60, as a 503 or on a failed operation's `error`), `rate_limited`, `machine_cooldown` and agent sign-up `quota_exceeded`. An error response also sends it as the `Retry-After` header; a failed operation's `error` has only this field. Absent otherwise and from older servers.","uniqueKey":"error.retryAfterSeconds","typeLabel":"integer"},"at":{"type":"string","format":"date-time","description":"When it happened, for a stop the platform found (a sandbox's `lastError` with code `host_oom`, `vmm_crashed` or `guest_reboot_loop`; `hint` says what to do). The next successful start clears the error. Absent otherwise and from older servers.","uniqueKey":"error.at","typeLabel":"string\u003cdate-time>"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"unauthenticated","message":"\u003cstring>","requestId":"\u003cstring>","retryable":true,"operationId":"\u003cstring>","reason":"missing_key","hint":"\u003cstring>","docs":"\u003cstring>","docs_url":"\u003cstring>","requiredScopes":["\u003cstring>"],"retryAfterSeconds":2,"at":"2023-11-07T05:31:56Z"}}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"27f69a76-6376-499f-bba9-22ced47568ec":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Opaque instabox access token (1 hour). Refresh with `/v1/auth/refresh` (refresh token valid 30 days, rotates on use).","scopes":[],"schemeName":"bearerAuth"}},"403a6e6d-9b62-42ae-a65e-8580752011ba":{"apiKey":{"type":"apiKey","in":"header","name":"X-API-Key","description":"API key (`ibk_...`) with scopes; also accepted as `Authorization: Bearer ibk_...`.\nAccepted on sandbox, snapshot, operation, template and usage routes per scope\n(see API keys), never on key management, sessions, logout or admin routes.\n","scopes":[],"schemeName":"apiKey"}},"74ea9795-556a-4187-a497-6c8a83b045b9":{"sessionCookie":{"type":"apiKey","in":"cookie","name":"instabox_session","description":"Dashboard browser session from `/auth/github/login` (7 days idle, 30 days at\nmost). Used only when no Authorization header is sent. Requests other than\nGET and HEAD must send `X-Instabox-CSRF` (from `GET /v1/me`) and an `Origin`\nequal to the server's `publicUrl`; otherwise `403 permission_denied`.\n","scopes":[],"schemeName":"sessionCookie"}}},"servers":{"e2c665bb-4b53-46fa-8dd3-3dba6e3ac4a8":{"url":"https://api.instabox.sh"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","description":"Opaque instabox access token (1 hour). Refresh with `/v1/auth/refresh` (refresh token valid 30 days, rotates on use).","scopes":[],"schemeName":"bearerAuth"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Opaque instabox access token (1 hour). Refresh with `/v1/auth/refresh` (refresh token valid 30 days, rotates on use).","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"bearerAuth","name":"Authorization"}],"title":"bearerAuth"},{"schemes":[{"scheme":{"type":"apiKey","in":"header","name":"X-API-Key","description":"API key (`ibk_...`) with scopes; also accepted as `Authorization: Bearer ibk_...`.\nAccepted on sandbox, snapshot, operation, template and usage routes per scope\n(see API keys), never on key management, sessions, logout or admin routes.\n","scopes":[],"schemeName":"apiKey"},"schema":{"title":"X-API-Key","type":"string","description":"API key (`ibk_...`) with scopes; also accepted as `Authorization: Bearer ibk_...`.\nAccepted on sandbox, snapshot, operation, template and usage routes per scope\n(see API keys), never on key management, sessions, logout or admin routes.\n","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"apiKey","name":"X-API-Key"}],"title":"apiKey"},{"schemes":[{"scheme":{"type":"apiKey","in":"cookie","name":"instabox_session","description":"Dashboard browser session from `/auth/github/login` (7 days idle, 30 days at\nmost). Used only when no Authorization header is sent. Requests other than\nGET and HEAD must send `X-Instabox-CSRF` (from `GET /v1/me`) and an `Origin`\nequal to the server's `publicUrl`; otherwise `403 permission_denied`.\n","scopes":[],"schemeName":"sessionCookie"},"schema":{"title":"instabox_session","type":"string","description":"Dashboard browser session from `/auth/github/login` (7 days idle, 30 days at\nmost). Used only when no Authorization header is sent. Requests other than\nGET and HEAD must send `X-Instabox-CSRF` (from `GET /v1/me`) and an `Origin`\nequal to the server's `publicUrl`; otherwise `403 permission_denied`.\n","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"sessionCookie","name":"instabox_session"}],"title":"sessionCookie"}]},"originalFileLocation":"api-reference/openapi.yaml"},"subdomain":"instacloud","siteName":"InstaBox","title":"Rename, resize (vCPUs, memory, disk) a stopped sandbox, or set its idle pause and metadata. - InstaBox","relatedPagesConfig":{"enabled":false,"limit":5,"mode":"automatic"},"navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-09T06:53:03.558Z","originalFileLocation":"api-reference/machines/rename-resize-vcpus-memory-disk-a-stopped-sandbox-or-set-its-idle-pause-and-metadata.mdx"},"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=\"Synchronous. Absent fields are unchanged. autoSuspendAfterSeconds and metadata apply in any state, also while an operation runs, and do not change revision: metadata replaces the metadata ({} clears it). name renames the sandbox in any state, also while an operation runs. Its ID, public port URLs and SSH certificates stay the same; the old name stops resolving at once. A name another live sandbox of the org has is 409 operation_conflict. The guest hostname (instabox-) follows at the sandbox\u0026#x27;s next start or resume, ~/MACHINE.md at its next start from stopped. Resizing (persistentDiskGiB) grows a paid sandbox\u0026#x27;s disk (/data) up to the plan\u0026#x27;s maxDiskGiB (pro 200, builder 500, team and enterprise 1024) and the stored-data limit, and the org must be under that limit (429 quota_exceeded). A free sandbox\u0026#x27;s size is fixed (400 spec_not_allowed). An admin can override that per user (diskResize) and, from a signed-in session, grow any sandbox without the limit. Each size is 1-1024 GiB (more is 400 bad_request), and needs no operation in progress (else 409 operation_conflict). The disk (/data) of a running sandbox grows online: no restart, files and processes stay; when it can\u0026#x27;t (rare: the sandbox is unreachable or its host is older) it is 409 grow_needs_stop: stop it and send the size again. A stopped sandbox\u0026#x27;s disk grows at its next start. It shrinks only while stopped (else 409 operation_conflict) and only when the used data plus 10% (at least 1 GiB) fits (else 409 disk_too_small, nothing changes); the shrink applies at the next start, which keeps the larger size if the data has grown past it by then. The system disk (rootDiskGiB, admins) only grows (a smaller size is 400 bad_request), and only while stopped. Growing either disk needs a template with the root-grow capability (else 400 bad_request); a shrink does not. At create the disks come with the size; this is the way to get bigger ones. vcpus and memMiB change a paid sandbox\u0026#x27;s size to another of its workspace\u0026#x27;s sizes (allowedSpecs of GET /v1/orgs/{id}), named as at create: one field picks the one size that matches it, else name both. The sandbox must be stopped with no operation in progress (else 409 operation_conflict); the new size applies at its next start, which boots it fresh (files stay), and running time is rated at the new size from then on. That start\u0026#x27;s operation fails, and the sandbox stays stopped at its new size, when its host has no room for the new size (no_capacity) or runs an older node-agent that cannot resize (host_unavailable), both retryable; resize it back or start it later. A size the plan does not offer and the free sandbox are 400 spec_not_allowed in any state (checked before the 409); the same size changes nothing. Admins may give any size within the API\u0026#x27;s ranges. As at create, a field it does not know is 400 unknown_field and nothing changes, so diskGiB here is refused. apply: \u0026quot;restart\u0026quot; lets a running or paused sandbox take a change that needs a stop (vcpus/memMiB, a /data shrink, a system-disk grow, or a grow it can\u0026#x27;t do online) instead of the 409: the reply is 202 with one resize operation, under this request\u0026#x27;s idempotency key, that stops it (resuming a paused one first; its running processes end), applies the size and starts it again (phases stopping, resizing, booting). The server finishes it even if the caller goes away, so a sandbox can resize itself. When it can\u0026#x27;t start at the new size, it starts again at the old one and the operation fails with the reason. A change it can take as it is (a stopped sandbox, an online grow) is the usual 200. GET /v1/me resizeRestart says the server takes it; a server that does not yet answers 400 resize_restart_off. It is checked against the settings this request leaves: maxRunMinutes: 0 with it is 400 max_run_disabled (resize, then set it). The operation boots under the max-run it was accepted with. API keys: needs one of the scopes machines:write.\">\u003cmeta data-mint-head name=\"application-name\" content=\"InstaBox\">\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/instacloud/B4TOiHlk6CDYfBRt/_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/instacloud/B4TOiHlk6CDYfBRt/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/docs/mintlify-assets/_mintlify/favicons/instacloud/B4TOiHlk6CDYfBRt/_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/instacloud/B4TOiHlk6CDYfBRt/_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/instacloud/B4TOiHlk6CDYfBRt/_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/instacloud/B4TOiHlk6CDYfBRt/_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/instacloud/B4TOiHlk6CDYfBRt/_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/instacloud/B4TOiHlk6CDYfBRt/_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/instacloud/B4TOiHlk6CDYfBRt/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Rename, resize (vCPUs, memory, disk) a stopped sandbox, or set its idle pause and metadata. - InstaBox\">\u003cmeta data-mint-head property=\"og:description\" content=\"Synchronous. Absent fields are unchanged. autoSuspendAfterSeconds and metadata apply in any state, also while an operation runs, and do not change revision: metadata replaces the metadata ({} clears it). name renames the sandbox in any state, also while an operation runs. Its ID, public port URLs and SSH certificates stay the same; the old name stops resolving at once. A name another live sandbox of the org has is 409 operation_conflict. The guest hostname (instabox-) follows at the sandbox\u0026#x27;s next start or resume, ~/MACHINE.md at its next start from stopped. Resizing (persistentDiskGiB) grows a paid sandbox\u0026#x27;s disk (/data) up to the plan\u0026#x27;s maxDiskGiB (pro 200, builder 500, team and enterprise 1024) and the stored-data limit, and the org must be under that limit (429 quota_exceeded). A free sandbox\u0026#x27;s size is fixed (400 spec_not_allowed). An admin can override that per user (diskResize) and, from a signed-in session, grow any sandbox without the limit. Each size is 1-1024 GiB (more is 400 bad_request), and needs no operation in progress (else 409 operation_conflict). The disk (/data) of a running sandbox grows online: no restart, files and processes stay; when it can\u0026#x27;t (rare: the sandbox is unreachable or its host is older) it is 409 grow_needs_stop: stop it and send the size again. A stopped sandbox\u0026#x27;s disk grows at its next start. It shrinks only while stopped (else 409 operation_conflict) and only when the used data plus 10% (at least 1 GiB) fits (else 409 disk_too_small, nothing changes); the shrink applies at the next start, which keeps the larger size if the data has grown past it by then. The system disk (rootDiskGiB, admins) only grows (a smaller size is 400 bad_request), and only while stopped. Growing either disk needs a template with the root-grow capability (else 400 bad_request); a shrink does not. At create the disks come with the size; this is the way to get bigger ones. vcpus and memMiB change a paid sandbox\u0026#x27;s size to another of its workspace\u0026#x27;s sizes (allowedSpecs of GET /v1/orgs/{id}), named as at create: one field picks the one size that matches it, else name both. The sandbox must be stopped with no operation in progress (else 409 operation_conflict); the new size applies at its next start, which boots it fresh (files stay), and running time is rated at the new size from then on. That start\u0026#x27;s operation fails, and the sandbox stays stopped at its new size, when its host has no room for the new size (no_capacity) or runs an older node-agent that cannot resize (host_unavailable), both retryable; resize it back or start it later. A size the plan does not offer and the free sandbox are 400 spec_not_allowed in any state (checked before the 409); the same size changes nothing. Admins may give any size within the API\u0026#x27;s ranges. As at create, a field it does not know is 400 unknown_field and nothing changes, so diskGiB here is refused. apply: \u0026quot;restart\u0026quot; lets a running or paused sandbox take a change that needs a stop (vcpus/memMiB, a /data shrink, a system-disk grow, or a grow it can\u0026#x27;t do online) instead of the 409: the reply is 202 with one resize operation, under this request\u0026#x27;s idempotency key, that stops it (resuming a paused one first; its running processes end), applies the size and starts it again (phases stopping, resizing, booting). The server finishes it even if the caller goes away, so a sandbox can resize itself. When it can\u0026#x27;t start at the new size, it starts again at the old one and the operation fails with the reason. A change it can take as it is (a stopped sandbox, an online grow) is the usual 200. GET /v1/me resizeRestart says the server takes it; a server that does not yet answers 400 resize_restart_off. It is checked against the settings this request leaves: maxRunMinutes: 0 with it is 400 max_run_disabled (resize, then set it). The operation boots under the max-run it was accepted with. API keys: needs one of the scopes machines:write.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"InstaBox\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://instabox.sh/docs/api-reference/machines/rename-resize-vcpus-memory-disk-a-stopped-sandbox-or-set-its-idle-pause-and-metadata\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://instacloud.mintlify.site/docs/_mintlify/api/og/v2?division=Machines\u0026amp;title=Rename%2C+resize+%28vCPUs%2C+memory%2C+disk%29+a+stopped+sandbox%2C+or+set+its+idle+pause+and+metadata.\u0026amp;description=Synchronous.+Absent+fields+are+unchanged.+%60autoSuspendAfterSeconds%60+and+%60metadata%60+apply+in+any+state%2C+also+while+an+operation+runs%2C+and+do+not+change+%60revision\u0026amp;theme=4d60089f83d6d00671834b24\u0026amp;signature=2e8ed09ff091dea9550d9d2b46bc371daac8c887bb11877fa8bed9da9fa68afd\">\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=\"Rename, resize (vCPUs, memory, disk) a stopped sandbox, or set its idle pause and metadata. - InstaBox\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Synchronous. Absent fields are unchanged. autoSuspendAfterSeconds and metadata apply in any state, also while an operation runs, and do not change revision: metadata replaces the metadata ({} clears it). name renames the sandbox in any state, also while an operation runs. Its ID, public port URLs and SSH certificates stay the same; the old name stops resolving at once. A name another live sandbox of the org has is 409 operation_conflict. The guest hostname (instabox-) follows at the sandbox\u0026#x27;s next start or resume, ~/MACHINE.md at its next start from stopped. Resizing (persistentDiskGiB) grows a paid sandbox\u0026#x27;s disk (/data) up to the plan\u0026#x27;s maxDiskGiB (pro 200, builder 500, team and enterprise 1024) and the stored-data limit, and the org must be under that limit (429 quota_exceeded). A free sandbox\u0026#x27;s size is fixed (400 spec_not_allowed). An admin can override that per user (diskResize) and, from a signed-in session, grow any sandbox without the limit. Each size is 1-1024 GiB (more is 400 bad_request), and needs no operation in progress (else 409 operation_conflict). The disk (/data) of a running sandbox grows online: no restart, files and processes stay; when it can\u0026#x27;t (rare: the sandbox is unreachable or its host is older) it is 409 grow_needs_stop: stop it and send the size again. A stopped sandbox\u0026#x27;s disk grows at its next start. It shrinks only while stopped (else 409 operation_conflict) and only when the used data plus 10% (at least 1 GiB) fits (else 409 disk_too_small, nothing changes); the shrink applies at the next start, which keeps the larger size if the data has grown past it by then. The system disk (rootDiskGiB, admins) only grows (a smaller size is 400 bad_request), and only while stopped. Growing either disk needs a template with the root-grow capability (else 400 bad_request); a shrink does not. At create the disks come with the size; this is the way to get bigger ones. vcpus and memMiB change a paid sandbox\u0026#x27;s size to another of its workspace\u0026#x27;s sizes (allowedSpecs of GET /v1/orgs/{id}), named as at create: one field picks the one size that matches it, else name both. The sandbox must be stopped with no operation in progress (else 409 operation_conflict); the new size applies at its next start, which boots it fresh (files stay), and running time is rated at the new size from then on. That start\u0026#x27;s operation fails, and the sandbox stays stopped at its new size, when its host has no room for the new size (no_capacity) or runs an older node-agent that cannot resize (host_unavailable), both retryable; resize it back or start it later. A size the plan does not offer and the free sandbox are 400 spec_not_allowed in any state (checked before the 409); the same size changes nothing. Admins may give any size within the API\u0026#x27;s ranges. As at create, a field it does not know is 400 unknown_field and nothing changes, so diskGiB here is refused. apply: \u0026quot;restart\u0026quot; lets a running or paused sandbox take a change that needs a stop (vcpus/memMiB, a /data shrink, a system-disk grow, or a grow it can\u0026#x27;t do online) instead of the 409: the reply is 202 with one resize operation, under this request\u0026#x27;s idempotency key, that stops it (resuming a paused one first; its running processes end), applies the size and starts it again (phases stopping, resizing, booting). The server finishes it even if the caller goes away, so a sandbox can resize itself. When it can\u0026#x27;t start at the new size, it starts again at the old one and the operation fails with the reason. A change it can take as it is (a stopped sandbox, an online grow) is the usual 200. GET /v1/me resizeRestart says the server takes it; a server that does not yet answers 400 resize_restart_off. It is checked against the settings this request leaves: maxRunMinutes: 0 with it is 400 max_run_disabled (resize, then set it). The operation boots under the max-run it was accepted with. API keys: needs one of the scopes machines:write.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://instacloud.mintlify.site/docs/_mintlify/api/og/v2?division=Machines\u0026amp;title=Rename%2C+resize+%28vCPUs%2C+memory%2C+disk%29+a+stopped+sandbox%2C+or+set+its+idle+pause+and+metadata.\u0026amp;description=Synchronous.+Absent+fields+are+unchanged.+%60autoSuspendAfterSeconds%60+and+%60metadata%60+apply+in+any+state%2C+also+while+an+operation+runs%2C+and+do+not+change+%60revision\u0026amp;theme=4d60089f83d6d00671834b24\u0026amp;signature=2e8ed09ff091dea9550d9d2b46bc371daac8c887bb11877fa8bed9da9fa68afd\">\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/instacloud/B4TOiHlk6CDYfBRt/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"InstaBox\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0A0A0A\">\u003clink data-mint-head rel=\"canonical\" href=\"https://instabox.sh/docs/api-reference/machines/rename-resize-vcpus-memory-disk-a-stopped-sandbox-or-set-its-idle-pause-and-metadata\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/docs/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/docs/api-reference/machines/rename-resize-vcpus-memory-disk-a-stopped-sandbox-or-set-its-idle-pause-and-metadata.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://instabox.sh/#organization\",\"name\":\"InstaBox\",\"url\":\"https://instabox.sh\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://instacloud.mintlify.site/docs/logo/light.svg\"}},{\"@type\":\"WebSite\",\"@id\":\"https://instabox.sh/docs#website\",\"name\":\"InstaBox\",\"url\":\"https://instabox.sh/docs\",\"publisher\":{\"@id\":\"https://instabox.sh/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://instabox.sh/docs/api-reference/machines/rename-resize-vcpus-memory-disk-a-stopped-sandbox-or-set-its-idle-pause-and-metadata#webpage\",\"url\":\"https://instabox.sh/docs/api-reference/machines/rename-resize-vcpus-memory-disk-a-stopped-sandbox-or-set-its-idle-pause-and-metadata\",\"name\":\"Rename, resize (vCPUs, memory, disk) a stopped sandbox, or set its idle pause and metadata.\",\"description\":\"Synchronous. Absent fields are unchanged. autoSuspendAfterSeconds and metadata apply in any state, also while an operation runs, and do not change revision: metadata replaces the metadata ({} clears it). name renames the sandbox in any state, also while an operation runs. Its ID, public port URLs and SSH certificates stay the same; the old name stops resolving at once. A name another live sandbox of the org has is 409 operation_conflict. The guest hostname (instabox-) follows at the sandbox's next start or resume, ~/MACHINE.md at its next start from stopped. Resizing (persistentDiskGiB) grows a paid sandbox's disk (/data) up to the plan's maxDiskGiB (pro 200, builder 500, team and enterprise 1024) and the stored-data limit, and the org must be under that limit (429 quota_exceeded). A free sandbox's size is fixed (400 spec_not_allowed). An admin can override that per user (diskResize) and, from a signed-in session, grow any sandbox without the limit. Each size is 1-1024 GiB (more is 400 bad_request), and needs no operation in progress (else 409 operation_conflict). The disk (/data) of a running sandbox grows online: no restart, files and processes stay; when it can't (rare: the sandbox is unreachable or its host is older) it is 409 grow_needs_stop: stop it and send the size again. A stopped sandbox's disk grows at its next start. It shrinks only while stopped (else 409 operation_conflict) and only when the used data plus 10% (at least 1 GiB) fits (else 409 disk_too_small, nothing changes); the shrink applies at the next start, which keeps the larger size if the data has grown past it by then. The system disk (rootDiskGiB, admins) only grows (a smaller size is 400 bad_request), and only while stopped. Growing either disk needs a template with the root-grow capability (else 400 bad_request); a shrink does not. At create the disks come with the size; this is the way to get bigger ones. vcpus and memMiB change a paid sandbox's size to another of its workspace's sizes (allowedSpecs of GET /v1/orgs/{id}), named as at create: one field picks the one size that matches it, else name both. The sandbox must be stopped with no operation in progress (else 409 operation_conflict); the new size applies at its next start, which boots it fresh (files stay), and running time is rated at the new size from then on. That start's operation fails, and the sandbox stays stopped at its new size, when its host has no room for the new size (no_capacity) or runs an older node-agent that cannot resize (host_unavailable), both retryable; resize it back or start it later. A size the plan does not offer and the free sandbox are 400 spec_not_allowed in any state (checked before the 409); the same size changes nothing. Admins may give any size within the API's ranges. As at create, a field it does not know is 400 unknown_field and nothing changes, so diskGiB here is refused. apply: \\\"restart\\\" lets a running or paused sandbox take a change that needs a stop (vcpus/memMiB, a /data shrink, a system-disk grow, or a grow it can't do online) instead of the 409: the reply is 202 with one resize operation, under this request's idempotency key, that stops it (resuming a paused one first; its running processes end), applies the size and starts it again (phases stopping, resizing, booting). The server finishes it even if the caller goes away, so a sandbox can resize itself. When it can't start at the new size, it starts again at the old one and the operation fails with the reason. A change it can take as it is (a stopped sandbox, an online grow) is the usual 200. GET /v1/me resizeRestart says the server takes it; a server that does not yet answers 400 resize_restart_off. It is checked against the settings this request leaves: maxRunMinutes: 0 with it is 400 max_run_disabled (resize, then set it). The operation boots under the max-run it was accepted with. API keys: needs one of the scopes machines:write.\",\"dateModified\":\"2026-11-09T06:53:03.558Z\",\"isPartOf\":{\"@id\":\"https://instabox.sh/docs#website\"},\"breadcrumb\":{\"@id\":\"https://instabox.sh/docs/api-reference/machines/rename-resize-vcpus-memory-disk-a-stopped-sandbox-or-set-its-idle-pause-and-metadata#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://instabox.sh/docs/api-reference/machines/rename-resize-vcpus-memory-disk-a-stopped-sandbox-or-set-its-idle-pause-and-metadata#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"API reference\",\"item\":\"https://instabox.sh/docs/api-reference/introduction\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Machines\",\"item\":\"https://instabox.sh/docs/api-reference/machines/create-a-sandbox\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Rename, resize (vCPUs, memory, disk) a stopped sandbox, or set its idle pause and metadata.\",\"item\":\"https://instabox.sh/docs/api-reference/machines/rename-resize-vcpus-memory-disk-a-stopped-sandbox-or-set-its-idle-pause-and-metadata\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://instabox.sh/docs/api-reference/machines/rename-resize-vcpus-memory-disk-a-stopped-sandbox-or-set-its-idle-pause-and-metadata#apireference\",\"headline\":\"Rename, resize (vCPUs, memory, disk) a stopped sandbox, or set its idle pause and metadata.\",\"name\":\"Rename, resize (vCPUs, memory, disk) a stopped sandbox, or set its idle pause and metadata.\",\"description\":\"Synchronous. Absent fields are unchanged. autoSuspendAfterSeconds and metadata apply in any state, also while an operation runs, and do not change revision: metadata replaces the metadata ({} clears it). name renames the sandbox in any state, also while an operation runs. Its ID, public port URLs and SSH certificates stay the same; the old name stops resolving at once. A name another live sandbox of the org has is 409 operation_conflict. The guest hostname (instabox-) follows at the sandbox's next start or resume, ~/MACHINE.md at its next start from stopped. Resizing (persistentDiskGiB) grows a paid sandbox's disk (/data) up to the plan's maxDiskGiB (pro 200, builder 500, team and enterprise 1024) and the stored-data limit, and the org must be under that limit (429 quota_exceeded). A free sandbox's size is fixed (400 spec_not_allowed). An admin can override that per user (diskResize) and, from a signed-in session, grow any sandbox without the limit. Each size is 1-1024 GiB (more is 400 bad_request), and needs no operation in progress (else 409 operation_conflict). The disk (/data) of a running sandbox grows online: no restart, files and processes stay; when it can't (rare: the sandbox is unreachable or its host is older) it is 409 grow_needs_stop: stop it and send the size again. A stopped sandbox's disk grows at its next start. It shrinks only while stopped (else 409 operation_conflict) and only when the used data plus 10% (at least 1 GiB) fits (else 409 disk_too_small, nothing changes); the shrink applies at the next start, which keeps the larger size if the data has grown past it by then. The system disk (rootDiskGiB, admins) only grows (a smaller size is 400 bad_request), and only while stopped. Growing either disk needs a template with the root-grow capability (else 400 bad_request); a shrink does not. At create the disks come with the size; this is the way to get bigger ones. vcpus and memMiB change a paid sandbox's size to another of its workspace's sizes (allowedSpecs of GET /v1/orgs/{id}), named as at create: one field picks the one size that matches it, else name both. The sandbox must be stopped with no operation in progress (else 409 operation_conflict); the new size applies at its next start, which boots it fresh (files stay), and running time is rated at the new size from then on. That start's operation fails, and the sandbox stays stopped at its new size, when its host has no room for the new size (no_capacity) or runs an older node-agent that cannot resize (host_unavailable), both retryable; resize it back or start it later. A size the plan does not offer and the free sandbox are 400 spec_not_allowed in any state (checked before the 409); the same size changes nothing. Admins may give any size within the API's ranges. As at create, a field it does not know is 400 unknown_field and nothing changes, so diskGiB here is refused. apply: \\\"restart\\\" lets a running or paused sandbox take a change that needs a stop (vcpus/memMiB, a /data shrink, a system-disk grow, or a grow it can't do online) instead of the 409: the reply is 202 with one resize operation, under this request's idempotency key, that stops it (resuming a paused one first; its running processes end), applies the size and starts it again (phases stopping, resizing, booting). The server finishes it even if the caller goes away, so a sandbox can resize itself. When it can't start at the new size, it starts again at the old one and the operation fails with the reason. A change it can take as it is (a stopped sandbox, an online grow) is the usual 200. GET /v1/me resizeRestart says the server takes it; a server that does not yet answers 400 resize_restart_off. It is checked against the settings this request leaves: maxRunMinutes: 0 with it is 400 max_run_disabled (resize, then set it). The operation boots under the max-run it was accepted with. API keys: needs one of the scopes machines:write.\",\"url\":\"https://instabox.sh/docs/api-reference/machines/rename-resize-vcpus-memory-disk-a-stopped-sandbox-or-set-its-idle-pause-and-metadata\",\"mainEntityOfPage\":{\"@id\":\"https://instabox.sh/docs/api-reference/machines/rename-resize-vcpus-memory-disk-a-stopped-sandbox-or-set-its-idle-pause-and-metadata#webpage\"},\"dateModified\":\"2026-11-09T06:53:03.558Z\",\"publisher\":{\"@id\":\"https://instabox.sh/#organization\"},\"isPartOf\":{\"@id\":\"https://instabox.sh/docs#website\"}}]}\u003c/script>","siteName":"InstaBox","nav":{"global":null,"tabs":[{"tab":"Documentation","pages":[{"title":"Documentation","href":""}]},{"tab":"API reference","groups":[{"group":"API reference","pages":[{"title":"API overview","icon":"braces","href":"/api-reference/introduction"},{"group":"Machines","pages":[{"title":"Create a sandbox.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /v1/machines","href":"/api-reference/machines/create-a-sandbox"},{"title":"List the sandboxes of your orgs.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /v1/machines","href":"/api-reference/machines/list-the-sandboxes-of-your-orgs"},{"title":"Get a sandbox.","description":"API keys: needs one of the scopes `machines:read`.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /v1/machines/{id}","href":"/api-reference/machines/get-a-sandbox"},{"title":"Rename, resize (vCPUs, memory, disk) a stopped sandbox, or set its idle pause and metadata.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml patch /v1/machines/{id}","href":"/api-reference/machines/rename-resize-vcpus-memory-disk-a-stopped-sandbox-or-set-its-idle-pause-and-metadata"},{"title":"Delete a sandbox, its system files and its storage.","description":"Snapshots saved from it are kept. API keys: needs one of the scopes `machines:delete`.\nSend `X-Confirm-Delete` with the sandbox's ID or name. API keys created on or after the\nserver's cutover (`confirmDeleteKeysFrom`) must send it: without it the delete is\n`409 delete_confirmation_required` and the sandbox is kept. Older keys may still leave it\nout; their deletes then carry a `Warning` response header. Sign-in sessions are not required to send it.\n\nA delete replaces an operation still `queued`: that operation fails with `operation_conflict`\n\"cancelled by a delete of this sandbox\", and a sandbox whose queued create never placed it is deleted\nat once (the delete answers `succeeded`). A running operation answers `409 operation_conflict` naming it;\na delete already active is returned as is.\n","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml delete /v1/machines/{id}","href":"/api-reference/machines/delete-a-sandbox-its-system-files-and-its-storage"}]},{"group":"Lifecycle","pages":[{"title":"Start a stopped or paused sandbox.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /v1/machines/{id}/start","href":"/api-reference/machines/start-a-stopped-or-paused-sandbox"},{"title":"Stop a running sandbox (shuts it down; running programs end, files are kept).","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /v1/machines/{id}/stop","href":"/api-reference/machines/stop-a-running-sandbox-shuts-it-down;-running-programs-end-files-are-kept"},{"title":"Pause a running sandbox, keeping its running programs.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /v1/machines/{id}/suspend","href":"/api-reference/machines/pause-a-running-sandbox-keeping-its-running-programs"},{"title":"Resume a paused sandbox where it left off.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /v1/machines/{id}/resume","href":"/api-reference/machines/resume-a-paused-sandbox-where-it-left-off"},{"title":"Resume an idle-suspended machine before using it.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /v1/machines/{id}/wake","href":"/api-reference/machines/resume-an-idle-suspended-machine-before-using-it"},{"title":"Put a sandbox's disks back to a snapshot's, in place.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /v1/machines/{id}/restore","href":"/api-reference/machines/put-a-sandboxs-disks-back-to-a-snapshots-in-place"},{"title":"Create a copy of a sandbox on its host, without a snapshot.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /v1/machines/{id}/fork","href":"/api-reference/machines/create-a-copy-of-a-sandbox-on-its-host-without-a-snapshot"},{"title":"Get an operation (the progress of a sandbox change).","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /v1/operations/{id}","href":"/api-reference/operations/get-an-operation-the-progress-of-a-sandbox-change"}]},{"group":"Commands and files","pages":[{"title":"Run a command in the sandbox and return its output.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /v1/machines/{id}/exec","href":"/api-reference/connections/run-a-command-in-the-sandbox-and-return-its-output"},{"title":"Read a file or directory of a running sandbox.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /v1/machines/{id}/files","href":"/api-reference/machines/read-a-file-or-directory-of-a-running-sandbox"},{"title":"Write (upload) a file to a running sandbox.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml put /v1/machines/{id}/files","href":"/api-reference/machines/write-upload-a-file-to-a-running-sandbox"},{"title":"Download a file's raw bytes from a running sandbox.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /v1/machines/{id}/files/content","href":"/api-reference/machines/download-a-files-raw-bytes-from-a-running-sandbox"},{"title":"Get a short-lived signed URL that uploads one file.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /v1/machines/{id}/files/upload-url","href":"/api-reference/machines/get-a-short-lived-signed-url-that-uploads-one-file"}]},{"group":"Snapshots","pages":[{"title":"Save a sandbox's system files and storage as a snapshot.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /v1/machines/{id}/snapshots","href":"/api-reference/snapshots/save-a-sandboxs-system-files-and-storage-as-a-snapshot"},{"title":"List the snapshots of your orgs.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /v1/snapshots","href":"/api-reference/snapshots/list-the-snapshots-of-your-orgs"},{"title":"Get a snapshot of one of your orgs.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /v1/snapshots/{id}","href":"/api-reference/snapshots/get-a-snapshot-of-one-of-your-orgs"},{"title":"Read a file or directory of a snapshot's system files.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /v1/snapshots/{id}/files","href":"/api-reference/snapshots/read-a-file-or-directory-of-a-snapshots-system-files"},{"title":"Delete a snapshot.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml delete /v1/snapshots/{id}","href":"/api-reference/snapshots/delete-a-snapshot"}]},{"group":"Ports","pages":[{"title":"Give one HTTP port of a sandbox an HTTPS URL, public or private.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /v1/machines/{id}/ports","href":"/api-reference/give-one-http-port-of-a-sandbox-an-https-url-public-or-private"},{"title":"List a sandbox's public ports.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /v1/machines/{id}/ports","href":"/api-reference/list-a-sandboxs-public-ports"},{"title":"List the public ports of all your sandboxes.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /v1/ports","href":"/api-reference/list-the-public-ports-of-all-your-sandboxes"},{"title":"Remove a port's public URL and close its active connections.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml delete /v1/machines/{id}/ports/{port}","href":"/api-reference/remove-a-ports-public-url-and-close-its-active-connections"}]},{"group":"SSH","pages":[{"title":"Issue an SSH token, for a plain `ssh` command without a key.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /v1/machines/{id}/ssh-tokens","href":"/api-reference/connections/issue-an-ssh-token-for-a-plain-`ssh`-command-without-a-key"},{"title":"List SSH token metadata, including revoked and recently expired tokens.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /v1/machines/{id}/ssh-tokens","href":"/api-reference/connections/list-ssh-token-metadata-including-revoked-and-recently-expired-tokens"},{"title":"Revoke one SSH token and close its SSH and mosh connections.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml delete /v1/machines/{id}/ssh-tokens/{tokenID}","href":"/api-reference/connections/revoke-one-ssh-token-and-close-its-ssh-and-mosh-connections"},{"title":"Revoke every SSH token of the sandbox and close their connections.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml delete /v1/machines/{id}/ssh-tokens","href":"/api-reference/connections/revoke-every-ssh-token-of-the-sandbox-and-close-their-connections"},{"title":"Issue a short-lived SSH user certificate for the sandbox.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /v1/machines/{id}/connections","href":"/api-reference/connections/issue-a-short-lived-ssh-user-certificate-for-the-sandbox"}]},{"group":"Secrets","pages":[{"title":"List an org's Secret metadata, never values.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /v1/orgs/{id}/secrets","href":"/api-reference/secrets/list-an-orgs-secret-metadata-never-values"},{"title":"Create or replace an org Secret.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml put /v1/orgs/{id}/secrets/{name}","href":"/api-reference/secrets/create-or-replace-an-org-secret"},{"title":"Atomically create or replace a batch of org Secrets.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /v1/orgs/{id}/secrets/import","href":"/api-reference/secrets/atomically-create-or-replace-a-batch-of-org-secrets"},{"title":"Delete an org Secret and its explicit sandbox grants.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml delete /v1/orgs/{id}/secrets/{name}","href":"/api-reference/secrets/delete-an-org-secret-and-its-explicit-sandbox-grants"},{"title":"Read a sandbox's Secret selections and delivery status.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /v1/machines/{id}/secrets","href":"/api-reference/secrets/read-a-sandboxs-secret-selections-and-delivery-status"},{"title":"Replace supplied Secret selections for a sandbox.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml patch /v1/machines/{id}/secrets","href":"/api-reference/secrets/replace-supplied-secret-selections-for-a-sandbox"},{"title":"Refresh managed Secret delivery in a running sandbox.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /v1/machines/{id}/secrets","href":"/api-reference/secrets/refresh-managed-secret-delivery-in-a-running-sandbox"}]},{"group":"Account","pages":[{"title":"The signed-in user and the sandbox size they get.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /v1/me","href":"/api-reference/auth/the-signed-in-user-and-the-sandbox-size-they-get"},{"title":"List the templates a sandbox can start from.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /v1/templates","href":"/api-reference/machines/list-the-templates-a-sandbox-can-start-from"},{"title":"Your storage use, limits, this month's cost and credit balance.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /v1/usage","href":"/api-reference/usage/your-storage-use-limits-this-months-cost-and-credit-balance"}]}]}]},{"tab":"SDK reference","pages":[{"title":"SDK reference","href":"/integrations/sdk-quickstart"}]}]},"basePath":"","title":"Rename, resize (vCPUs, memory, disk) a stopped sandbox, or set its idle pause and metadata. - InstaBox","buildId":"dpl_3pZeXn3XukjzFRgAX73A7GNDfRJ1","deploymentId":"dpl_3pZeXn3XukjzFRgAX73A7GNDfRJ1","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-CW3yP2DK.js","utils-BN0nty2W.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-C8_MydSG.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-Bsl5xDMQ.js","snippetPresets-DYv9OBej.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","conditional-requirements-CFM0id0Q.js","ApiExamples-9OnYPrVf.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-xr67xWGO.js","shallow-DO1aDdBF.js","getApiPlaygroundDisplay-o7cLzFL-.js","CodeSnippet-CGr2yOA8.js","CodeSnippets-CzBbqPNh.js","Page-CBlOSKZG.js","getPastedJson-dpi9sn5Y.js","icon-aIWHt8Pn.js","MethodPill-Bv2zLsGY.js","DuplicateIcon-DxFSz0J6.js","createIcon-uDNv6jwj.js","DynamicMarkdown-C91yhnNP.js","SectionHeading-DG_xjOLR.js","axios-vUo_bRtp.js","Markdown-B4M_Eo1P.js","clsx-DShopWo_.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-BX6wab7q.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-48h67xm_.js"]}