Why Use the Async Queue
The synchronous endpoints (/ai/images/generate, /ai/videos/generate) block until the result is ready. For video generation, this can be 1-10+ minutes. The async queue returns immediately with generation IDs so you can:
- Run many generations in parallel (up to 4 per request, no limit on total queued)
- Avoid long-lived HTTP connections
- Build progress-tracking UIs
- Query completed generations and their output URLs at any time
Workflow
succeeded, failed, or cancelled), and you can fetch them at any time. See Output Files for more information about where the outputs are saved.
A Server-Sent Events stream at GET /api/events can also deliver completion notifications with the output file URL. See Completion Events.
Enqueue
Required Parameters
Additional Parameters
All other parameters (e.g.
prompt, multi_prompt, input_image, input_video, aspect_ratio, duration, seed, generate_audio) are passed through to the model. Consult the model’s request_schema via GET /api/ai/models/:id for supported parameters and their constraints.
Response
Validation
The API validates at enqueue time that:- The model exists and produces image, video, or audio output
num_generationsis 1-4- The user is authenticated with sufficient credits
failed status with an error_message. To validate parameters and get immediate error feedback, use /ai/images/generate or /ai/videos/generate instead.
Billing an Organization
A generation bills the target namespace and saves its file there. That’s your own account unless you passtarget_namespace. Pass an organization’s name to use its credits and storage with your own API key, as long as you’re an admin or editor of that organization. Only the organization’s balance counts, and a request fails with a 402 when the organization is out of credit, even if your own account has plenty.
Output Files
A generation writes its output file into a repository in the target namespace. The repository isplayground unless you pass target_repo, and it’s created the first time it’s used. The file goes at the repository’s root unless you pass target_directory. The workbench also saves your uploads and generations to playground. Give an application its own target_repo to keep its files separate.
result_url is a signed link to that file which expires after one hour. Get Generation and List Generations sign it again on every call, which means you can keep the generation_id and fetch a fresh link whenever you need the file. The url in a completion event is signed when the generation completes and expires an hour later.
List Generations
queued or processing) are returned. Pass an explicit status filter to include terminal states.
Query Parameters
Response
Any additional parameters from the original enqueue request (e.g.
seed, aspect_ratio, duration, input_image) are included in the response alongside the fields above.
Polling Strategy
- Image generation (FLUX, etc.): typically completes in 5-30 seconds. Poll every 2-5 seconds.
- Video generation (Kling, etc.): typically takes 1-5 minutes. Poll every 10-30 seconds.
status is a terminal value (succeeded, failed, or cancelled), or until count reaches 0 when using the default active-only filter.
Get Generation
result_url when the generation has succeeded and error_message when it has failed.
Path Parameters
Response (in progress)
Response (succeeded)
Response (failed)
Response (not found)
Returns 404 when the generation ID does not exist:Cancel Generation
Path Parameters
Response (success)
Response (not found)
Returns 404 when the generation ID does not exist:queued or processing). Cancelling a generation that has already reached a terminal state (succeeded, failed, or cancelled) has no effect.
Completion Events
media_generation_completed events when generations reach a terminal state.
Connect
Content-Type: text/event-stream. The server sends : keep-alive\n\n every 15 seconds when idle.
Events are broadcast to currently-connected subscribers with no buffering. Anything that fires before you connect is lost. Subscribe before calling POST /ai/queue to avoid missing events.
Event: media_generation_completed
Fires once per generation on terminal state. Success wire format:Fields
Other events on this stream
GET /api/events is a user-scoped stream that may carry unrelated event types (e.g. deployment events). Filter on the event: line and ignore anything other than media_generation_completed.
Example
Cancellation
Cancelling a generation fires the same event withstatus: "cancelled":
status when you handle one.
Examples
Batch image generation with polling
Async video generation
Poll a single generation by ID
End-to-end: enqueue, wait for SSE, download
Python