---
title: "Ingredients to Video"
method: POST
path: "/v2/veo/ingredients-to-video"
tags: ["Veo V2"]
---

# Ingredients to Video

`POST /v2/veo/ingredients-to-video`

## Request

- Base URL: `https://genaipro.io/api`
- URL: `https://genaipro.io/api/v2/veo/ingredients-to-video`
- Auth: HTTP bearer
- TypeScript: <https://skmtc.dev/genaipro/apis/genaipro-api/docs/v2/veo/ingredients-to-video/post.ts> (a function with typed inputs; its response is checked against the schema)

Generate video from 1–3 reference images and a text prompt. Returns immediately with `202 Accepted`.

> **Rate limit:** 30 requests/minute — shared across all four Veo creation endpoints.

## Request body `multipart/form-data`

- object
  - `reference_images` string[], required: Reference image files (1–3 images, each max 20MB)
  - `prompt` string, required: Text description to guide the video generation
  - `aspect_ratio` 'VIDEO_ASPECT_RATIO_LANDSCAPE' | 'VIDEO_ASPECT_RATIO_PORTRAIT': Video aspect ratio
  - `number_of_videos` string, required: Number of videos to generate (1–4). Sent as string in form data.
  - `model` 'veo' | 'omni_flash': Video model — `veo` (default) or `omni_flash` (Omni 1.1, see *Video models* in the Veo V2 tag). `403 omni_disabled` if Omni is not enabled for your account.
  - `duration` '4' | '6' | '8' | '10': Omni only — clip length in seconds. Sent as string in form data.
  - `resolution` '360p' | '720p' | '1080p': Omni only — output resolution (`1080p` = 720p + upscale; `upscale_resolution` is ignored for Omni).
  - `watermark` string: Omni only (`true`/`false`, sent as string in form data) — cheaper clip with a ✦ watermark. Requires `resolution` `720p` or `1080p`.
  - `upscale_resolution` '' | 'none' | '1080p': Optional upscale resolution. Leave empty or `none` to disable upscale. `4k` is not supported for video and returns 400. Veo only — ignored for `omni_flash` (use `resolution` instead).
  - `callback_url` string: Optional webhook URL. When the task reaches a terminal state (`completed` or `failed`), GenAIPro POSTs the task status (same shape as `GET /v2/veo/tasks/{id}`) to this URL.

## Response `202`

Task accepted for processing. Returns exactly one history item representing the parent task; use its `id` to poll `GET /v2/veo/tasks/{id}`.

- object
  - `histories` VeoV2History[]
    - `id` string: Task ID (use for polling via `GET /v2/veo/tasks/{id}`)
    - `prompt` string: The prompt used for generation
    - `file_url` string: URL of the generated file (empty while processing)
    - `status` 'processing' | 'completed' | 'failed': Task status
    - `created_at` string, date-time: Timestamp when the task was created

## Other responses

- `400`: Invalid request
- `429`: Rate limit exceeded

## Changes

- **2026-10-07** `031a52a1288b`: 4 info
  - added the new optional request property `duration`
  - added the new optional request property `model`
  - added the new optional request property `resolution`
  - added the new optional request property `watermark`
- **2026-09-16** `c2782cee0caa`: 4 info
  - added the optional property `code` to the response with the `429` status
  - added the optional property `limit` to the response with the `429` status
  - added the optional property `retry_after` to the response with the `429` status
  - added the optional property `window_seconds` to the response with the `429` status

[Operation history](https://skmtc.dev/genaipro/apis/genaipro-api/changes/v2/veo/ingredients-to-video/post.md)

---

[API](https://skmtc.dev/genaipro/apis/genaipro-api.md) - [All operations](https://skmtc.dev/genaipro/apis/genaipro-api/llms.txt) - [OpenAPI document](https://skmtc.dev/genaipro/apis/genaipro-api/revisions/74e909d7c324?raw)
