One env line picks the video model: $1.25 vs $5.78 per 10 s clip
Read the Sume video model id from one env var. For a 10 s 720p 9:16 clip, gemini-omni-flash-1.1 bills $1.25 and seedance-2.5 bills $5.78.

Put the video model id in one environment variable, SUME_VIDEO_MODEL, and the rest of the request stays the same. For a 10-second 720p 9:16 clip, gemini-omni-flash-1.1 bills $1.25 and seedance-2.5 bills $5.78, so that one line changes the price of a clip by a factor of about 4.6. The /v1/videos route takes the same body for both, with a bare catalog id in model.
The price difference, with arithmetic
Gemini Omni Flash 1.1 lists $0.10 per second at 720p, so 10 seconds is $1.00 list and $1.25 billable. Seedance 2.5 is priced per video token, and the billable figure for a 10-second 720p 9:16 clip is $5.78 after the 1.25 multiplier and rounding up to the cent.
| Model id | Basis | Billable |
|---|---|---|
| gemini-omni-flash-1.1 | $0.10 per second x 10 = $1.00, x 1.25 | $1.25 |
| seedance-2.5 | per video token, 9:16 at 720p | $5.78 |
| Ratio | 5.78 / 1.25 | about 4.6x |
What differs besides price
Limits are different for each model, so a one-line switch needs a check of the request against the model. Gemini Omni Flash 1.1 accepts 3 to 10 seconds at 360p, 720p, 1080p and 4K in 16:9 or 9:16, with native synced audio always on. Seedance 2.5 accepts 4 to 30 seconds at 480p, 720p and 1080p. A 12-second request works on Seedance and fails validation on Omni. Read supported_durations and supported_resolutions from GET /v1/videos/models rather than trusting the table.
The config-driven submit
The script reads the id, checks it against the live catalog, and submits. An unknown id stops the run before any paid call. Setting the variable to sume/auto lets Sume choose, with the 3 to 10 second limit of Auto.
import os
import httpx
key = os.environ.get("SUME_API_KEY", "")
model = os.environ.get("SUME_VIDEO_MODEL", "sume/auto")
if not key:
raise SystemExit("set SUME_API_KEY")
h = {"Authorization": f"Bearer {key}"}
ids = {m["id"] for m in httpx.get(
"https://api.sume.com/v1/videos/models", headers=h, timeout=20
).json()["data"]}
if model != "sume/auto" and model not in ids:
raise SystemExit(f"{model} is not in the catalog")
r = httpx.post(
"https://api.sume.com/v1/videos",
headers={**h, "Idempotency-Key": f"cfg-{model}-clip-001"},
json={"model": model, "duration": 8, "resolution": "720p",
"aspect_ratio": "9:16", "prompt": "A product clip on a desk"},
timeout=60,
)
r.raise_for_status()
print(r.json()["id"])Keep the key in step with the model
Notice that the idempotency key includes the model id. If you change the model and keep the same key and prompt, Sume treats it as a changed payload and returns 409 idempotency_conflict. Including the model in the key avoids that and keeps each model's attempts separate.
Test the switch, not just the price
A one-line change deserves a one-clip test. Run the same prompt on both models at the same length and resolution, look at the output side by side, and write down the two bills. A model that costs a quarter as much but misses your style is more expensive than it looks, and a model that costs more but removes a retake can be cheaper in practice.
Because the wire format is the same, you can run the comparison from the same script by changing only the variable. Include the model in the idempotency key so the two runs do not collide.
Setting the variable to sume/auto removes the model choice and keeps the same body. Auto create controls default to 720p and 8 seconds, with 3 to 10 second clips at 16:9 or 9:16. The response reports sume/auto, and Sume does not say which family ran. Use Auto when the family does not matter, and pin when the price or a capability such as a 30-second clip does.
Sources
Related posts
More in Developers
- Clip-type route table in Python: Sora use cases to Sume models
A 30-line Python route table maps ads, demos and teasers to a Sume model, size and length, refuses a length the model cannot make, and prints the dollar cost.
- Video trim end past the clip: trim_clamped_to_source and a short ad
If end is beyond the source, Sume video-trim clamps it and warns trim_clamped_to_source. Ask for 0-20 s of a 15 s clip and you get 15 s, which can break a spot.
- Video upscale hold: omit duration_seconds and Sume reserves 5 s
Sume video upscale reserves from duration_seconds, or 5 seconds when you omit it. Hold table for 5, 15 and 30 seconds at $0.009 per second and the 402 case.
- Vidu Q4 or LTX on Sume? Check the video model list first
Sume does not list Vidu or LTX in its video catalog as of 2026-10-08. Query GET /v1/videos/models and filter by id; a short script and the 12 ids it returns.
Written by Sume