Skip to main content

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, 503 and 504 with exponential backoff (for example 1 s, 2 s, 4 s … up to 60 s), honouring Retry-After when present.
  • Send an Idempotency-Key header with POST /v1/transcripts so 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 pong within 10 seconds of a ping), 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.