Skip to content

Errors

Every error has a stable code. Build against the code, not the message.

The error envelope

When /v1 can't handle a request, it returns a 4xx or 500 status with this body:

JSON
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded",
    "request_id": "REQUEST_ID",
    "doc_url": "DOC_URL"
  }
}
FieldMeaning
codeA stable code from the table below.
messageA sentence for people to read. It can change.
request_idThis request's ID.
doc_urlA link to this code's row in the table below.

When a run fails

A run that starts and then fails isn't an envelope. Its code reaches you in one of these places:

WhereField
A 200 from POST /v1/extracterror.code, with ok: false
A failed job from GET /v1/extract/:jobIderror_code
An item from GET /v1/batch/:batchIderror_code
A job.failed webhookdata.error.code

So check ok on a 200, and status on a job. See Extraction for the full error object, including error.retryable.

Every code

A row that gives a status arrives in the envelope. A row with no status reaches you as a failed run, as above. A row marked Dashboard only comes from the dashboard's own pages and never from /v1.

CodeWhat it meansWhat to do
invalid_urlThe url isn't a YouTube video URL or video ID, the formats list is empty, or lang is malformed.Fix the request. Sending it unchanged returns the same code.
video_not_foundThe video doesn't exist, or it's no longer on YouTube.Check the video ID.
video_access_restrictedThe video is private, age-restricted, limited by region or for members only.Use a video that's publicly available.
unsupported_mediaThe video is a live stream or a broadcast still in progress.Try again after the broadcast ends, or use a different video.
no_captionsClypso found no captions for this video, and it doesn't transcribe audio.Use a video with captions. error.retryable can be true here, but don't retry in a loop.
provider_unavailableClypso couldn't fetch the transcript, because the services it gets captions from failed or timed out.Try again in a few minutes.
llm_output_truncatedThe generated result was cut off before it finished, so none of it is returned.Don't retry in a loop, since error.retryable is false. You can try the video again later.
llm_output_invalidThe generated result failed validation, so none of it is returned.Don't retry in a loop, since error.retryable is false. You can try the video again later.
spend_ceiling_reachedDaily capacity, shared by everyone using the service, has been reached. New extractions pause until 00:00 UTC.Try again after 00:00 UTC. Cached results keep working. See Usage and quota.
internal_errorSomething went wrong on Clypso's side. The message is a fixed sentence with no details. It can also arrive as a 500, and a job whose attempts ran out reports it.Try again. If it keeps happening, check Status.
video_too_longThe video is longer than the maximum length.Use a shorter video.
quota_exceededYour account has used its monthly limit. A batch that needs more videos than you have left gets a 429.Wait for the monthly reset. Cached results keep working.
invalid_api_keyA 401: the API key is missing, malformed, unknown or revoked.Send a valid key as a Bearer token. Manage your keys at API Keys.
rate_limitedA 429: this key went over its request limit, or a batch would put too much queued work on your account.Wait the number of seconds in Retry-After. See Rate limits.
invalid_requestA 400: the body is malformed JSON, has an unknown field, or a value failed validation.Fix the request. Sending it unchanged returns the same code.
idempotency_key_reusedA 409: this Idempotency-Key was already used with a different body.Use a new key for a different request.
request_in_progressA 409: the first request with this Idempotency-Key is still running.Wait, then send it again with the same key.
job_not_foundA 404: no job with this ID exists on your account. Another account's job looks the same.Check the job_id, and that the key is from the account that created the job.
transcript_not_foundA 404: the token is valid, but no transcript text is stored for this ID.Use the result without its transcript. The rest of it isn't affected.
invalid_signed_urlA 401: the transcript link's token is expired, altered or for another transcript, or your key is from another account.Get a new link.
batch_too_largeA 400: the batch has more URLs than your limit, so all of it is rejected.Split it into smaller batches.
invalid_batch_itemA 400: at least one URL isn't a YouTube video, so all of the batch is rejected. The message lists the indexes.Fix or remove those URLs, then send the batch again.
batch_not_foundA 404: no batch with this ID exists on your account. Another account's batch looks the same.Check the batch_id, and that the key is from the account that created the batch.
watch_limit_reachedDashboard only: adding this channel would go over your watch list limit.Remove a channel first.
webhook_limit_reachedDashboard only: adding this endpoint would go over your webhook endpoint limit.Delete an endpoint first.
channel_not_foundDashboard only: what you entered doesn't lead to a channel.Check the channel's handle or URL.
invalid_webhook_urlDashboard only: the endpoint URL is malformed, isn't HTTPS or points to a private address.Use a publicly reachable HTTPS URL. See Webhooks.
feature_not_configuredDashboard only: this feature isn't available right now.Try again later.
not_foundDashboard only: the item doesn't exist, or it belongs to another account.Reload the page to see what's still there.