Skip to main content
Every error, from either surface, is one JSON envelope:
code is the closed list below and is what to branch on; type is its coarser family; message is for a person; retryable says whether the identical request can succeed later without any change on your side. doc_url links to the heading for the code on this page. A refusal generated at the edge itself — a missing key, a rate limit — has the same shape, with a request_id that carries the gateway’s own hyphenated id.

Your request

invalid_request

400 · retryable: no. The request shape is wrong: a missing field, a value out of range, an unknown field.

invalid_url

400 · retryable: no. A pointer that is not an absolute http(s) URL, or not one of the supported forms.

unauthenticated

401 · retryable: no. Missing, malformed, revoked or expired API key or dashboard session.

payment_required

402 · retryable: no. Available credits cannot cover the quote ceiling.

rate_limited

429 · retryable: yes. Over the plan’s requests per minute; wait for Retry-After.

concurrency_limited

429 · retryable: yes. The plan’s open-job cap is reached; wait for a job to finish.

Quotes, confirms and groups

quote_not_found

404 · retryable: no. The quote does not exist or belongs to another account.

quote_expired

409 · retryable: no. The quote’s expires_at has passed; request a new quote.

quote_mismatch

409 · retryable: no. An entry’s audio changed since the quote; request a new quote.

quote_unverified

409 · retryable: yes. The confirm ran out of time re-checking every entry; retry the same confirm.

expected_total_mismatch

409 · retryable: no. Your expected_total_credits disagrees with the quote’s total_ceiling_credits; nothing was spent.

group_not_found

404 · retryable: no. The job group does not exist or belongs to another account.

idempotency_conflict

409 · retryable: no. The same Idempotency-Key was reused with a different body.

request_in_progress

409 · retryable: yes. A request under this Idempotency-Key is still running; retry with the same key shortly.

nothing_to_quote

422 · retryable: no. Every episode in the selection was excluded from pricing; the exclusions say why.

Jobs and transcripts

job_not_found

404 · retryable: no. The job does not exist or belongs to another account.

job_not_completed

409 · retryable: yes. A derived artifact was requested for a job that has not completed; poll and retry.

processing_failed

500 · retryable: yes. A terminal job failure; the reservation was released.

engine_unavailable

503 · retryable: yes. The pinned transcription route is unavailable; no silent switch to another engine.

Resolving a show or episode

source_not_supported

422 · retryable: no. Direct audio, uploads, Spotify- or YouTube-exclusive shows, or a feed with nothing stable to key a transcript on.

feed_dead

422 · retryable: yes. The feed could not be fetched or parsed within the request’s budget.

episode_not_found

422 · retryable: no. The episode is not in the feed, or not in the catalog when named by id.

show_not_found

422 · retryable: no. The show could not be resolved.

unsafe_source

422 · retryable: no. The fetch target or a redirect failed the outbound-security policy.

unsupported_codec

422 · retryable: no. The audio is in a format the pipeline does not accept.

unsupported_language

422 · retryable: no. The requested language is outside published support.

duration_exceeded

422 · retryable: no. The episode is longer than the published 10-hour cap.

size_exceeded

422 · retryable: no. The audio file is larger than the published 5 GB cap.

content_blocked

451 · retryable: no. A publisher or legal block is active for this content.

discovery_unavailable

503 · retryable: yes. The show directory did not answer.

Your account

account_suspended

409 · retryable: no. The account is on hold and cannot accept this write; reads stay open.

account_closed

409 · retryable: no. The account is closing or closed.

account_not_found

409 · retryable: no. The credential resolves to no account row.

tier_unchanged

409 · retryable: no. Checkout was refused because the account already holds the requested plan.

api_key_not_found

404 · retryable: no. The dashboard key does not exist or belongs to another account.

api_key_limit_reached

409 · retryable: no. The account already holds the maximum number of live keys; revoke one.

credit_lot_not_found

404 · retryable: no. The credit lot does not exist or belongs to another account.

credits_not_refundable

422 · retryable: no. The named lots are consumed, promotional, expired or otherwise ineligible.

Ours

internal_error

500 · retryable: yes. An unclassified failure; retry, and quote the request_id if it persists.