Skip to content

Errors

Errors use a consistent envelope with a machine-readable code:

{
"error": {
"code": "not_found",
"message": "No public video found at that URL. It may be private or deleted.",
"status": 404
},
"request_id": "req_01JZX4M8Q2TE9W"
}

Always log request_id — quote it in support requests and we can trace the exact call.

Error codes

StatusCodeWhen
400invalid_requestMissing/malformed url, handle, or query
401unauthorized / invalid_keyBad or missing API key
402insufficient_creditsCredit balance too low for the call
403forbiddenKey lacks access to the endpoint
404not_foundContent is private, deleted, or the URL resolves to nothing
409job_conflictDuplicate async job submission
422unprocessableURL parsed but the content type is unsupported (e.g. transcript of an image post)
429rate_limitedPlan rpm exceeded — honor Retry-After
5xxupstream_error / internalTransient fetch failure — safe to retry

Retry guidance

import httpx, time
for attempt in range(3):
r = httpx.get(url, headers=headers, timeout=120)
if r.status_code == 429:
time.sleep(int(r.headers.get("Retry-After", "2")))
continue
if r.status_code >= 500:
time.sleep(2 ** attempt)
continue
break

Failed calls that return an error are not charged — credits are only deducted when data comes back.

Next: Rate limits · Output formats