Skip to main content
Every error from the /v1 surface is an OpenAI-compatible JSON envelope:
  • message — human-readable; user-facing messages are written in Korean. Don’t parse it — branch on code.
  • type — the error family (invalid_request_error, rate_limit_error, quota_exceeded, access_denied, overloaded_error, server_error, service_unavailable).
  • code — the stable machine-readable identifier. Branch on this.
  • resets_at — extra field on session_exhausted, weekly_exhausted, and abuse_cooldown (ISO 8601).
Upstream failures use HTTP 500, never 502, and ModelOverloadedError uses the non-standard 529 — make sure your client treats 529 as retryable.

Codes by status

400 — fix the request

401 / 403 — fix the key or account

See Authentication for the full table (invalid_api_key, account_unlinked, legacy_account_upgrade_required, guest_expired, email_required, geo_restricted).

429 — back off

5xx / 529 — not your fault

Streaming errors

If a stream fails after the first bytes were sent, the connection ends without a JSON envelope (the HTTP status was already 200). Treat an unexpected stream end without data: [DONE] as a failed request. Errors detected before streaming starts are returned as normal JSON envelopes.

Correlation IDs

Two response headers identify a request, on success and failure alike:
  • x-sq1-request-id — correlation ID, present on every response. Quote this when reporting a problem.
  • x-request-id — the completed request’s log ID (chat/embeddings only).