Async Jobs
The async API (V2) lets you submit a generation request and poll for its response. The result is downloadable using a URL available when the job completes. This is the recommended approach for production workloads, as it avoids the connection timeouts that can affect long-running sync requests.
Lifecycle
- Submit.
POSTto an async endpoint (/v2/{endpoint}) with your generation parameters. The response is202 Acceptedwith a job ID. - Poll.
GET /v2/{endpoint}/{id}every few seconds until thestatusfield iscompletedorfailed. - Download. When
statusiscompleted, theresultobject contains one or more URLs pointing to the generated output files.
Status values
completed and failed are terminal — stop polling when you see either.
Result format
The result object on a completed job is a map of output labels to URLs. Keys depend on the endpoint — for video-to-video-hdr, the result contains exr_frames_url:
Polling guidance
- Poll every 5 seconds. Shorter intervals add load without meaningfully reducing latency.
- Treat transient HTTP errors (5xx, network failures) as retryable — your poll loop should retry with backoff rather than giving up. The examples below omit error handling for brevity.
- A
404means the job doesn’t exist or has expired (see retention below).
Retention
Job status and output URLs are available for 24 hours after the job reaches a terminal state. After that, GET /v2/{endpoint}/{id} returns 404. Download or re-host outputs before that window expires.
Error handling
Errors appear in two places but use the same { type, message } shape:
- HTTP errors on
POSTorGETrequests — validation, auth, rate limits, etc. - Job failures inside the status response when a job fails during processing.
Your error handling logic can use the same type checks (e.g., content_filtered_error, insufficient_funds_error) regardless of where the error appears. See Error Handling for the full list.
Example
A complete submit → poll → download loop: