Jobs
The same request body as a task. POST /v1/jobs answers 202 at once with the job object; the client polls GET /v1/jobs/{id} or waits for the SDK's helper. Video, long audio and batched generation are jobs; any task type may be submitted as a job.
/v1/jobspreviewAn asynchronous job: the same body as a task, answered 202 with the job object.
/v1/jobs/{id}previewThe job object with its status, transitions, result, usage and error.
/v1/jobspreviewThe workspace's jobs, newest first, cursor-paginated.
/v1/jobs/{id}/cancelpreviewCancels a queued, assigned or running job.
Job object
{ "object": "job", "id": "job_...", "status": "queued", "model": "<pinned id>", "task": "video_generation", "created_at": "2026-10-20T12:00:00Z", "transitions": [{"status": "queued", "at": "2026-10-20T12:00:00Z"}], "requirements": {"pool": "approved", "pricing_mode": "market", "region": null, "fallback": false}, "quote": "quote_...", "result": null, "error": null, "usage": null, "expires_at": null}| Status | Meaning | Terminal |
|---|---|---|
queued | Accepted, quote bound, no worker yet | No |
assigned | A worker took it; the attempt is att_ | No |
running | The worker reported a start | No |
completed | result is set; usage and the cost are final | Yes |
failed | error is set (the envelope's shape); nothing billed unless the retries page says otherwise | Yes |
canceled | By POST /v1/jobs/{id}/cancel, by a client disconnect or by the workspace being paused; the running attempt, if any, ends interrupted with reason canceled | Yes |
interrupted | An attempt was interrupted after a streamed partial answer had already reached the client, or the attempt limit was reached after an interruption; nothing billed | Yes |
- Status
queued- Meaning
- Accepted, quote bound, no worker yet
- Terminal
- No
- Status
assigned- Meaning
- A worker took it; the attempt is
att_ - Terminal
- No
- Status
running- Meaning
- The worker reported a start
- Terminal
- No
- Status
completed- Meaning
resultis set;usageand the cost are final- Terminal
- Yes
- Status
failed- Meaning
erroris set (the envelope's shape); nothing billed unless the retries page says otherwise- Terminal
- Yes
- Status
canceled- Meaning
- By
POST /v1/jobs/{id}/cancel, by a client disconnect or by the workspace being paused; the running attempt, if any, endsinterruptedwith reasoncanceled - Terminal
- Yes
- Status
interrupted- Meaning
- An attempt was interrupted after a streamed partial answer had already reached the client, or the attempt limit was reached after an interruption; nothing billed
- Terminal
- Yes
Every transition carries a timestamp and, when the scheduler has one, an explanation. An attempt interrupted before any output returns the job to queued while attempts remain.
Parts list: Behavior
GET /v1/jobs/{id}The job object.
resultholds inline results (the task's result shape) or, for media,outputs: [{upload_id, download_url, content_type, bytes, expires_at}]with a presigned GET. Another workspace's job is a 404job_not_found.GET /v1/jobsThe key's workspace's jobs, newest first, cursor-paginated, filterable by
status,model,deploymentandtask.POST /v1/jobs/{id}/cancelqueued: canceled at once, nothing billed.assignedorrunning: cancellation is sent to the worker; the attempt endsinterruptedwith reasoncanceledand the job endscanceled; the charge for work done is Not decided yet (proposed: nothing). A terminal job answers 200 with the job unchanged.Expiryresultandoutputsare retrievable untilexpires_atNot decided yet; the job record and its usage stay. A read after expiry is a 404result_expiredonresult; the job object itself still answers.WebhooksNone in this version; a completion webhook is open Not decided yet. The Console shows job progress.
| Status | Type | Code | Situation | Retry |
|---|---|---|---|---|
| 400 | invalid_request_error | use_jobs | A synchronous task the gateway can tell will exceed the synchronous limit | As a job |
| 400 | invalid_request_error | invalid_idempotency_key, idempotency_key_reused, idempotency_in_progress | The idempotency rules | The last one, later |
| 402 | insufficient_credit | insufficient_credit | The balance does not cover the request's maximum cost at the bound quote. On the free plan with the allowance used, the message names when it resets | After a top-up |
| 404 | not_found_error | job_not_found, upload_not_found | An id in the path that is unknown or another workspace's | No |
| 404 | not_found_error | result_expired | A job's result read after expires_at | No |
| 429 | rate_limit_error | concurrency_limit_exceeded | Too many concurrent streams or active jobs; param is streams or jobs; Retry-After | Yes, after Retry-After |
- Status
- 400
- Type
invalid_request_error- Code
use_jobs- Situation
- A synchronous task the gateway can tell will exceed the synchronous limit
- Retry
- As a job
- Status
- 400
- Type
invalid_request_error- Code
invalid_idempotency_key,idempotency_key_reused,idempotency_in_progress- Situation
- The idempotency rules
- Retry
- The last one, later
- Status
- 402
- Type
insufficient_credit- Code
insufficient_credit- Situation
- The balance does not cover the request's maximum cost at the bound quote. On the free plan with the allowance used, the message names when it resets
- Retry
- After a top-up
- Status
- 404
- Type
not_found_error- Code
job_not_found,upload_not_found- Situation
- An id in the path that is unknown or another workspace's
- Retry
- No
- Status
- 404
- Type
not_found_error- Code
result_expired- Situation
- A job's result read after
expires_at - Retry
- No
- Status
- 429
- Type
rate_limit_error- Code
concurrency_limit_exceeded- Situation
- Too many concurrent streams or active jobs;
paramisstreamsorjobs;Retry-After - Retry
- Yes, after
Retry-After
Related sheets
- Sheet
- 11 of 13
- Detail
- F
- Updated
- 2026-10-21
- Status
- Preview