Errors & limits

Errors use HTTP status codes and a JSON body:

{ "error": { "code": "insufficient_credits", "message": "Not enough credits for a session. Top up in the dashboard." } }
StatuscodeMeaning
400invalid_requestA field is missing or out of range. The message names it.
401invalid_api_key, unauthorizedMissing, wrong or revoked key or token
402insufficient_creditsTop up or upgrade
403plan_requiredYour plan doesn't include this feature
403account_suspendedContact support
403feature_unavailableNot enabled yet (for example, cloning)
404voice_not_foundCheck GET /v1/voices
429rate_limitedSlow down and retry with backoff
502synthesis_failedUpstream voice provider error. Retry.

WebSocket close codes

CodeMeaning
4001Session time is up (maxMinutes reached)
HTTP 401 on connectToken invalid, or the expiresIn connect window passed
HTTP 409 on connectThis token already has a live connection

Realtime errors that don't end the session arrive as error events with code and message (for example agent_disabled, voice_forbidden, tts_error).