| 400 | invalid_json | The body is not valid JSON. | Send a JSON object. |
| 400 | unsupported_content_type | A body was sent with a Content-Type other than JSON. | Set Content-Type: application/json. |
| 400 | unknown_parameter | A body field — or a query parameter on a list or date-range endpoint — this endpoint does not accept. param names it. | Remove it. encryption, resolutions and keep_original are decided by your plan and settings. |
| 400 | missing_parameter | A required field is absent. param names it. | Add the field. |
| 400 | invalid_parameter | A value has the wrong type, format or range — for example limit outside 1–100, from after to, or end not after start. | Read message; it says exactly what is wrong. |
| 400 | no_fields | A PATCH with nothing to change. | Send at least one field. |
| 400 | invalid_cursor | starting_after is not a cursor this API issued. | Pass next_cursor back unchanged. |
| 400 | invalid_idempotency_key | Idempotency-Key is longer than 255 characters. | Use a UUID. |
| 400 / 404 | folder_not_found | 400 when a folder_id you sent is not yours; 404 on /v1/folders/{id}. | Check the id with List folders. |
| 401 | missing_api_key | No Authorization: Bearer … header reached the API. | Send the header. Behind a proxy, make sure it forwards Authorization. |
| 401 | invalid_api_key | Unknown, malformed, revoked or deactivated key. One message for all of them, on purpose. | Copy the key again, or create a new one. |
| 401 | expired_api_key | The key passed its expiry date. | Create a new key. |
| 403 | insufficient_scope | The key lacks the scope this route needs; message names it. | Create a key with that scope. |
| 403 | ip_not_allowed | The key is restricted to IP addresses and this request came from another. Exact match — no CIDR ranges. | Add the server’s IP to the key. |
| 403 | account_inactive | The account is not active. | Contact support. |
| 404 | unknown_endpoint | No route matches the path. | Check the /v1 prefix and spelling. |
| 404 | not_found | A numeric path id (folder, endpoint, chapter or moment index) is not a number. | Use the integer id. |
| 404 | video_not_found | The video does not exist — or belongs to another account. The two are indistinguishable by design. | Check the id and the key’s account. |
| 404 | caption_not_found | No caption for that language. | List captions first. |
| 404 | chapter_not_found | No chapter at that index. | Re-read the list — indexes shift after edits. |
| 404 | moment_not_found | No moment at that index. | Re-read the list — indexes shift after edits. |
| 404 | session_not_found | No such session on your account. | Check the session id. |
| 404 | webhook_endpoint_not_found | No such webhook endpoint on your account. | List endpoints. |
| 405 | method_not_allowed | The path exists but not with this method. The Allow header lists the ones that work. | Use a listed method. |
| 409 | idempotency_key_reused | The same Idempotency-Key was used with a different method, path or body. | Use a new key per operation; reuse it only for identical retries. |
| 409 | request_in_progress | The original request with this key is still running. | Wait a moment and retry with the same key. |
| 409 | chapter_overlap | The range overlaps an existing chapter, which the message names. | Adjust start/end. |
| 409 | moment_exists | A moment already exists at that timestamp. | Pick another second or update the existing moment. |
| 422 | no_active_plan | The account has no active plan. | Assign a plan in the dashboard (Billing). |
| 422 | insufficient_storage | The file (per its Content-Length) is larger than your available storage. | Free space or upgrade. |
| 422 | invalid_source_url | Malformed, not https, or a port other than 443/8443 — at the URL or a redirect hop. | Use a plain https URL. |
| 422 | source_not_allowed | The host resolves to a private or reserved address. | Serve the file from a public host. |
| 422 | source_unreachable | DNS failed, the connection failed, or the server answered non-2xx (a HEAD for videos). | Check the URL answers HEAD publicly. GET-only presigned URLs fail here. |
| 422 | unsupported_source_type | The server sent a Content-Type that is not video. | Serve video/* or application/octet-stream. |
| 422 | source_too_large | Over 20 GiB for a video, or 5 MB for a caption. | Compress or split the file. |
| 422 | too_many_redirects | More than 5 redirects. | Link to the final URL. |
| 422 | invalid_caption_file | The caption does not start with WEBVTT. | Convert SRT to WebVTT first. |
| 429 | rate_limit_exceeded | Per-minute or per-day limit reached for this key. | Wait Retry-After seconds. |
| 500 | internal_error | Something failed on our side. | Retry with backoff; quote request_id if it persists. |
| 503 | service_unavailable | The database or a media server could not be reached. | Retry shortly — nothing was changed. |