> ## Documentation Index
> Fetch the complete documentation index at: https://docs.geekhub.mx/llms.txt
> Use this file to discover all available pages before exploring further.

# Video models

> 7 video generation models with async polling

| ID                 | Provider | Price/sec | Default | Max | Audio | Aspect ratios   |
| ------------------ | -------- | --------- | ------- | --- | ----- | --------------- |
| `google/veo-3.1`   | Google   | \$0.40    | 8s      | 8s  | ✅     | 16:9, 9:16      |
| `google/veo-3`     | Google   | \$0.20    | 8s      | 8s  | ❌     | 16:9, 9:16      |
| `fal/veo-3.1`      | fal.ai   | \$0.40    | 8s      | 8s  | ✅     | 16:9, 9:16      |
| `fal/runway-gen-4` | fal.ai   | \$0.05    | 5s      | 10s | ❌     | 16:9, 9:16, 4:3 |
| `fal/luma-ray-2`   | fal.ai   | \$0.20    | 5s      | 9s  | ❌     | 16:9, 9:16, 1:1 |
| `fal/kling-2`      | fal.ai   | \$0.04    | 5s      | 10s | ❌     | 16:9, 9:16, 1:1 |
| `fal/hailuo-02`    | fal.ai   | \$0.04    | 6s      | 10s | ❌     | 16:9, 9:16      |

## Example cost

For 5 seconds at FX \$20 MXN/USD:

| Model                | Total cost                                |
| -------------------- | ----------------------------------------- |
| Kling 2              | `5 × $0.04 × 1.05 × 20` = **\$4.20 MXN**  |
| Hailuo 02            | `5 × $0.04 × 1.05 × 20` = **\$4.20 MXN**  |
| Runway Gen-4         | `5 × $0.05 × 1.05 × 20` = **\$5.25 MXN**  |
| Luma Ray 2           | `5 × $0.20 × 1.05 × 20` = **\$21.00 MXN** |
| Veo 3                | `5 × $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](/en/api-reference/videos/overview) for the full submit + polling flow.

```python theme={null}
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.
