Seedance 2.5 is live — 30-second cinematic video with native audio & real-person references
rreAPI Docs

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_KEY

Keys 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:

Areagemini-omnigemini-omni-1-1
resolution720p / 1080p / 4k360p / 720p / 1080p / 4k — 360p is a draft tier priced like 720p
generation_typenot available (one image = first frame)frame or reference — you choose how images are used
content_filternot availableboolean, pre-submit moderation of prompt + images
Pricesee its model pagelower 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_urlsvideo_urlsgeneration_typeModeWhat it does
00Text-to-videoGenerate from a prompt.
10frame (or omitted)Image-to-videoThe image is the locked first frame; animate from it.
10referenceReference imageThe image guides subject / style without pinning frame 1.
30reference (or omitted)Three-image fusionCombine three references into one motion shot.
0 / 11omitted or referenceReference-to-videoReference a source clip (≤ 30s) for motion / style. Flat per generation.

Unsupported combinations.

  • image_urls = 2 is rejected with 400 image_urls cardinality 2 is not supported. Submit 0, 1, or 3 — there is no first/last-frame pair on gemini-omni-1-1.
  • image_urls = 4 or more is also rejected.
  • generation_type = "frame" needs exactly one image, and cannot be combined with video_urls.
  • generation_type = "reference" needs 1 or 3 images.
  • video_urls = 2 or more is rejected with 400 video_urls accepts at most 1 entry.
  • duration and video_urls cannot both be set. Reference-to-video mode reads the source clip's length; passing duration alongside is rejected with 400 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 (code 20002).
  • Longer than 2,000 chars → 400 prompt exceeds 2000 characters (code 20007).

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:

ValueShape
16:9Landscape
9:16Portrait

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.

ValueImages acceptedMeaning
frameexactly 1The image is the first frame; the clip animates from it.
reference1 or 3The 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). duration MUST 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
}
FieldTypeNotes
idstringTask identifier — keep it for polling and audit
modelstringAlways "gemini-omni-1-1" (echo of the submitted model)
statusstringprocessing / completed / failed
created_atintegerSubmission unix timestamp
outputobject | nullnull until completion. output.video_urls holds MP4s
errorobject | nullPopulated 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.

TriggerCodeMessage (illustrative)
prompt missing or blank20002prompt is required
prompt longer than 2,000 chars20007prompt exceeds 2000 characters
image_urls length 220003image_urls cardinality 2 is not supported
image_urls length > 320003image_urls accepts at most 3 entries
generation_type = "frame" with 0 or 3 images20003generation_type=frame requires exactly 1 image_urls entry
generation_type = "reference" with 0 images20003generation_type=reference requires 1 or 3 image_urls entries
generation_type = "frame" together with video_urls20003generation_type=frame cannot be combined with video_urls
duration not one of 4/6/8/1020003duration must be one of 4, 6, 8, 10
Unknown resolution20003invalid resolution "X" (allowed: 360p / 720p / 1080p / 4k)
Unknown aspect_ratio20003invalid aspect_ratio "X" (allowed: 16:9 / 9:16)
aspect_ratio and size disagree20003aspect_ratio and size disagree; pass one or set them to the same value
duration together with video_urls20003duration and video_urls cannot both be set
image_urls carrying a data: URI or non-http(s)20003image_urls entries must be public http(s) URLs
video_urls source clip longer than 30 seconds20003Reference 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

NeedSend
Generate from textprompt only
Animate a still from its first frameprompt + image_urls (1 entry) + generation_type: "frame"
Keep a subject but reframe the shotprompt + image_urls (1 entry) + generation_type: "reference"
Compose scene + character + productprompt + image_urls (3 entries)
Match an existing clip's motion / lengthprompt + video_urls (1 entry, no duration)
Iterate cheaplyresolution: "360p" and duration: 4
Hero shotresolution: "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 polls

A 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. frame when the still must be frame 1 (product shots, storyboards); reference when 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.

Table of Contents