---
title: "Generate a video clip (Veo 3.1 · Gemini Omni)"
method: POST
path: "/v1/ai/video"
tags: ["Video"]
---

# Generate a video clip (Veo 3.1 · Gemini Omni)

`POST /v1/ai/video`

## Request

- Base URL: `https://apihub.co.il`
- URL: `https://apihub.co.il/v1/ai/video`
- Auth: HTTP bearer

Text-to-video or image-to-video, 9:16 or 16:9, with sound. Veo 3.1 / Fast / Lite: 4–8 s. Gemini Omni (`model: "gemini-omni-1.1-flash"`), Google's newest video model: sound with speech in the language you quote, readable text in the frame, a start frame (and a last frame) or up to 3 reference images, 360p–4k; it picks the length itself (3–10 s) and is billed by what it made. Asynchronous (about 1–3 minutes) — wait with x-wait-ms or poll the execution. The clip is hosted for you and can go straight into /v1/studio/*. Until an account has bought credits once: Veo 3.1 (`quality: "best"`, or named) runs as Veo 3.1 Fast — estimated and charged as Fast, and the clip's answer says so in `model_note` (`model_note_he` in Hebrew) — and a call that names Gemini Omni answers 402 `top_up_required` with the account's top-up page in `details.top_up`.

**Billing:** Per generated second, by model and resolution · **Rate limit:** 10/min · **Asynchronous**

## Headers

- `Idempotency-Key` string
- `X-Tag` string
- `x-wait-ms` integer

## Request body

- object
  - `model` 'auto' | 'veo-3.1-generate-preview' | 'veo-3.1-fast-generate-preview' | 'veo-3.1-lite-generate-preview' | 'gemini-omni-1.1-flash': A model id (GET /v1/ai/models) or "auto" — then the clip is made with gemini-omni-1.1-flash at the resolution you send (Veo 3.1 can still be named until Google retires it, from 22 October 2026). "gemini-omni-1.1-flash" = Gemini Omni, Google's newest video model: sound with speech (put the line in quotes in the prompt), readable text in the frame, reference images; it picks the length itself (3–10 s)
  - `ultra` boolean: ULTRA: true = the clip is made with Gemini Omni (gemini-omni-1.1-flash) at 1080p or higher (4k stays 4k), whatever model and resolution are sent; a Veo model named becomes Omni at the duration asked, at 3× the credits of the same request without ULTRA (the estimate's `ultra` block shows both prices — POST …/estimate before you run it). Only for accounts that have bought credits at least once (402 ultra_paid_only, with the account's top-up page in details.top_up) and where ULTRA is switched on (else 403 ultra_unavailable). Nothing is charged when it is refused.
  - `prompt` string, required
  - `quality` 'fast' | 'balanced' | 'best': Which model auto picks: fast (cheapest) · balanced (default) · best (strongest, costs more)
  - `duration` '3' | '4' | '5' | '6' | '7' | '8' | '9' | '10': seconds: Veo renders 4, 6 or 8; gemini-omni-1.1-flash 3–10. gemini-omni-1.1-flash keeps this length when the call names no model or sends duration; a call that names gemini-omni-1.1-flash without duration lets it pick 3–10 s (a spoken line takes as long as it takes)
  - `image_url` string, uri: Start frame (image-to-video)
  - `resolution` '360p' | '720p' | '1080p' | '4k': Veo: 720p, 1080p or 4k (1080p and 4k need duration 8). gemini-omni-1.1-flash: 360p, 720p, 1080p or 4k
  - `aspect_ratio` '16:9' | '9:16'
  - `last_frame_url` string, uri: gemini-omni-1.1-flash only, with image_url: the last frame — the clip moves from the first image to this one
  - `negative_prompt` string
  - `reference_images` string[]: gemini-omni-1.1-flash only: up to 3 images of people, products or places to put in the clip (not a start frame) — refer to them in the prompt as <IMAGE_REF_0>, <IMAGE_REF_1>, <IMAGE_REF_2>

## Response `200`

Completed (or 202 while processing)

- object
  - `id` string: Execution id — stable across internal retries; use it with GET /v1/executions/{id}
  - `status` 'pending' | 'processing' | 'completed' | 'partial' | 'failed' | 'cancelled' | 'timeout'
  - `operation` string
  - `tag` string, nullable: Your X-Tag, if sent
  - `created_at` string, date-time
  - `completed_at` string, date-time, nullable
  - `output` object: Operation result (see each operation). While a Studio render is processing: `stage` (queued · transcribing · downloading · preparing · cleaning_voice · mixing_audio · rendering · finishing), `phase` (the engine's: download · prepare · voice · audio · encode · qa · upload, or null), `progress` (a percent, 0–100) and `progress_fraction` (0–1), `eta_seconds` (seconds left, never below 0) and `estimate_seconds`
  - `error` string, nullable
  - `usage` object
    - `credits_charged` number, nullable
    - `credits_reserved` number
    - `estimated_credits` number
    - `cost_source` 'provider_reported' | 'calculated' | 'estimated' | 'null', nullable
    - `provider_usage` object, nullable: Normalised consumption, e.g. { VIDEO_SECOND: 22.4 }
  - `balance` object
    - `available` number
    - `reserved` number

## Other responses

- `202`: Processing — poll GET /v1/executions/{id}
- `400`: Invalid input
- `402`: Insufficient credits / project budget
- `404`: Resource not found (or not yours)
- `429`: Rate limited
- `503`: Service temporarily paused

---

[API](https://skmtc.dev/apihub/apis/apihub-one-api-for-chat-image-video-ai.md) · [All operations](https://skmtc.dev/apihub/apis/apihub-one-api-for-chat-image-video-ai/llms.txt) · [OpenAPI document](https://skmtc.dev/apihub/apis/apihub-one-api-for-chat-image-video-ai/revisions/a8caa42835ce?raw)
