Start exactly on the input image. The lighthouse beam rotates and sweeps across the darkening sea, waves crash against the rocks sending up white spray, clouds drift slowly across the dusk sky. Steady cinematic wide shot, no cuts. Audio: ocean waves and wind. Keep the same lighthouse, cliff, and colors. No logos, no readable text, no watermark.
Gemini Omni Flash Image to Video API
google/gemini-omni-flash/image-to-videoGemini Omni Flash Image to Video animates one still image into a 4–10 second clip with subject preservation, native lip-synced audio, and resolution from 720p to 4K. It keeps identity, composition, and style from the source frame while adding directed motion, camera moves, and synchronized sound.
Upload one source image to animate.
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 image and prompt, 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 parameters for this endpoint using the request example, then save the returned task_id to query progress and results.
REQUEST_BODY=$(cat <<'JSON'
{
"model": "google/gemini-omni-flash/image-to-video",
"input": {
"prompt": "Start exactly on the input image. The lighthouse beam rotates and sweeps across the darkening sea, waves crash against the rocks sending up white spray, clouds drift slowly across the dusk sky. Steady cinematic wide shot, no cuts. Audio: ocean waves and wind. Keep the same lighthouse, cliff, and colors. No logos, no readable text, no watermark.",
"duration": 8,
"resolution": "720p",
"aspect_ratio": "16:9",
"image_urls": [
"https://cdn.vidgo.ai/apis/models/google/gemini-omni-flash/image-to-video/v1/01/input-source.png"
]
}
}
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-flash/image-to-video",
"input": {
"prompt": "Start exactly on the input image. The lighthouse beam rotates and sweeps across the darkening sea, waves crash against the rocks sending up white spray, clouds drift slowly across the dusk sky. Steady cinematic wide shot, no cuts. Audio: ocean waves and wind. Keep the same lighthouse, cliff, and colors. No logos, no readable text, no watermark.",
"duration": 8,
"resolution": "720p",
"aspect_ratio": "16:9",
"image_urls": [
"https://cdn.vidgo.ai/apis/models/google/gemini-omni-flash/image-to-video/v1/01/input-source.png"
]
}
}
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.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| prompt | string | Yes | — | 1–20,000 characters after trimming. |
| image_urls | string[] | Yes | — | Exactly 1 public HTTP(S) image URL. |
| duration | integer | No | 6 | 4, 6, 8, or 10 seconds. |
| resolution | string | No | 720p | 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 fields, parameter ranges, and available credits, then adjust and resubmit.
- 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 image | One public still plus a motion and audio prompt. |
| Output | Video | Returns an asynchronous task ID; finished tasks include a video file with native audio. |
| Resolution | 720p / 1080p / 4k | Default is 720p. |
| Duration | 4 / 6 / 8 / 10 seconds | Default is 6 seconds. |
| Aspect ratio | 16:9 / 9:16 | Default is 16:9. |
| Billing basis | Per generation | 720p/1080p: 4s=120, 6s=150, 8s=200, 10s=220 credits. 4k: 4s=250, 6s=300, 8s=350, 10s=450 credits. |
Gemini Omni Flash Image to Video
Gemini Omni Flash Image to Video is Google DeepMind’s multimodal model for turning a single reference still into motion. Upload one public image URL, add a motion and audio prompt, then generate a 4–10 second clip with lip-synced dialogue and ambience. Choose 720p, 1080p, or 4K with 16:9 or 9:16 framing—ideal for product still animation, portrait talking clips, brand key-visual motion, and social conversions from existing creatives.
Why Choose This?
Single-image motion from brand stillsAnimate one product or portrait still into a watchable clip without rebuilding the scene from scratch.
Subject and composition preservationKeeps face, wardrobe, product shape, and framing cues from the source image while adding physically plausible motion.
Native audio with lip syncGenerates dialogue and ambience with the picture so talking-head and product demos ship with synced sound.
Prompted camera and lighting controlGuide push-in, dolly, tracking, and light mood on top of the still to stage reveals and emotional beats.
720p to 4K delivery tiersDraft at 720p or 1080p, then render 4K when texture and lighting detail matter for final delivery.
Flexible duration and framingPick 4–10 seconds and 16:9 or 9:16 to match hooks, demos, and vertical social layouts.
Parameters
| Parameter | Requirement | Description |
|---|---|---|
| prompt | Required | String. Motion, camera, lighting, and audio cues; 1–20,000 characters after trimming. |
| image_urls | Required | Array with exactly 1 public HTTP(S) image URL used as the source still. |
| duration | Optional | Integer. Output length in seconds; the Playground preselects 6. Default 64810 |
| resolution | Optional | String. Output clarity tier; the Playground preselects 720p. Default 720p1080p4k |
| aspect_ratio | Optional | String. Output framing; the Playground preselects 16:9. Default 16:99:16 |
How to Use
Prepare the source stillProvide one clear public image URL showing the subject, product, or key visual you want to animate.
Write the motion promptDescribe action, camera move, lighting change, and dialogue or ambience while stating what identity details to keep.
Set output durationChoose 4, 6, 8, or 10 seconds (default 6) to match the beat you want from the still.
Select resolutionPick 720p for iteration, 1080p for clearer delivery, or 4K for high-detail finals.
Choose aspect ratioSelect 16:9 or 9:16 to match landscape storytelling or vertical social placement.
Review the cost and runCheck the cost shown on the Run button, finish uploads and prompt, then click Run.
Preview and download the videoWhen the task finishes, preview picture and synced audio, then select Download video to save the result.
Pricing
Billed per generation by duration and resolution tier, with native audio included. 1 credit = $0.005.
| Usage | Rate | Details |
|---|---|---|
| 720p / 1080p | 4s=120, 6s=150, 8s=200, 10s=220 credits | Default 720p / 6s costs 150 credits ($0.75). |
| 4k | 4s=250, 6s=300, 8s=350, 10s=450 credits | 4k / 6s costs 300 credits ($1.50). |
Best Use Cases
Product still to motion adsTurn pack shots and hero stills into short demos with ambient sound for ecommerce and paid social.
Portrait talking clipsAnimate a clear face still with speech cues for virtual hosts, reactions, and spokesperson drafts.
Brand key-visual activationBring campaign stills to life with controlled camera moves before full video production.
Social creative remixConvert existing 9:16 or 16:9 creatives into fresh motion variants for A/B testing.
Pro Tips
- Use a sharp, well-lit still with a clear subject silhouette so identity cues stay readable in motion.
- State what to preserve—face, wardrobe, product labeling—then describe the new action separately.
- Name camera moves such as slow push-in or side tracking to avoid random framing drift.
- Add Audio cues for dialogue language and ambience tied to visible actions.
- Keep one primary motion arc per clip; complex choreography works better as a second iteration.
Usage notes
- Gemini Omni Flash Image to Video requires prompt plus image_urls with exactly one public image URL.
- Describe speech or ambience in the prompt; native audio with lip sync is included in the result.
- Duration, resolution, and aspect_ratio configure output length, clarity, and framing.
- After an API submission, save the returned task_id to query progress and retrieve the final media URL.
Related Models
Gemini Omni Flash Image to Video API frequently asked questions
What is the Gemini Omni Flash Image to Video API?
Gemini Omni Flash Image to Video is a Google DeepMind multimodal model for animating a still image into video. It creates 4–10 second clips from one reference still plus a text prompt, with subject preservation, native lip-synced audio, and 720p to 4K output. Built on Gemini’s unified multimodal architecture, it keeps identity and composition from the source frame while adding directed motion and synchronized sound. You can call it programmatically or try it from the playground above.
How many images does Gemini Omni Flash Image to Video require?
Submit exactly one public image URL in image_urls. That still is the visual anchor for identity and composition; motion and sound are driven by the prompt. For multi-image consistency, use Reference to Video instead.
Does Gemini Omni Flash Image to Video preserve subject identity?
Yes. Start from a clear still and restate face, wardrobe, or product labeling in the prompt so the model anchors appearance while adding motion. Strong, uncluttered source frames improve continuity across the clip.
Does Gemini Omni Flash Image to Video generate native lip sync?
Yes. Dialogue and ambience are generated with the picture and embedded in the MP4. Add language and tone cues when you need talking performances aligned to mouth motion.
When should Gemini Omni Flash Image to Video use 4K?
Choose 4K for finals that need sharper texture and lighting detail from the still. Iterate at 720p or 1080p first—same duration options, lower credit cost—then promote selected takes.
How do I control camera motion in Gemini Omni Flash Image to Video?
Write explicit moves such as slow push-in, dolly, or side tracking, separate from subject action. Pair them with lighting cues so the still’s framing evolves intentionally.
How are Gemini Omni Flash Image to Video credits calculated?
Credits are charged per generation by duration and resolution. At 720p/1080p, 6 seconds costs 150 credits ($0.75); at 4K the same length costs 300 credits ($1.50). See the Pricing section for full rates.















