Skip to main content
Every generation is a job. You create it with POST /jobs, read it with GET /jobs/{id}, and it ends in one of three terminal statuses.

Job lifecycle

completed, failed and canceled are terminal: the job does not change after that.

Submit

A media input is { "asset_id": "…" } or { "url": "https://…" }. See File uploads.

Initial response

A new job returns 202 Accepted with a Location header pointing at the job and a Retry-After header equal to next_poll_after_seconds.
Always decide by the status in the body, not by the HTTP status code: a replayed job returns 200 whatever its status.

Completed output

Each artifact has an id, which is a Blon asset id you can pass as { "asset_id": "…" } to the next job, and a url signed for 15 minutes (url_expires_at). Every read of the job signs fresh URLs, so when one expires, read the job again. Files created through the API are kept for 7 days; the job’s expires_at shows when. After that artifacts is an empty list.

List jobs

Jobs come newest first. Page with limit (1–100, default 20) and starting_after set to the previous page’s next_cursor, while has_more is true. You can also filter by status, model, created_after and created_before. Jobs in a list do not include artifacts; read the single job for its files.

Cancel a job

Only a queued job can be canceled. Anything else returns 409 job_not_cancelable. A job already sent to the provider is not canceled.