Gemini Omni 1.1 API

Googlevideo$0.042 / second

Submit a Gemini Omni 1.1 run over HTTP, then poll it or take a webhook. Results are files on media.ezflows.io. Try it in the playground first.

Async: the POST answers at once with a request id. Poll it, or take the webhook.

  1. 01

    Submit

    Parameters at the top level of the JSON body. Answers 202 with a request id.

    curlPOST /v1/models/gemini-omni-1.1
    curl -X POST https://api.ezflows.io/v1/models/gemini-omni-1.1 \
      -H "Authorization: Bearer $EZFLOWS_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "prompt": "Cinematic drone shot gliding through misty pine mountains at sunrise, god rays breaking through the fog, birdsong and gentle wind in the audio, photorealistic, highly detailed.",
        "duration": 5,
        "resolution": "720p",
        "aspect_ratio": "16:9"
      }'
    
    # 202 Accepted, at once — it never waits for the model:
    # {"request_id": "req_8f2a41c9b70e4d15", "status": "queued",
    #  "poll_url": "https://api.ezflows.io/v1/requests/req_8f2a41c9b70e4d15"}
  2. 02

    Poll

    Same bearer header, every few seconds, until the status is final.

    curlGET /v1/requests/:id
    REQUEST_ID=req_8f2a41c9b70e4d15   # from the POST
    
    while :; do
      BODY=$(curl -s https://api.ezflows.io/v1/requests/$REQUEST_ID \
        -H "Authorization: Bearer $EZFLOWS_API_KEY")
      STATUS=$(echo "$BODY" | jq -r .data.status)
      case "$STATUS" in succeeded|failed|cancelled) break ;; esac
      sleep 3
    done
    
    echo "$BODY" | jq -r '.data.output.artifacts[].url'   # media.ezflows.io, kept 90 days
  3. 03

    Response

    Files are on media.ezflows.io, kept 90 days. A failed run says why and costs nothing.

    json200 · succeeded
    {
      "data": {
        "id": "req_8f2a41c9b70e4d15",
        "model_slug": "gemini-omni-1.1",
        "status": "succeeded",
        "http_status": 200,
        "cost": 0.211,
        "auth_method": "api_key",
        "error": null,
        "submitted_at": "2026-09-12T18:07:21.114Z",
        "queue_started_at": "2026-09-12T18:07:21.402Z",
        "execution_started_at": "2026-09-12T18:07:22.010Z",
        "first_byte_at": "2026-09-12T18:07:52.871Z",
        "finished_at": "2026-09-12T18:07:55.203Z",
        "io_deleted_at": null,
        "canvas_id": null,
        "canvas_node_id": null,
        "client_attempt_id": null,
        "idempotency_key": null,
        "input": {
          "prompt": "Cinematic drone shot gliding through misty pine mountains at sunrise, god rays breaking through the fog, birdsong and gentle wind in the audio, photorealistic, highly detailed.",
          "duration": 5,
          "resolution": "720p",
          "aspect_ratio": "16:9"
        },
        "output": {
          "artifacts": [
            {
              "index": 0,
              "kind": "video",
              "contentType": "video/mp4",
              "url": "https://media.ezflows.io/outputs/<account>/req_8f2a41c9b70e4d15/0.mp4"
            }
          ]
        }
      }
    }
  4. 04

    Webhook

    Skip polling: we POST the result to your endpoint, at least once.

    Register
    Create an endpoint under Webhooks in the dashboard; the signing secret is shown once.
    Events
    request.succeeded · request.failed · request.cancelled
    Headers
    ezflows-event-id (dedupe on it) · ezflows-timestamp (unix seconds) · ezflows-signature t=<ts>,v1=<hex HMAC-SHA256 of "<ts>.<raw body>">
    Verify
    Over the exact bytes received, in constant time; reject anything older than five minutes.
    Respond
    Any 2xx within 10 s. Redirects are not followed.
    Retries
    Five, with backoff: 30 s · 60 s · 2 min · 4 min · 8 min. Disabled after five consecutive dead deliveries.
    jsonDelivery body
    {
      "id": "82cf46a4-841e-41d6-b3c7-facc937d3252",
      "type": "request.succeeded",
      "created_at": "2026-09-12T18:07:55Z",
      "data": {
        "id": "req_8f2a41c9b70e4d15",
        "model_slug": "gemini-omni-1.1",
        "status": "succeeded",
        "cost": 0.211,
        "output": {
          "artifacts": [
            {
              "url": "https://media.ezflows.io/…/0.mp4"
            }
          ]
        }
      }
    }
    curlverify.sh
    # Create the endpoint under Webhooks in the dashboard; the signing secret is shown once.
    # ezflows-signature: t=<ts>,v1=<hex HMAC-SHA256 of "<ts>.<raw body>">
    # body.json = the exact bytes received. Reject anything older than five minutes.
    EXPECTED=$({ printf '%s.' "$TS"; cat body.json; } \
      | openssl dgst -sha256 -hmac "$EZFLOWS_WEBHOOK_SECRET" -r | cut -d' ' -f1)
    
    [ "$EXPECTED" = "$V1" ] && echo "valid" || echo "reject"

Parameters 8

NameTypeDefaultAllowedDescription
promptrequiredstringCinematic drone shot gliding through misty pine mountains at sunrise, god rays breaking through the fog, birdsong and gentle wind in the audio, photorealistic, highly detailed.—Describe the scene, subjects, camera moves and sound design. Supports bracketed timecodes like [0-3s] ... [3-6s], and <IMAGE_REF_0>, <IMAGE_REF_1>, ... to bind reference images.
first_framestring—one image urlThe video starts exactly from this image.
last_framestring—one image urlOptional ending frame. With First Frame set, the model interpolates smoothly between the two.
reference_imagesstring[]—up to 10 image urls1-10 reference images. Subjects/styles are extracted and embedded into a new scene (not used as literal frames). Bind them in the prompt with <IMAGE_REF_0>, <IMAGE_REF_1>, ... Cannot be combined with First/Last Frame.
durationinteger53–10Video length in seconds (3-10). Billed per second of output video.
resolutionenum720p360p · 720p · 1080p · 4kOutput resolution. 360p is a draft tier (~1/3 the price, ~2x faster); 1080p costs 1.5x and 4k 3x the 720p rate per second.
aspect_ratioenum16:916:9 · 9:1616:9 landscape or 9:16 vertical.
seedinteger-1-1–999999999999999Seed for reproducible generation. -1 for random.

File inputs (first_frame: one image url · last_frame: one image url · reference_images: up to 10 image urls) take URLs. Upload the raw file to POST /v1/uploads with its own Content-Type and pass the url it returns. Inputs are kept 90 days.