Omni Flash 4K, 10 seconds: a webhook-mode /v1/videos request body
One curl body for gemini-omni-flash-1.1 at 4K, 16:9, 10 seconds with audio and a callback_url, plus what the docs say the submit reserves and what it cannot.

The request below asks gemini-omni-flash-1.1 for the longest clip the catalog allows, 10 seconds, at 4K and 16:9, with audio, and gives a callback_url so you need not poll. Sume's docs list 3 to 10 seconds, 360p to 4K, and 16:9 or 9:16 for this model. Google's Omni page says its 1080p and 4K outputs are upscaled, so 4K here is a delivery size, not a native render.
The fields
resolution and aspect_ratio replace the size string some APIs use; size returns 400 on this route. generate_audio defaults to the model's own audio capability, so send it only to be explicit.
| Field | Value | Note |
|---|---|---|
| model | gemini-omni-flash-1.1 | From GET /v1/videos/models |
| duration | 10 | Catalog range is 3 to 10 |
| resolution | 4K | Also 360p, 720p, 1080p |
| aspect_ratio | 16:9 | Or 9:16 |
| callback_url | HTTPS URL | Signed job webhook on terminal state |
The call
Set SUME_API_KEY, swap the placeholder hook URL, and run it. A good response is 202 with an id and a polling_url. The Idempotency-Key means a retry of this exact body returns the same job.
curl -sS https://api.sume.com/v1/videos \
-H "Authorization: Bearer $SUME_API_KEY" -H "Content-Type: application/json" \
-H "Idempotency-Key: omni-4k-0001" \
-d '{
"model": "gemini-omni-flash-1.1",
"prompt": "slow dolly past a rain-streaked neon sign",
"duration": 10,
"resolution": "4K",
"aspect_ratio": "16:9",
"generate_audio": true,
"callback_url": "https://hooks.example.com/sume"
}'What to expect from the money and the wait
At submit, Sume reserves the provider list price times 1.25, and usage.cost on the completed job is the amount billed. A 402 insufficient_credits at submit means the reserve could not be held, and nothing started.
The webhook is terminal-only: job.completed, job.failed or job.canceled, with no progress events. A 4K, 10-second render can take a while, so keep a status poll as a backup and do not set a short client timeout that gives up on the job.
Sources
Related posts
More in Developers
- Gemini Omni Flash edit on Sume: a Python preflight for bad fields
A 29-line Python preflight for Sume video-router edit requests on gemini-omni-flash-1.1: catches the fields the docs say it rejects before you pay for a job.
- Two failure channels in the Sume SDK: submit error vs failed job
A generateVideoV1 error means no job exists; a failed job means one did and billing was settled. Handle both channels in TypeScript without double-submitting.
- generation_spend_cap_usd on a Format run: null is $500, 0 is a 400
On a Format run request, omit generation_spend_cap_usd for the Format cap, send a number up to 500, null for the $500 maximum. 0 or above 500 returns 400.
- Get transcript text from a captioned video: caption jobs return none
A Sume caption job returns the burned video, not the transcript. For text and word times run STT or video inspect with transcribe. Prices and a recipe.
Written by Sume