HTTP errors
Every error uses one shape:
Include
request_id (also in the x-request-id header) when you contact support.
unsupported_language: only English is available today; multilingual support is planned.insufficient_balance: your free hours and credits are used up. Add credits in the console (or turn on auto refill) to keep going.usage_limit_reached,model_access_denied,queue_full: account limits. To raise them, talk to sales.- AirCaps Speaker ID-v1 reports problems with a clip in the response itself (it is synchronous):
invalid_audio(not decodable or no audio),audio_too_short(under 0.5 s; enrollments under 1 s),audio_too_long(over 2 minutes),file_too_large(over 100 MB). These requests are not counted toward your usage.
Job errors
A transcript that fails has"status": "error" and an error object. None of these count toward your usage.
Deleting a queued or processing transcript cancels it: the
DELETE response shows error.code canceled, no webhook is sent, and the ID then returns 404.
Retries
- Retry
429,500,502,503and504with exponential backoff (for example 1 s, 2 s, 4 s … up to 60 s), honouringRetry-Afterwhen present. - Send an
Idempotency-Keyheader withPOST /v1/transcriptsso a retried request never creates a second job. A retry with the same key and body returns the original transcript (200), even after it has finished. - Live streaming: on close code 1013, a connection that can’t be opened, one that drops without a close message, or one that goes quiet (no message for 30 seconds and no
pongwithin 10 seconds of aping), open a new session with backoff (for example 1 s, 2 s, 4 s … up to 30 s). See Live streaming. - Polling: call
GET /v1/transcripts/{id}every 3–10 seconds, or use a webhook instead. - For large files, prefer an upload URL: the bytes go straight to storage, so a retry never re-sends them through the API.

