Switch video models by changing one string: what can still break
On Sume's /v1/videos you swap the model id and keep the body. Duration range, resolution and aspect ratio are the three fields that may need adjusting.

Switching models on Sume is a one-field change: model in the POST /v1/videos body. Auth, polling, download and webhooks are identical for every id. What may need a second edit is anything the new model does not accept: a duration outside its range, a resolution it lacks, or a field it rejects.
One body, three models
Duration 6 sits inside the documented range of all three ids below, so this body is a fair test of the swap.
for M in wan-3.0 seedance-2.5 kling-3; do
curl -s -X POST https://api.sume.com/v1/videos \
-H "Authorization: Bearer $SUME_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: switch-$M" \
-d "{\"model\":\"$M\",\"prompt\":\"A kite over a cliff at sunset\",\"duration\":6}"
doneWhat can differ
Read the new model's entry in GET /v1/videos/models before you reuse a stored body.
| Field | Where it differs | Example |
|---|---|---|
| duration | Each id has its own range | minimax-h3 needs 5 s or more; gemini-omni-flash-1.1 stops at 10 s |
| resolution | Value sets differ | minimax-h3 uses 768p, not 720p |
| aspect_ratio | Subsets differ | gemini-omni-flash-1.1 is 16:9 or 9:16 only |
| generate_audio | Some models have no toggle | Omni always produces native audio; kling-3 has a toggle |
| seed, size, provider.options | Rejected on every v1 model | 400 unsupported_parameter |
Make the swap safe
- Validate against the catalog at startup and fall back to the model's nearest valid value.
- Use a new
Idempotency-Keyper model, since a replay returns the original job. - Compare
usage.costafter a swap: prices differ by up to two orders of magnitude between ids.
A guard function
A few lines turn the catalog into a pre-flight check:
import os, requests
r = requests.get("https://api.sume.com/v1/videos/models",
headers={"Authorization": "Bearer " + os.environ["SUME_API_KEY"]})
catalog = {m["id"]: m for m in r.json()["data"]}
def fits(model, duration, resolution):
m = catalog[model]
return (duration in m["supported_durations"]
and resolution in m["supported_resolutions"])
print(fits("minimax-h3", 4, "720p")) # False: 5 s minimum, 768p not 720pSources
Related posts
More in Developers
- sync, subscribe, async or webhook: which Sume mode for a video job
Sume's sync and subscribe modes wait at most 30 seconds, then return a job id. Use async or webhook for video; Python that survives a timed-out wait.
- rate_limited or queue_full? One Python submit handler for both 429s
Two different 429s need two different waits. A Python handler reads error.code, sleeps on retry-after for rate_limited, and waits for capacity on queue_full.
- Test one video prompt on ten models for under $7 (Python sweep)
A 5-second, lowest-resolution sweep of one prompt over ten Sume video ids costs about $5.60 in total. The price of each row and a script that submits them.
- TTS word timestamps: timestamps.words and sentence segmentation
Sume TTS accepts timestamps.words and segmentation.mode sentence so a generated voiceover can drive caption timing. Request fields, rules and a working call.
Written by Sume