Skip to main content
All V1 errors use a single envelope, ErrorBody, shared by synchronous HTTP failures (wrapped in {"error": ...}), asynchronous resource error fields, and render SSE events:
Internal implementation codes are never exposed.

Error codes

Retry policy

Use retryable and remediation on the error itself rather than hardcoding a policy per HTTP status — they’re specific to what actually happened. As a baseline: retry temporary service failures (RATE_LIMITED, SERVICE_BUSY, ALL_WORKERS_BUSY, WORKER_STOPPED, and retryable: true INTERNAL_ERRORs) with exponential backoff, honoring retry_after_ms or Retry-After when present. Don’t retry a 400-, 401-, 402-, 403-, 404-, 409-, or 422-level response unchanged. The JSON draft form of POST /v1/renders requires Idempotency-Key, so it’s safe to retry after a network timeout with the same key and body — you’ll get the original render back rather than a duplicate. The multipart/form-data form of POST /v1/renders, and Character/Motion creation, have no such key: if a create response was received, use its resource ID; otherwise resolve the outcome with your request logs and X-Request-Id before submitting again.

Failed async jobs

An HTTP 200 response from a status endpoint can still describe a failed job — the resource’s own error field carries the same ErrorBody:
Treat failed as terminal. Keep the resource ID and request_id for support.