Video frames always returns 202: mode sync does not give a 200

Sume video frames pins async, so a submit returns 202 even with mode sync. How it differs from video inspect, which waits up to 30 s, and how to poll.

4 min readSume
All posts

If you send mode: "sync" to Sume video frames and wait for a 200 with the stills, you will not get one. The docs, read 2026-10-05, say submitVideoFramesJob pins communicationMode: "async", so a submit always returns 202. Poll GET /v1/video-frames/:id or GET /v1/jobs/:id/status.

Video inspect behaves differently: its default is sync, and the handler waits up to 30 seconds for a 200, falling back to a 202 if the job is slower.

Side by side

From the Sume docs, read 2026-10-05
ToolSubmit returnsSource capFrame cap
Video framesAlways 202300 s24 frames, at source size unless max_edge
Video inspect200 within 30 s, else 2021800 s24 stills, default max_edge 768

When to pick which

  • Need a full-size frame at one time, for a first-frame restage: video frames, with no max_edge.
  • Need a quick look at a long clip, with probe facts: video inspect.
  • Need the probe and an optional transcript in one call: video inspect with transcribe: true.

A poll loop

import time

def wait_ready(get_status, tries=30, delay=2):
    # get_status returns the resource_status of GET /v1/video-frames/:id
    for _ in range(tries):
        status = get_status()
        if status in ("ready", "failed"):
            return status
        time.sleep(delay)
    return "timeout"

states = iter(["processing", "ready"])
print(wait_ready(lambda: next(states), delay=0))

Always send an Idempotency-Key on REST so a retry after a dropped connection does not queue a second extract.

Sources

Related posts

More in Media tools

All Media tools posts

Written by Sume