Check a new Sume video model against your clip spec before you pay
Four catalog fields decide if a new video model fits your pipeline: durations, resolutions, ratios, and references. A Python check that submits no job.

To find out whether a newly launched video model fits your pipeline, read its entry in GET /v1/videos/models and compare four fields to your clip spec: supported_durations, supported_resolutions, supported_aspect_ratios, and supported_input_references. No job is submitted and nothing is reserved, so the check costs nothing. The Python below returns a list of problems, and an empty list means the model accepts the spec.
Limits differ by model, and Sume's docs say so directly: seedance-2.5 accepts 4 to 30 seconds, wan-3.0 accepts 2 to 30, minimax-h3 accepts 5 to 15, and gemini-omni-flash-1.1 accepts 3 to 10. A pipeline built around 12-second clips fits three of those four and fails the fourth.
The fields to read
Reference types differ as well. The Seedance 2.x models, Wan 3.0, MiniMax H3, and MiniMax H3 Max accept audio and video references. Gemini Omni Flash 1.1, higgsfield-genjutsu, and h3-max-recast accept video references but not audio.
| Field | Type | What it tells you |
|---|---|---|
| supported_durations | list of whole seconds | Which clip lengths the model accepts |
| supported_resolutions | list of strings | For example 480p, 720p, 1080p |
| supported_aspect_ratios | list of strings | For example 16:9 and 9:16 |
| supported_input_references | list | Which of image_url, video_url, audio_url it accepts |
| generate_audio | boolean | Whether the model can produce an audio track |
| seed | boolean | Whether a seed is accepted. The docs say no v1 model accepts one. |
The check
Run it with SUME_API_KEY set and uncomment the last line to read the live catalog. As written it uses a sample entry shaped like the one in Sume's docs, so the file prints a result offline: a 20-second clip is outside 4 to 15 seconds, and audio references are not in the sample's list.
import json, os, urllib.request
def fetch_models():
req = urllib.request.Request(
"https://api.sume.com/v1/videos/models",
headers={"Authorization": "Bearer " + os.environ["SUME_API_KEY"]},
)
with urllib.request.urlopen(req, timeout=20) as r:
return {m["id"]: m for m in json.load(r)["data"]}
def problems(m, seconds, resolution, ratio, refs=()):
out = []
if seconds not in m["supported_durations"]:
out.append(f"duration {seconds} not in {m['supported_durations']}")
if resolution not in m["supported_resolutions"]:
out.append(f"resolution {resolution} not supported")
if ratio not in m["supported_aspect_ratios"]:
out.append(f"aspect ratio {ratio} not supported")
for kind in refs:
if kind not in m["supported_input_references"]:
out.append(f"{kind} references not accepted")
return out
sample = {"supported_durations": list(range(4, 16)), "supported_resolutions": ["480p", "720p", "1080p"],
"supported_aspect_ratios": ["16:9", "9:16"], "supported_input_references": ["image_url", "video_url"]}
print(problems(sample, 20, "1080p", "9:16", refs=("audio_url",)))
# live: print(problems(fetch_models()["seedance-2.5"], 12, "720p", "9:16"))What the check cannot tell you
Run the check in CI on a schedule, not only on launch day. A failing check on a Tuesday morning is a cheap way to learn that a model changed its limits.
- Whether the output looks right. Run one cheap, short test clip for that.
- Price. Each catalog entry has
pricing_skus, and Sume bills the provider list price times 1.25. Read the live number before you plan a batch. - Whether your key can call the model today. A model appears in the catalog only when its provider is configured, as the docs note for
higgsfield-genjutsu.
After the check passes
Submit one job with an Idempotency-Key that includes the model id, then poll about every 30 seconds. Video generation usually takes from 30 seconds to several minutes depending on model and parameters. When the job is completed, download from unsigned_urls[0] with your API key in the header.
Wiring it into a launch routine
Keep your clip spec in one small dictionary: seconds, resolution, aspect ratio, and the references you plan to send. Run the check against every model id you might route to, not only the new one. The output is a table of model ids and problems, and it tells you in one run which models can serve as fallbacks and which cannot.
Treat the result as advice about the catalog, not a promise about a job. The catalog describes what the API accepts. A request that passes the check can still fail for reasons the catalog does not list, such as a prompt a provider refuses. Read the error object of a failed job and its request id when that happens.
When a launch adds a model, add its id to the list, rerun, and read the diff. A model that fails only on duration may still be worth using if you can trim the clip.
Sources
Related posts
More in Developers
- Check a webhook URL before you give it to Sume: https and public
Sume rejects localhost, private-network and non-HTTPS webhook URLs. A Python preflight that catches all three, and the 2048-character limit, before you submit.
- Check ad video length for Pinterest, LinkedIn and Google in Python
A short Python check of a video-inspect probe against Pinterest, LinkedIn and Google Video action length limits read on 2026-10-08, before you upload an ad.
- Check probe.has_audio before captions to avoid caption_no_speech
A silent clip fails Sume speech captions with caption_no_speech. Run video_inspect with frames false, read probe.has_audio, then pick STT captions or text cues.
- Check Sume webhook signatures in Python with hmac.compare_digest
A Python verifier for the sume-v1 header: raw bytes, constant-time compare, 300 s replay window, empty-secret refusal, and a Flask route that dedupes on job_id.
Written by Sume