Begin exactly on the first frame and finish on the last frame. One continuous 8-second locked close-up: the folded paper crane's wings slowly uncrease and lift a few centimeters until they match the end still. Preserve the same crane, paper color, table, window light, and camera. Native audio: dry paper flex, a faint wooden-table creak, quiet room tone. No logos, no readable text, no products, no packaging, no prices, no CTA, no advertising, no watermark, no brand marks.
Gemini Omni 1.1 Flash Image-to-Video API
google/gemini-omni-1.1-flash/image-to-videoGemini Omni 1.1 Flash (Image-to-Video) turns a start image and text prompt into video with native audio, optional end-frame guidance, and 360p to 4K output. Build action, camera movement, and sound around the subject and composition of your opening image, adding an end frame to guide the closing shot.
Upload a start image first, then add an optional end frame to guide the closing shot.
Your generated video will appear here
Add your prompt and required media, review the settings, then click Run.
Examples
REST API
Quick Start
Authenticate with the API, submit the inputs and instructions, then retrieve the video using the task ID.
Connect to the Vidgo API
Create an API key, keep it only on your server, and send Authorization: Bearer VIDGO_API_KEY.
- Endpoint
- POST
https://api.vidgo.ai/api/generate/submit - Authentication
- Authorization: Bearer VIDGO_API_KEY
Submit one generation task
Fill in the inputs and settings for this endpoint using the request example, then save the returned task_id to query generation progress and results.
REQUEST_BODY=$(cat <<'JSON'
{
"model": "google/gemini-omni-1.1-flash/image-to-video",
"input": {
"prompt": "Begin exactly on the first frame and finish on the last frame. One continuous 8-second locked close-up: the folded paper crane's wings slowly uncrease and lift a few centimeters until they match the end still. Preserve the same crane, paper color, table, window light, and camera. Native audio: dry paper flex, a faint wooden-table creak, quiet room tone. No logos, no readable text, no products, no packaging, no prices, no CTA, no advertising, no watermark, no brand marks.",
"duration": 8,
"resolution": "720p",
"aspect_ratio": "16:9",
"image_urls": [
"https://cdn.vidgo.ai/apis/models/google/gemini-omni-1.1-flash/image-to-video/v1/01/input-start-frame.webp",
"https://cdn.vidgo.ai/apis/models/google/gemini-omni-1.1-flash/image-to-video/v1/01/input-end-frame.webp"
]
}
}
JSON
)
RESPONSE=$(curl --silent --show-error --fail-with-body \
--request POST \
--url "https://api.vidgo.ai/api/generate/submit" \
--header "Authorization: Bearer $VIDGO_API_KEY" \
--header "Content-Type: application/json" \
--data "$REQUEST_BODY")
CODE=$(printf '%s' "$RESPONSE" | jq -r '.code // empty')
if [ "$CODE" != "0" ] && [ "$CODE" != "200" ]; then
printf 'API error: %s
' "$RESPONSE" >&2
exit 1
fi
printf '%s
' "$RESPONSE"Wait for the result
Query with task_id, continue for not_started/running, and stop for finished/failed. On success, read data.files[].file_url.
Track status
GET https://api.vidgo.ai/api/generate/status/{task_id}Poll status with a 2-second base interval, and increase the interval for longer tasks. Continue only while status is not_started or running, and stop once finished or failed. You can also specify callback_url in the request payload to receive webhook notifications.
not_startedrunningfinishedfailed{
"code": 200,
"data": {
"task_id": "task-unified-...",
"status": "running",
"created_time": "2026-09-15T10:00:00Z"
}
}{
"code": 200,
"data": {
"task_id": "task-unified-...",
"status": "finished",
"files": [
{
"file_url": "https://storage.vidgo.ai/generated/video.mp4",
"file_type": "video"
}
],
"created_time": "2026-08-22T10:00:00Z",
"progress": 100,
"error_message": null
}
}Complete runnable example
Expand for a complete script with HTTP and business-code checks, task_id validation, polling, terminal-state handling, and a timeout boundary.
set -euo pipefail
: "${VIDGO_API_KEY:?Set VIDGO_API_KEY in your environment}"
REQUEST_BODY=$(cat <<'JSON'
{
"model": "google/gemini-omni-1.1-flash/image-to-video",
"input": {
"prompt": "Begin exactly on the first frame and finish on the last frame. One continuous 8-second locked close-up: the folded paper crane's wings slowly uncrease and lift a few centimeters until they match the end still. Preserve the same crane, paper color, table, window light, and camera. Native audio: dry paper flex, a faint wooden-table creak, quiet room tone. No logos, no readable text, no products, no packaging, no prices, no CTA, no advertising, no watermark, no brand marks.",
"duration": 8,
"resolution": "720p",
"aspect_ratio": "16:9",
"image_urls": [
"https://cdn.vidgo.ai/apis/models/google/gemini-omni-1.1-flash/image-to-video/v1/01/input-start-frame.webp",
"https://cdn.vidgo.ai/apis/models/google/gemini-omni-1.1-flash/image-to-video/v1/01/input-end-frame.webp"
]
}
}
JSON
)
SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
--request POST \
--url "https://api.vidgo.ai/api/generate/submit" \
--header "Authorization: Bearer $VIDGO_API_KEY" \
--header "Content-Type: application/json" \
--data "$REQUEST_BODY")
TASK_ID=$(printf '%s' "$SUBMIT_RESPONSE" | jq -r '.data.task_id // .task_id // empty')
BUSINESS_CODE=$(printf '%s' "$SUBMIT_RESPONSE" | jq -r '.code // empty')
if [ "$BUSINESS_CODE" != "0" ] && [ "$BUSINESS_CODE" != "200" ]; then
printf 'Submit failed:
%s
' "$SUBMIT_RESPONSE" >&2
exit 1
fi
if [ -z "$TASK_ID" ]; then
printf 'Submit response did not include task_id:
%s
' "$SUBMIT_RESPONSE" >&2
exit 1
fi
START_TIME=$(date +%s)
POLL_DELAY=2
while true; do
if [ $(( $(date +%s) - START_TIME )) -ge 600 ]; then
printf 'Timed out after 600 seconds
' >&2
exit 1
fi
STATUS_RESPONSE=$(curl --silent --show-error --fail-with-body \
--url "https://api.vidgo.ai/api/generate/status/$TASK_ID" \
--header "Authorization: Bearer $VIDGO_API_KEY")
STATUS=$(printf '%s' "$STATUS_RESPONSE" | jq -r '.data.status // .status // empty')
BUSINESS_CODE=$(printf '%s' "$STATUS_RESPONSE" | jq -r '.code // empty')
if [ "$BUSINESS_CODE" != "0" ] && [ "$BUSINESS_CODE" != "200" ]; then
printf 'Status request failed:
%s
' "$STATUS_RESPONSE" >&2
exit 1
fi
case "$STATUS" in
finished)
printf '%s' "$STATUS_RESPONSE" | jq -r '(.data.files // .files // [])[]?.file_url'
break
;;
failed)
printf '%s' "$STATUS_RESPONSE" | jq -r '.data.error_message // .error_message // "Generation failed"' >&2
exit 1
;;
not_started|running)
sleep "$POLL_DELAY"
if [ "$POLL_DELAY" -lt 10 ]; then POLL_DELAY=$((POLL_DELAY + 1)); fi
;;
*)
printf 'Unexpected task status: %s
' "$STATUS" >&2
exit 1
;;
esac
doneInput parameters
The table lists available input parameters, types, and defaults. Request examples also include the required top-level model field. Prepare the inputs for this task and configure the output.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| prompt | string | Yes | — | 1–20,000 characters after trimming. |
| image_urls | string[] | Yes | — | One or two public image URLs. First = start frame, optional second = end frame. |
| duration | integer | No | 8 | 4, 6, 8, or 10, in seconds. |
| resolution | string | No | 720p | 360p, 720p, 1080p, or 4k. |
| aspect_ratio | string | No | 16:9 | 16:9 or 9:16. |
Response Fields
A successful submission returns a task ID. Status queries provide progress, output files, and error details when a task fails.
| Field | Type | Description |
|---|---|---|
| code | integer | Application result code; successful responses use 0 or 200. |
| message | string | Human-readable message or error detail when present. |
| data.task_id | string | Task ID used in the status endpoint path. |
| data.status | string | not_started, running, finished, or failed. |
| data.created_time | string | Task creation time in date-time format. |
| data.progress | integer | Task progress from 0 to 100, when included in the response. |
| data.files[] | array | All output files from a successful task, in response order. |
| data.files[].file_url | string | Public URL for a generated video. |
| data.files[].file_type | string | File type, such as video. |
| data.error_message | string | null | Failure detail when status is failed. |
Task Lifecycle
Continue querying while the status is not_started or running. End polling at finished or failed, then process the output files or error details respectively.
not_startedThe task was accepted and is waiting to begin.
runningGeneration is in progress. Continue polling the same task_id.
finishedGeneration succeeded. Read every video URL from data.files[].file_url.
failedGeneration stopped with an error. Read data.error_message and stop polling.
Polling and Errors
- AuthenticationFor a 401 response, check the Bearer API key in Authorization, update the credentials, and retry.
- ValidationFor a 400 response, use the response details to check required inputs, parameter values, and available credits, then make the indicated adjustments before submitting again.
- Network and timeoutIf a status query encounters a network error or timeout, retain the original task_id and retry the query, then handle the result according to the returned task status.
- Polling intervalPoll status with a 2-second base interval, and gradually increase the interval for longer tasks.
- Terminal statesContinue only for not_started or running. Stop immediately on finished or failed.
- Callback optionProvide callback_url at the request top level to receive the final flat task object; polling remains available if delivery fails.
Endpoint limits
| Specification | Value | Details |
|---|---|---|
| Input mode | Prompt + 1–2 images | The first image is the start frame; the optional second image is the end frame. |
| Output | Video with native audio | The endpoint returns an asynchronous task ID. |
| Image files | JPEG / PNG / WebP | Maximum 30 MiB per image. |
| Resolution | 360p / 720p / 1080p / 4k | Default is 720p. |
| Duration | 4 / 6 / 8 / 10 seconds | Default is 8 seconds. |
| Billing basis | Per generation | 360p–1080p: 4s=45, 6s=60, 8s=75, 10s=90 credits. 4k: 4s=105, 6s=120, 8s=135, 10s=150 credits. |
Gemini Omni 1.1 Flash Image-to-Video
Gemini Omni 1.1 Flash Image-to-Video turns a start image and text prompt into a moving clip with native audio, with an optional end image to guide the closing composition. Use your chosen image as the visual starting point for character action, product shots, and camera movement that bring still assets into video.
Why Choose This?
Animation from a start frameBegin with the subject, lighting, and composition of a chosen image to turn product artwork, portraits, or scene stills into moving footage.
End-frame guidanceAdd an optional end frame to define a target pose, product position, or closing composition and give the clip a clear visual destination.
Transitions between framesProvide start and end images, then describe the action and camera movement between them to plan composition changes and product transitions.
Prompt-directed motionDescribe a head turn, moving fabric, a camera push-in, or an orbit to build an existing image around a specific action.
Native sound creationAdd footsteps, ambient sound, or music to the prompt to design a soundtrack around the visible action.
Flexible output specificationsCombine 360p to 4K resolution, landscape or portrait framing, and a 4–10 second duration for product presentations and social content.
Parameters
| Parameter | Requirement | Description |
|---|---|---|
| prompt | Required | String. Directs action, camera movement, visual change, and sound after the start frame; 1–20,000 characters after trimming. |
| image_urls | Required | String array with one or two public URLs. The first image is the start frame; the optional second image is the end frame. JPEG, PNG, or WebP, up to 30 MiB each. |
| duration | Optional | Integer. Sets output length; the Playground preselects 8 seconds. Default 84610 |
| resolution | Optional | String. Sets output resolution; the Playground preselects 720p. Default 720p360p1080p4k |
| aspect_ratio | Optional | String. Controls output framing; the Playground preselects 16:9. Default 16:99:16 |
How to Use
Upload a start imageChoose a JPEG, PNG, or WebP image with a clear subject and composition, up to 30 MiB, as the opening frame.
Add an optional end frameTo guide the closing pose or composition, add an end image after the start frame using the same format and size requirements.
Describe action and soundDescribe the subject action, camera movement, lighting, and audio after the opening frame; with an end image, explain how the shot reaches it.
Choose a resolutionChoose 360p, 720p, 1080p, or 4K, with 720p selected by default, to match the output specifications for editing or presentation.
Choose a durationChoose 4, 6, 8, or 10 seconds, with 8 seconds selected by default, to plan the clip around its main action and pacing.
Choose an aspect ratioChoose 16:9 landscape or 9:16 portrait, with 16:9 selected by default, and frame the subject for the intended layout.
Review the cost and runReview the cost shown on the Run button, complete the required uploads and prompt, then click Run.
Preview and download the videoWhen the task finishes, preview the video and sound in the output panel, then select Download video to save the result.
Pricing
Billed per generation based on video duration and resolution tier, with native audio included in the result. 1 credit = $0.005.
| Usage | Rate | Details |
|---|---|---|
| 360p / 720p / 1080p | 4s=45, 6s=60, 8s=75, 10s=90 credits | Default 720p / 8s costs 75 credits ($0.375). |
| 4k | 4s=105, 6s=120, 8s=135, 10s=150 credits | 4k / 8s costs 135 credits ($0.675). |
Best Use Cases
Animated product visualsUse a product still as the start frame and describe camera movement and lighting changes to create footage for brand presentations.
Portrait animationStart with a portrait and describe a head turn, expression, or clothing movement for character presentations and story shots.
Start-to-end transitionsProvide opening and closing images and describe the action between them to plan product transformations or scene transitions.
Storyboard animationUse a selected storyboard image as the start frame, then add camera and sound direction for a shot preview shared across creative teams.
Pro Tips
- Choose a start image with a clear subject outline, lighting, and composition to establish the visual starting point.
- Describe action that continues from the image, such as “The person raises their cup as the camera slowly moves closer,” to define what happens next.
- When adding an end frame, choose consistent subject features and visual styling, then describe the action leading into the final pose.
- Describe the facial features, clothing, or setting to carry forward in one sentence, then specify camera motion separately to distinguish retained details from movement.
- Describe sounds tied to visible events, such as footsteps or a product opening, to connect the soundtrack to the action.
Usage notes
- Gemini Omni 1.1 Flash Image-to-Video generates video from a start image and text prompt, using prompt and image_urls as its main inputs. An optional second image guides the end frame, while duration, resolution, and aspect ratio configure the output.
- Describe speech, music, or ambient sound in the prompt; native audio is included in the result.
- Use publicly accessible HTTP(S) URLs for API media inputs so the service can retrieve the files.
- Save the task_id returned by an API submission to query progress and retrieve the result.
Related Models
Gemini Omni 1.1 Flash Image-to-Video API frequently asked questions
What is the Gemini Omni 1.1 Flash Image-to-Video API?
Gemini Omni 1.1 Flash Image-to-Video is a Google model for generating video from images. It animates static starting frames into clips up to 4K resolution with native synchronized audio based on text instructions, and supports uploading an optional closing frame for end-state control. Built on Gemini's multimodal intelligence architecture, it faithfully preserves the source subject identity, clothing textures, and lighting while introducing natural physical dynamics. You can call it programmatically or try it from the playground above.
Does Gemini Omni 1.1 Flash Image-to-Video support first and last frame interpolation?
Yes. When you provide a second image URL in the image_urls array as an end frame, the model computes spatial transitions and structural displacements between both stills, producing a seamless continuous camera take from the opening frame to the closing frame.
How does Gemini Omni 1.1 Flash Image-to-Video preserve subject identity?
The model anchors facial likeness, outfit details, and ambient lighting directly from the starting image. Providing high-resolution assets with clear subject boundaries and describing specific motion trajectories in the prompt provides unambiguous guidance for consistent subject animation.
Can Gemini Omni 1.1 Flash Image-to-Video synthesize ambient audio for static images?
Yes. With native audio-visual cross-modal reasoning, the model infers the visual context (such as an ocean beach, a bustling cafe, or a rainy street) from the start frame and automatically synthesizes matching environmental audio and physical foley without requiring manual sound uploads.
How can I create seamless looping clips with Gemini Omni 1.1 Flash Image-to-Video?
To produce a seamless loop, pass the exact same image as both the first and last frame in image_urls, and specify a subtle cyclic movement or steady circular camera orbit in your prompt. The model completes the action cycle within the set duration and returns cleanly to the initial composition.
What image formats are recommended for Gemini Omni 1.1 Flash Image-to-Video?
The endpoint accepts JPEG, PNG, and WebP images up to 20MB. Clear exposure and well-defined contours give the model the richest visual detail to extract facial geometry, material textures, and spatial depth accurately.
Can Gemini Omni 1.1 Flash Image-to-Video animate an image without a text prompt?
Yes. If no prompt is provided, the model infers plausible real-world physics from the image composition to generate organic micro-movements, such as hair sway, fabric drift, or water ripples. Adding text instructions allows you to guide explicit camera moves or deliberate character choreography.
