Error shape
All API errors follow this JSON envelope:| Field | Type | Description |
|---|---|---|
code | string | Machine-readable error code (see table below) |
message | string | Human-readable description |
details | object | Optional additional context |
HTTP status codes
| Status | Meaning |
|---|---|
200 | OK |
202 | Accepted — job enqueued |
201 | Created |
204 | No content |
400 | Bad request |
401 | Unauthorized — invalid or missing API key |
403 | Forbidden |
404 | Not found |
409 | Conflict — idempotency key reused with different body |
422 | Unprocessable entity — validation failed |
429 | Too many requests — rate limit exceeded |
500 | Internal server error |
Error codes
| Code | HTTP | Description |
|---|---|---|
unauthorized | 401 | Missing or invalid API key |
forbidden | 403 | Action not permitted for this workspace |
not_found | 404 | Resource does not exist |
conflict | 409 | Idempotency key conflict |
invalid_request | 422 | Request validation failed |
unsupported_feature | 422 | Feature not yet supported |
invalid_source | 422 | Source URL is invalid or inaccessible |
source_not_found | 422 | Source URL returned 404 |
source_too_large | 422 | Source file exceeds the 5 GiB limit |
codec_unsupported | 422 | Codec not supported by the render engine |
quota_exceeded | 429 | Monthly render or task quota exhausted |
rate_limited | 429 | Too many requests in the current window |
internal | 500 | Unexpected internal error |
Job-level errors
When a render or task fails asynchronously, theerror field is set on the job object:
render.failed / task.failed webhook payload.
