Skip to main content
IDProviderPrice/secDefaultMaxAudioAspect ratios
google/veo-3.1Google$0.408s8s16:9, 9:16
google/veo-3Google$0.208s8s16:9, 9:16
fal/veo-3.1fal.ai$0.408s8s16:9, 9:16
fal/runway-gen-4fal.ai$0.055s10s16:9, 9:16, 4:3
fal/luma-ray-2fal.ai$0.205s9s16:9, 9:16, 1:1
fal/kling-2fal.ai$0.045s10s16:9, 9:16, 1:1
fal/hailuo-02fal.ai$0.046s10s16:9, 9:16

Example cost

For 5 seconds at FX $20 MXN/USD:
ModelTotal cost
Kling 25 × $0.04 × 1.05 × 20 = $4.20 MXN
Hailuo 025 × $0.04 × 1.05 × 20 = $4.20 MXN
Runway Gen-45 × $0.05 × 1.05 × 20 = $5.25 MXN
Luma Ray 25 × $0.20 × 1.05 × 20 = $21.00 MXN
Veo 35 × $0.20 × 1.05 × 20 = $21.00 MXN
Veo 3.1 (with audio)5 × $0.40 × 1.05 × 20 = $42.00 MXN

When to use each

Cheapest for iterating

Kling 2 or Hailuo 02. $0.04/sec, decent for varying prompts.

Quality/price sweet spot

Runway Gen-4 Turbo. $0.05/sec with solid quality and good prompt-following.

For high cinematic quality

Luma Ray 2 or Veo 3. $0.20/sec, better temporal coherence.

For included audio

Only Veo 3.1. The only provider with generated foley + ambience.

Usage pattern

See Video overview for the full submit + polling flow.
job = client.post("/videos/generations", body={
    "model": "fal/kling-2",
    "prompt": "...",
    "duration": 5,
})

# Poll every 15s until completed or failed
while True:
    s = client.get(f"/videos/{job['id']}")
    if s["status"] in ("completed", "failed"):
        break
    time.sleep(15)

Built-in storage

Same as images: generated videos are persisted in your Supabase Storage with a public URL that doesn’t expire.