{
  "version": "2026-09-07",
  "source": "forum-contracts contracts/error-dictionary.json (the closed dictionary; law: Platform API §1)",
  "errors": [
    {
      "code": "invalid_key",
      "status": 401,
      "reaction": "Don't retry; check the account at the address in action_url. On the data plane this is the one refusal for a key a data server cannot serve — a spent balance is the usual reason — and a human clears it there."
    },
    {
      "code": "key_expired",
      "status": 401,
      "reaction": "Rotate the key or escalate to the owner. The platform host only: a data call answers invalid_key."
    },
    {
      "code": "key_revoked",
      "status": 401,
      "reaction": "Stop and escalate as a possible incident. The platform host only: a data call answers invalid_key."
    },
    {
      "code": "key_blocked",
      "status": 401,
      "next_action": "contact_support",
      "reaction": "Stop; the owner contacts support with the request id, at the address in action_url. The platform host only: a data call answers invalid_key."
    },
    {
      "code": "session_expired",
      "status": 401,
      "reaction": "Log in again from the console — a mailed link. Sessions are browser credentials; agents never hold one."
    },
    {
      "code": "scope_denied",
      "status": 403,
      "next_action": "request_scope",
      "reaction": "Don't retry — this surface is the platform operator's; no customer key is ever granted it."
    },
    {
      "code": "verification_required",
      "status": 403,
      "next_action": "verify_account",
      "reaction": "Forward the verification checkpoint to the owner."
    },
    {
      "code": "account_suspended",
      "status": 403,
      "next_action": "contact_support",
      "reaction": "Stop entirely; the owner contacts support. The platform host only: a data call answers invalid_key."
    },
    {
      "code": "wrong_credential",
      "status": 403,
      "reaction": "Present the other string: the api host takes the secret, the data plane takes a data key. Never retry with the same string, never sign up again."
    },
    {
      "code": "payment_required",
      "status": 402,
      "next_action": "top_up",
      "reaction": "Reserved since 2026-09-07 — no surface raises it. An empty balance answers invalid_key on the data plane, with the account page in action_url."
    },
    {
      "code": "budget_cap_reached",
      "status": 402,
      "reaction": "Reserved — nothing raises this today; the platform has no spending caps."
    },
    {
      "code": "rate_limited",
      "status": 429,
      "reaction": "Wait for the supplied retry interval, then resume."
    },
    {
      "code": "email_exists",
      "status": 409,
      "next_action": "login_to_link",
      "reaction": "Switch to account linking; do not retry signup."
    },
    {
      "code": "invalid_params",
      "status": 400,
      "reaction": "Correct the request; do not retry unchanged."
    },
    {
      "code": "not_found",
      "status": 404,
      "next_action": "refetch_root",
      "reaction": "Re-read discovery and products; do not retry unchanged."
    },
    {
      "code": "upstream_error",
      "status": 502,
      "reaction": "Retry with backoff; the call was not charged."
    },
    {
      "code": "internal_error",
      "status": 500,
      "reaction": "Back off and retain the request id for support."
    }
  ]
}