Skip to navigation

Gemini Omni 1.1 Flash

Generate a 3–10 second video with sound at 720p, 1080p or 4K from text, a first frame, first and last frames, or up to 10 reference images and 3 reference videos.

  • Asynchronous: the create call returns a task ID; the video arrives when the task succeeds.
  • Four inputs under one model ID: text only, one first frame, a first and a last frame in images, or up to 10 reference_images with up to 3 optional reference_videos. Frames and references cannot be combined.
  • Clips of 3 to 10 seconds in 16:9 or 9:16; duration is a whole number of seconds.
  • Every video comes with a soundtrack. There is no switch to turn it off, and reference audio is not accepted.
  • Billed by the resolution and the number of seconds you request. A failed task costs nothing.
POST/v1/videos/tasksTry it

Opens this model in the API Explorer. Enter your BeatAPI API key to create a task: the call is real and is billed to your own balance.

Endpoint and authentication

POST https://api.beatapi.io/v1/videos/tasks

Authorization string Required

Your BeatAPI API key, sent as Bearer <BEATAPI_API_KEY>. Create keys in the Dashboard. Keep keys on your server; never ship them in a browser or mobile app.

Send the body as JSON with Content-Type: application/json. Idempotency-Key is optional: send a unique value (at most 255 characters) per logical request and reuse it only to retry that exact body. Within 24 hours a retry with the same key and body returns the first response again with Idempotent-Replayed: true; the same key with a different body returns 409 idempotency_conflict. Responses other than 2xx are not stored, so a retry after a 400 or 402 runs again.

How a request works

1

Create the task

POST the parameters below to the endpoint. A 201 means the task was accepted and its price reserved from your balance; the work runs in the background. Save data.id.

2

Wait for it to finish

Call GET /v1/tasks/{task_id} and wait data.poll_after_seconds between calls (5 s for images, 8 s for videos) until status is succeeded or failed. Or register a webhook for task.succeeded and task.failed; keep polling as the fallback, because a task stopped by the processing timeout sends no event.

3

Save the result

On succeeded, download every data.output.media[].url and store the files you need; BeatAPI does not promise how long result URLs stay available. On failed, read data.error_code and data.error_message: the reserved amount was returned to your balance, and data.retryable says whether sending the same request again can succeed.

Input modes

ModeRequired inputsNotes
Text to videomodel, promptSend no images, reference_images or reference_videos.
First framemodel, prompt, images (1 link)The video starts from this picture.
First and last framesmodel, prompt, images (2 links)The first link opens the video and the second closes it, in that order.
Reference images and videosmodel, prompt, reference_images (1 to 10 links)Add up to 3 reference_videos if you like; a reference video needs at least one reference image. Cannot be combined with images.

Request parameters

model string Required

The model to run.

Value: gemini-omni-1.1-flash

If the value is wrong

  • Missing: "model" is required
  • An image model sent to this endpoint: "model" nano-banana-2 is served by POST /v1/images/tasks, not this endpoint

prompt string Required

What happens in the video: the action, the camera, the setting, and any speech or sound you want.

Length: 1–5000 characters

  • Length is counted in characters (a CJK character counts as one).
  • With references, say in the prompt what to take from each one, for example “the woman in the first reference image” or “the camera move of the reference video”.

If the value is wrong

  • Missing: "prompt" is required
  • Empty or longer than the limit: "prompt" has an unsupported length
  • Not a string: "prompt" must be a string

images string[] Optional

Frames: one link is the first frame, two links are the first and the last frame, in that order. Optional: leave it out for text to video or when you send references.

Items: 1–2
Each item is a public https:// URL. For a local file, upload it first with POST /v1/files and pass the returned data.url.

  • Each link must be a public https:// URL.
  • For pictures the video should draw on rather than start or end with, use reference_images.

If the value is wrong

  • More than 2 links: "images" accepts at most 2 items
  • Empty array: "images" requires at least 1 item
  • Not an array: "images" must be an array
  • Not an https:// link: "images[0]" must be a public HTTPS URL
  • Sent together with reference_images or reference_videos: Cannot combine "images" with reference inputs in one task

reference_images string[] Optional

One to ten pictures of people, products, styles or settings that the video should use.

Items: 1–10
Each item is a public https:// URL. For a local file, upload it first with POST /v1/files and pass the returned data.url.

  • Each link must be a public https:// URL.
  • Required whenever you send reference_videos.

If the value is wrong

  • More than 10 links: "reference_images" accepts at most 10 items
  • Empty array: "reference_images" requires at least 1 item
  • Not an array: "reference_images" must be an array
  • Sent together with images: Cannot combine "images" with reference inputs in one task

reference_videos string[] Optional

One to three video clips whose motion, camera work or subject the new video should follow.

Items: 1–3
Each item is a public https:// URL. For a local file, upload it first with POST /v1/files and pass the returned data.url.

  • Each link must be a public https:// URL to an MP4, MOV or WebM file.
  • Only together with at least one link in reference_images.
  • The reference videos do not change the price: you pay for the seconds of the new video.

If the value is wrong

  • Sent without reference_images: Gemini Omni 1.1 Flash "reference_videos" need at least one image in "reference_images"
  • More than 3 links: "reference_videos" accepts at most 3 items
  • Sent together with images: Cannot combine "images" with reference inputs in one task

duration integer OptionalDefault: 5

Length of the video in seconds, a whole number.

Default: 5
Range: 3–10

  • If you leave it out, 5 is used and billed.
  • Seconds are billed (see Billing), so this is the main lever on the price.

If the value is wrong

  • Outside 3–10, not a whole number, or sent as a string: "duration" is outside its supported range

aspect_ratio string OptionalDefault: 16:9

Shape of the video: landscape 16:9 or portrait 9:16.

Allowed values: 16:9, 9:16
Default: 16:9

  • If you leave it out, 16:9 is used.
  • It applies to frames too: choose the shape of your first frame.

If the value is wrong

  • A value not in the list: "aspect_ratio" must be one of: [16:9 9:16]

resolution string OptionalDefault: 720p

Output resolution. Each step up costs more per second.

Allowed values: 720p, 1080p, 4k
Default: 720p

  • If you leave it out, 720p is used.
  • 4k and 4K are the same tier.

If the value is wrong

  • A value not in the list (for example 480p or 720P): "resolution" must be one of: [720p 1080p 4k 4K]

The gateway also checks these combinations before creating the task:

  • images cannot be combined with reference inputs
  • images are frames: one is the first frame, two the first and last frame in that order
  • reference_videos need at least one image in reference_images
  • there is no audio switch; reference audio is not supported

Input media limits

The gateway reads every input before the task is created and refuses one outside these limits with a 400 bad_request that names the input. Nothing is charged.

MediaLimits checked before the task is created
Imagesat most 20 MB each
Videosat most 64 MB each
  • The gateway checks the size of each linked file before it creates the task. A file over the limit is refused with a 400 that names it, for example images[0] is 25.0 MB; this model takes images up to 20 MB., and nothing is charged.
  • A link whose host answers with a 4xx error, or that points to an empty file, is refused the same way: <field>[<n>] could not be downloaded: <reason>.
  • A link the model cannot use after the task was created fails the task, usually with bad_request, and the task is refunded in full.
  • Have a local file? Upload it with POST /v1/files and pass the returned data.url.

Fields this model does not accept

Sending one of these is refused before anything is charged, instead of being ignored:

  • reference_audios, generate_audio, seed, quality, sound, task_type, output_format, watermark and the other fields of other video models → field "generate_audio" is not supported by model gemini-omni-1.1-flash (with the field you sent). The soundtrack is always generated; there is nothing to switch.
  • Any field the video endpoint does not know at all → unknown field: <name>.

Request examples

curl --request POST \
--url https://api.beatapi.io/v1/videos/tasks \
--header "Authorization: Bearer $BEATAPI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "gemini-omni-1.1-flash",
"prompt": "A dramatic product reveal of a glass water bottle, slow orbiting camera, soft studio reflections",
"duration": 5,
"aspect_ratio": "16:9",
"resolution": "720p"
}'

Text to video

A 5-second 720p landscape clip from text alone.

curl --request POST \
--url https://api.beatapi.io/v1/videos/tasks \
--header "Authorization: Bearer $BEATAPI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "gemini-omni-1.1-flash",
"prompt": "A dramatic product reveal of a glass water bottle, slow orbiting camera, soft studio reflections",
"duration": 5,
"aspect_ratio": "16:9",
"resolution": "720p"
}'

First frame

A 5-second 720p clip that starts from one image.

curl --request POST \
--url https://api.beatapi.io/v1/videos/tasks \
--header "Authorization: Bearer $BEATAPI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "gemini-omni-1.1-flash",
"prompt": "The singer turns toward the camera and smiles, hair moving in the breeze, warm spotlights",
"images": [
"https://cdn.beatapi.io/samples/neon-singer.png"
],
"duration": 5,
"resolution": "720p"
}'

First and last frames

An 8-second 1080p clip that moves from the first picture to the second.

curl --request POST \
--url https://api.beatapi.io/v1/videos/tasks \
--header "Authorization: Bearer $BEATAPI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "gemini-omni-1.1-flash",
"prompt": "The camera pulls away from the singer and glides across the stage to the bottle on a table",
"images": [
"https://cdn.beatapi.io/samples/neon-singer.png",
"https://cdn.beatapi.io/samples/smart-bottle.png"
],
"duration": 8,
"aspect_ratio": "16:9",
"resolution": "1080p"
}'

Reference images and a reference video

Two reference images and one reference video, as an 8-second 720p portrait clip.

curl --request POST \
--url https://api.beatapi.io/v1/videos/tasks \
--header "Authorization: Bearer $BEATAPI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "gemini-omni-1.1-flash",
"prompt": "The singer from the first reference image lifts the bottle from the second toward the camera, following the camera move of the reference video",
"reference_images": [
"https://cdn.beatapi.io/samples/neon-singer.png",
"https://cdn.beatapi.io/samples/smart-bottle.png"
],
"reference_videos": [
"https://your-cdn.example.com/clips/source.mp4"
],
"duration": 8,
"aspect_ratio": "9:16",
"resolution": "720p"
}'

Responses

Create a task (201)

The task object. output is null until the task succeeds. Fields marked “while running” disappear once the task finishes.

{
"data": {
"id": "task_7Qm2Xc9LpR4vT8sKa1Nf6YbH3eWdJ0uZ",
"object": "task",
"task_kind": "video",
"capability_id": "gemini-omni-1.1-flash",
"capability_version": 1,
"media_type": "video",
"model": "gemini-omni-1.1-flash",
"status": "queued",
"stage": "queued",
"created_at": 1791993600,
"updated_at": 1791993600,
"completed_at": null,
"poll_after_seconds": 8,
"output": null,
"usage": {
"credits_reserved": 0.3,
"credits_settled": 0,
"credits_refunded": 0,
"credits_charged": 0.3,
"billable_duration_seconds": 5
},
"request_id": "req_5f0c2a9e4b7d4e31",
"error_code": null,
"error_message": null
}
}
FieldTypeDescription
data.idstringTask ID: task_ followed by 32 letters and digits. Use it to poll and to match webhook events.
data.objectstringAlways task.
data.task_kindstringimage or video.
data.capability_idstringThe model ID you sent.
data.capability_versionintegerContract version of the model, currently 1.
data.media_typestringimage or video.
data.modelstringThe model ID you sent (same as capability_id).
data.statusstringqueued, processing, succeeded or failed. Only the last two are final.
data.stagestringRepeats status; kept for older clients.
data.created_atintegerWhen the task was created, Unix seconds.
data.updated_atintegerLast change, Unix seconds.
data.completed_atinteger | nullWhen the task finished, Unix seconds; null while it runs.
data.poll_after_secondsintegerWhile running: how long to wait before the next poll (5 for images, 8 for videos).
data.typical_secondsobjectWhile running, when enough recent tasks exist: p50 and p90 completion times in seconds over the last window, from samples tasks.
data.outputobject | nullThe result; null until status is succeeded. See the output fields below.
data.usage.credits_reservednumberUSD held from your balance when the task was created.
data.usage.credits_chargednumberUSD this task costs; 0 on a failed task.
data.usage.credits_settlednumberUSD finally taken; set when the task succeeds, otherwise 0.
data.usage.credits_refundednumberUSD returned to your balance; equals the reservation on a failed task once the refund is recorded.
data.usage.billable_duration_secondsintegerVideo only: the seconds the price is based on. Absent when the model reports no duration.
data.request_idstringRequest ID. Include it when you contact support.
data.error_codestring | nullFailure code; null unless the task failed.
data.error_messagestring | nullWhat went wrong and what to change; null unless the task failed.

Finished task

GET /v1/tasks/{task_id} returns HTTP 200 with status: "succeeded" and the result in data.output.

{
"data": {
"id": "task_7Qm2Xc9LpR4vT8sKa1Nf6YbH3eWdJ0uZ",
"object": "task",
"task_kind": "video",
"capability_id": "gemini-omni-1.1-flash",
"capability_version": 1,
"media_type": "video",
"model": "gemini-omni-1.1-flash",
"status": "succeeded",
"stage": "succeeded",
"created_at": 1791993600,
"updated_at": 1791993690,
"completed_at": 1791993690,
"output": {
"media": [
{
"type": "video",
"url": "https://media.beatapi.io/outputs/task_7Qm2Xc9LpR4vT8sKa1Nf6YbH3eWdJ0uZ/0.mp4",
"mime_type": "video/mp4"
}
],
"r2_url": "https://media.beatapi.io/outputs/task_7Qm2Xc9LpR4vT8sKa1Nf6YbH3eWdJ0uZ/0.mp4"
},
"usage": {
"credits_reserved": 0.3,
"credits_settled": 0.3,
"credits_refunded": 0,
"credits_charged": 0.3,
"billable_duration_seconds": 5
},
"request_id": "req_5f0c2a9e4b7d4e31",
"error_code": null,
"error_message": null
}
}

Output fields

FieldTypeDescription
output.mediaobject[]The generated files; one video with a soundtrack for this model.
output.media[].typestringAlways video.
output.media[].urlstringHTTPS link to the stored video. Download and keep it; no retention period is promised.
output.media[].mime_typestringvideo/mp4.
output.r2_urlstringThe video URL again, for older clients. Read media instead.

Failed task

A failed task is still HTTP 200 on GET /v1/tasks/{task_id}: the failure is in the body. The reservation is returned in full, so nothing is charged.

{
"data": {
"id": "task_7Qm2Xc9LpR4vT8sKa1Nf6YbH3eWdJ0uZ",
"object": "task",
"task_kind": "video",
"capability_id": "gemini-omni-1.1-flash",
"capability_version": 1,
"media_type": "video",
"model": "gemini-omni-1.1-flash",
"status": "failed",
"stage": "failed",
"created_at": 1791993600,
"updated_at": 1791993690,
"completed_at": 1791993690,
"output": null,
"usage": {
"credits_reserved": 0.3,
"credits_settled": 0,
"credits_refunded": 0.3,
"credits_charged": 0,
"billable_duration_seconds": 5
},
"retryable": true,
"request_id": "req_5f0c2a9e4b7d4e31",
"error_code": "processing_failed",
"error_message": "The task failed during processing on our side. Retry; a failed task is refunded."
}
}
FieldTypeDescription
data.error_codestringOne of bad_request and content_policy_violation (change the request) or processing_unavailable, processing_timeout, processing_failed and result_transfer_failed (try again later). See Errors.
data.error_messagestringA sentence that names the problem and the fix.
data.retryablebooleanPresent only on a failed task: true when the same request can succeed if you send it again.
data.usageobjectOnce the refund is recorded (normally at the moment the task fails): credits_charged and credits_settled are 0, and credits_refunded equals credits_reserved.

Complete example

Create a task, wait for it with the server’s polling hint, and print the result URLs. Set BEATAPI_API_KEY in your environment and install requests.

import os
import time
import uuid
import requests
API = "https://api.beatapi.io"
HEADERS = {"Authorization": f"Bearer {os.environ['BEATAPI_API_KEY']}"}
def create_task(body: dict) -> dict:
# One Idempotency-Key per logical request: a retry with the same key cannot create a second task.
headers = {**HEADERS, "Idempotency-Key": str(uuid.uuid4())}
for attempt in range(3):
response = requests.post(f"{API}/v1/videos/tasks", headers=headers, json=body, timeout=60)
if response.status_code in (429, 503) and attempt < 2:
time.sleep(int(response.headers.get("Retry-After", 10)))
continue
break
try:
payload = response.json()
except ValueError: # an edge error page is not JSON
response.raise_for_status()
raise
if not response.ok:
error = payload["error"]
raise RuntimeError(f"{response.status_code} {error['code']}: {error['message']} (request_id={error.get('request_id')})")
return payload["data"]
def wait_for_task(task_id: str, timeout_seconds: int = 1800) -> dict:
deadline = time.monotonic() + timeout_seconds
while time.monotonic() < deadline:
response = requests.get(f"{API}/v1/tasks/{task_id}", headers=HEADERS, timeout=30)
if response.status_code == 429 or response.status_code >= 500:
time.sleep(int(response.headers.get("Retry-After", 10)))
continue
response.raise_for_status()
task = response.json()["data"]
if task["status"] in ("succeeded", "failed"):
return task
time.sleep(task.get("poll_after_seconds", 5))
raise TimeoutError(f"task {task_id} is still running; keep polling later")
task = create_task({
"model": "gemini-omni-1.1-flash",
"prompt": "A dramatic product reveal of a glass water bottle, slow orbiting camera, soft studio reflections",
"duration": 5,
"aspect_ratio": "16:9",
"resolution": "720p"
})
print("created", task["id"])
task = wait_for_task(task["id"])
if task["status"] == "failed":
raise SystemExit(f"{task['error_code']}: {task['error_message']}")
for item in task["output"]["media"]:
print(item["url"])

Billing

  • The price follows the resolution and the number of seconds you request (duration, 5 if you leave it out). 1080p costs more per second than 720p, and 4K more than 1080p. The input route, aspect_ratio and the number of frames or references do not change it.
  • The table below shows 8-second clips; other lengths are priced per second at the same rate for their resolution.
  • The price is reserved when the task is created; data.usage.billable_duration_seconds shows the seconds it is based on.
  • A failed task, including one refused by moderation after submission, is refunded in full.

Current list prices, the same as on Pricing. An account with a negotiated discount pays less; data.usage on the task always shows the amount actually charged.

OptionList price (USD)
8 sec · 720p$0.48
8 sec · 1080p$0.72
8 sec · 4K$1.44

Common errors

Error or symptomCauseFix
400 Cannot combine "images" with reference inputs in one taskFrames in images and references in reference_images or reference_videos in one request.Send frames in images, or references, not both.
400 Gemini Omni 1.1 Flash "reference_videos" need at least one image in "reference_images"Reference videos without any reference image.Add at least one link to reference_images.
400 "images" accepts at most 2 itemsMore than two frames.Send a first frame, or a first and a last frame; put other pictures in reference_images.
400 "reference_images" accepts at most 10 itemsMore than 10 reference images.Send at most 10.
400 "duration" is outside its supported rangeBelow 3, above 10, a decimal, or a string.Send an integer from 3 to 10, such as 8.
400 "resolution" must be one of: [720p 1080p 4k 4K]480p, or upper case such as 720P.Send 720p, 1080p or 4k.
400 "aspect_ratio" must be one of: [16:9 9:16]1:1, 21:9 or another ratio this model does not offer.Send 16:9 or 9:16.
400 field "reference_audios" is not supported by model gemini-omni-1.1-flashReference audio, generate_audio and other fields of other video models are refused.Remove the field. The soundtrack is generated with every video.
Task failed with bad_requestA link the model could not fetch or use (a private or expired link, a file of the wrong kind).Use a public HTTPS link to a real image or video, or upload it with POST /v1/files. The failed task was refunded.
Task failed with content_policy_violationThe prompt, an input or the result was refused by moderation.Change the prompt or the input. Retrying unchanged fails again; nothing is charged.
402 insufficient_creditsThe balance is below the price reserved for the request; long clips at 4K cost the most.Top up, shorten duration, or use a lower resolution.

HTTP errors at a glance

Errors before a task exists arrive as a non-2xx response, and nothing is charged. Branch on error.code or error.retryable; message names the problem. The full list and retry policy are on Errors.

{
"error": {
"code": "bad_request",
"message": "\"prompt\" is required",
"retryable": false,
"request_id": "req_5f0c2a9e4b7d4e31"
}
}
HTTP statuserror.codeWhat to do
400bad_request, content_policy_violationFix the request; the message names the field. Do not retry unchanged.
401missing_api_key, invalid_api_key (older clients may see unauthorized)Send a valid key as Authorization: Bearer <key>.
402insufficient_creditsTop up, or raise the key’s quota, then send it again.
403forbiddenThe key or account may not use this model (for example, free credit only covers some models). Do not retry unchanged.
404not_foundOn GET /v1/tasks/{task_id}: the task does not exist for this key’s account. Check the ID.
409idempotency_conflictUse a new Idempotency-Key, or wait for the first request with this key to finish.
429rate_limit_exceededWait Retry-After seconds (also error.retry_after_seconds), then retry.
500internal_errorRetry with backoff; contact support with request_id if it continues.
503processing_unavailable, processing_timeout, processing_failed, result_transfer_failedNothing was charged. Retry with exponential backoff.

Authentication

AuthorizationBearer

Send your API key as Authorization: Bearer <BEATAPI_API_KEY>.

Headers

Idempotency-KeystringOptional<=255 characters

Send the body as JSON with Content-Type: application/json. Idempotency-Key is optional: send a unique value (at most 255 characters) per logical request and reuse it only to retry that exact body. Within 24 hours a retry with the same key and body returns the first response again with Idempotent-Replayed: true; the same key with a different body returns 409 idempotency_conflict. Responses other than 2xx are not stored, so a retry after a 400 or 402 runs again.

Request

This endpoint expects an object.
modelenumRequired

The model to run.

Value: gemini-omni-1.1-flash

If the value is wrong

  • Missing: "model" is required
  • An image model sent to this endpoint: "model" nano-banana-2 is served by POST /v1/images/tasks, not this endpoint
Allowed values:
promptstringRequired1-5000 characters

What happens in the video: the action, the camera, the setting, and any speech or sound you want.

Length: 1–5000 characters

  • Length is counted in characters (a CJK character counts as one).
  • With references, say in the prompt what to take from each one, for example “the woman in the first reference image” or “the camera move of the reference video”.

If the value is wrong

  • Missing: "prompt" is required
  • Empty or longer than the limit: "prompt" has an unsupported length
  • Not a string: "prompt" must be a string
aspect_ratioenumOptionalDefaults to 16:9

Shape of the video: landscape 16:9 or portrait 9:16.

Allowed values: 16:9, 9:16

Default: 16:9

  • If you leave it out, 16:9 is used.
  • It applies to frames too: choose the shape of your first frame.

If the value is wrong

  • A value not in the list: "aspect_ratio" must be one of: [16:9 9:16]
Allowed values:
durationintegerOptional3-10Defaults to 5

Length of the video in seconds, a whole number.

Default: 5

Range: 3–10

  • If you leave it out, 5 is used and billed.
  • Seconds are billed (see Billing), so this is the main lever on the price.

If the value is wrong

  • Outside 3–10, not a whole number, or sent as a string: "duration" is outside its supported range
imageslist of stringsOptional

Frames: one link is the first frame, two links are the first and the last frame, in that order. Optional: leave it out for text to video or when you send references.

Items: 1–2

Each item is a public https:// URL. For a local file, upload it first with POST /v1/files and pass the returned data.url.

  • Each link must be a public https:// URL.
  • For pictures the video should draw on rather than start or end with, use reference_images.

If the value is wrong

  • More than 2 links: "images" accepts at most 2 items
  • Empty array: "images" requires at least 1 item
  • Not an array: "images" must be an array
  • Not an https:// link: "images[0]" must be a public HTTPS URL
  • Sent together with reference_images or reference_videos: Cannot combine "images" with reference inputs in one task
reference_imageslist of stringsOptional

One to ten pictures of people, products, styles or settings that the video should use.

Items: 1–10

Each item is a public https:// URL. For a local file, upload it first with POST /v1/files and pass the returned data.url.

  • Each link must be a public https:// URL.
  • Required whenever you send reference_videos.

If the value is wrong

  • More than 10 links: "reference_images" accepts at most 10 items
  • Empty array: "reference_images" requires at least 1 item
  • Not an array: "reference_images" must be an array
  • Sent together with images: Cannot combine "images" with reference inputs in one task
reference_videoslist of stringsOptional

One to three video clips whose motion, camera work or subject the new video should follow.

Items: 1–3

Each item is a public https:// URL. For a local file, upload it first with POST /v1/files and pass the returned data.url.

  • Each link must be a public https:// URL to an MP4, MOV or WebM file.
  • Only together with at least one link in reference_images.
  • The reference videos do not change the price: you pay for the seconds of the new video.

If the value is wrong

  • Sent without reference_images: Gemini Omni 1.1 Flash "reference_videos" need at least one image in "reference_images"
  • More than 3 links: "reference_videos" accepts at most 3 items
  • Sent together with images: Cannot combine "images" with reference inputs in one task
resolutionenumOptionalDefaults to 720p

Output resolution. Each step up costs more per second.

Allowed values: 720p, 1080p, 4k

Default: 720p

  • If you leave it out, 720p is used.
  • 4k and 4K are the same tier.

If the value is wrong

  • A value not in the list (for example 480p or 720P): "resolution" must be one of: [720p 1080p 4k 4K]
Allowed values:

Response

The task object. output is null until the task succeeds. Fields marked “while running” disappear once the task finishes.

Errors

400
Bad Request Error
401
Unauthorized Error
402
Payment Required Error
403
Forbidden Error
409
Conflict Error
429
Too Many Requests Error
500
Internal Server Error
503
Service Unavailable Error