Which AI video model for ads, product shots or talking heads?

On Sume, pick Wan 3.0 or Omni for ads, Kling 3 for silent product shots, and the Avatar Video route for talking heads. One table with rates and limits.

5 min readSume
All posts

For an ad with sound, pick gemini-omni-flash-1.1 ($0.125 a second at 720p) or wan-3.0; for a silent product shot at 1080p, pick kling-3 ($0.14); for a talking head with lip-synced speech, use the Avatar Video route, POST /v1/avatar-1.0/talking-video. Rates here are list times 1.25 from the Video Router guide, read 2026-10-05.

Veo, Luma Ray3.2, Runway and HappyHorse are not in the Sume catalog, so the table covers only models you can call.

One-table pick

Sume bills the provider list price times 1.25 and rounds the job up to the cent, so a one-second figure here is a rate, not a charge.

A Sume video model for each job (read 2026-10-05)
JobPickRate per secondWhy
Short ad with soundgemini-omni-flash-1.1$0.125 at 720pNative audio, first and last frame, references
Long or multi-ratio adwan-3.0$0.0625 to $0.252 to 30 s, five ratios, references
Silent product shotkling-3$0.14 at 1080pCheapest 1080p, first and last frame
Cheapest still-to-videogrok-imagine-video-1.5see usage.costNeeds a first frame, 480p or 720p, 4 to 15 s
Talking headAvatar Video routesee the avatar docsSpeech-driven face, not a general video row

Not sure

Leave model as sume/auto and the router picks, with gemini-omni-flash-1.1 as the default. Pin a model only once a job has a clear need, such as a ratio or a clip longer than 10 seconds.

Before you pin, call GET /v1/videos/models and check supported_durations, supported_aspect_ratios and supported_frame_images.

  • Sound needed, 10 s or less: Omni.
  • Over 10 s: Wan or Seedance 2.5.
  • Lip sync: Avatar Video.

Request

Let the router pick.

import os, time, requests

H = {"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"}
payload = {
    "model": "sume/auto",
    "prompt": "A founder holds the product up to camera in a bright studio",
    "duration": 5,
    "resolution": "720p",
}
job = requests.post("https://api.sume.com/v1/videos", headers=H, json=payload).json()
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("usage"))

Sources

Related posts

More in Use cases

All Use cases posts

Written by Sume