Skip to main content

Documentation Index

Fetch the complete documentation index at: https://septemberai.mintlify.app/llms.txt

Use this file to discover all available pages before exploring further.

Non-2xx responses follow this shape:
{
  "error": {
    "code": "<stable_code>",
    "message": "<human description>"
  }
}
Use code for routing logic; show message (or your translation of the code) to your users.

HTTP status taxonomy

StatusMeaning
400Bad request — malformed JSON, missing field, invalid value.
401Unauthenticated — X-Platform-Key or X-Admin-Key missing or invalid.
403Authenticated but the action is denied (policy, missing scope).
404Resource doesn’t exist.
409Conflict — resource is in a state that prevents the action.
429Quota exceeded or rate-limited. Retry after some time.
500Internal server error. Report it.
502Backend (Docker, engine) returned an unrecoverable error.
503Orchestrator starting up or out of capacity.
504Backend (engine boot, health probe) timed out.

Error codes

Auth

CodeStatusCauseAction
INVALID_PLATFORM_KEY401Header missing or unknown.Fix the key.
INVALID_ADMIN_KEY401Admin call without (or wrong) X-Admin-Key.Fix the key.

Product / engine state

CodeStatusCauseAction
PRODUCT_NOT_FOUND404Product slug or ID doesn’t exist.Re-register the product.
ENGINE_NOT_FOUND404No engine for this user_id.Provision one (or pass auto_provision=true).
ENGINE_ALREADY_EXISTS409POST /engines/provision against an existing engine.Use /admit if you want idempotent behavior.
ENGINE_NOT_RUNNING409POST /stop or /rotate-key against an engine that isn’t running.Start it first or skip.
ENGINE_ALREADY_RUNNING409POST /start against a running engine.No-op; ignore.

Policy

CodeStatusCauseAction
QUOTA_EXCEEDED429Product at max_engines limit.Destroy unused engines or raise the policy limit.
RATE_LIMITED429Per-product RPM exceeded.Back off; respect Retry-After if present.
POLICY_DENIED403Action not permitted by the product’s policy.Check the policy; update if needed.

Resource exhaustion

CodeStatusCauseAction
PORT_EXHAUSTION503No free port in [ORCH_PORT_MIN, ORCH_PORT_MAX].Widen the port range or destroy unused engines.

Backend

CodeStatusCauseAction
BACKEND_ERROR502Docker / subprocess returned an error.Check the orchestrator logs; usually transient.
BOOT_TIMEOUT504Engine didn’t reach /health: ok within ORCH_BOOT_TIMEOUT_S.Check the engine’s logs. The engine’s startup is misbehaving.

Internal

CodeStatusCauseAction
INTERNAL_ERROR500Unexpected server bug.File an issue with the request and timestamp.

Retry guidance

CodeRetry?How
RATE_LIMITEDYesExponential backoff. Honor Retry-After.
QUOTA_EXCEEDEDNoHard limit; fix the policy or destroy engines.
BACKEND_ERROROnceCould be a transient Docker hiccup. After one failed retry, surface to the user.
BOOT_TIMEOUTNoThe engine itself is broken. Investigate.
503 (orchestrator starting)YesBack off 1–5s.
INVALID_PLATFORM_KEYNoFix the key.
ENGINE_NOT_FOUNDNo (in lookup)Provision instead.

Error envelope examples

{
  "error": {
    "code": "QUOTA_EXCEEDED",
    "message": "Product 'demo' at max_engines limit (1000)."
  }
}
{
  "error": {
    "code": "BOOT_TIMEOUT",
    "message": "Engine 5c2f... did not become healthy within 60s."
  }
}
The error.message is for humans; don’t depend on its exact text.

See also

  • AuthINVALID_* codes.
  • Policy — quota and rate-limit codes.
  • Lifecycle — engine state codes.