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
- RMBG or upscale fails: image_not_fetchable and the HTTPS fix list
Sume cutout and upscale jobs need a public HTTPS image_url of at most 2,048 characters. Fix list for image_not_fetchable, 400 on model, 402 and 429 errors.
- Rotate the Sume webhook secret twice in one 24-hour window: what dies
Sume signs with both secrets for 24 hours after a rotation. Rotate a second time inside that window and the secret from two rotations back stops at once.
- 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 image as first and last frame: a 6-second loop on three models
A 6 s loop with one image as both first and last frame costs $2.27 on Seedance 2.0 at 720p, $0.60 on H3 Max at 768p and $0.75 on Omni at 720p.
Written by Sume