Errors

HTTP status codes, WebSocket error events, and error payload formats.

Error response formats

OpenAI format (/v1/audio/* endpoints)

Used for realtime WebSocket, offline HTTP, and session-token endpoints:

{
  "error": {
    "message": "API key is missing.",
    "type": "invalid_request_error",
    "code": "missing_api_key"
  }
}

type is rate_limit_error for 429 responses, otherwise invalid_request_error.

Envelope format (Key management API)

{
  "ok": false,
  "error": {
    "code": "admin_unauthorized",
    "message": "Admin token required.",
    "retryable": false
  }
}

retryable is true for 429 and ≥500 responses.

HTTP error codes

CodeHTTPCauseClient action
missing_api_key401No Authorization header / query tokenAdd API key
invalid_api_key401Key format invalid or unknownCheck key
revoked_api_key401Key has been revokedContact provider
expired_api_key401Key has expiredRe-provision
auth_unavailable503Key store unavailableRetry later
invalid_session_token401Session token invalid or expiredObtain new token
token_issuer_unavailable503Token issuer not configuredRetry later
websocket_required426Non-WS upgrade requestUse WebSocket client
gateway_disabled503Realtime gateway disabledContact provider
upstream_unavailable503Upstream unavailable (circuit breaker)Back off and retry
connection_rate_limited429Connection rate exceededHonor Retry-After
concurrent_connection_limit429Max concurrent connections exceededWait for release
request_rate_limited429Request rate exceededHonor Retry-After
audio_quota_exhausted429Audio window budget exhaustedRetry later
audio_too_long413Single request audio exceeds plan limitReduce audio duration
internal_error500Uncaught exceptionContact provider
bad_request400Invalid request bodyFix and retry

WebSocket error events

Within an active WebSocket connection, the server may send error events:

{ "type": "error", "code": "...", "message": "...", "request_id": "..." }

WebSocket error codes

CodeDescriptionClose code
audio_frame_too_largeAudio frame exceeds 1 MiB1009
concurrent_utterance_limitConcurrent utterance limit exceeded
upstream_backpressureUpstream backpressure1013
client_backpressureClient backpressure
upstream_unavailableUpstream unavailable1013
idle_timeoutIdle timeout reached4408
session_duration_limitSession duration exceeded1008
session_audio_limitSession audio budget exceeded1008
audio_quota_exhaustedAudio quota exhausted1008
bad_jsonJSON parse failure
bad_messageInvalid message type
invalid_audioInvalid audio data

Key management API errors

CodeHTTPDescription
admin_unauthorized401Missing admin token
invalid_plan400Unknown plan
invalid_expiry400Invalid or past expiry date
store_unavailable500R2 storage unavailable
key_not_found404Key ID not found
not_found404Unknown management route

Troubleshooting

ProblemCheck
401 missing_api_keyEnsure request includes Authorization: Bearer sk-...
401 invalid_api_keyVerify key starts with sk-, length ≥ 16
429 *_rate_limitedHonor Retry-After header, exponential backoff
503 upstream_unavailableCheck /readyz for upstream status
WS idle_timeoutKeep sending audio frames, or close explicitly
WS audio_frame_too_largeReduce frame size to ≤ 1 MiB