video-inspect frames: at[] and fps together is a 400, pick one
video-inspect and video-frames take a list of times or a sample rate, never both. The codes, the 24-still cap, the fps 2 ceiling, and the empty object.

In Sume frames objects, you choose either explicit timestamps with at or a sample rate with fps. Send both and video inspect returns video_inspect_frames_program_conflict; send a frames object with neither and you get video_inspect_frames_program_required. Video frames enforces the same rule as a plain schema 400.
The two programs
at is a list of 1 to 24 seconds, each at least 0 and below the clip length. fps is a rate above 0 and at most 2; Sume expands it to mid-bin samples (0.5/fps, 1.5/fps, and so on) and stops at 24 frames. Because of that cap, fps: 2 covers 12 seconds of the clip, and a longer one needs a lower rate. For a 180-second Short, fps: 0.1 gives a still every 10 seconds, with the first at 5 s and 18 stills in total.
| Field | video-inspect | video-frames |
|---|---|---|
| Frames not sent | 8 mid-bin stills (1 fps if the clip is under 8 s) | not allowed: one of at or fps is required |
frames: false | probe only, no stills | n/a |
at[] | 1-24 values | 1-24 values |
fps | above 0, up to 2, limit 24 | above 0, up to 2, limit 24 |
| Both at and fps | video_inspect_frames_program_conflict | 400 schema error |
| Empty object | video_inspect_frames_program_required | 400 schema error |
max_edge | 64-2160, default 768 | 16-2160, source size if omitted |
| Source length | up to 1800 s | up to 300 s |
Why the empty-object case exists
frames: {} or frames: { format: "png" } looks like a harmless way to say "defaults, but PNG". It is not: the options format, max_edge and seek live on the same object as at and fps, and an object without one of the two has no program. If you want the default eight stills at PNG, send fps or at explicitly, or leave frames out and take JPEG.
A request that works
Three timestamps for a thumbnail shortlist, precise seek, PNG, at the Short's full height. seek: fast would snap each still to the keyframe at or before the instant, up to about one GOP early, so keep precise when the exact frame matters.
{
"video_url": "https://media.sume.com/artifacts/artf_demo/short.mp4",
"frames": {
"at": [0.5, 4, 9.5],
"format": "png",
"max_edge": 1920
}
}Related errors
An at value outside [0, duration) raises frame_time_out_of_range and the message includes the probed duration. Transcript-only fields such as language_code without transcribe: true return video_inspect_transcribe_required. All of them are free of charge to hit, since they fail at admit.
Sources
Related posts
More in Media tools
- Inspect a 3-minute Short with a transcript: set duration_seconds 180
video-inspect reserves one minute of speech-to-text unless you send duration_seconds (max 600). Why a 180 hint matters, the $0.01 per minute rate, and the 400s.
- Source too long? The 1800 s and 300 s caps for each Sume media tool
Trim, detach and inspect take sources up to 1800 s; filter, frames and compose stop at 300 s. The error each returns and the order to cut a long file.
- Which URL does each Sume media tool accept: public or media.sume.com?
Video captions and face swap take a public HTTPS URL; trim, filter, frames, inspect, detach, compose and timeline need your workspace's media.sume.com file.
- How to assemble a long-form video with the Timeline 1.0 API
Timeline 1.0 renders one audio spine plus 1 to 200 ordered video slots into one MP4. Every URL must be Sume-hosted; the plan preflight is unbilled.
Written by Sume