Sume job status: queue.state, a null position, worker_heartbeat
Why queue.position is null on a Sume job status, what queue.state and worker_heartbeat report, and what a poller should do when a job sits in the queue.

On a Sume job status, queue.position is null until Sume computes a real queue rank, and the OpenAPI schema says the API does not return fake queue positions. The queue object still tells you something useful: a state, a provider-neutral reason, the earliest available_at, and a worker_heartbeat liveness summary. A queued job with a null position is normal; keep polling.
Field names and descriptions come from the JobStatusResponse schema in the OpenAPI file; the no-position boundary is stated on Generation admission. Both read 2026-10-02.
What is in the queue object?
GET /v1/jobs/{id}/status returns the queue object next to the flat status, sume_status, terminal, and result_ready fields. A top-level queue_position is also required in the response and is null for the same reason.
| Field | Type | What the schema says |
|---|---|---|
state | enum | waiting, deferred, runtime_unavailable, processing, completed, failed, canceled |
reason | string | Provider-neutral reason for the current queue state. |
position | integer or null | Null until Sume computes real queue rank; no fake positions. |
available_at | date-time | Earliest time the job is eligible for worker pickup or retry. |
retry_after_seconds | integer or null | No description beyond the type in the schema. |
runtime | object | job_ledger_configured, worker_configured, and a worker_heartbeat. |
What does worker_heartbeat tell me?
runtime.worker_heartbeat is described as a provider-neutral worker liveness summary. It carries status (fresh, stale, or missing), last_seen_at, and stale_after_seconds. Raw worker identifiers and internal topology are not exposed.
The schema does not say what to do on stale or missing, so treat it as a diagnostic, not a trigger to resubmit. Resubmitting a paid job because a status looks slow is the one action the docs rule out: do not resubmit the original paid request just because a local process timed out.
Why can a job wait in queued at all?
Concurrency is a dispatch limit, not a submit limit. A workspace already at its processing limit can still be accepted into queued while queue capacity remains, and workers move jobs to processing later. Free is 1 concurrent with a queue capacity of 5; Pro is 4 with 20, according to the plan table on the admission page, and the dashboard Concurrency tab is the source of truth for your workspace.
Sume exposes queue counts and remaining accepted capacity, not a precise per-job queue position or ETA. If you need a number, read generation_limits on a submit response: queued_generation_jobs, active_generation_jobs, and queue_capacity_remaining.
What should a poller do with a long queue?
Keep the loop boring; none of these steps need a resubmit.
- Treat
queuedandprocessingas normal non-terminal states and poll with backoff untilterminalis true. - Sleep for
next_poll_after_secondswhen it is present; it is the suggested minimum delay before the next poll. - Read
events_urlif a job seems stuck; events are the public timeline for debugging and recovery. - If you need to give up, cancel while
cancelableis true. A client-side timeout does not cancel the job, which keeps running and billing. - When asking for help, send the
request_idfrom the error body or thex-sume-request-idheader, not your API key.
Sources
Related posts
More in Developers
- Sume job usage_summary: reserved, captured, refunded, final
Read usage_summary on a Sume job: status reserved, captured or refunded, amounts in micros, the final flag, and why dollars are micros divided by 1,000,000.
- Sume job webhook_delivery: attempts, exhausted, redeliveries
Read the webhook_delivery object on a Sume job: status, attempts of 10, last_status_code, manual_redeliveries, and what to do when delivery is exhausted.
- Submit a Sume video job with curl, save it with sume jobs download
The CLI has no video generate command, but jobs watch and jobs download work on jobs created through the API. A shell script that submits, waits and saves.
- List Sume jobs: next_cursor, starting_after, and idempotency_key
Page through GET /v1/jobs with limit, next_cursor and starting_after, then recover a lost wave by joining your own key to each job's idempotency_key.
Written by Sume