/v1/videos poll status: pending, in_progress, and the Sume job state

On /v1/videos, a Sume job reads queued as pending, processing as in_progress, canceled as cancelled. The full status mapping, and why expired never appears.

3 min readSume
All posts

If you wrote a client from OpenRouter's video generation docs and point it at Sume, the status strings you see on GET /v1/videos/{job_id} are not the same as the ones on GET /v1/jobs/{id}/status. Both read the same job. The mapping is fixed in Sume's implementation contract.

The mapping

Note the spelling: Sume says canceled on its own job endpoints and cancelled on the OpenRouter-shaped route. A strict string match on one will miss the other.

Sume job status to /v1/videos status (Sume contract docs, read 2026-10-05)
Sume job.status/v1/videos status
queuedpending
processingin_progress
completedcompleted
failedfailed
canceledcancelled

Two things that surprise people

  • expired is in the enum for wire compatibility, but Sume does not expire jobs, so you will never see it.
  • Submit and poll return bare OpenRouter-shaped objects, not Sume's usual { "data": ... } envelope. id and generation_id are the same Sume job id.

A poll loop that handles both names

This loop stops on any terminal name from either surface. It uses the polling URL from the 202 response and the key from the environment.

import os
import time

import requests

TERMINAL = {"completed", "failed", "cancelled", "canceled"}
HEADERS = {"Authorization": "Bearer " + os.environ["SUME_API_KEY"]}


def wait(polling_url, every=5, limit=900):
    waited = 0
    while waited < limit:
        job = requests.get(polling_url, headers=HEADERS, timeout=30).json()
        if job["status"] in TERMINAL:
            return job
        time.sleep(every)
        waited += every
    raise TimeoutError(polling_url)

When a job fails, read error on the poll response; it is the same public remap as the jobs endpoint. A GET .../content after failure answers 409 job_failed, which is not retryable, while job_not_completed is. See the Video generation docs for the full error table.

Sources

Related posts

More in Developers

All Developers posts

Written by Sume