Errors
Handle the standard error envelope, HTTP statuses, and retryable failures.
Public endpoints return business failures in a standard envelope:
{
"error": {
"code": "NO_TRANSCRIPT",
"message": "Transcript not in your library. Use POST /v1/transcript to extract or save it."
}
}Plan-gated 402 responses may also include actionLabel, actionUrl, and the backwards-compatible upgrade_url alias. A language miss that cannot fall back to speech recognition returns 404 with availableLanguages.
Some framework-level failures are still returned as a flat string body — for example { "error": "unauthorized" }, { "error": "rate_limited" }, or { "error": "invalid_credential" }. A robust client reads error as either an object or a string and only inspects error.code when it is present.
HTTP statuses
| Status | Meaning | Client action |
|---|---|---|
400 | Malformed input | Fix the request before retrying. |
401 | Missing or invalid credential | Supply or rotate the API key. |
402 | Plan or entitlement gate | Surface the returned action URL. |
403 | Valid key with insufficient scope | Use a key with the required scope. |
404 | Resource or requested language not found | Inspect the response details and available languages. |
409 | Resource state conflict | Wait for the required state, then retry. |
422 | Valid JSON with unsupported values or source | Correct the semantic input. |
429 | Rate limit exceeded | Respect Retry-After and back off. |
502 | A dependent capability or upstream discovery call failed | Retry with bounded exponential backoff; do not treat it as "no transcript". |
503 | A required capability is unavailable or unconfigured | Do not treat it as "no transcript"; surface the error. |
POST /v1/transcript also uses 202 for accepted asynchronous speech recognition. It is a successful handoff, not an error.
Common error codes
| Code | Meaning |
|---|---|
INVALID_VIDEO | The supplied URL or platform id is invalid. |
NO_TRANSCRIPT | A usable transcript is not available for the request. |
LANGUAGE_NOT_AVAILABLE | Captions exist in other languages but none matched the request, and speech recognition was not allowed. |
UNAVAILABLE | The source is private, removed, or inaccessible. |
UPLOAD_INVALID | A multipart upload failed declaration, media-type, or integrity validation. |
IDEMPOTENCY_CONFLICT | The same Idempotency-Key was reused with a different request. |
IP_BLOCKED | The source platform temporarily blocked extraction infrastructure. |
PO_TOKEN_REQUIRED | The source platform requires additional login state. |
VIDEO_TOO_LONG | The media exceeds the current plan's duration limit. |
RATE_LIMITED | The caller exceeded its current request window. |
UPGRADE_REQUIRED | The account is not eligible to use the requested API capability. |
INSUFFICIENT_CREDITS | The account cannot start the gated operation. |
TRANSCRIPT_QUOTA_EXCEEDED | The transcript allowance for the current period is exhausted. |
ASR_QUOTA_EXCEEDED | The ASR minute allowance for the current period is exhausted. |
ASR_CONCURRENCY_LIMIT | The plan's concurrency limit is fully in use; ASR minutes are not exhausted. Retry once an in-flight task finishes. |
BATCH_LIMIT_EXCEEDED | The batch exceeds the plan's per-job item limit. |
Retry guidance
Retry 429 and transient 503 responses only. Honor Retry-After when supplied, add jitter, cap the delay, and set a maximum attempt count. Do not automatically retry authentication, scope, validation, or plan failures without changing the request or credential.