Home › Guides › Veo cost strategy

Engineering your Veo spend: drafts, caching, tier gates

Updated 2026-10-02

The existing variant comparison explains how Veo 3.1, Fast and Lite differ. This page is about what to build around them. Per-second price is only one input to your bill. The number of generations you run, how many you throw away, and whether you ever pay for the same shot twice usually matter more.

Know where the money goes

Video is billed once at job creation from the requested duration_secs, plus a 2% platform fee, and polling is free. Jobs that fail upstream are not billed. So the cost of a shot is the sum of every attempt that succeeded and was not used. Three levers follow:

  1. Price per second (variant, resolution, host).
  2. Seconds per attempt (clip length requested).
  3. Attempts per accepted shot (your retry factor).

Tier choice moves lever 1. A good pipeline mostly works on levers 2 and 3.

Lever 1: price, per variant and per host

Do not assume the host that is cheapest for one variant is cheapest for the others. Check each variant separately in the live table:

ModelCheapest hostPriciest hostCheapest isHosts
google/veo-3.1 (2160p)Pika
$0.2 / second
MachGen
$0.6 / second
67% lower7
google/veo-3.1-fast (2160p)Replicate
$0.1 / second
MachGen
$0.3 / second
67% lower7
google/veo-3.1-lite (1080p)SandBase
$0.03 / second
WaveSpeedAI
$0.08 / second
62% lower3

Per second, before VideoRouter's 2% platform fee. For tiered models each row compares the resolution tier with the widest host-to-host gap. Built 2026-10-02 from the live catalog.

Leaving routing automatic sends each request to the cheapest healthy host and fails over if a submission is rejected. Pin a host only when you need consistent behaviour, since pinning gives up some of that price advantage. For image input or a specific resolution, confirm the host supports it first.

Lever 2: draft short and small

Because you pay for requested seconds, a draft does not need the full runtime. Prototype motion with the shortest clip that shows it, at the lowest resolution you can judge, on the cheapest variant. Only the final render should carry the full length and delivery resolution. Be aware that some hosts ignore the resolution and aspect_ratio fields, so verify what you actually received before you decide a draft was "cheap".

Lever 3: a promotion ladder with a budget per stage

Treat the three variants as stages with explicit exit criteria:

StageModel idGoalExit rule
Exploregoogle/veo-3.1-liteDoes the prompt produce the intended motion at all?Max attempts per concept, then rewrite the prompt
Refinegoogle/veo-3.1-fastIs it good at delivery resolution?One or two attempts, then promote or drop
Finalgoogle/veo-3.1Produce the deliverableRender once; re-render only on a defect

A cheaper stage is a preview of intent, not a guarantee of the final pixels, so keep a human or an automated check between Fast and full. Skipping that check is how teams end up paying for finals they reject.

Cache accepted shots

The cheapest generation is the one you do not run. Once a shot is accepted, store it keyed by the inputs that define it:

import hashlib, json

def shot_key(model, prompt, duration, aspect, resolution, image_sha=None):
    payload = json.dumps(
        [model, prompt, duration, aspect, resolution, image_sha],
        sort_keys=True,
    )
    return hashlib.sha256(payload.encode()).hexdigest()

def get_or_generate(store, submit_and_wait, **params):
    key = shot_key(**params)
    hit = store.get(key)
    if hit:
        return hit            # already paid for, no new job
    url = submit_and_wait(**params)
    store.put(key, copy_to_own_storage(url))
    return store.get(key)

Copy the file to your own storage when the job completes instead of keeping only the provider URL. Use the image hash in the key for image-to-video so a swapped source image is not served a stale clip. Caching also protects you from the most common double-spend: a user pressing "regenerate" on an unchanged request.

Gate the expensive tier per key and per user

See the quickstart for the key setup.

Avoid paying twice by design

The opt-in failover.on_timeout_sec option resubmits a stalled job to another host without cancelling the original, and both attempts are billed if both land. That can be worth it for a deadline-critical final. It is a poor default for drafts, where waiting longer is cheaper than hedging. Likewise, retry loops on your side should key off failed or specific error codes, never off a slow job, because a slow job is still running and still billed.

A minimal budget guard

Track estimated spend per project before submitting. You can compute an estimate from the live per-second price and the requested duration, and refuse the call if it would exceed the project budget. Combined with the allow-list and cap above, that gives three independent layers: your app, the key, and the account balance. The numbers belong in your config or your finance sheet, not in prose, so pull them from the live pricing page when you set it up. Create a key at videorouter.sh/signup and start with the draft stage.

Frequently asked questions

What is the cheapest way to iterate on Veo prompts?

Draft on google/veo-3.1-lite with short clips at a low resolution, promote good prompts to Fast, and render only approved shots on the full model. Billing is by requested seconds, so shorter drafts cost less.

Am I billed for failed Veo jobs?

Jobs that fail upstream are not billed. A successful job you later discard is billed, which is why drafts and caching matter.

How do I stop a bug from spending on the flagship tier?

Give each API key a model allow-list and a monthly spend cap. Disallowed models return 403 and a reached cap returns 402.

Should I enable timeout failover for drafts?

Generally no. The hedge resubmits to a second host without cancelling the first, and both attempts are billed if both finish. Reserve it for deadline-critical finals.

Keep reading

Using Veo is one part of the job.

VideoRouter puts it next to dozens of other video and image models behind one API key, so you can compare providers, prices and fail over automatically. Compare providers on VideoRouter →