Reference

Error codes & outcomes

Request-level failures return a canonical error object with a machine-readable code. Per-video results inside a batch carry an outcome instead, and only successful ones are billed.

Fix the request
400 · 401 · 402 · 404 · 409 · 422
Change the input, credentials, credits, or request state before sending it again.
Retry with backoff
429 · 5xx
Retry transient failures. For 429, wait for the Retry-After value first.
Inspect each item
Batch HTTP 200
A successful batch can contain mixed outcomes. Only items marked ok are billed.

Request errors

Every failure carries error.code (a stable string) and error.number (a stable integer whose thousands digit is the family: 1 request, 2 account, 3 input, 4 content, 5 transient, 9 ours). Branch on either; 5xxx means retry with backoff. Select a code for its response shape and recovery guidance. A number works as a URL too: /docs/errors/4103.

code#HTTPMeaning
invalid_request1001400The body failed validation. error.issues names each field and constraint.
invalid_cursor1002400The pagination cursor is malformed or expired. Restart the listing without a cursor.
unauthorized1101401Missing or invalid API key.
idempotency_conflict1201409Idempotency-Key reused with a different body, or a request with that key is still in flight.
not_found1301404No such resource: an unknown job id (or a job that belongs to someone else), or a channel or playlist that does not exist or is not public.
insufficient_credits2001402Not enough credits for the request. Nothing was charged; retry once credits are available.
batch_too_large2002400The batch exceeds your plan's per-request cap. error.details carries the cap and what was sent.
rate_limited2101429Your account or key has reached a request or work-capacity limit. Wait Retry-After seconds, then continue.
unsupported_platform3001422The input is not on a platform we serve. Transcripts cover YouTube, TikTok, Instagram and direct media files.
endpoint_platform_mismatch3002422The platform is supported, but not by this endpoint: playlist listing covers YouTube and TikTok only, so an Instagram profile URL sent to /transcripts/playlist lands here. error.retry_with names the endpoint to use (the channel endpoint lists profiles).
audio_ineligible3004422Audio transcription cannot run on this input, so mode: "audio" (or ai_fallback) has nothing to work on.
upstream_unavailable5101502The transcript service could not be reached. Safe to retry.
internal_error9001500Unexpected server error. Retry with backoff; if it persists, send support the request_id.

Per-video outcomes

Batch requests return one outcome per video, even when the overall request succeeds.

outcomeChargedMeaning
ok1 creditTranscript (or video list) returned successfully.
no_transcriptFreeThe video exists but has no available transcript/captions.
processingFree on this callNo caption track existed, so audio transcription started (batch default). The entry carries job_id and poll_url; billed on delivery at the audio rate.
errorFreeThe fetch failed. Transient failures are worth retrying with backoff.
A 200 can still carry a non-success outcome. Only ok items are billed. Inspect every item instead of treating the batch status as the result.

Transcript failure reasons

A failed fetch reports which of these as error.code. A 422 is permanent for that input; a 503 is transient unless noted. When AI transcription of the audio would still work, the error carries retry_with.

code#HTTPWhat it meansRetry?
live_stream4101422The video is a live stream: broadcasting now, scheduled, or ended without a published recording. Live streams are not supported; retrying will not help until YouTube publishes a recording (24/7 streams never get one).No
was_live4102422The video was a live broadcast and has no caption track.No
no_audio_stream4106422The downloaded media carried no audio stream, so it could not be transcribed. Distinct from no_speech, which means audio exists but carries no speech. PERMANENT on purpose: retrying re-runs the same conversion on the same bytes and fails identically.No
audio_too_long3006422The media is longer than the AI-transcription length limit, so no audio was downloaded and nothing was charged. This is about the media, never the account: a balance that cannot cover the media answers insufficient_credits instead. Distinct from no_speech, which means audio WAS transcribed and carried no speech. Retrying the same media changes nothing; the response's message names the limit.No
no_speech4105422No detectable speech (e.g. music/ambient); nothing to transcribe.No
captions_disabled4104422Captions are disabled by the uploader.No
no_captions4103422No caption track (manual or auto-generated) is available.No
age_restricted4004422The video is age-restricted and not accessible without sign-in.No
members_only4003422The video is members-only / requires a channel membership.No
private4001422The video is private.No
unavailable4002422The video is unavailable (deleted, removed, terminated, or region-blocked).No
region_blocked4005422The video is geo-restricted for the fetch region.No
timeout5002503Upstream fetch timed out. Transient, retry.Yes, with backoff
upstream_error5001503The upstream fetch failed with a server-side error. Transient, retry.Yes, with backoff
proxy_unavailable5004503The upstream egress proxy refused the tunnel (billing, credentials, or exhausted quota). NOT retryable - retrying cannot clear it, and every platform is affected until it is resolved.No, wait for us
connection5003503Could not connect to the upstream service. Transient, retry.Yes, with backoff
parse_error5005503Upstream returned a response that couldn't be parsed.Yes, with backoff
invalid_input3005422The provided video/URL/ID was invalid.No
drm_protected3007422The source is DRM-protected and cannot be downloaded. Spotify and Apple Podcasts pages fall here; podcast links are not supported.No
unknown9002503The fetch failed for an unspecified reason.Yes, with backoff

HTTP status guide

Use the status to choose the broad response, then the error or reason code for the exact cause.

StatusNameMeaning
400Bad RequestInvalid body, bad value, limit out of range, stale cursor, or a batch over your plan's cap. Read error.code and error.issues / error.details.
401UnauthorizedMissing, malformed, revoked, or unknown API key.
402Payment RequiredNot enough credits to complete the request. Top up or upgrade your plan.
404Not FoundThe referenced thing does not exist: a transcription job (or one belonging to another account), or a channel or playlist that a listing endpoint could not find (error.code not_found).
409ConflictIdempotency-Key reused with a different body, or a request with that key is still in flight.
422Unprocessable EntityPermanent failure for this input (unsupported platform, no captions, private, live, DRM-protected). error.code says which. The same input will fail the same way, so do not retry unchanged.
429Too Many RequestsRate limited: always your own key's per-plan limit. Honor the Retry-After header. (An upstream platform failing or blocking a fetch answers 503, never 429.)
500Internal Server ErrorUnexpected server error. Retry with backoff; if it persists, send support the request_id.
502Bad GatewayThe transcript service was unreachable. Safe to retry with backoff.
503Service UnavailableTransient failure. Safe to retry with backoff; error.code says what failed.