Status codes
| Code | Meaning | Typical cause |
|---|---|---|
200 | Success | Request accepted. Inspect results[].status for per-item outcomes — some may still be "error". |
400 | Bad Request | Pydantic validation failed (bad enum, oversized batch, malformed URL or hex color), or org_id in body mismatches the API key’s org. |
401 | Unauthorized | X-API-Key / Authorization header missing, malformed, or revoked. |
403 | Forbidden | JWT caller is not an active member of the requested organization. |
422 | Unprocessable Entity | Body is not valid JSON. |
429 | Too Many Requests | Per-caller rate limit exceeded. See Rate Limits. |
500 | Internal Server Error | Unexpected server failure. Per-item failures normally surface as 200 with status: "error" rows; a 500 indicates the request itself could not be handled. |
Per-item errors
POST /v1/videos returns 200 even when some items fail validation or queueing — your client should iterate results and retry only the failed entries.
A failed result entry looks like:
| Field | Meaning |
|---|---|
status | Always "error" for failed items. |
code | Machine-readable error code. Currently "ITEM_FAILED" is the only value emitted. |
message | Human-readable description suitable for logs. |
index | Position of the failed item in the original request — use to correlate with your input. |
Retry guidance
| Status | Retry? | How |
|---|---|---|
429 | Yes | Wait Retry-After seconds, then retry. |
500 | Yes, with backoff | Exponential backoff starting at 2 s. |
400 / 401 / 403 / 422 | No | Fix the request first. |
200 with per-item "error" | Yes, per item | Resubmit only the failing items in a new request. |
