Returns a create operation whose machineId is the new sandbox. Start from a template (templateId) or one of your snapshots (snapshotId). A sandbox gets the default size (4 vCPUs, 8 GiB memory) when the size fields are left out. For another size of your plan (Pro: 2/4, 4/8, 8/16; Builder: 2/4 up to 16/32; Team and Enterprise: 2/4 up to 32/64) or one an admin granted the org (GET /v1/orgsallowedSpecs lists them), name its vcpus and memMiB. Any other size is refused with 400 spec_not_allowed. The free plan creates from agent-browser, android, omarchy or ci only (403 template_not_allowed); a create from a snapshot is not limited, except a snapshot of an internal-test template (restricted in GET /v1/templates), which only the accounts allowed to create from the template (and whoever took the snapshot) may use (403 template_not_allowed). An internal-test template has a limit on its machines (403 template_limit); a template whose guest kernel no host has is 503 kernel_unavailable, and one with no version on any host (during a template rollout) is 503 template_unavailable. Counts toward your plan’s sandbox limit (429 quota_exceeded). When no host has room, the operation fails with no_capacity (retryable); with failFast the create is refused at once instead (503 no_capacity, nothing created, no operation). Retry no_capacity with backoff (see Unavailable) or try another size or template. A create from a template or from a system-files-only snapshot that fails before it gets a host (no_capacity, or any other error at that point) has its sandbox deleted with the failure (GET returns 404), so it does not count toward your limit and its name is free to retry. A create from a snapshot with storage stays, stopped; start it later. API keys: needs one of the scopes machines:write.
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.
Required string length: 1 - 200
Pattern: ^[\x21-\x7e]+$
Body
application/json
Every field is optional; a body key that is none of these is refused with 400 unknown_field (keys match case-insensitively). The lifetime timeout retired on 2026-10-20 is refused too; timeoutSeconds, onTimeout or timeout with any value but null is 400 unknown_field, and the message names deleteAfterSeconds, maxRunMinutes and autoSuspendAfterSeconds instead (to a User-Agent of instabox-cli/<version>, whose builds before that date sent them, it says the CLI is out of date, how to install the current one, and names the flags --delete-after, --max-run-minutes and --auto-suspend). At most one of templateId and snapshotId; with neither, the sandbox starts from agent-browser, the CLI's and dashboard's default. Leave the size fields out for the default size, or name the vcpus and memMiB of another of your sizes (the org's plan's or one an admin granted the org; GET /v1/orgsallowedSpecs).
1-63 lowercase letters, digits or -, starting with a letter or digit; unique among the org's sandboxes. Absent or empty: box- and 8 random hex digits (the operation's machineId and the sandbox carry it).
The template to create from (GET /v1/templates, one with creatable true), optionally with a version as id@version (e.g. agent-browser@2026-10-15.4, the same as templateVersion). Absent (and no snapshotId or templateVersion): agent-browser. An unknown or retired one is refused with 400 bad_request whose message lists the templates your plan can create from. The free plan creates from agent-browser, android, omarchy or ci only; another template is refused with 403 template_not_allowed. A create from a snapshot is not limited.
Default: the version GET /v1/templates marks latest. templateId may name it instead, as id@version (e.g. agent-browser@2026-10-15.4); both at once must agree. A version the template does not have is 400 bad_request whose message lists its versions, newest first, the latest (or default) one tagged.
Absent: the default size (4 vCPUs, 8 GiB memory; limits.machineSpec). Else one of the org's sizes (GET /v1/orgsallowedSpecs: the default, its plan's others and any size an admin granted the org; on api.instabox.sh free 4/8192 only, Pro 2/4096, 4/8192, 8/16384, Builder 2/4096 up to 16/32768, Team and Enterprise 2/4096 up to 32/65536); name memMiB too when two of them have this many vCPUs. Anything else is refused with 400 spec_not_allowed; 0 or a negative (no size) with 400 bad_request.
Storage (/data) size in GiB. The disks come with the size: storage gets the size's (20 GiB on api.instabox.sh), or a snapshot's storage size when that is larger. Absent or exactly that size: accepted; any other is 400 spec_not_allowed whose message names the size's storage next to what was asked; 0 or a negative is 400 bad_request. To get more storage, grow it later with PATCH /v1/machines/{id}: a running sandbox's storage grows live, and a shrink applies while it is stopped, at its next boot. The SDKs' diskGiB (TypeScript) and persistent_disk_gib (Python) are this field; diskGiB in a REST body is 400 unknown_field.
System files size in GiB. Like persistentDiskGiB: system files get the template's size (or the snapshot's); naming any other is 400 spec_not_allowed (the message names the size's root disk), 0 or a negative 400 bad_request; grow it later with PATCH /v1/machines/{id}.
Sets deleteAt to now plus this many seconds (60-86400, else 400): the sandbox is then deleted, whatever its state, so it cannot outlive a client that died (instabox run sets it). 0 or absent: never. A server without this field ignores 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.
Absent: 1800 (30 minutes). The plan decides, and a value is honoured or refused, never silently replaced: a paid sandbox takes 300-1800 (5 to 30 minutes) in whole minutes, as sent, and 0 (off) where the plan allows always on (else 403 spec_not_allowed); below 300 (1-299), above 1800, negative or not a multiple of 60 is 400 bad_request. The free sandbox is fixed at 1800: any other value is 403 spec_not_allowed, a plan limit (older servers: 403 permission_denied). A refused create makes no sandbox. The reply's autoSuspendAfterSeconds shows the effective value. Separately, an account an admin gave manual lifecycle (GET /v1/memanualLifecycle) sends 120-86400 idle seconds, or 0 never (docs/idle-suspend.md).
Proxy Secrets from this org. All includes current and future proxy Secrets; [] selects none. Omit both secrets and envSecrets to retain only existing Vault delivery. When envSecrets alone is supplied, proxy selection defaults to all; directSecrets alone selects no proxy Secrets. Null is rejected.
Explicit env Secret names from this org; omitted or [] selects none. No all mode; null is rejected. Real values enter the sandbox. Shorthand for directSecrets entries with env = the Secret's name; not sent together with directSecrets.
A unique environment variable name within an org. The names a sandbox's env reserves are reserved (shell variables such as PATH, HOME, BASH_ENV, ENV and IFS, session and trust-store variables, and INSTABOX_ and SSH_ prefixes). A Secret saved under a name before it was reserved is not delivered: the machine's guest status names it.
Direct (delivery env) Secrets from this org, each as a variable and/or a home file. Real values enter the sandbox; prefer proxy Secrets for HTTPS API keys. A fork that sends none of secrets, envSecrets and directSecrets copies its source's selection.
Environment variables for the whole sandbox: every login shell exports them (exec, SSH, the terminal and what they start), from the first command on and again after each start and resume. Names match ^[A-Za-z_][A-Za-z0-9_]{0,127}$; BASH_ENV, ENV, HOME, HOSTNAME, IFS, LOGNAME, OLDPWD, PATH, PWD, SHELL, SHLVL, USER, bash's readonly BASHOPTS, BASH_VERSINFO, EUID, PPID, SHELLOPTS and UID, the session's TERM, XDG_RUNTIME_DIR and DBUS_SESSION_BUS_ADDRESS, the trust roots SSL_CERT_FILE, SSL_CERT_DIR, REQUESTS_CA_BUNDLE, CURL_CA_BUNDLE and NODE_EXTRA_CA_CERTS, and names starting INSTABOX_ or SSH_ are reserved (set them per exec); values have no NUL bytes; names and values at most 32 KiB together. Not on macOS or Windows templates (400). Fixed at create: a fork takes its source's, a create from a snapshot only its own. An exec's envs, a Vault item and an env Secret of the same name win. Not Secrets: anything in the sandbox can read the values, and the sandbox shows only the names (envNames). The values are stored encrypted at rest; a site without the Secret master key refuses env (400 bad_request).
Admins only: the host pool to place the sandbox in and no other (docs/hybrid-pools.md), "default" included. With snapshotId it must be the snapshot's pool. Absent: the user's pool assignment, else the server's placement.createPools.
The sandbox's Linux user (Machine.guestUser), so ssh <sandbox> over your own network (Tailscale) logs in as the same name as on your computer. Lowercase letters, digits, _ and -, starting with a letter or _, at most 32 characters; reserved names (root, instabox, the Debian base system's users and groups such as sudo, systemd-*) are refused with 400 invalid_guest_user. Clients send the local username normalized (DOMAIN\alice and alice@corp.example become alice, lowercase, spaces become _) and nothing when that is not a valid name. Absent: user; with snapshotId, the snapshot's user. Ignored (the sandbox gets dev) for templates without the guest-user capability. Fixed at create.
When no host has room for the sandbox right now, refuse the create at once with 503 no_capacity (retryable; nothing is created, there is no operation and the Idempotency-Key is not kept) instead of answering 202 with an operation that then fails with no_capacity. Every other check and the rest of the create are unchanged; a host that had room can still fill up before the operation places the sandbox. The check does not ask for a host with the secret proxy, which a create with secrets or envSecrets needs: if only hosts without it have room, the create is accepted and its operation fails with no_capacity. A create from a snapshot that no host can start now is refused too, instead of being created stopped. A server without this field ignores it, or, if it already refuses unknown body keys, answers 400 unknown_field.
The org the sandbox counts against and is shared with (GET /v1/orgs); you must be a member. Absent: your personal org, or with snapshotId the snapshot's org (a sandbox from a snapshot lives in the snapshot's org; another is 400 bad_request). Secret selections always resolve within this org. The org's sandbox limit and, on the free tier, its monthly included usage apply (429 quota_exceeded, 402 credit_exhausted).
Response
The mutation was accepted (or replayed for the same idempotency key). Poll the operation.
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).
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}.
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.
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.
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/create-a-sandbox","slug":"/api-reference/machines/create-a-sandbox","pageMetadata":{"title":"Create a sandbox.","description":"Returns a `create` operation whose `machineId` is the new sandbox. Start from a template (`templateId`) or one of your snapshots (`snapshotId`). A sandbox gets the default size (4 vCPUs, 8 GiB memory) when the size fields are left out. For another size of your plan (Pro: 2/4, 4/8, 8/16; Builder: 2/4 up to 16/32; Team and Enterprise: 2/4 up to 32/64) or one an admin granted the org (`GET /v1/orgs` `allowedSpecs` lists them), name its `vcpus` and `memMiB`. Any other size is refused with `400 spec_not_allowed`. The free plan creates from agent-browser, android, omarchy or ci only (`403 template_not_allowed`); a create from a snapshot is not limited, except a snapshot of an internal-test template (`restricted` in `GET /v1/templates`), which only the accounts allowed to create from the template (and whoever took the snapshot) may use (`403 template_not_allowed`). An internal-test template has a limit on its machines (`403 template_limit`); a template whose guest kernel no host has is `503 kernel_unavailable`, and one with no version on any host (during a template rollout) is `503 template_unavailable`. Counts toward your plan's sandbox limit (`429 quota_exceeded`). When no host has room, the operation fails with `no_capacity` (retryable); with `failFast` the create is refused at once instead (`503 no_capacity`, nothing created, no operation). Retry `no_capacity` with backoff (see `Unavailable`) or try another size or template. A create from a template or from a system-files-only snapshot that fails before it gets a host (`no_capacity`, or any other error at that point) has its sandbox deleted with the failure (GET returns 404), so it does not count toward your limit and its name is free to retry. A create from a snapshot with storage stays, `stopped`; start it later. API keys: needs one of the scopes `machines:write`.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /v1/machines","href":"/api-reference/machines/create-a-sandbox","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: [\"Returns a \", _jsx(_components.code, {\n children: \"create\"\n }), \" operation whose \", _jsx(_components.code, {\n children: \"machineId\"\n }), \" is the new sandbox. Start from a template (\", _jsx(_components.code, {\n children: \"templateId\"\n }), \") or one of your snapshots (\", _jsx(_components.code, {\n children: \"snapshotId\"\n }), \"). A sandbox gets the default size (4 vCPUs, 8 GiB memory) when the size fields are left out. For another size of your plan (Pro: 2/4, 4/8, 8/16; Builder: 2/4 up to 16/32; Team and Enterprise: 2/4 up to 32/64) or one an admin granted the org (\", _jsx(_components.code, {\n children: \"GET /v1/orgs\"\n }), \" \", _jsx(_components.code, {\n children: \"allowedSpecs\"\n }), \" lists them), name its \", _jsx(_components.code, {\n children: \"vcpus\"\n }), \" and \", _jsx(_components.code, {\n children: \"memMiB\"\n }), \". Any other size is refused with \", _jsx(_components.code, {\n children: \"400 spec_not_allowed\"\n }), \". The free plan creates from agent-browser, android, omarchy or ci only (\", _jsx(_components.code, {\n children: \"403 template_not_allowed\"\n }), \"); a create from a snapshot is not limited, except a snapshot of an internal-test template (\", _jsx(_components.code, {\n children: \"restricted\"\n }), \" in \", _jsx(_components.code, {\n children: \"GET /v1/templates\"\n }), \"), which only the accounts allowed to create from the template (and whoever took the snapshot) may use (\", _jsx(_components.code, {\n children: \"403 template_not_allowed\"\n }), \"). An internal-test template has a limit on its machines (\", _jsx(_components.code, {\n children: \"403 template_limit\"\n }), \"); a template whose guest kernel no host has is \", _jsx(_components.code, {\n children: \"503 kernel_unavailable\"\n }), \", and one with no version on any host (during a template rollout) is \", _jsx(_components.code, {\n children: \"503 template_unavailable\"\n }), \". Counts toward your plan’s sandbox limit (\", _jsx(_components.code, {\n children: \"429 quota_exceeded\"\n }), \"). When no host has room, the operation fails with \", _jsx(_components.code, {\n children: \"no_capacity\"\n }), \" (retryable); with \", _jsx(_components.code, {\n children: \"failFast\"\n }), \" the create is refused at once instead (\", _jsx(_components.code, {\n children: \"503 no_capacity\"\n }), \", nothing created, no operation). Retry \", _jsx(_components.code, {\n children: \"no_capacity\"\n }), \" with backoff (see \", _jsx(_components.code, {\n children: \"Unavailable\"\n }), \") or try another size or template. A create from a template or from a system-files-only snapshot that fails before it gets a host (\", _jsx(_components.code, {\n children: \"no_capacity\"\n }), \", or any other error at that point) has its sandbox deleted with the failure (GET returns 404), so it does not count toward your limit and its name is free to retry. A create from a snapshot with storage stays, \", _jsx(_components.code, {\n children: \"stopped\"\n }), \"; start it later. 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":"Create a sandbox.","description":"Returns a `create` operation whose `machineId` is the new sandbox. Start from a template (`templateId`) or one of your snapshots (`snapshotId`). A sandbox gets the default size (4 vCPUs, 8 GiB memory) when the size fields are left out. For another size of your plan (Pro: 2/4, 4/8, 8/16; Builder: 2/4 up to 16/32; Team and Enterprise: 2/4 up to 32/64) or one an admin granted the org (`GET /v1/orgs` `allowedSpecs` lists them), name its `vcpus` and `memMiB`. Any other size is refused with `400 spec_not_allowed`. The free plan creates from agent-browser, android, omarchy or ci only (`403 template_not_allowed`); a create from a snapshot is not limited, except a snapshot of an internal-test template (`restricted` in `GET /v1/templates`), which only the accounts allowed to create from the template (and whoever took the snapshot) may use (`403 template_not_allowed`). An internal-test template has a limit on its machines (`403 template_limit`); a template whose guest kernel no host has is `503 kernel_unavailable`, and one with no version on any host (during a template rollout) is `503 template_unavailable`. Counts toward your plan's sandbox limit (`429 quota_exceeded`). When no host has room, the operation fails with `no_capacity` (retryable); with `failFast` the create is refused at once instead (`503 no_capacity`, nothing created, no operation). Retry `no_capacity` with backoff (see `Unavailable`) or try another size or template. A create from a template or from a system-files-only snapshot that fails before it gets a host (`no_capacity`, or any other error at that point) has its sandbox deleted with the failure (GET returns 404), so it does not count toward your limit and its name is free to retry. A create from a snapshot with storage stays, `stopped`; start it later. API keys: needs one of the scopes `machines:write`.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /v1/machines","href":"/api-reference/machines/create-a-sandbox","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"tags":["machines"],"operationId":"createMachine","summary":"Create a sandbox.","security":["8986ac23-cac9-4d85-bb0c-0c95bc9cf0b3","ade73e30-5bb2-416e-ae6f-fa788248d8fc","999a2fa4-8e9d-4355-b856-72da073a2427"],"description":"Returns a `create` operation whose `machineId` is the new sandbox. Start from a template (`templateId`) or one of your snapshots (`snapshotId`). A sandbox gets the default size (4 vCPUs, 8 GiB memory) when the size fields are left out. For another size of your plan (Pro: 2/4, 4/8, 8/16; Builder: 2/4 up to 16/32; Team and Enterprise: 2/4 up to 32/64) or one an admin granted the org (`GET /v1/orgs` `allowedSpecs` lists them), name its `vcpus` and `memMiB`. Any other size is refused with `400 spec_not_allowed`. The free plan creates from agent-browser, android, omarchy or ci only (`403 template_not_allowed`); a create from a snapshot is not limited, except a snapshot of an internal-test template (`restricted` in `GET /v1/templates`), which only the accounts allowed to create from the template (and whoever took the snapshot) may use (`403 template_not_allowed`). An internal-test template has a limit on its machines (`403 template_limit`); a template whose guest kernel no host has is `503 kernel_unavailable`, and one with no version on any host (during a template rollout) is `503 template_unavailable`. Counts toward your plan's sandbox limit (`429 quota_exceeded`). When no host has room, the operation fails with `no_capacity` (retryable); with `failFast` the create is refused at once instead (`503 no_capacity`, nothing created, no operation). Retry `no_capacity` with backoff (see `Unavailable`) or try another size or template. A create from a template or from a system-files-only snapshot that fails before it gets a host (`no_capacity`, or any other error at that point) has its sandbox deleted with the failure (GET returns 404), so it does not count toward your limit and its name is free to retry. A create from a snapshot with storage stays, `stopped`; start it later. API keys: needs one of the scopes `machines:write`.","parameters":["36de7086-bc69-4bd5-a26f-840aa011acfd"],"requestBody":"a09bf11f-2361-4943-afb6-cd042363a967","responses":{"202":"0f1a08a2-4a79-470a-a3e2-ac414aa44b85","400":"61c127ee-96eb-419e-99a2-bba8b1337c40","401":"92c841a1-9894-475e-9971-b07f173879f8","402":"6fcca777-b32f-44ff-b319-8483be384345","403":"ad4beb64-5780-4d7f-bb95-b33420b66f6a","409":"55f8fd28-0f97-4a49-9fe8-4f28959dd0ad","429":"a99411fe-7fae-48f3-95e0-0c6918df6989","500":"151f4af9-ef14-4c59-8c03-b35781758ce3","503":"e02e2cd9-e7c3-4185-b777-e94a7e9a92ee"},"method":"post","type":"path","servers":["e2c665bb-4b53-46fa-8dd3-3dba6e3ac4a8"],"path":"/v1/machines","baseUrlOptions":["https://api.instabox.sh"],"title":"Create a sandbox.","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"36de7086-bc69-4bd5-a26f-840aa011acfd":{"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"}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"description":"Every field is optional; a body key that is none of these is refused with `400 unknown_field` (keys match case-insensitively). The lifetime timeout retired on 2026-10-20 is refused too; `timeoutSeconds`, `onTimeout` or `timeout` with any value but null is `400 unknown_field`, and the message names `deleteAfterSeconds`, `maxRunMinutes` and `autoSuspendAfterSeconds` instead (to a `User-Agent` of `instabox-cli/\u003cversion>`, whose builds before that date sent them, it says the CLI is out of date, how to install the current one, and names the flags `--delete-after`, `--max-run-minutes` and `--auto-suspend`). At most one of `templateId` and `snapshotId`; with neither, the sandbox starts from agent-browser, the CLI's and dashboard's default. Leave the size fields out for the default size, or name the `vcpus` and `memMiB` of another of your sizes (the org's plan's or one an admin granted the org; `GET /v1/orgs` `allowedSpecs`).","properties":{"name":{"type":"string","description":"1-63 lowercase letters, digits or `-`, starting with a letter or digit; unique among the org's sandboxes. Absent or empty: `box-` and 8 random hex digits (the operation's `machineId` and the sandbox carry it).","uniqueKey":"name","typeLabel":"string"},"templateId":{"type":"string","examples":["agent-browser"],"description":"The template to create from (`GET /v1/templates`, one with `creatable` true), optionally with a version as `id@version` (e.g. `agent-browser@2026-10-15.4`, the same as `templateVersion`). Absent (and no `snapshotId` or `templateVersion`): agent-browser. An unknown or retired one is refused with `400 bad_request` whose message lists the templates your plan can create from. The free plan creates from agent-browser, android, omarchy or ci only; another template is refused with `403 template_not_allowed`. A create from a snapshot is not limited.","uniqueKey":"templateId","typeLabel":"string"},"templateVersion":{"type":"string","description":"Default: the version `GET /v1/templates` marks `latest`. `templateId` may name it instead, as `id@version` (e.g. `agent-browser@2026-10-15.4`); both at once must agree. A version the template does not have is `400 bad_request` whose message lists its versions, newest first, the `latest` (or `default`) one tagged.","uniqueKey":"templateVersion","typeLabel":"string"},"snapshotId":{"type":"string","description":"Create from this snapshot of yours: its system files and storage (empty storage for a system-files-only snapshot).","uniqueKey":"snapshotId","typeLabel":"string"},"imageId":{"type":"string","deprecated":true,"description":"Deprecated: `snapshotId` under its old name (both: they must be equal). The reply carries a `Deprecation` header.","uniqueKey":"imageId","typeLabel":"string"},"vcpus":{"type":"integer","minimum":1,"description":"Absent: the default size (4 vCPUs, 8 GiB memory; `limits.machineSpec`). Else one of the org's sizes (`GET /v1/orgs` `allowedSpecs`: the default, its plan's others and any size an admin granted the org; on api.instabox.sh free 4/8192 only, Pro 2/4096, 4/8192, 8/16384, Builder 2/4096 up to 16/32768, Team and Enterprise 2/4096 up to 32/65536); name memMiB too when two of them have this many vCPUs. Anything else is refused with `400 spec_not_allowed`; 0 or a negative (no size) with `400 bad_request`.","uniqueKey":"vcpus","typeLabel":"integer"},"memMiB":{"type":"integer","minimum":1,"description":"Like vcpus: the memory (MiB) of one of your sizes, such as 8192 with vcpus 4; 0 or a negative is `400 bad_request`.","uniqueKey":"memMiB","typeLabel":"integer"},"persistentDiskGiB":{"type":"integer","minimum":1,"description":"Storage (`/data`) size in GiB. The disks come with the size: storage gets the size's (20 GiB on api.instabox.sh), or a snapshot's storage size when that is larger. Absent or exactly that size: accepted; any other is `400 spec_not_allowed` whose message names the size's storage next to what was asked; 0 or a negative is `400 bad_request`. To get more storage, grow it later with `PATCH /v1/machines/{id}`: a running sandbox's storage grows live, and a shrink applies while it is stopped, at its next boot. The SDKs' `diskGiB` (TypeScript) and `persistent_disk_gib` (Python) are this field; `diskGiB` in a REST body is `400 unknown_field`.","uniqueKey":"persistentDiskGiB","typeLabel":"integer"},"rootDiskGiB":{"type":"integer","minimum":1,"description":"System files size in GiB. Like persistentDiskGiB: system files get the template's size (or the snapshot's); naming any other is `400 spec_not_allowed` (the message names the size's root disk), 0 or a negative `400 bad_request`; grow it later with `PATCH /v1/machines/{id}`.","uniqueKey":"rootDiskGiB","typeLabel":"integer"},"desiredState":{"type":"string","enum":["running","stopped"],"description":"Default: running.","uniqueKey":"desiredState","typeLabel":"enum\u003cstring>"},"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"},"uniqueKey":"metadata","typeLabel":"object"},"archiveSeconds":{"type":"integer","minimum":60,"maximum":86400,"description":"Sets `archiveAt` to now plus this many seconds: the sandbox is stopped then if it is running. 0 or absent: none.","uniqueKey":"archiveSeconds","typeLabel":"integer"},"deleteAfterSeconds":{"type":"integer","minimum":60,"maximum":86400,"description":"Sets `deleteAt` to now plus this many seconds (60-86400, else 400): the sandbox is then deleted, whatever its state, so it cannot outlive a client that died (`instabox run` sets it). 0 or absent: never. A server without this field ignores it.","uniqueKey":"deleteAfterSeconds","typeLabel":"integer"},"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"},"autoSuspendAfterSeconds":{"type":"integer","description":"Absent: 1800 (30 minutes). The plan decides, and a value is honoured or refused, never silently replaced: a paid sandbox takes 300-1800 (5 to 30 minutes) in whole minutes, as sent, and 0 (off) where the plan allows always on (else `403 spec_not_allowed`); below 300 (1-299), above 1800, negative or not a multiple of 60 is `400 bad_request`. The free sandbox is fixed at 1800: any other value is `403 spec_not_allowed`, a plan limit (older servers: `403 permission_denied`). A refused create makes no sandbox. The reply's `autoSuspendAfterSeconds` shows the effective value. Separately, an account an admin gave manual lifecycle (`GET /v1/me` `manualLifecycle`) sends 120-86400 idle seconds, or 0 never (docs/idle-suspend.md).","uniqueKey":"autoSuspendAfterSeconds","typeLabel":"integer"},"vault":{"type":"boolean","description":"False disables legacy Vault delivery. Org Secret selections are independent.","uniqueKey":"vault","typeLabel":"boolean"},"secrets":{"oneOf":[{"type":"string","description":"Proxy Secrets from this org. All includes current and future proxy Secrets; [] selects none. Omit both secrets and envSecrets to retain only existing Vault delivery. When envSecrets alone is supplied, proxy selection defaults to all; directSecrets alone selects no proxy Secrets. Null is rejected.","const":"all","uniqueKey":"secrets.oneOf.0","typeLabel":"string"},{"type":"array","items":{"type":"string","pattern":"^[A-Za-z_][A-Za-z0-9_]{0,127}$","description":"A unique environment variable name within an org. The names a sandbox's env reserves are reserved (shell variables such as PATH, HOME, BASH_ENV, ENV and IFS, session and trust-store variables, and INSTABOX_ and SSH_ prefixes). A Secret saved under a name before it was reserved is not delivered: the machine's guest status names it.","uniqueKey":"secrets.oneOf.1.items.[INDEX]","typeLabel":"string"},"description":"Proxy Secrets from this org. All includes current and future proxy Secrets; [] selects none. Omit both secrets and envSecrets to retain only existing Vault delivery. When envSecrets alone is supplied, proxy selection defaults to all; directSecrets alone selects no proxy Secrets. Null is rejected.","uniqueKey":"secrets.oneOf.1","typeLabel":"string[]"}],"uniqueKey":"secrets","typeLabel":"string | string[]"},"envSecrets":{"type":"array","items":{"type":"string","pattern":"^[A-Za-z_][A-Za-z0-9_]{0,127}$","description":"A unique environment variable name within an org. The names a sandbox's env reserves are reserved (shell variables such as PATH, HOME, BASH_ENV, ENV and IFS, session and trust-store variables, and INSTABOX_ and SSH_ prefixes). A Secret saved under a name before it was reserved is not delivered: the machine's guest status names it.","uniqueKey":"envSecrets.items.[INDEX]","typeLabel":"string"},"default":[],"description":"Explicit env Secret names from this org; omitted or [] selects none. No all mode; null is rejected. Real values enter the sandbox. Shorthand for directSecrets entries with env = the Secret's name; not sent together with directSecrets.","uniqueKey":"envSecrets","typeLabel":"string[]"},"directSecrets":{"type":"array","maxItems":64,"items":{"type":"object","required":["secret"],"description":"A reference to a direct (delivery env) Secret: its real value as the variable `env` (exported by login shells), as a file at `file` (home-relative; the value stays on tmpfs at /run/instabox/secrets/files and the home path is a symlink to it), or both. Names and paths only; values are never returned.","properties":{"secret":{"type":"string","pattern":"^[A-Za-z_][A-Za-z0-9_]{0,127}$","description":"A unique environment variable name within an org. The names a sandbox's env reserves are reserved (shell variables such as PATH, HOME, BASH_ENV, ENV and IFS, session and trust-store variables, and INSTABOX_ and SSH_ prefixes). A Secret saved under a name before it was reserved is not delivered: the machine's guest status names it.","isRequired":true,"uniqueKey":"directSecrets.items.[INDEX].secret","typeLabel":"string"},"env":{"type":"string","pattern":"^[A-Za-z_][A-Za-z0-9_]{0,127}$","description":"Not reserved (PATH, HOME, BASH_ENV, IFS, CA variables, ...) and no INSTABOX_ or SSH_ prefix.","uniqueKey":"directSecrets.items.[INDEX].env","typeLabel":"string"},"file":{"type":"string","maxLength":255,"description":"Clean path relative to the home directory, without .. components.","uniqueKey":"directSecrets.items.[INDEX].file","typeLabel":"string"}},"uniqueKey":"directSecrets.items.[INDEX]","typeLabel":"object"},"description":"Direct (delivery env) Secrets from this org, each as a variable and/or a home file. Real values enter the sandbox; prefer proxy Secrets for HTTPS API keys. A fork that sends none of secrets, envSecrets and directSecrets copies its source's selection.","uniqueKey":"directSecrets","typeLabel":"object[]"},"env":{"type":"object","maxProperties":128,"description":"Environment variables for the whole sandbox: every login shell exports them (exec, SSH, the terminal and what they start), from the first command on and again after each start and resume. Names match `^[A-Za-z_][A-Za-z0-9_]{0,127}$`; `BASH_ENV`, `ENV`, `HOME`, `HOSTNAME`, `IFS`, `LOGNAME`, `OLDPWD`, `PATH`, `PWD`, `SHELL`, `SHLVL`, `USER`, bash's readonly `BASHOPTS`, `BASH_VERSINFO`, `EUID`, `PPID`, `SHELLOPTS` and `UID`, the session's `TERM`, `XDG_RUNTIME_DIR` and `DBUS_SESSION_BUS_ADDRESS`, the trust roots `SSL_CERT_FILE`, `SSL_CERT_DIR`, `REQUESTS_CA_BUNDLE`, `CURL_CA_BUNDLE` and `NODE_EXTRA_CA_CERTS`, and names starting `INSTABOX_` or `SSH_` are reserved (set them per exec); values have no NUL bytes; names and values at most 32 KiB together. Not on macOS or Windows templates (400). Fixed at create: a fork takes its source's, a create from a snapshot only its own. An exec's `envs`, a Vault item and an env Secret of the same name win. Not Secrets: anything in the sandbox can read the values, and the sandbox shows only the names (`envNames`). The values are stored encrypted at rest; a site without the Secret master key refuses env (400 bad_request).","additionalProperties":{"type":"string","uniqueKey":"env.additionalProperties","typeLabel":"string"},"uniqueKey":"env","typeLabel":"object"},"pool":{"type":"string","description":"Admins only: the host pool to place the sandbox in and no other (docs/hybrid-pools.md), \"default\" included. With snapshotId it must be the snapshot's pool. Absent: the user's pool assignment, else the server's placement.createPools.","uniqueKey":"pool","typeLabel":"string"},"guestUser":{"type":"string","pattern":"^[a-z_][a-z0-9_-]{0,31}$","maxLength":32,"examples":["alice"],"description":"The sandbox's Linux user (`Machine.guestUser`), so `ssh \u003csandbox>` over your own network (Tailscale) logs in as the same name as on your computer. Lowercase letters, digits, `_` and `-`, starting with a letter or `_`, at most 32 characters; reserved names (`root`, `instabox`, the Debian base system's users and groups such as `sudo`, `systemd-*`) are refused with `400 invalid_guest_user`. Clients send the local username normalized (`DOMAIN\\alice` and `alice@corp.example` become `alice`, lowercase, spaces become `_`) and nothing when that is not a valid name. Absent: `user`; with `snapshotId`, the snapshot's user. Ignored (the sandbox gets `dev`) for templates without the `guest-user` capability. Fixed at create.","uniqueKey":"guestUser","typeLabel":"string"},"failFast":{"type":"boolean","default":false,"description":"When no host has room for the sandbox right now, refuse the create at once with `503 no_capacity` (`retryable`; nothing is created, there is no operation and the `Idempotency-Key` is not kept) instead of answering 202 with an operation that then fails with `no_capacity`. Every other check and the rest of the create are unchanged; a host that had room can still fill up before the operation places the sandbox. The check does not ask for a host with the secret proxy, which a create with `secrets` or `envSecrets` needs: if only hosts without it have room, the create is accepted and its operation fails with `no_capacity`. A create from a snapshot that no host can start now is refused too, instead of being created stopped. A server without this field ignores it, or, if it already refuses unknown body keys, answers `400 unknown_field`.","uniqueKey":"failFast","typeLabel":"boolean"},"orgId":{"type":"string","description":"The org the sandbox counts against and is shared with (`GET /v1/orgs`); you must be a member. Absent: your personal org, or with `snapshotId` the snapshot's org (a sandbox from a snapshot lives in the snapshot's org; another is `400 bad_request`). Secret selections always resolve within this org. The org's sandbox limit and, on the free tier, its monthly included usage apply (`429 quota_exceeded`, `402 credit_exhausted`).","uniqueKey":"orgId","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"name":"\u003cstring>","templateId":"agent-browser","templateVersion":"\u003cstring>","snapshotId":"\u003cstring>","imageId":"\u003cstring>","vcpus":2,"memMiB":2,"persistentDiskGiB":2,"rootDiskGiB":2,"metadata":{},"archiveSeconds":43230,"deleteAfterSeconds":43230,"maxRunMinutes":1073741823,"autoSuspendAfterSeconds":123,"vault":true,"secrets":"all","envSecrets":[],"directSecrets":[{"secret":"\u003cstring>","env":"\u003cstring>","file":"\u003cstring>"}],"env":{},"pool":"\u003cstring>","guestUser":"alice","failFast":false,"orgId":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"0f1a08a2-4a79-470a-a3e2-ac414aa44b85":{"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"},"61c127ee-96eb-419e-99a2-bba8b1337c40":{"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"},"92c841a1-9894-475e-9971-b07f173879f8":{"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"},"6fcca777-b32f-44ff-b319-8483be384345":{"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"},"ad4beb64-5780-4d7f-bb95-b33420b66f6a":{"description":"`permission_denied`: the user is not allowed (not on the allowlist, or not the owner), or an API key was used where only a sign-in session is; `missing_scope`: the API key lacks the route's scope (`requiredScopes` names it; older servers sent `insufficient_scope`).","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"},"55f8fd28-0f97-4a49-9fe8-4f28959dd0ad":{"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"},"a99411fe-7fae-48f3-95e0-0c6918df6989":{"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"},"151f4af9-ef14-4c59-8c03-b35781758ce3":{"description":"`internal`: unexpected server error.","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"},"e02e2cd9-e7c3-4185-b777-e94a7e9a92ee":{"description":"`no_capacity` (there is no room for the sandbox right now; the message says what could not run and when to retry) or `host_unavailable` (the sandbox cannot be reached right now). Usually `retryable`; try again shortly. `no_capacity` is `retryable`: retry with exponential backoff (for example after 15 s, 30 s, 60 s, then every few minutes), or try another size or template. A create whose operation failed with it replays that failed operation for the same `Idempotency-Key`, so retry it with a new key. With `--fail-fast` the CLI's `create` and `run` exit 75 on it (otherwise 1). A retryable `no_capacity` has `retryAfterSeconds` and the same `Retry-After` header: wait at least that long before the first retry.","headers":{"Retry-After":{"description":"Seconds to wait before retrying; the body's `retryAfterSeconds`.","schema":{"type":"integer","minimum":1,"examples":[60]}}},"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":{"8986ac23-cac9-4d85-bb0c-0c95bc9cf0b3":{"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"}},"ade73e30-5bb2-416e-ae6f-fa788248d8fc":{"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"}},"999a2fa4-8e9d-4355-b856-72da073a2427":{"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":"Create a sandbox. - InstaBox","relatedPagesConfig":{"enabled":false,"limit":5,"mode":"automatic"},"navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-09T06:53:03.518Z","originalFileLocation":"api-reference/machines/create-a-sandbox.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=\"Returns a create operation whose machineId is the new sandbox. Start from a template (templateId) or one of your snapshots (snapshotId). A sandbox gets the default size (4 vCPUs, 8 GiB memory) when the size fields are left out. For another size of your plan (Pro: 2/4, 4/8, 8/16; Builder: 2/4 up to 16/32; Team and Enterprise: 2/4 up to 32/64) or one an admin granted the org (GET /v1/orgs allowedSpecs lists them), name its vcpus and memMiB. Any other size is refused with 400 spec_not_allowed. The free plan creates from agent-browser, android, omarchy or ci only (403 template_not_allowed); a create from a snapshot is not limited, except a snapshot of an internal-test template (restricted in GET /v1/templates), which only the accounts allowed to create from the template (and whoever took the snapshot) may use (403 template_not_allowed). An internal-test template has a limit on its machines (403 template_limit); a template whose guest kernel no host has is 503 kernel_unavailable, and one with no version on any host (during a template rollout) is 503 template_unavailable. Counts toward your plan\u0026#x27;s sandbox limit (429 quota_exceeded). When no host has room, the operation fails with no_capacity (retryable); with failFast the create is refused at once instead (503 no_capacity, nothing created, no operation). Retry no_capacity with backoff (see Unavailable) or try another size or template. A create from a template or from a system-files-only snapshot that fails before it gets a host (no_capacity, or any other error at that point) has its sandbox deleted with the failure (GET returns 404), so it does not count toward your limit and its name is free to retry. A create from a snapshot with storage stays, stopped; start it later. 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=\"Create a sandbox. - InstaBox\">\u003cmeta data-mint-head property=\"og:description\" content=\"Returns a create operation whose machineId is the new sandbox. Start from a template (templateId) or one of your snapshots (snapshotId). A sandbox gets the default size (4 vCPUs, 8 GiB memory) when the size fields are left out. For another size of your plan (Pro: 2/4, 4/8, 8/16; Builder: 2/4 up to 16/32; Team and Enterprise: 2/4 up to 32/64) or one an admin granted the org (GET /v1/orgs allowedSpecs lists them), name its vcpus and memMiB. Any other size is refused with 400 spec_not_allowed. The free plan creates from agent-browser, android, omarchy or ci only (403 template_not_allowed); a create from a snapshot is not limited, except a snapshot of an internal-test template (restricted in GET /v1/templates), which only the accounts allowed to create from the template (and whoever took the snapshot) may use (403 template_not_allowed). An internal-test template has a limit on its machines (403 template_limit); a template whose guest kernel no host has is 503 kernel_unavailable, and one with no version on any host (during a template rollout) is 503 template_unavailable. Counts toward your plan\u0026#x27;s sandbox limit (429 quota_exceeded). When no host has room, the operation fails with no_capacity (retryable); with failFast the create is refused at once instead (503 no_capacity, nothing created, no operation). Retry no_capacity with backoff (see Unavailable) or try another size or template. A create from a template or from a system-files-only snapshot that fails before it gets a host (no_capacity, or any other error at that point) has its sandbox deleted with the failure (GET returns 404), so it does not count toward your limit and its name is free to retry. A create from a snapshot with storage stays, stopped; start it later. 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/create-a-sandbox\">\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=Create+a+sandbox.\u0026amp;description=Returns+a+%60create%60+operation+whose+%60machineId%60+is+the+new+sandbox.+Start+from+a+template+%28%60templateId%60%29+or+one+of+your+snapshots+%28%60snapshotId%60%29.+A+sandbox+gets+\u0026amp;theme=4d60089f83d6d00671834b24\u0026amp;signature=405c613751ad18881b78c31fd8023eaf328ec4e540db15c6b7640b99e5585dc3\">\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=\"Create a sandbox. - InstaBox\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Returns a create operation whose machineId is the new sandbox. Start from a template (templateId) or one of your snapshots (snapshotId). A sandbox gets the default size (4 vCPUs, 8 GiB memory) when the size fields are left out. For another size of your plan (Pro: 2/4, 4/8, 8/16; Builder: 2/4 up to 16/32; Team and Enterprise: 2/4 up to 32/64) or one an admin granted the org (GET /v1/orgs allowedSpecs lists them), name its vcpus and memMiB. Any other size is refused with 400 spec_not_allowed. The free plan creates from agent-browser, android, omarchy or ci only (403 template_not_allowed); a create from a snapshot is not limited, except a snapshot of an internal-test template (restricted in GET /v1/templates), which only the accounts allowed to create from the template (and whoever took the snapshot) may use (403 template_not_allowed). An internal-test template has a limit on its machines (403 template_limit); a template whose guest kernel no host has is 503 kernel_unavailable, and one with no version on any host (during a template rollout) is 503 template_unavailable. Counts toward your plan\u0026#x27;s sandbox limit (429 quota_exceeded). When no host has room, the operation fails with no_capacity (retryable); with failFast the create is refused at once instead (503 no_capacity, nothing created, no operation). Retry no_capacity with backoff (see Unavailable) or try another size or template. A create from a template or from a system-files-only snapshot that fails before it gets a host (no_capacity, or any other error at that point) has its sandbox deleted with the failure (GET returns 404), so it does not count toward your limit and its name is free to retry. A create from a snapshot with storage stays, stopped; start it later. 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=Create+a+sandbox.\u0026amp;description=Returns+a+%60create%60+operation+whose+%60machineId%60+is+the+new+sandbox.+Start+from+a+template+%28%60templateId%60%29+or+one+of+your+snapshots+%28%60snapshotId%60%29.+A+sandbox+gets+\u0026amp;theme=4d60089f83d6d00671834b24\u0026amp;signature=405c613751ad18881b78c31fd8023eaf328ec4e540db15c6b7640b99e5585dc3\">\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/create-a-sandbox\">\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/create-a-sandbox.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/create-a-sandbox#webpage\",\"url\":\"https://instabox.sh/docs/api-reference/machines/create-a-sandbox\",\"name\":\"Create a sandbox.\",\"description\":\"Returns a create operation whose machineId is the new sandbox. Start from a template (templateId) or one of your snapshots (snapshotId). A sandbox gets the default size (4 vCPUs, 8 GiB memory) when the size fields are left out. For another size of your plan (Pro: 2/4, 4/8, 8/16; Builder: 2/4 up to 16/32; Team and Enterprise: 2/4 up to 32/64) or one an admin granted the org (GET /v1/orgs allowedSpecs lists them), name its vcpus and memMiB. Any other size is refused with 400 spec_not_allowed. The free plan creates from agent-browser, android, omarchy or ci only (403 template_not_allowed); a create from a snapshot is not limited, except a snapshot of an internal-test template (restricted in GET /v1/templates), which only the accounts allowed to create from the template (and whoever took the snapshot) may use (403 template_not_allowed). An internal-test template has a limit on its machines (403 template_limit); a template whose guest kernel no host has is 503 kernel_unavailable, and one with no version on any host (during a template rollout) is 503 template_unavailable. Counts toward your plan's sandbox limit (429 quota_exceeded). When no host has room, the operation fails with no_capacity (retryable); with failFast the create is refused at once instead (503 no_capacity, nothing created, no operation). Retry no_capacity with backoff (see Unavailable) or try another size or template. A create from a template or from a system-files-only snapshot that fails before it gets a host (no_capacity, or any other error at that point) has its sandbox deleted with the failure (GET returns 404), so it does not count toward your limit and its name is free to retry. A create from a snapshot with storage stays, stopped; start it later. API keys: needs one of the scopes machines:write.\",\"dateModified\":\"2026-11-09T06:53:03.518Z\",\"isPartOf\":{\"@id\":\"https://instabox.sh/docs#website\"},\"breadcrumb\":{\"@id\":\"https://instabox.sh/docs/api-reference/machines/create-a-sandbox#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://instabox.sh/docs/api-reference/machines/create-a-sandbox#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"API reference\",\"item\":\"https://instabox.sh/docs/api-reference/introduction\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Create a sandbox.\",\"item\":\"https://instabox.sh/docs/api-reference/machines/create-a-sandbox\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://instabox.sh/docs/api-reference/machines/create-a-sandbox#apireference\",\"headline\":\"Create a sandbox.\",\"name\":\"Create a sandbox.\",\"description\":\"Returns a create operation whose machineId is the new sandbox. Start from a template (templateId) or one of your snapshots (snapshotId). A sandbox gets the default size (4 vCPUs, 8 GiB memory) when the size fields are left out. For another size of your plan (Pro: 2/4, 4/8, 8/16; Builder: 2/4 up to 16/32; Team and Enterprise: 2/4 up to 32/64) or one an admin granted the org (GET /v1/orgs allowedSpecs lists them), name its vcpus and memMiB. Any other size is refused with 400 spec_not_allowed. The free plan creates from agent-browser, android, omarchy or ci only (403 template_not_allowed); a create from a snapshot is not limited, except a snapshot of an internal-test template (restricted in GET /v1/templates), which only the accounts allowed to create from the template (and whoever took the snapshot) may use (403 template_not_allowed). An internal-test template has a limit on its machines (403 template_limit); a template whose guest kernel no host has is 503 kernel_unavailable, and one with no version on any host (during a template rollout) is 503 template_unavailable. Counts toward your plan's sandbox limit (429 quota_exceeded). When no host has room, the operation fails with no_capacity (retryable); with failFast the create is refused at once instead (503 no_capacity, nothing created, no operation). Retry no_capacity with backoff (see Unavailable) or try another size or template. A create from a template or from a system-files-only snapshot that fails before it gets a host (no_capacity, or any other error at that point) has its sandbox deleted with the failure (GET returns 404), so it does not count toward your limit and its name is free to retry. A create from a snapshot with storage stays, stopped; start it later. API keys: needs one of the scopes machines:write.\",\"url\":\"https://instabox.sh/docs/api-reference/machines/create-a-sandbox\",\"mainEntityOfPage\":{\"@id\":\"https://instabox.sh/docs/api-reference/machines/create-a-sandbox#webpage\"},\"dateModified\":\"2026-11-09T06:53:03.518Z\",\"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","description":"Base URL, authentication, operations, idempotency and errors that every endpoint shares.","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.","description":"Your sandboxes and those of the other members of your orgs (docs/orgs.md). API keys: needs one of the scopes `machines:read`.","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.","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.","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":"Create a sandbox. - 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"]}