Video frames: one frame with url null and the job still succeeds
In Sume video frames, a failed instant returns url null while the job completes. How to detect partial results and retry only the missing times.

A Sume video frames job can finish with resource_status: ready and still hold a frame whose url is null. The docs, read 2026-10-05, say that if the extract fails for one instant, that frame has a null url, and this does not cause the job to fail. Each frame is {t, url, width, height}, so the missing one is easy to find by its t.
This matters in automation. A flow that only checks the job status will report success, then break later when an image step receives a null.
Detect and retry
Filter the frames, collect the failed times, and submit a second call with only those times in at[]. Use a new Idempotency-Key, since the first call is already complete.
frames = result["frames"]
missing = [f["t"] for f in frames if f["url"] is None]
if missing:
retry_body = {"video_url": video_url, "at": missing}
print(retry_body)
else:
print("all frames present")Things that are not partial failures
- An
atvalue outside[0, duration)fails the whole job withframe_time_out_of_range, and the error reports the probed duration. - A source longer than 300 seconds fails with
duration_out_of_range. - More than 24
atvalues, orfpsabove 2, is a 400 at submit.
Billing and mode
The job is billed by its Modal compute at container seconds times list price times 1.25 plus the platform fee, never above the reservation held at submit. A video frames submit always returns 202, because the route pins async, so do not send mode: "sync" expecting a 200. Poll GET /v1/video-frames/:id or the job status.
Sources
Related posts
More in Media tools
- Video inspect stills come back 432x768: set max_edge 1920
Video inspect clamps stills to a 768 long edge by default, so a 1080x1920 clip returns 432x768 frames. Set max_edge up to 2160, or use video frames.
- Video inspect frames: at and fps together return a 400 conflict
Sume video inspect frames takes either at[] or fps, never both. The conflict and required codes, the 24-still cap, and how to sample a clip evenly.
- video-inspect 400: frames at and fps together on a Shorts hook
Send frames.at or frames.fps to Sume video-inspect, never both: both returns 400 video_inspect_frames_program_conflict. Pick at[] for a Shorts hook check.
- video-inspect frames needs at or fps: probe a Short with frames:false
video_inspect_frames_program_required means frames is an object with no at or fps. Omit frames for 8 stills, or pass frames:false to only probe a Short upload.
Written by Sume