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 |
asset_not_ready | 422 | Referenced media is still being processed (retry after the asset.ready webhook) |
ingest_failed | — | A public file referenced with ingest_external could not be copied into Framelane storage (set on the failed job) |
codec_unsupported | 422 | Codec not supported by the render engine |
quota_exceeded | 402 | Monthly free-plan render-time cap exhausted. details carries limit_seconds, used_seconds, requested_seconds. Not retryable — upgrade or wait for the monthly reset |
rate_limited | 429 | Too many requests in the current window |
email_not_verified | 403 | Workspace email not verified — call POST /v1/signup/verify with the emailed OTP. Returned on every authenticated call until then |
email_in_use | 409 | A signup for this email is already in progress; retry |
invalid_otp | 400 | Verification code incorrect or expired (15-minute TTL, 5 attempts) |
unsupported_content_type | 422 | content_type not in the allowed upload list; details.allowed lists them |
http_error | — | Generic HTTP error not covered by a more specific code |
internal | 500 | Unexpected internal error |