{
  "docs_url": "https://innstance.impossibuild.ai/docs/errors",
  "envelope": "Every JSON error body has the same envelope:\n\n    {\"error\": \"\u003cmessage\u003e\", \"code\": \"\u003cCODE\u003e\", \"retryable\": false, \"docs_url\": \"\u003cthis page\u003e#\u003cCODE\u003e\"}\n\n- error: the human sentence. Print it as-is; clients that read only this field keep working.\n- code: stable once sent; branch on it, never on the sentence. A refusal with no code of its own carries the generic code for its HTTP status.\n- retryable: true when the same request, sent again after a pause, can succeed with nothing changed. Honour Retry-After when it is set.\n- docs_url: this catalog, at the code.\n\nSome codes add fields of their own (upgrade, retry_after, over_pool_until, moderation, ...). Codes are case-sensitive; a few early subscription codes are lower case and stay that way.\n\nNot every response is JSON: a body over a route's size cap is refused with a plain-text 413 before any handler runs, and an unknown route is a plain-text 404.",
  "errors": [
    {
      "code": "INVALID_REQUEST",
      "status": [
        400
      ],
      "retryable": false,
      "summary": "The request is malformed or a value is not allowed.",
      "action": "Read the message: it names the field and the rule. Fix the request and send it again.",
      "generic": true,
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#INVALID_REQUEST"
    },
    {
      "code": "UNAUTHENTICATED",
      "status": [
        401
      ],
      "retryable": false,
      "summary": "No credential, or the token is unknown, revoked or expired.",
      "action": "Sign in again (innstance login) or send a valid token as Authorization: Bearer \u003ctoken\u003e.",
      "generic": true,
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#UNAUTHENTICATED"
    },
    {
      "code": "PAYMENT_REQUIRED",
      "status": [
        402
      ],
      "retryable": false,
      "summary": "The request needs payment or more balance first.",
      "action": "Pay or top up as the body describes (x402 challenges carry an accepts list), then send the request again.",
      "generic": true,
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#PAYMENT_REQUIRED"
    },
    {
      "code": "FORBIDDEN",
      "status": [
        403
      ],
      "retryable": false,
      "summary": "This account may not do this.",
      "action": "Do not retry. The message says why; a cookie request from another origin is refused here too.",
      "generic": true,
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#FORBIDDEN"
    },
    {
      "code": "NOT_FOUND",
      "status": [
        404
      ],
      "retryable": false,
      "summary": "No such resource on this account (another account's resources also answer 404).",
      "action": "Check the name; list what exists (GET /apps, /sites, /agents/hosts).",
      "generic": true,
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#NOT_FOUND"
    },
    {
      "code": "REQUEST_TIMEOUT",
      "status": [
        408
      ],
      "retryable": true,
      "summary": "The request was cancelled before the operation finished.",
      "action": "Read the resource's state, then send the request again if it did not take effect.",
      "generic": true,
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#REQUEST_TIMEOUT"
    },
    {
      "code": "CONFLICT",
      "status": [
        409
      ],
      "retryable": false,
      "summary": "The request conflicts with the resource's current state: a name already taken, a limit on tokens, a resource in the wrong state.",
      "action": "Change the request or the resource as the message says; waiting alone does not clear it. A conflict that does clear by itself, after which the same request passes, has its own retryable code (OPERATION_IN_PROGRESS, POOL_LOCKED, DEPLOY_IN_PROGRESS, APP_OPERATION_IN_PROGRESS). When the work asked for is already under way (an assistant being set up), watch the resource instead of sending the request again.",
      "generic": true,
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#CONFLICT"
    },
    {
      "code": "GONE",
      "status": [
        410
      ],
      "retryable": false,
      "summary": "What the request refers to existed but has expired or been used.",
      "action": "Start the flow again to get a fresh link, token or session.",
      "generic": true,
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#GONE"
    },
    {
      "code": "PAYLOAD_TOO_LARGE",
      "status": [
        413
      ],
      "retryable": false,
      "summary": "The request body is larger than this route accepts.",
      "action": "Send less. JSON routes take up to 64 KiB; upload routes state their plan's limit in the message.",
      "generic": true,
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#PAYLOAD_TOO_LARGE"
    },
    {
      "code": "UNPROCESSABLE",
      "status": [
        422
      ],
      "retryable": false,
      "summary": "The request is well formed but its content cannot be accepted.",
      "action": "Change the content as the message says.",
      "generic": true,
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#UNPROCESSABLE"
    },
    {
      "code": "RATE_LIMIT",
      "status": [
        429
      ],
      "retryable": true,
      "summary": "Too many requests from this account or address.",
      "action": "Wait for Retry-After seconds (also in retry_after or retry_after_seconds when present), then send the request again.",
      "generic": true,
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#RATE_LIMIT"
    },
    {
      "code": "INTERNAL_ERROR",
      "status": [
        500
      ],
      "retryable": true,
      "summary": "The server failed while handling the request.",
      "action": "Retry with backoff. For a write, read the resource first: part of it may have happened.",
      "generic": true,
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#INTERNAL_ERROR"
    },
    {
      "code": "UPSTREAM_ERROR",
      "status": [
        502
      ],
      "retryable": true,
      "summary": "A provider the platform depends on (machines, certificates, payments, DNS) failed or answered something unusable.",
      "action": "Retry with backoff. Failures whose outcome is unknown use OUTCOME_UNKNOWN instead.",
      "generic": true,
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#UPSTREAM_ERROR"
    },
    {
      "code": "UNAVAILABLE",
      "status": [
        503
      ],
      "retryable": true,
      "summary": "A dependency is briefly unavailable, or coordination with another request failed.",
      "action": "Retry after a short pause. A feature this deployment does not run answers NOT_ENABLED instead.",
      "generic": true,
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#UNAVAILABLE"
    },
    {
      "code": "TIMEOUT",
      "status": [
        504
      ],
      "retryable": true,
      "summary": "The operation ran out of time.",
      "action": "Read the resource's state, then retry if it did not finish. Work run on a machine, which may still be running there, answers EXEC_TIMEOUT instead.",
      "generic": true,
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#TIMEOUT"
    },
    {
      "code": "OPERATION_IN_PROGRESS",
      "status": [
        409
      ],
      "retryable": true,
      "summary": "Another change to the same app, site or assistant is running, or it is still starting.",
      "action": "Wait a few seconds and send the same request again.",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#OPERATION_IN_PROGRESS"
    },
    {
      "code": "NOT_ENABLED",
      "status": [
        503
      ],
      "retryable": false,
      "summary": "This deployment does not run the feature (it is switched off in its configuration).",
      "action": "Do not retry; use another way, or ask the operator. A few older messages call this \"temporarily unavailable\"; the code is what holds.",
      "where": "assistants and their settings changes, backups, volumes, custom domains, legacy CLI login, card checkout, traffic top-ups, deploys without a runner image",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#NOT_ENABLED"
    },
    {
      "code": "OUTCOME_UNKNOWN",
      "status": [
        500,
        502,
        503
      ],
      "retryable": false,
      "summary": "The request may already have taken effect, in whole or in part, and the server cannot confirm it.",
      "action": "Do not repeat it blindly: read the target's state first (the message says what to check), then decide.",
      "where": "app create, commands run with exec, runner upload completion, subscription plan changes, x402 top-ups whose settlement did not answer or answered something unusable",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#OUTCOME_UNKNOWN"
    },
    {
      "code": "ACCOUNT_SUSPENDED",
      "status": [
        403
      ],
      "retryable": false,
      "summary": "The account is suspended for breaking the acceptable use policy.",
      "action": "Do not retry. The body carries the reason and an appeal link when there is one.",
      "where": "every sign-in route",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#ACCOUNT_SUSPENDED"
    },
    {
      "code": "ACCOUNT_CHANGED",
      "status": [
        403
      ],
      "retryable": false,
      "summary": "The browser session now belongs to a different account than the page expected.",
      "action": "Reload the page and confirm the action with the intended account.",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#ACCOUNT_CHANGED"
    },
    {
      "code": "TOKEN_REQUEST_REPLAY",
      "status": [
        409
      ],
      "retryable": false,
      "summary": "This token request already created a token; its secret cannot be shown again.",
      "action": "Check GET /auth/tokens and revoke the token if its secret was not received.",
      "where": "POST /auth/token",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#TOKEN_REQUEST_REPLAY"
    },
    {
      "code": "RATE_LIMIT_UNAVAILABLE",
      "status": [
        503
      ],
      "retryable": true,
      "summary": "The rate limiter could not record the request, so an expensive route refused it.",
      "action": "Retry after a short pause.",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#RATE_LIMIT_UNAVAILABLE"
    },
    {
      "code": "FREE_TIER_DISABLED",
      "status": [
        403
      ],
      "retryable": false,
      "summary": "New free accounts are switched off on this server.",
      "action": "Subscribe to a paid plan (upgrade names the cheapest).",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#FREE_TIER_DISABLED"
    },
    {
      "code": "FREE_TIER_FULL",
      "status": [
        403
      ],
      "retryable": false,
      "summary": "The free plan has reached its account cap.",
      "action": "Subscribe to a paid plan.",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#FREE_TIER_FULL"
    },
    {
      "code": "APP_LIMIT",
      "status": [
        403
      ],
      "retryable": false,
      "summary": "The plan's app count is reached.",
      "action": "Remove an app, or upgrade to the plan named in upgrade.",
      "where": "app create",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#APP_LIMIT"
    },
    {
      "code": "SITE_LIMIT",
      "status": [
        403
      ],
      "retryable": false,
      "summary": "The plan's published-site count is reached.",
      "action": "Remove a site (innstance sites rm), or upgrade to the plan named in upgrade.",
      "where": "site create",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#SITE_LIMIT"
    },
    {
      "code": "CPU_LIMIT",
      "status": [
        403
      ],
      "retryable": false,
      "summary": "More CPUs per machine than the plan allows.",
      "action": "Ask for fewer CPUs, or upgrade.",
      "where": "app create and update",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#CPU_LIMIT"
    },
    {
      "code": "CPU_KIND_LIMIT",
      "status": [
        403
      ],
      "retryable": false,
      "summary": "Performance CPUs are not included in this plan.",
      "action": "Use cpu_kind shared, or upgrade.",
      "where": "app create and update",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#CPU_KIND_LIMIT"
    },
    {
      "code": "POOL_MEMORY_LIMIT",
      "status": [
        403
      ],
      "retryable": false,
      "summary": "The change would take the account over its plan's RAM pool.",
      "action": "Free RAM (smaller machines, fewer apps or assistants), or upgrade.",
      "where": "app create and update, scale, assistant launch",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#POOL_MEMORY_LIMIT"
    },
    {
      "code": "POOL_VOLUME_LIMIT",
      "status": [
        403
      ],
      "retryable": false,
      "summary": "The change would take the account over its plan's storage pool.",
      "action": "Remove or shrink volumes, or upgrade.",
      "where": "volume create and extend, assistant launch",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#POOL_VOLUME_LIMIT"
    },
    {
      "code": "VOLUMES_NOT_AVAILABLE",
      "status": [
        403
      ],
      "retryable": false,
      "summary": "The plan does not include persistent volumes.",
      "action": "Upgrade, or keep state in a managed database.",
      "where": "volume create",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#VOLUMES_NOT_AVAILABLE"
    },
    {
      "code": "AUTOSCALE_LIMIT",
      "status": [
        403
      ],
      "retryable": false,
      "summary": "More machines per app than the plan allows.",
      "action": "Ask for fewer, or upgrade.",
      "where": "app create and update, scale",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#AUTOSCALE_LIMIT"
    },
    {
      "code": "DOMAINS_NOT_AVAILABLE",
      "status": [
        403
      ],
      "retryable": false,
      "summary": "The plan does not include custom domains.",
      "action": "Upgrade.",
      "where": "domain add",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#DOMAINS_NOT_AVAILABLE"
    },
    {
      "code": "DOMAIN_LIMIT",
      "status": [
        403
      ],
      "retryable": false,
      "summary": "The plan's custom-domain count is reached.",
      "action": "Remove a domain, or upgrade.",
      "where": "domain add",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#DOMAIN_LIMIT"
    },
    {
      "code": "ALWAYS_ON_PERFORMANCE",
      "status": [
        403
      ],
      "retryable": false,
      "summary": "The change would add always-on performance CPU, which this account's plan does not include.",
      "action": "Follow one of the fixes in the body.",
      "where": "deploy, apply, scale",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#ALWAYS_ON_PERFORMANCE"
    },
    {
      "code": "ALWAYS_ON_COST_LIMIT",
      "status": [
        403
      ],
      "retryable": false,
      "summary": "The change would take the account's always-on machines past the plan's always-on budget.",
      "action": "Follow one of the fixes in the body.",
      "where": "deploy, apply, scale",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#ALWAYS_ON_COST_LIMIT"
    },
    {
      "code": "LIMITS_UNAVAILABLE",
      "status": [
        403,
        503
      ],
      "retryable": true,
      "summary": "Usage could not be measured, so a change that needs the pool check was refused.",
      "action": "Retry in a moment.",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#LIMITS_UNAVAILABLE"
    },
    {
      "code": "OVER_POOL",
      "status": [
        402
      ],
      "retryable": false,
      "summary": "The account is over its plan's pool; over_pool_until is when the grace period ends.",
      "action": "Reduce usage or upgrade before making further changes.",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#OVER_POOL"
    },
    {
      "code": "POOL_LOCKED",
      "status": [
        409
      ],
      "retryable": true,
      "summary": "Another change to this account's pool is being written.",
      "action": "Retry with a short jittered backoff; the CLI does this itself.",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#POOL_LOCKED"
    },
    {
      "code": "TRIAL_EXPIRED",
      "status": [
        403
      ],
      "retryable": false,
      "summary": "The free trial for this app or site has ended.",
      "action": "Upgrade (url in the body) to deploy or publish again.",
      "where": "deploy, site upload",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#TRIAL_EXPIRED"
    },
    {
      "code": "SETUP_LIMIT",
      "status": [
        409
      ],
      "retryable": false,
      "summary": "Too many names are held by pages or assistants that were never finished.",
      "action": "Finish or remove one of them, then try again.",
      "where": "site create, assistant launch",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#SETUP_LIMIT"
    },
    {
      "code": "NAME_TAKEN",
      "status": [
        409
      ],
      "retryable": false,
      "summary": "The name is taken on the public namespace.",
      "action": "Pick another name.",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#NAME_TAKEN"
    },
    {
      "code": "NAME_NOT_ALLOWED",
      "status": [
        400
      ],
      "retryable": false,
      "summary": "The name resembles a well-known brand or the platform, or promotes gambling, adult content or scams.",
      "action": "Pick a plainly different name; the reply never says which rule matched.",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#NAME_NOT_ALLOWED"
    },
    {
      "code": "agent_name_yours",
      "status": [
        409
      ],
      "retryable": false,
      "summary": "This account already has an assistant with this name; status says what state it is in.",
      "action": "Carry on with it (send its inputs), or destroy it first.",
      "where": "POST /agents",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#agent_name_yours"
    },
    {
      "code": "agent_name_taken",
      "status": [
        409
      ],
      "retryable": false,
      "summary": "The name is held by another account, or by one of this account's sites or apps.",
      "action": "Pick another name.",
      "where": "POST /agents",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#agent_name_taken"
    },
    {
      "code": "UNDER_REVIEW",
      "status": [
        403
      ],
      "retryable": false,
      "summary": "The resource is held or quarantined by trust and safety.",
      "action": "Do not retry; it cannot be changed or deleted until reviewed. moderation carries the reasons and the appeal link.",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#UNDER_REVIEW"
    },
    {
      "code": "FILE_TYPE_NOT_ALLOWED",
      "status": [
        422
      ],
      "retryable": false,
      "summary": "The free plan publishes only web file types; files lists the refused ones.",
      "action": "Remove those files, or upgrade. Nothing was published.",
      "where": "site upload",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#FILE_TYPE_NOT_ALLOWED"
    },
    {
      "code": "IMAGE_NOT_CHECKABLE",
      "status": [
        422
      ],
      "retryable": false,
      "summary": "An image could not be checked (AVIF, HEIC, JPEG XL, or far larger than a page needs).",
      "action": "Save it as PNG, JPEG, GIF or WebP. Nothing was published.",
      "where": "site upload",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#IMAGE_NOT_CHECKABLE"
    },
    {
      "code": "DEPLOY_IN_PROGRESS",
      "status": [
        409
      ],
      "retryable": true,
      "summary": "A deploy is already running on this app.",
      "action": "Wait for it to finish (GET /apps/{name}/deployments), then retry.",
      "where": "runner deploy, app delete",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#DEPLOY_IN_PROGRESS"
    },
    {
      "code": "APP_OPERATION_IN_PROGRESS",
      "status": [
        409
      ],
      "retryable": true,
      "summary": "Another deploy or app-wide operation is running.",
      "action": "Retry when it finishes.",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#APP_OPERATION_IN_PROGRESS"
    },
    {
      "code": "DELETE_FAILED",
      "status": [
        502
      ],
      "retryable": true,
      "summary": "Tearing the app down at the provider failed; the app is kept as delete_failed.",
      "action": "Call DELETE again (retry carries a hint).",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#DELETE_FAILED"
    },
    {
      "code": "EXEC_TIMEOUT",
      "status": [
        504
      ],
      "retryable": false,
      "summary": "The command ran out of time. It may still be running on the machine, or have finished there.",
      "action": "Do not send the same request again: it would run the work a second time and run out of time the same way. Start a long command detached (`nohup \u003ccmd\u003e \u003e /tmp/log 2\u003e\u00261 \u003c /dev/null \u0026`) and poll it with short commands; `innstance agents ssh` has no time limit. For a backup, choose a smaller directory.",
      "where": "POST /apps/{name}/exec, POST /agents/hosts/{name}/exec, POST /apps/{name}/pull (archiving)",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#EXEC_TIMEOUT"
    },
    {
      "code": "EXEC_OUTPUT_TOO_LARGE",
      "status": [
        502
      ],
      "retryable": false,
      "summary": "The command ran, but its output was larger than an exec response can carry.",
      "action": "Do not run it again as is: redirect its output to a file and fetch the file (`innstance machines pull`).",
      "where": "POST /apps/{name}/exec",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#EXEC_OUTPUT_TOO_LARGE"
    },
    {
      "code": "DOMAIN_PROOF_REQUIRED",
      "status": [
        428
      ],
      "retryable": true,
      "summary": "Ownership of the hostname is not proven yet; nothing was written.",
      "action": "Publish the TXT record in verify (and the CNAME in records), then send the same request again.",
      "where": "domain add (apps and sites)",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#DOMAIN_PROOF_REQUIRED"
    },
    {
      "code": "PAYMENT_NOT_CREDITED",
      "status": [
        500
      ],
      "retryable": false,
      "summary": "The payment settled on-chain, but the account could not be credited with it. Its transaction (tx_hash) is kept for reconciliation.",
      "action": "Do not pay again: the same request cannot succeed, and a fresh payment would be a second one. Check GET /subscription/topup/recent (plan days) or GET /billing/usage (traffic); if the credit has not appeared, contact support with tx_hash.",
      "where": "x402 top-ups (GET /subscription/topup/x402, GET /billing/egress/topup/x402)",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#PAYMENT_NOT_CREDITED"
    },
    {
      "code": "PRICING_NOT_ON_SALE",
      "status": [
        409
      ],
      "retryable": false,
      "summary": "There is no other pricing version on sale here, so the account's plan is the one on sale.",
      "action": "Nothing to do.",
      "where": "POST /billing/pricing",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#PRICING_NOT_ON_SALE"
    },
    {
      "code": "PRICING_SWITCH_NOT_ALLOWED",
      "status": [
        409
      ],
      "retryable": false,
      "summary": "A switch is one way: a pricing version that is no longer sold cannot be chosen again.",
      "action": "Nothing to do; the account keeps its version.",
      "where": "POST /billing/pricing",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#PRICING_SWITCH_NOT_ALLOWED"
    },
    {
      "code": "PRICING_SWITCH_DOES_NOT_FIT",
      "status": [
        409
      ],
      "retryable": false,
      "summary": "The account does not fit the new version's plan yet; blockers lists what stands in the way. Nothing was changed.",
      "action": "Act on each blocker, check again with GET /billing/pricing, then send the switch again.",
      "where": "POST /billing/pricing",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#PRICING_SWITCH_DOES_NOT_FIT"
    },
    {
      "code": "PRICING_VERSION_CHANGED",
      "status": [
        409
      ],
      "retryable": false,
      "summary": "The account's plan changed while it was switching; nothing was written.",
      "action": "Read GET /billing/pricing again and switch only if its preview still holds.",
      "where": "POST /billing/pricing",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#PRICING_VERSION_CHANGED"
    },
    {
      "code": "checkout_in_progress",
      "status": [
        409
      ],
      "retryable": true,
      "summary": "A checkout is already open for this account.",
      "action": "Finish or abandon it, then retry.",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#checkout_in_progress"
    },
    {
      "code": "crypto_subscription_active",
      "status": [
        409
      ],
      "retryable": false,
      "summary": "An active crypto subscription must be cancelled before a checkout.",
      "action": "Cancel it first.",
      "where": "POST /subscription/checkout",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#crypto_subscription_active"
    },
    {
      "code": "already_on_plan",
      "status": [
        409
      ],
      "retryable": false,
      "summary": "The account is already on the requested plan.",
      "action": "Nothing to do.",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#already_on_plan"
    },
    {
      "code": "cancel_first",
      "status": [
        409
      ],
      "retryable": false,
      "summary": "The account has a different recurring plan.",
      "action": "Switch with POST /subscription/change-plan, or cancel first (the paid period is kept).",
      "where": "POST /subscription/checkout",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#cancel_first"
    },
    {
      "code": "card_coming_soon",
      "status": [
        503
      ],
      "retryable": false,
      "summary": "Card checkout is not available on this deployment.",
      "action": "Pay with USDC instead (innstance billing topup).",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#card_coming_soon"
    },
    {
      "code": "scheduled_change_active",
      "status": [
        409
      ],
      "retryable": false,
      "summary": "A plan change is already scheduled; scheduled_tier and scheduled_change_at say which and when.",
      "action": "Call it off (POST /subscription/change-plan/cancel) before scheduling another.",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#scheduled_change_active"
    },
    {
      "code": "not_configured",
      "status": [
        503
      ],
      "retryable": false,
      "summary": "Plan changes need the payment gateway, which this deployment lacks.",
      "action": "Do not retry.",
      "where": "subscription plan changes",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#not_configured"
    },
    {
      "code": "no_subscription",
      "status": [
        409
      ],
      "retryable": false,
      "summary": "There is no active recurring subscription to change.",
      "action": "Subscribe with POST /subscription/checkout instead.",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#no_subscription"
    },
    {
      "code": "billing_state_mismatch",
      "status": [
        409
      ],
      "retryable": false,
      "summary": "The platform's record of the plan and the payment gateway's disagree.",
      "action": "Do not retry; contact support to reconcile billing.",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#billing_state_mismatch"
    },
    {
      "code": "change_reconciliation_pending",
      "status": [
        409
      ],
      "retryable": true,
      "summary": "A previous plan change is still being reconciled with the gateway.",
      "action": "Retry once it has landed (a few minutes).",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#change_reconciliation_pending"
    },
    {
      "code": "payment_declined",
      "status": [
        402
      ],
      "retryable": false,
      "summary": "The upgrade charge was declined.",
      "action": "Check the payment method, or cancel and subscribe to the new plan.",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#payment_declined"
    },
    {
      "code": "no_scheduled_change",
      "status": [
        409
      ],
      "retryable": false,
      "summary": "No plan change is scheduled.",
      "action": "Nothing to call off.",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#no_scheduled_change"
    },
    {
      "code": "change_not_cancelable",
      "status": [
        409
      ],
      "retryable": false,
      "summary": "The scheduled change is already being applied.",
      "action": "Pick a plan again once it has landed.",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#change_not_cancelable"
    },
    {
      "code": "payments_paused",
      "status": [
        503
      ],
      "retryable": true,
      "summary": "USDC payments are paused on this server. Nothing was charged.",
      "action": "Retry after the time in Retry-After, or pay by card where the plan offers it.",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#payments_paused"
    },
    {
      "code": "PERFORMANCE_ADDON_LIMIT",
      "status": [
        403
      ],
      "retryable": false,
      "summary": "This change needs more performance machines than the account's add-ons cover, one add-on per machine.",
      "action": "Use shared CPU, or buy the add-on the message names (innstance billing addons).",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#PERFORMANCE_ADDON_LIMIT"
    },
    {
      "code": "unknown_addon",
      "status": [
        400
      ],
      "retryable": false,
      "summary": "There is no add-on with that ID.",
      "action": "Use an ID from the message, or from GET /billing/plans.",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#unknown_addon"
    },
    {
      "code": "addon_not_found",
      "status": [
        404
      ],
      "retryable": false,
      "summary": "The account holds no active add-on in that slot.",
      "action": "List the account's add-ons (innstance billing addons).",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#addon_not_found"
    },
    {
      "code": "addon_not_for_plan",
      "status": [
        403
      ],
      "retryable": false,
      "summary": "This plan already includes performance CPU, so the add-on would add only its RAM.",
      "action": "Do not buy it on this plan; the message says where it is sold.",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#addon_not_for_plan"
    },
    {
      "code": "addon_needs_paid_plan",
      "status": [
        403
      ],
      "retryable": false,
      "summary": "The add-on is for paid plans.",
      "action": "Subscribe to the plan the message names, then buy the add-on.",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#addon_needs_paid_plan"
    },
    {
      "code": "addon_not_on_sale",
      "status": [
        503
      ],
      "retryable": false,
      "summary": "This add-on cannot be bought on this server yet.",
      "action": "Do not retry. GET /billing/plans says what is on sale.",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#addon_not_on_sale"
    },
    {
      "code": "addon_does_not_renew",
      "status": [
        409
      ],
      "retryable": false,
      "summary": "This add-on was a one-time purchase, so there is nothing to cancel.",
      "action": "Nothing to do: it ends on the date in ends_at.",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#addon_does_not_renew"
    },
    {
      "code": "addon_slot_ambiguous",
      "status": [
        409
      ],
      "retryable": false,
      "summary": "Several renewing add-ons match.",
      "action": "Send the request again naming one slot from slots.",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#addon_slot_ambiguous"
    },
    {
      "code": "UPLOAD_IN_PROGRESS",
      "status": [
        409
      ],
      "retryable": true,
      "summary": "Another request is uploading this file right now.",
      "action": "Wait for it, then finalize.",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#UPLOAD_IN_PROGRESS"
    },
    {
      "code": "UPLOAD_ALREADY_RECEIVED",
      "status": [
        409
      ],
      "retryable": false,
      "summary": "This file was already uploaded to the session; each upload URL takes one upload.",
      "action": "Finalize, or start a new session to send different bytes.",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#UPLOAD_ALREADY_RECEIVED"
    },
    {
      "code": "UPLOAD_INCOMPLETE",
      "status": [
        409
      ],
      "retryable": false,
      "summary": "Some of the session's files have not been uploaded.",
      "action": "PUT the files listed in missing to their upload_url, then finalize again.",
      "docs_url": "https://innstance.impossibuild.ai/docs/errors#UPLOAD_INCOMPLETE"
    }
  ],
  "cli_exit_codes": [
    {
      "code": "0",
      "meaning": "Success. `domains check` exits 0 only when the domain is configured and the site answers."
    },
    {
      "code": "1",
      "meaning": "The command failed; the reason is printed to stderr as `Error: \u003cmessage\u003e`. This covers API errors (the message carries the HTTP status, e.g. `API error (409): ...`), invalid flags or arguments (including those `machines wait-for --help` lists under 2), and a `--wait-for-match` or `machines wait-for` timeout. `domains check` also exits 1, after printing its report, when the domain is not ready yet."
    },
    {
      "code": "2",
      "meaning": "`domains check` only: the check was rate-limited (HTTP 429). Run it again after the printed number of seconds."
    },
    {
      "code": "1-255 (passed through)",
      "meaning": "`machines exec` and `agents exec` exit with the remote command's own status, so `if ! innstance machines exec ...` works in scripts; a status outside 1-255 becomes 1. `agents ssh` exits with the ssh client's status: the remote command's, or 255 when ssh itself fails."
    },
    {
      "code": "1-255 (a local program's)",
      "meaning": "A command that runs a program on your computer can exit with that program's status when the program fails. Today that is git: `deploy` with `[secrets]` in its config runs `git ls-files` to check the config is not committed, and a git failure other than \"not tracked\" (for example 128, `detected dubious ownership`) exits with git's status. The message on stderr says which check failed."
    }
  ]
}