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.

5 min readSume
All posts

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.

frames programs for video-inspect and video-frames, from the Sume docs (read 2026-10-07)
Fieldvideo-inspectvideo-frames
Frames not sent8 mid-bin stills (1 fps if the clip is under 8 s)not allowed: one of at or fps is required
frames: falseprobe only, no stillsn/a
at[]1-24 values1-24 values
fpsabove 0, up to 2, limit 24above 0, up to 2, limit 24
Both at and fpsvideo_inspect_frames_program_conflict400 schema error
Empty objectvideo_inspect_frames_program_required400 schema error
max_edge64-2160, default 76816-2160, source size if omitted
Source lengthup to 1800 sup 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

All Media tools posts

Written by Sume