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.

5 min readSume
All posts

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.

Billable cost of one 10-second 720p clip, as of 2026-10-08
Model idBasisBillable
gemini-omni-flash-1.1$0.10 per second x 10 = $1.00, x 1.25$1.25
seedance-2.5per video token, 9:16 at 720p$5.78
Ratio5.78 / 1.25about 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

All Developers posts

Written by Sume