# Video

URL: https://bridge.wekoya.tech/docs/video
Updated: 2026-11-08

> Filmed-looking clips with sound, from a description and optionally a first frame, by Google's Veo, on POST /v1/videos/generations. A video takes from about…

Filmed-looking clips with sound, from a description and optionally a first frame, by Google's Veo, on `POST /v1/videos/generations`. A video takes from about ten seconds to a few minutes, so you get an id at once and ask for it with `GET /v1/videos/generations/<id>` until `status` is `succeeded` or `failed`; or listen for the `video.succeeded` and `video.failed` webhooks.

```
# Start a video: answered at once with an id
curl https://wekoya-api.wekoya.tech/v1/videos/generations \
  -H "Authorization: Bearer $WEKOYA_API_KEY" -H "Content-Type: application/json" \
  -d '{ "model": "veo-3.1-fast", "prompt": "A chef plating jollof rice in a busy Lagos kitchen, close-up",
        "duration_seconds": 8, "aspect_ratio": "9:16" }'

{ "id": "video_8f1c…", "object": "video.generation", "status": "queued", "held": { "amount": 1404, "currency": "NGN" }, … }

# Ask until it is done (every 10 seconds is plenty; most take 20 s to 2 min)
curl https://wekoya-api.wekoya.tech/v1/videos/generations/video_8f1c… -H "Authorization: Bearer $WEKOYA_API_KEY"

{ "id": "video_8f1c…", "status": "succeeded", "duration_seconds": 8, "aspect_ratio": "9:16", "resolution": "720p",
  "video": { "url": "https://wekoya-api.wekoya.tech/files/videos/8f1c….mp4?token=…",
             "mime_type": "video/mp4", "expires_at": "2026-10-18T15:02:11.000Z" },
  "wekoya": { "cost": 1404, "currency": "NGN" } }
```

- `model`: `veo-3.1-fast` (the default), `veo-3.1-lite` (cheapest) or `veo-3.1` (best).
- `duration_seconds`: 4, 6 or 8 (the default). `aspect_ratio`: `16:9` (the default) or `9:16`; square is not available.
- `resolution`: `720p` (the default), `1080p` or `4k`; the last two only at 8 seconds, and Lite makes no 4K.
- `image`: the first frame, as base64, a data URL or an https address (PNG, JPEG or WebP).
- Veo always adds a soundtrack; `audio: false` is refused. Mute the video when you play it if you do not want sound.

#### The video
`video.url` plays in a `<video>` tag or a browser with no key, and seeking works. It stops working at `expires_at`, two days after the video was made: Bridge keeps no copy, so download it and store it yourself if you need it longer. With your key, `GET /v1/videos/generations/<id>/content` returns the same file. `GET /v1/videos/generations` lists your recent videos. Up to 10 at once per account.

#### What it costs
Per second of video, by model and resolution: see [Models & pricing](https://bridge.wekoya.tech/models), or `GET /v1/models?type=video`. The price for the seconds you ask for is held when the video starts and charged when it is made. A video that fails or is blocked by the safety rules costs nothing (`error.code` says which: `content_policy`, `generation_failed` or `timed_out`). Guest keys need the `videos` use.
