gemini-omni-1-1
Gemini Omni 1.1 — Google's newest video model on one endpoint. Text, first-frame or reference images, three-image fusion, and reference-to-video at 360p, 720p, 1080p, or 4K. Flat per-generation billing.
Gemini Omni 1.1 — the versioned successor of gemini-omni,
exposed through reapi as a single async endpoint. Mode is implicit: the
counts of image_urls / video_urls pick text-to-video,
image-to-video, three-image fusion, or reference-to-video.
What 1.1 adds: a 360p draft tier, a generation_type switch that
decides whether one image is a locked first frame or a reference, and a
content_filter control. 4 to 10 second outputs at 360p, 720p, 1080p, or
4K. Flat per-generation pricing across every mode — see the
model page.
Quick example
curl https://reapi.ai/api/v1/videos/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-omni-1-1",
"prompt": "A ginger cat hops onto a sunlit kitchen counter, slow dolly-in",
"duration": 6,
"resolution": "1080p",
"aspect_ratio": "16:9"
}'import requests
resp = requests.post(
"https://reapi.ai/api/v1/videos/generations",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"model": "gemini-omni-1-1",
"prompt": "A ginger cat hops onto a sunlit kitchen counter, slow dolly-in",
"duration": 6,
"resolution": "1080p",
"aspect_ratio": "16:9",
},
timeout=30,
)
print(resp.json())const r = await fetch("https://reapi.ai/api/v1/videos/generations", {
method: "POST",
headers: {
Authorization: "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
model: "gemini-omni-1-1",
prompt: "A ginger cat hops onto a sunlit kitchen counter, slow dolly-in",
duration: 6,
resolution: "1080p",
aspect_ratio: "16:9",
}),
});
console.log(await r.json());package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
)
func main() {
body, _ := json.Marshal(map[string]any{
"model": "gemini-omni-1-1",
"prompt": "A ginger cat hops onto a sunlit kitchen counter, slow dolly-in",
"duration": 6,
"resolution": "1080p",
"aspect_ratio": "16:9",
})
req, _ := http.NewRequest("POST",
"https://reapi.ai/api/v1/videos/generations", bytes.NewReader(body))
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
out, _ := io.ReadAll(resp.Body)
fmt.Println(string(out))
}Submit response
{
"id": "task_01a04cbf7c25765daf9e00404ce84dc6",
"model": "gemini-omni-1-1",
"status": "processing",
"created_at": 1787994015
}Poll GET /api/v1/tasks/{id} (see the Tasks reference) until
status === "completed". The completed payload's output.video_urls
holds the generated MP4 URL, valid for 7 days.
Authentication
Every call needs a Bearer token. Generate keys at reapi.ai/settings/apikeys.
Authorization: Bearer YOUR_API_KEYKeys carry the active workspace's billing scope — there is no separate project header.
Endpoint
POST /api/v1/videos/generations
GET /api/v1/tasks/{id}Submission is async. The POST returns immediately with a task_id; the
task endpoint returns the same envelope until completion. Polling does
not consume credits.
What changed from gemini-omni
Same endpoint, same request shape, same task polling. Switching is a
one-line change in the model field. The differences:
| Area | gemini-omni | gemini-omni-1-1 |
|---|---|---|
resolution | 720p / 1080p / 4k | 360p / 720p / 1080p / 4k — 360p is a draft tier priced like 720p |
generation_type | not available (one image = first frame) | frame or reference — you choose how images are used |
content_filter | not available | boolean, pre-submit moderation of prompt + images |
| Price | see its model page | lower at every resolution × duration tier |
Google's announcement also lists scene extension and first-plus-last-frame interpolation; neither is exposed on this endpoint yet.
Mode routing
gemini-omni-1-1 picks its mode from the counts of image_urls and
video_urls you send — there is no mode parameter. generation_type
then decides what the images mean:
image_urls | video_urls | generation_type | Mode | What it does |
|---|---|---|---|---|
0 | 0 | — | Text-to-video | Generate from a prompt. |
1 | 0 | frame (or omitted) | Image-to-video | The image is the locked first frame; animate from it. |
1 | 0 | reference | Reference image | The image guides subject / style without pinning frame 1. |
3 | 0 | reference (or omitted) | Three-image fusion | Combine three references into one motion shot. |
0 / 1 | 1 | omitted or reference | Reference-to-video | Reference a source clip (≤ 30s) for motion / style. Flat per generation. |
Unsupported combinations.
image_urls = 2is rejected with400 image_urls cardinality 2 is not supported. Submit 0, 1, or 3 — there is no first/last-frame pair ongemini-omni-1-1.image_urls = 4or more is also rejected.generation_type = "frame"needs exactly one image, and cannot be combined withvideo_urls.generation_type = "reference"needs 1 or 3 images.video_urls = 2or more is rejected with400 video_urls accepts at most 1 entry.durationandvideo_urlscannot both be set. Reference-to-video mode reads the source clip's length; passingdurationalongside is rejected with400 duration and video_urls cannot both be set.
Request body
model — required
string. Must be "gemini-omni-1-1".
prompt — string, required
Up to 2,000 characters. Required in every mode. Empty / whitespace-only prompts are treated as missing.
Failure modes.
- Empty / missing →
400 prompt is required(code20002). - Longer than 2,000 chars →
400 prompt exceeds 2000 characters(code20007).
duration — integer, default 6
One of 4, 6, 8, 10 seconds. Other values are rejected with
400 duration must be one of 4, 6, 8, 10.
Reference-to-video mode ignores duration. When video_urls is set,
the output follows the source clip's length and duration must be
omitted. Passing both is rejected with
400 duration and video_urls cannot both be set.
resolution — string, default "720p"
360p / 720p / 1080p / 4k. Lowercase is canonical; uppercase forms
("4K") are accepted and normalized. Drives the per-generation rate —
360p, 720p and 1080p share the same price; only 4K is uplifted.
360p is the draft tier. Use it to iterate on prompts, framing and
motion, then resend the same request at 1080p or 4k for the keeper.
Drafts are billed as completed generations at the 720p rate.
aspect_ratio — string, default "16:9"
Output framing. One of:
| Value | Shape |
|---|---|
16:9 | Landscape |
9:16 | Portrait |
Unknown ratios are rejected with 400 invalid aspect_ratio.
size — string, alias for aspect_ratio
Accepted for parity with gemini-omni. If both are sent, they must match;
otherwise 400 aspect_ratio and size disagree. The reapi playground does
not surface size; the JSON body still accepts it.
generation_type — string, optional
How image_urls are used. Omit to keep the upstream default.
| Value | Images accepted | Meaning |
|---|---|---|
frame | exactly 1 | The image is the first frame; the clip animates from it. |
reference | 1 or 3 | The images are subject / style references; frame 1 is not pinned. |
frame cannot be combined with video_urls. Other values are rejected
with 400 invalid generation_type.
image_urls — string[]
Array of public HTTP(S) URLs. Allowed counts: 0, 1, or 3.
- 0 entries — text-to-video.
- 1 entry — image-to-video (
frame) or single reference (reference). - 3 entries — three-image fusion (
reference).
video_urls — string[]
Array of public HTTP(S) URLs. Allowed counts: 0 or 1.
- 0 entries — non-reference modes (text / image / fusion).
- 1 entry — reference-to-video. The source clip drives the output; it
must be ≤ 30 seconds (longer is rejected with
400). Billed at a flat per-generation rate (not per second).durationMUST be omitted in this mode;generation_type = "frame"is not allowed.
content_filter — boolean, optional
Pre-submit moderation of the prompt and input images. Omit to keep the
upstream default. When true, a request that trips the filter is refused
before any generation runs and nothing is charged.
No data: URIs. reAPI rejects base64 inputs platform-wide — every
URL field on this endpoint must be a public HTTP(S) URL. Upload to your
own object storage (S3, R2, OSS, …) and pass the URL.
Response envelope
Submit and poll share the same shape — only status and output fill in
over time.
{
"id": "task_01a04cbf7c25765daf9e00404ce84dc6",
"model": "gemini-omni-1-1",
"status": "completed",
"created_at": 1787994015,
"output": {
"video_urls": ["https://cdn.reapi.ai/media/tasks/task_01a04cbf7c25765daf9e00404ce84dc6/0.mp4"]
},
"error": null
}| Field | Type | Notes |
|---|---|---|
id | string | Task identifier — keep it for polling and audit |
model | string | Always "gemini-omni-1-1" (echo of the submitted model) |
status | string | processing / completed / failed |
created_at | integer | Submission unix timestamp |
output | object | null | null until completion. output.video_urls holds MP4s |
error | object | null | Populated on failed — { code, message } |
output.video_urls URLs are valid for 7 days. Re-host to your own
storage if you need them longer.
Validation errors
All cases below return HTTP 400 with code 20003 unless noted. Pattern-match
on code, not message — message strings carry request-specific context
and are not a stable contract.
| Trigger | Code | Message (illustrative) |
|---|---|---|
prompt missing or blank | 20002 | prompt is required |
prompt longer than 2,000 chars | 20007 | prompt exceeds 2000 characters |
image_urls length 2 | 20003 | image_urls cardinality 2 is not supported |
image_urls length > 3 | 20003 | image_urls accepts at most 3 entries |
generation_type = "frame" with 0 or 3 images | 20003 | generation_type=frame requires exactly 1 image_urls entry |
generation_type = "reference" with 0 images | 20003 | generation_type=reference requires 1 or 3 image_urls entries |
generation_type = "frame" together with video_urls | 20003 | generation_type=frame cannot be combined with video_urls |
duration not one of 4/6/8/10 | 20003 | duration must be one of 4, 6, 8, 10 |
Unknown resolution | 20003 | invalid resolution "X" (allowed: 360p / 720p / 1080p / 4k) |
Unknown aspect_ratio | 20003 | invalid aspect_ratio "X" (allowed: 16:9 / 9:16) |
aspect_ratio and size disagree | 20003 | aspect_ratio and size disagree; pass one or set them to the same value |
duration together with video_urls | 20003 | duration and video_urls cannot both be set |
image_urls carrying a data: URI or non-http(s) | 20003 | image_urls entries must be public http(s) URLs |
video_urls source clip longer than 30 seconds | 20003 | Reference video must be at most 30s (got Ns); trim the clip before submitting. |
The full envelope is { "error": { "code", "message", "request_id" } } —
see Errors catalog for the wire format and request_id
correlation tips.
Recipes
360p draft, then the 4K keeper
Send the draft first:
{
"model": "gemini-omni-1-1",
"prompt": "Macro shot of a butterfly landing on a pale pink blossom, golden backlight",
"duration": 6,
"resolution": "360p",
"aspect_ratio": "16:9"
}When the take works, change one field:
{
"model": "gemini-omni-1-1",
"prompt": "Macro shot of a butterfly landing on a pale pink blossom, golden backlight",
"duration": 6,
"resolution": "4k",
"aspect_ratio": "16:9"
}Image-to-video — lock the first frame
{
"model": "gemini-omni-1-1",
"prompt": "A ginger cat hops onto the counter and sniffs the plate, slow dolly-in",
"generation_type": "frame",
"image_urls": ["https://your-cdn.com/first_frame.jpg"],
"duration": 6,
"resolution": "1080p"
}Single reference image — guide the subject, free the framing
{
"model": "gemini-omni-1-1",
"prompt": "The same character walking through a rainy neon street, tracking shot",
"generation_type": "reference",
"image_urls": ["https://your-cdn.com/character.jpg"],
"duration": 8,
"resolution": "1080p"
}Three-image fusion
{
"model": "gemini-omni-1-1",
"prompt": "A man rides a wooden bicycle through the village market, handheld tracking shot",
"generation_type": "reference",
"image_urls": [
"https://your-cdn.com/village.jpg",
"https://your-cdn.com/character.jpg",
"https://your-cdn.com/bicycle.jpg"
],
"duration": 10,
"resolution": "1080p",
"aspect_ratio": "16:9"
}Reference-to-video — match a source clip
{
"model": "gemini-omni-1-1",
"prompt": "the same scene but at night with neon lights",
"resolution": "720p",
"aspect_ratio": "16:9",
"video_urls": ["https://your-cdn.com/source.mp4"]
}The output tracks the source clip (which must be ≤ 30s); omit
duration and do not set generation_type = "frame". Billing is a flat
per-generation rate (see Pricing below).
With the content filter on
{
"model": "gemini-omni-1-1",
"prompt": "A product spot for a ceramic mug on a wooden table, soft daylight",
"content_filter": true,
"duration": 4,
"resolution": "720p"
}Choosing a mode
| Need | Send |
|---|---|
| Generate from text | prompt only |
| Animate a still from its first frame | prompt + image_urls (1 entry) + generation_type: "frame" |
| Keep a subject but reframe the shot | prompt + image_urls (1 entry) + generation_type: "reference" |
| Compose scene + character + product | prompt + image_urls (3 entries) |
| Match an existing clip's motion / length | prompt + video_urls (1 entry, no duration) |
| Iterate cheaply | resolution: "360p" and duration: 4 |
| Hero shot | resolution: "4k" at 4–10s |
Polling pattern
The task endpoint behaves identically to other video tasks — the only
difference is the completed output shape (video_urls instead of
image_urls). A pragmatic schedule:
0–5 minutes: poll every 5s
5 min – 1 h: back off gradually toward 1 min
≥ 1 h: cap at 3 min between pollsA typical task completes in about two minutes. The worker's wall-clock cap is 48 hours, comfortably above any realistic queue.
Pricing
Two billing modes — picked by request shape.
Per generation — text / image / fusion
Charged once per submitted job. 360p, 720p and 1080p share the same rate
at every duration; only 4K is uplifted. Duration tiers are 4s / 6s /
8s / 10s. See current per-tier rates on the
Gemini Omni 1.1 model page.
Flat per generation — reference-to-video
Triggered when video_urls is set. Charged once per job at a flat rate by
resolution — independent of clip length. 360p, 720p and 1080p share the
same rate; 4K is uplifted. The source clip must be ≤ 30 seconds: the
gateway probes its decoded length server-side and rejects longer clips
with 400. See current rates on the
Gemini Omni 1.1 model page.
Bill formula
1 credit = $0.001. Integer credits = ceil(usd × 1000). Failed jobs
refund automatically.
Tips
- Draft at 360p, ship at 1080p or 4K. Same price as 720p, faster to render; the request body does not change between draft and final.
- Say what the image is for.
framewhen the still must be frame 1 (product shots, storyboards);referencewhen you want the subject but a new framing. - Prompt motion, not just scene. "Slow push-in, warm tones, shallow depth of field" outperforms a pure noun-list of what's on screen.
- Three-image fusion needs cohesive references. Pick three images that share lighting and composition cues.
- Keep reference clips ≤ 30s and omit
duration— the server rejects requests that pass both.