Google's newer Omni video model, served as one model id with four modes chosen by the fields you send: a prompt alone is text-to-video; first_frame_url (plus an optional last_frame_url) is first/last-frame image-to-video; images (up to 7 references), audio_ids and character_ids drive reference-to-video; video_list with a source clip of 10 seconds or shorter is video editing. Every mode outputs 720p / 1080p / 4K with a synced audio track, 4 / 6 / 8 / 10 seconds, 16:9 or 9:16. Billed per output second — 720p $0.07/s, 1080p $0.10/s, 4K $0.20/s — at least 30% below Google's official $0.10 / $0.15 / $0.30; video-input generations are a flat $0.70 / $1.05 by resolution.
| What you send | Mode | Billing |
|---|---|---|
| prompt | Text-to-video | rate × duration |
| first_frame_url (+ last_frame_url) | First / last-frame image-to-video | rate × duration |
| images (≤7) · audio_ids · character_ids | Reference-to-video | rate × duration |
| video_list (1 clip ≤10s) | Video edit (output length follows the clip) | flat $0.70 (720p/1080p) · $1.05 (4K) |
Upstream constraint: first/last frames cannot be combined with images / video_list / audio_ids / character_ids, and a last frame needs a first frame. Such requests return a 400 at creation — nothing queued, nothing charged.
| Resolution | apimodels.app | Google official | 8-second clip | Video input (flat) |
|---|---|---|---|---|
| 720p | $0.07/s | $0.10/s | $0.56 | $0.70 |
| 1080p | $0.10/s | $0.15/s | $0.80 | $0.70 |
| 4K | $0.20/s | $0.30/s | $1.60 | $1.05 |
360p is not offered. Only successful generations are charged; failures and safety rejections are refunded automatically.
POST /api/v1/video/generations — async: create, then poll the same endpoint (or pass callback_url), same flow as the rest of the video family.
# 1) Text-to-video — a prompt alone
curl -X POST https://api.apimodels.app/v1/video/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-omni-1.1-flash",
"prompt": "a street food stall at night, steam rising, handheld camera pushing in, warm neon",
"duration": "8",
"resolution": "720p",
"aspect_ratio": "16:9"
}'
# 2) First / last frame — anchor the opening (and optionally the closing) frame
curl -X POST https://api.apimodels.app/v1/video/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-omni-1.1-flash",
"prompt": "the product slowly rotates while the lighting shifts from cool to warm",
"first_frame_url": "https://example.com/first.jpg",
"last_frame_url": "https://example.com/last.jpg",
"duration": "6",
"resolution": "1080p"
}'
# 3) Reference-to-video — up to 7 reference images (characters, products, scenes, styles)
curl -X POST https://api.apimodels.app/v1/video/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-omni-1.1-flash",
"prompt": "the character from image 1 walks through the scene from image 2, cinematic",
"images": ["https://example.com/character.jpg", "https://example.com/scene.jpg"],
"duration": "8",
"resolution": "720p",
"aspect_ratio": "9:16"
}'
# 4) Video edit — a source clip of 10s or shorter (trim a longer source with start / ends)
curl -X POST https://api.apimodels.app/v1/video/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-omni-1.1-flash",
"prompt": "make it snow outside the window, keep the person, lighting and camera motion unchanged",
"video_list": [{ "url": "https://example.com/source.mp4", "start": 0, "ends": 8 }],
"resolution": "720p"
}'
# Poll (shared with the rest of the video family)
curl "https://api.apimodels.app/v1/video/generations?task_id=TASK_ID" \
-H "Authorization: Bearer YOUR_API_KEY"| Field | Required | Type | Description |
|---|---|---|---|
| model | Yes | string | "gemini-omni-1.1-flash" |
| prompt | Yes | string | Scene, action, camera, style and audio direction (dialogue / music / ambience); up to 20000 characters |
| duration | No | string | "4" / "6" / "8" / "10" (default "8"). Ignored when video_list is passed — the output length follows the clip |
| resolution | No | string | "720p" (default) / "1080p" / "4k"; 360p is not offered |
| aspect_ratio | No | string | "16:9" (default) or "9:16" |
| first_frame_url | No | string | First frame (URL or base64, ≤20MB) → image-to-video. Mutually exclusive with images / video_list / audio_ids / character_ids |
| last_frame_url | No | string | Last frame; requires first_frame_url — the model interpolates between the two |
| images | No | array | Reference images (URL or base64, ≤20MB each, up to 7) → reference-to-video. image_urls / reference_image_urls are accepted aliases |
| video_list | No | array | Source clip, max 1: [{ url, start, ends }]. Source ≤100MB and ≤30s; the trimmed window (ends − start) must be ≤10s, and start / ends are required when the source is longer than 10s. A video_url string is accepted too |
| audio_ids | No | array | Voice IDs (max 3) created via POST /api/v1/omni/audio |
| character_ids | No | array | Character IDs (max 3) created via POST /api/v1/omni/character; each takes 1 quota slot |
| seed | No | number | Random seed in [0, 2147483647] |
| callback_url | No | string | Webhook URL called when the task completes |
gemini-omni-1.1-flash is billed per output second: 720p $0.07/s, 1080p $0.10/s and 4K $0.20/s, so an 8-second 720p clip is $0.56 and a 10-second 4K clip is $2.00. Google's official rate is $0.10 / $0.15 / $0.30 per second, so every tier is at least 30% lower. When you pass a source video (video_list) the generation is a flat $0.70 at 720p/1080p or $1.05 at 4K regardless of length. 360p is not offered. Only successful generations are charged.
The backend routes by the fields you send. A prompt alone is text-to-video. first_frame_url (plus an optional last_frame_url) is image-to-video anchored to your frames. images (up to 7), audio_ids and character_ids drive reference-to-video. video_list with one clip of 10 seconds or shorter (trim a source of up to 30 seconds with start / ends) is video editing, where the output length follows the clip. The model string is always "gemini-omni-1.1-flash". One upstream constraint: first/last frames cannot be combined with references, voices, characters or a source video — such requests return a 400 at creation, nothing is queued or charged.
duration is "4", "6", "8" or "10" seconds (ignored when a source video is passed); resolution is "720p", "1080p" or "4k"; aspect_ratio is "16:9" or "9:16". Prompts can be up to 20000 characters. The per-job quota is images ×1 + videos ×2 + character_ids ×1 ≤ 7, with at most 1 video, 3 character_ids and 3 audio_ids. Reference images may be up to 20MB each, a source video up to 100MB and 30 seconds with a trimmed window of 10 seconds or shorter. Results are async: poll the same endpoint with ?task_id= or pass callback_url; result files are kept for 7 days.