Skip to content

Errors

Every error code with its HTTP status, which ones the read and write surfaces can return, and the dashboard-only codes that never appear on v1.

Requires API access to be enabled for your workspace

Errors use the standard envelope — see Response envelope. Branch on error.code, never on the message text. Every error body also carries a requestId (returned as the X-Request-Id header too) — a safe, non-secret correlation id you can quote to support to find the exact failed request.

Codes and statuses

What you can hit on v1 today

v1 is a full read-write surface, so most of the table is live:

  • UNAUTHORIZED — key problems, including a key you disabled yourself.
  • FORBIDDEN — the layered access gate, a missing scope (Missing required scope: <scope>. — see Scopes), or an owner-protected target (for example, changing the workspace owner's member row).
  • NOT_FOUND — the resource does not exist in your workspace; another workspace's ids read identically to unknown ones.
  • VALIDATION_ERROR — a rejected body or parameter on any write.
  • USAGE_LIMIT_REACHED — a plan cap on creation endpoints (chatbots, sources, seats, reseller client seats) or an out-of-credit state.
  • FILE_TOO_LARGE / UNSUPPORTED_FILE_TYPE — the knowledge file upload.
  • RATE_LIMITED — the two 120-per-minute limits, or an endpoint's own stricter one (exports, crawl, topics, domain verification).
  • INTERNAL_ERROR — rare, and worth reporting.

The chatbot and domain codes (CHATBOT_INACTIVE, DOMAIN_NOT_ALLOWED, AI_PROVIDER_ERROR) belong to the widget's public endpoints and are listed here because one client library usually handles all of them.

Dashboard-session codes

These five exist in the same catalogue and never appear on /api/v1:

They describe the state of a signed-in user session or the dashboard login flow, and API keys have neither. In particular, when a workspace owner is suspended or deleted, v1 does not return ACCOUNT_SUSPENDED — it returns the ordinary access-gate 403 with "API access is not enabled for this workspace.", identical to an entitlement gap, so a key holder cannot detect a moderation action.

Handling them

request.mjs

Retry RATE_LIMITED with backoff and INTERNAL_ERROR sparingly. Do not retry UNAUTHORIZED or FORBIDDEN — nothing about them changes on a second attempt.

Where to go next

Last updated