video_inspect seek fast vs precise: a quick look with keyframe stills
seek: fast moves each still to the keyframe at or before its instant and skips the decode. Use it for a quick look; precise when timing matters.

Set frames.seek to fast for a quick look at a clip. Each still then moves to the keyframe at or before its requested instant and the server skips the accurate decode, so a still can be early by up to one GOP (about 0 to 5 seconds on typical sources) but is never late. Quality, resolution and the transcript do not change. Leave seek at precise when the timestamp must be right.
Two modes
precise is the default. It decodes to the accurate instant, so programs you already use keep their behavior. fast trades timing for speed. The result is a grid that records seek: fast, the sample_times the tiles actually show, and the requested_times from your program, so you can see the gap on every still.
Picking by task
A first look at a long export, a thumbnail pass, and a skim of what the clip contains all work with fast. A check that a caption appears at second 12.4, a comparison of two cuts at the same instant, or a frame handed to a model with a time claim all need precise. If a timing error would change the decision, you want precise. When in doubt, run fast first, find the interesting stretch, and then run precise only over it.
| Task | seek | Why |
|---|---|---|
| Skim an export | fast | A few seconds early is fine |
| Explicit at[] instants | precise | The time is the point |
| Default 8 mid-bin stills | precise | Midpoints should be accurate |
| Contact sheet of 24 stills | fast | Speed over timing |
| Frame at the source size | video_frames | Use the dedicated route |
A request
The frames object takes only one of at[] or fps, with optional format, max_edge and seek. The example samples one still every two seconds with seek fast. Remember the call limit of 24 stills and the 1,800-second source limit. At fps 0.5 on a 40-second clip, that gives 20 stills, each moved back to a keyframe, which is plenty for a skim of what the clip contains.
{
"video_url": "https://media.sume.com/artifacts/artf_demo/export.mp4",
"frames": {
"fps": 0.5,
"seek": "fast",
"max_edge": 768
}
}What fast does not change
The probe, the resolution and the transcript are the same either way, and the stills are still durable media.sume.com images. Cost is unaffected by the seek mode in the docs: probe and stills are billed by the Modal compute they use, and a transcript adds $0.01 per audio minute. If you need an exact frame at a time and the source size, use video_frames, which is built for that. For a long review, run a fast pass to find the section that matters, then a precise pass with explicit at[] instants over that section only. Two small calls usually cost less than one wide precise call that you have to redo.
Sources
Related posts
More in Developers
- Video job statuses: pending, cancelled vs Sume's five job states
A /v1/videos job says pending or in_progress; /v1/jobs/{id}/status says queued or processing. Here is the mapping, which one to poll, and the spelling trap.
- Video model fallback chain in Python with one key per model
A Python chain that tries Gemini Omni, Wan 3.0 and Seedance 2 on Sume in order, stops on 401 or 402, and uses a separate idempotency key for each model.
- 'Video Router generate requires a catalog model id': the fix
The model must be an id from the catalog or an Auto alias. Provider names, vendor slugs and marketing names fail. List valid ids from /v1/videos/models first.
- wait_timeout_seconds 30 is not a 30-second video
The 30 in wait_timeout_seconds is how long your HTTP request may block, not how long a clip may run. A 30-second video job still needs a poll or webhook.
Written by Sume