Review a 30-second Wan 3.0 clip: video inspect caps at 24 stills
Video inspect returns at most 24 stills per call, so a 30-second clip needs a sample rate of 0.8 fps or an explicit list of 24 times. Python builds the request.

To review a 30-second Wan 3.0 clip frame by frame, ask Video inspect for 24 stills: either { "fps": 0.8 }, which gives 24 mid-bin samples over 30 seconds, or an at list of up to 24 timestamps you choose. The docs cap a frames program at 24 values, so you cannot ask for every second of a 30-second clip in one call.
A 30 fps clip holds 900 frames (30 x 30), and Alibaba lists 30 fps MP4 for wan3.0-video (read 2026-10-08). Twenty-four stills are under 3 percent of them, which is enough to catch a cut, a morphing hand or a logo drift.
Two sampling choices
| frames program | Result for 30 s | Use it for |
|---|---|---|
| { "fps": 0.8 } | 24 evenly spaced stills | Skimming the whole clip |
| { "at": [0, 1.25, 2.5, ...] } | Up to 24 chosen times | Checking known moments, such as the last second |
| { "fps": 1 } | 30 stills, more than the limit of 24 | Do not use on a 30 s clip |
Build the request
Send either at or fps, never both. The clip must be a media.sume.com artifact or asset in your workspace; import it first with POST /v1/media-imports if it is not.
import json, os
duration, shots = 30, 24
# mid-bin timestamps: one still per 1.25 s bin
at = [round((i + 0.5) * duration / shots, 2) for i in range(shots)]
body = {
"video_url": "https://media.sume.com/artifacts/artf_demo/wan-30s.mp4",
"frames": {"at": at, "format": "jpeg", "max_edge": 768},
}
print(len(at), "stills; last at", at[-1], "s")
print("curl -X POST https://api.sume.com/v1/video-inspect \\")
print(' -H "Authorization: Bearer $SUME_API_KEY" -H "Content-Type: application/json" \\')
print(' -H "Idempotency-Key: review-wan-30s-001" -d', "'" + json.dumps(body) + "'")Checking the end of the clip
Long takes tend to drift late, so put the extra stills where you doubt the clip. An at list such as [0, 5, 10, 15, 20, 24, 26, 28, 29, 29.8] samples the final seconds more densely than an even 0.8 fps would. Keep the list at 24 values or fewer and each value at least 0.
Reading the result
When the job completes, the resource carries probe and frames[{t,url,width,height}] as durable image artifacts. Check probe for duration and frame rate, then flip through the stills. The default mode is sync, which waits up to 30 seconds and returns 202 with a queued job if it takes longer; poll that job instead of resubmitting.
Inspect bills by its Modal compute, so it is a small line next to the video, which is why reviewing a draft at 480p before a 1080p re-render is cheap insurance.
Sources
Related posts
More in Developers
- Rotate the Sume webhook secret without dropping events
After POST /v1/webhooks/signing-secret/rotate, Sume signs with both secrets for 24 hours. How verifyWebhook handles the two-entry header, and the deploy order.
- Same prompt on five Sume image models in one script: about 18 cents
One loop sends a text-in-image prompt to Flux 2 Pro, Seedream 5.0 Lite, Qwen Image, Imagen 4 Fast and Recraft V4. Expected total $0.18125. Code you can run.
- Score your own audio: a word error rate script for Sume STT
Microsoft quotes 5.2% WER on FLEURS for MAI-Transcribe-2. Measure your audio: a short Python WER function, a reference file and a cent-a-minute Sume STT run.
- Seedance output pixel sizes: 480p, 720p and 1080p for every ratio
The frame size Seedance renders at 480p, 720p and 1080p for 21:9, 16:9, 4:3, 1:1, 3:4 and 9:16 on Sume, as used for pricing.
Written by Sume