Skim a 30-second Seedance clip with video-inspect seek fast
To skim a long Seedance 2.5 clip, call video-inspect with frames fps and seek fast. Stills snap to keyframes, a few seconds early at most. Stills are free.

To skim a 30-second Seedance 2.5 clip, call POST /v1/video-inspect with frames: {"fps": 0.5, "seek": "fast"}. You get about 15 stills across the clip, each snapped to the keyframe at or before its instant, and the probe and stills are unbilled. Use the default precise seek when a timestamp must be exact.
Seedance 2.5 is the Seedance id that reaches 30 seconds, so a full-length render is where a quick skim pays off. The rules below are from Sume's Video inspect reference.
What does seek fast change?
seek: precise decodes to the exact instant. seek: fast skips the decode and takes the keyframe at or before each instant, so a still can be earlier than requested by up to one GOP, roughly 0 to 5 seconds on typical sources, and never later. Quality, resolution and the transcript are unchanged.
With fast, each returned grid carries seek: "fast", sample_times for the instants the tiles actually show, and requested_times for the ones you asked for. Read sample_times when you label a tile with a time.
How many stills can I ask for?
A frames program is one of three shapes, and the caps apply to all of them.
| frames value | Effect | Limit |
|---|---|---|
| omitted | 8 mid-bin stills | Default seek is precise |
| false | Probe only, no stills | Check probe.has_audio |
| { at: [seconds] } | Explicit timestamps | 1 to 24 values, each 0 or more |
| { fps: n } | Sampling rate | 0 < n <= 2, capped at 24 stills |
What does a skim request look like?
This script asks for one still every two seconds, with fast seek and a smaller max_edge of 512, then prints each still's time and URL. Pass the clip's media.sume.com URL.
import os, requests
r = requests.post(
"https://api.sume.com/v1/video-inspect",
json={"video_url": os.environ["CLIP_URL"],
"frames": {"fps": 0.5, "seek": "fast", "max_edge": 512}},
headers={"Authorization": f"Bearer {os.environ['SUME_API_KEY']}",
"Idempotency-Key": "skim-" + os.environ["CLIP_URL"][-24:]},
timeout=60,
)
r.raise_for_status()
body = r.json()
inspect = body.get("video_inspect", body)
for f in inspect.get("frames", []):
print(f["t"], f["url"])
print("probe:", inspect.get("probe"))
When should I not use fast?
Do not use it when a still must show an exact frame, such as the first frame you intend to restage into a new generation, or a specific beat in the dialogue. Use precise, or Sume's video frames for an exact frame at one time at source size. The docs say to keep precise for explicit at[] instants and for the default eight midpoints.
Also keep in mind what inspect is not. It returns probe facts, stills and an optional transcript, not typed scenes, and it never produces a new MP4. For a shorter file, use video trim.
Sources
Related posts
More in Media tools
- source_too_long_for_reference_ingest: clips over 300 s
Reference ingest rejects a clip over 300 seconds with source_too_long_for_reference_ingest. What the cap covers and the routes Sume's docs point to instead.
- Square YouTube Short (1:1) from a vertical master with Timeline
YouTube accepts square or vertical Shorts. Render a 1080x1080 version of a vertical clip with Sume Timeline, using fit blur or contain instead of a hard crop.
- Starlight Precise 2.6 sharpness levels vs Sume video upscale tiers
Topaz Starlight Precise 2.6 adds a three-level sharpness slider. Sume Video Upscale 1.0 has no sharpness setting: it has fast, standard and pro tiers.
- Steam trailer thumbnail: a 1920x1080 frame from the video itself
Steam wants the trailer poster as a 1920x1080 JPG or PNG taken from the video. Pull it with Sume video frames at max_edge 1920, plus the trailer specs to check.
Written by Sume