DocsErrors

Errors

The error envelope, every error code, and which ones to retry.

A request error means the API refused the call. A job failure means the API accepted the transcription, but it later ended with status set to failed.

The error envelope

Every /v1 request error has the same shape:

{
  "error": {
    "code": "insufficient_minutes",
    "message": "Not enough minutes",
    "retryable": false,
    "action_url": "https://transcript1.com/dashboard/billing",
    "minutes_needed": 20,
    "minutes_remaining": 3
  }
}

Handle errors by code. Display message to the user; its wording may change. When retryable is true, the same request may succeed later.

Some errors add fields next to retryable:

FieldOn which errorsMeaning
action_urlinsufficient_minutes, no_active_plan, topup_needs_userWhere to buy a plan or a top-up.
minutes_needed, minutes_remaininginsufficient_minutesMinutes the request needs (null when it is not known yet) and minutes you have.
reason, packstopup_needs_userWhy the card was not charged, and the packs that were requested.
supported_platformsunsupported_platformThe platforms you can send: ["youtube", "x", "tiktok", "instagram", "facebook", "bluesky", "twitch", "dailymotion", "pinterest", "linkedin", "snapchat"].
missing_chunksupload_incompleteIndexes of the chunks that did not arrive.
max_bytesmedia_too_largeThe largest file size allowed for you, in bytes.
paramsinvalid_requestFor body and query validation errors, an object mapping each field to what is wrong with it.

Request errors

HTTP statuscodeRetryableWhen
400, 422invalid_requestNoA parameter or body field is missing or invalid, for example diarize together with source: "captions", or reuse_recent with webhook_url. Also returned when the request body is not valid JSON.
422invalid_urlNoUse a YouTube, X, TikTok, Instagram, Facebook or Bluesky link, or another platform listed in Sources and options. Also returned when platform does not match the link.
422unsupported_platformNoplatform is not supported.
422unsupported_mediaNoThe uploaded file does not have a supported extension.
401unauthorizedNoThe credential is missing, invalid, expired or revoked, or the upload token is invalid or expired.
403insufficient_scopeNoAn OAuth token lacks transcriptions:read or transcriptions:write.
403email_not_verifiedNoVerify your email address before creating transcriptions or live sessions.
402insufficient_minutesNoYour usable minutes are 0 or fewer than the transcription needs, or fewer than one started minute of a live session. When auto top-up is on, transcript1 tries to top up first. Buy minutes at action_url, or let an agent buy them with POST /v1/topups or the MCP tool top_up.
402no_active_planNoYou tried to buy a top-up without an active paid plan. POST /v1/topups and the dashboard's billing endpoints return this, not the transcription endpoints.
402topup_needs_userOnly for pending and in_progressPOST /v1/topups did not charge the card. reason says why: not_allowed (the credential cannot buy top-ups, or its user is not a team admin), cap_reached (the monthly agent limit has no room), card_declined, authentication_required or no_card. The user can buy the packs at action_url. For pending (the payment is not confirmed yet) and in_progress (another top-up is running), the charge may still complete: retry later with the same Idempotency-Key instead of sending the user to buy.
404not_foundNoThe transcription does not exist or belongs to another team.
409upload_incompleteNoSome chunks are missing. Send them and complete again.
409invalid_stateNoThe transcription is not awaiting an upload, so chunks can no longer be sent or completed.
409session_endedNoA live session has ended, so POST /v1/live/sessions/:id/token cannot issue a token. Also sent as a WebSocket error event.
422unsupported_languageNoThe language of a live session is not supported.
422unsupported_translationNoThe translate_to language of a live session is not supported, or live translation is not available.
409idempotency_conflictNoThe Idempotency-Key was already used with different parameters.
413media_too_largeNoThe file is larger than your limit. See Uploads.
413invalid_requestNoA JSON body over 1 MB. Files use media_too_large instead.
429rate_limitedYesToo many requests per minute. Wait for Retry-After seconds.
429too_many_active_jobsYesToo many transcriptions running, or too many open uploads. Wait for Retry-After seconds.
429too_many_live_sessionsYesYour plan's simultaneous live sessions are in use. Wait for Retry-After seconds (30).
500internal_errorYesSomething went wrong on our side. Retry shortly.
503service_unavailableYestranscript1 is temporarily unavailable. Retry shortly.
503live_capacityYesAll live capacity is in use. Wait for Retry-After seconds (30) and create the session again.
503live_unavailableNoLive transcription is not available right now.

Requests from a browser that use a login cookie instead of a bearer credential are also checked for their origin. A request from another site returns 403 forbidden_origin. API calls with an Authorization header are not affected.

Every 429 response includes a Retry-After header with the number of seconds to wait. See Billing and limits for the limits themselves.

Retry a request

  • Retry only when retryable is true: rate_limited, too_many_active_jobs, too_many_live_sessions, live_capacity, internal_error, service_unavailable, and topup_needs_user with reason pending or in_progress. Honor Retry-After when it is present and back off between attempts otherwise.
  • When retrying POST /v1/transcriptions or POST /v1/topups, send the same Idempotency-Key header to avoid a second charge if the original request succeeded.
  • Fix the request before sending it again for every other code.

Live transcription

POST /v1/live/sessions and the other live endpoints use the same envelope. invalid_request, unsupported_language, insufficient_minutes and email_not_verified apply to them as well, together with the live codes in the table above. Creating a session is not idempotent, so a retry after too_many_live_sessions or live_capacity creates a new session.

After the session exists, problems arrive on the WebSocket as error events and close codes, not as HTTP errors. See Live transcription for every event.

Close codeMeaning
1000Normal close, after session.ended.
1011Unexpected server error. Resume with a new token.
1012Server restart, after reconnect. Resume with a new token.
4001Invalid, expired or already used token.
4004Session not found or already ended.
4008Protocol violation: an odd-length or oversized audio frame.
4010Replaced by a newer connection to the same session.

A live session that ends for a reason such as balance_exhausted or idle_timeout is not an error: it sends session.ended with an end reason and is saved. See End reasons.

Job failures

When a transcription ends with status set to failed, the object has error: { "code", "message" }. Failures can happen after the request returned, so read error when you poll or in the transcription.failed webhook. A failed translation sends a transcription.translation.failed webhook and never fails the transcript.

error.codeMeaningTry again?
media_unavailableThe video does not exist or is no longer available.No. Check the URL.
media_privateThe video is private.No. Use a public post or a public or unlisted YouTube video.
login_requiredThe platform requires a logged-in account.No. Permanent failure; not retried.
no_audioThe video has no sound track.No. Permanent failure; not retried.
age_restrictedThe video is age-restricted.No. Upload the file instead.
live_streamThe video is a live stream, or a stream that has not started yet.After the stream has ended.
no_captionssource was captions and the video has no usable caption track.Use source: "auto" or "stt".
media_too_longSpeech-to-text accepts up to 5 hours of media.No. Split the media.
unsupported_mediaThe file could not be read or has no audio track.No. Send a supported file.
no_speechNo speech was detected.No.
unsupported_languageThe language of this media is not supported.No. Set language to a supported code or "auto".
insufficient_minutesYour minutes ran out before the transcription could be charged, and auto top-up, if on, could not add more.After you top up.
fetch_failedFetching the media failed after several attempts.Yes, later.
transcription_failedSpeech-to-text failed after several attempts.Yes, later.

Failed and canceled transcriptions are never charged. Minutes that were taken for a transcription are returned when it fails or is canceled.

Updated November 5, 2026