Build the pricing_skus key from the resolution string: 4K is uppercase
Omni Flash 1.1 rates sit at per-video-second-360p, -720p, -1080p and -4K. Build the key from a template, mind the 4K case, total 10 s from $0.375 to $3.75.

The per-second pricing key is per-video-second- plus the resolution string exactly as the API spells it, so Gemini Omni Flash 1.1 has per-video-second-360p, -720p, -1080p and -4K. Build the key with a template and keep 4K uppercase, or the lookup returns nothing and the price looks like zero.
The Omni ladder
Gemini Omni Flash 1.1 runs 3 to 10 s at 360p, 720p, 1080p and 4K, in 16:9 or 9:16, with audio always on. The same template works for Wan 3.0 (480p, 720p, 1080p) and MiniMax H3 (480p, 768p).
The totals below are for a 10 s clip, which is the model's maximum.
| Resolution | SKU key | Rate per second | 10 s total |
|---|---|---|---|
| 360p | per-video-second-360p | $0.0375 | $0.375 |
| 720p | per-video-second-720p | $0.125 | $1.25 |
| 1080p | per-video-second-1080p | $0.1875 | $1.875 |
| 4K | per-video-second-4K | $0.375 | $3.75 |
The lookup
Fail loudly on a missing key. A silent undefined multiplied by seconds gives a non-number that slips past most budget checks.
type Model = { id: string; pricing_skus: Record<string, string> };
export function clipUsd(m: Model, res: string, seconds: number): number {
const rate = m.pricing_skus[`per-video-second-${res}`];
if (rate === undefined) {
throw new Error(`${m.id}: no sku for ${res}`);
}
return Math.round(Number(rate) * seconds * 1e4) / 1e4;
}
// clipUsd(omni, "4K", 10) -> 3.75Gotchas
The 4K spelling matters in the request too: resolution is an enum, and the lowercase form is not on it. Some models have a flat per-video-second key with no resolution suffix, so try that as a fallback and decide whether to throw.
Round the final money value, not the rate. The rates are four-decimal strings and a float multiplication can leave noise.
Sources
Related posts
More in Developers
- Which Sume API routes work without a key? Six public routes
Six Sume routes need no API key, including GET /v1/catalog and GET /v1/health. What they return, how they are limited, and a Python preflight for CI.
- Can polling hit the Sume read limit? 24 Pro jobs at 2 s use 6%
Polling every accepted job every 2 seconds uses 3.75% to 7.5% of a Sume plan's read budget. The arithmetic for Free, Pro, Startup and Scale, with the caveats.
- Cancel 12 queued Sume jobs: 12 writes, and a 409 that is not an error
Cancel is a write, only works before generation starts, and returns 409 job_generation_already_started after. A Python sweep that treats 409 as fine.
- Caption a 61-second clip: the $0.20 Sume price is for 60 seconds
Sume's docs say the $0.20 caption job price is for videos of at most 60 seconds. For a 61-second clip, trim first for $0.02 or check the live catalog price.
Written by Sume