Veo 3.1 request on Sume: 720p, 4, 6 or 8 seconds, in Python
A working POST /v1/videos call for veo-3.1-lite with 6 seconds, 9:16 and no audio, the rates for the three Veo rows, and what Sume rejects.

To call Veo 3.1 on Sume, POST to https://api.sume.com/v1/videos with model set to veo-3.1, veo-3.1-fast or veo-3.1-lite, a prompt, a duration of 4, 6 or 8, a 720p resolution and a 16:9 or 9:16 ratio. Sume's Veo rows are text-to-video only, at 720p, with audio on by default and a lower rate when generate_audio is false.
Google describes Veo 3.1 as a model for generating video with native audio, with extension, frame-specific generation and image direction (Gemini API video docs, read 2026-10-10). Sume's rows expose only the text-to-video mode that was proven end to end, so the extra modes are not available here.
The request
The script below submits a 6-second vertical clip without audio on the Lite row, polls the job and prints the download URL. It reads the key from SUME_API_KEY and uses the documented poll fields status and unsigned_urls.
import os, time, requests
H = {"Authorization": "Bearer " + os.environ["SUME_API_KEY"]}
body = {
"model": "veo-3.1-lite",
"prompt": "A paper boat drifting down a rainy street gutter, shallow focus",
"duration": 6,
"resolution": "720p",
"aspect_ratio": "9:16",
"generate_audio": False,
}
job = requests.post("https://api.sume.com/v1/videos", headers={**H, "Idempotency-Key": "veo-demo-001"}, json=body).json()
print(job.get("id"), job.get("status"))
while True:
time.sleep(30)
s = requests.get(job["polling_url"], headers=H).json()
if s["status"] in ("completed", "failed", "cancelled"):
break
print(s["status"], s.get("unsigned_urls"), s.get("error"))Rates and a 6-second example
Sume's catalog stores Veo list rates per output second at 720p, taken from the Vertex list on 2026-10-08, and bills them times 1.25. A 6-second clip reserves the figures in the last column.
| Row | List with audio | List without audio | 6 s billed with audio | 6 s billed without audio |
|---|---|---|---|---|
| veo-3.1 | $0.40 | $0.20 | $3.00 | $1.50 |
| veo-3.1-fast | $0.10 | $0.08 | $0.75 | $0.60 |
| veo-3.1-lite | $0.05 | $0.03 | $0.375 | $0.225 |
What Sume refuses
The schema rejects these before any reserve:
- Any duration other than 4, 6 or 8 (default 8).
- Any resolution other than 720p.
- Any ratio other than 16:9 (default) or 9:16.
- Image, first or last frame, reference or
video_urlinputs, andbitrate_mode. provider.options(every v1 row reports an emptyallowed_passthrough_parameters).
Check the row exists first
A Veo row appears in GET /v1/videos/models only where the Google Cloud route is configured, so read that list before you hard-code an id. If you need 10 seconds, 1080p or 4K, Gemini Omni Flash 1.1 is the Sume row for that (3 to 10 seconds, up to 4K); the Gemini API pricing page (read 2026-10-10) lists Veo 3.1 4K and 1080p tiers that Sume does not offer.
Sources
Related posts
More in Developers
- Vercel skipMiddlewareRequestBody and a Sume webhook route
Vercel's Oct 8 skipMiddlewareRequestBody stops sending request bodies to Routing Middleware. What it means for a Sume webhook route that signs the raw body.
- Verify a canceled Sume job was refunded: read the usage ledger by job
After you cancel a queued job, check GET /v1/usage with job_id and read the row status: reserved, captured or refunded. A Python script prints the answer.
- A video model row missing from Sume's list: why, and how to check
Veo and Genjutsu list in the Sume catalog only where their provider route is configured. How listing works, plus a Python check that fails on a missing id.
- Video-trim says unsupported_media_source: which Sume routes take URLs
Trim, filter and compose need a media.sume.com clip; upscale, STT, RMBG and captions take public HTTPS URLs. Imports take TikTok and Instagram. Read 2026-10-10.
Written by Sume