Errors

Both surfaces emit envelope-shaped JSON; the OpenAI surface uses OpenAI's shape, the Anthropic surface uses Anthropic's.

OpenAI surface

Envelope:

{ "error": { "message": "...", "type": "...", "code": "..." } }
HTTPtypecodeMeaning
400invalid_request_errorinvalid_requestBody shape wrong / missing required fields
400invalid_request_errormissing_model`model` field absent + no X-QGRE-Model header
401permission_errormissing_bearerNo / malformed Authorization header
401permission_errorinvalid_api_keyBearer didn't match an active key
403permission_errormodel_forbiddenKey not allowed to call this model
404invalid_request_errormodel_not_foundmodel_id not in the configured upstream pool
413invalid_request_errorpayload_too_largeBody > max_body_mb (default 8 MB)
429rate_limit_errorrate_limit_exceededPer-key bucket drained (Retry-After: 1)
429rate_limit_errorip_rate_limit_exceededIP bucket drained (anonymous-flooder defense)
502upstream_errorbad_gatewayUpstream forward failed mid-request
502upstream_errorupstream_stream_failedStream broke mid-flight (delivered as SSE error event then [DONE])
503service_unavailableupstream_unavailableAll replicas for the model are unhealthy
503service_unavailableglobal_concurrency_exhaustedGlobal in-flight cap reached; retry shortly
503service_unavailableno_priced_upstreammodel: "auto" + cost-tier but no priced upstream is healthy
408service_unavailablerequest_timeoutPer-route timeout exceeded (`abuse.short_request_timeout_secs`)

Anthropic surface

Envelope:

{ "type": "error", "error": { "type": "...", "message": "..." } }
HTTPtypeMeaning
400invalid_request_errorMalformed Messages JSON OR empty messages[]
401permission_errorNo bearer / invalid bearer
403permission_errorKey not allowed for this model
404not_found_errorUnknown model
503overloaded_errorNo healthy upstream replica