Google Veo3.1 Fast Image To Video API Documentation
Playground
Try it on WaveSpeedAI!Google Veo 3.1 Fast is an Image-to-Video model with native 1080p output for high-detail videos from images and fast performance. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing.
Features
Veo 3 I2V Fast is the high-speed, cost-optimized variant of Google DeepMind’s Veo 3 image-to-video model. It transforms static images into cinematic 1080p videos with smooth, realistic motion and natural lighting — all while delivering results up to 30% faster than the standard version. Perfect for creators who need rapid, high-quality motion generation for social content, concept visualization, and creative storytelling.
🎬 Why it stands out
-
From Image to Motion Transform a single image into a natural, dynamic video sequence while preserving its original composition and style.
-
Cinematic Realism Produces high-fidelity motion with natural lighting, accurate perspective, and fluid camera transitions.
-
Native Audio Generation Automatically generates synchronized sound—including ambient noise, effects, and light music—perfectly aligned with the visuals.
-
Dialogue & Lip-Sync Enables speaking characters or realistic expressions, ideal for storytelling, marketing, and short-form content.
-
Consistent Subject & Style Retains the identity, color tone, and visual integrity of your input image throughout the motion sequence.
Pricing
Pricing depends on the requested duration, resolution, and whether audio generation is enabled.
| Resolution | Without Audio / Second | With Audio / Second |
|---|---|---|
| 720p | $0.10 | $0.15 |
| 1080p | $0.10 | $0.15 |
| 4K | $0.25 | $0.30 |
Example Costs
| Resolution | Duration | Without Audio | With Audio |
|---|---|---|---|
| 720p | 8s | $0.80 | $1.20 |
| 1080p | 8s | $0.80 | $1.20 |
| 4K | 8s | $2.00 | $2.40 |
Billing Rules
- Total price = requested duration × the applicable per-second rate.
generate_audio=trueuses the With Audio rate.generate_audio=falseuses the Without Audio rate.- Default configuration: 1080p, 8 seconds, audio enabled — $1.20.
- Providing a starting image or an optional last frame does not add a separate charge.
aspect_ratio,negative_prompt, andseeddo not add separate charges.
🚀 How to Use
-
Upload an Image Choose a clear, high-quality still image—this defines the subject, framing, and overall style.
-
Write a Prompt Describe the desired motion, mood, and camera movement.
> Example: “Slow cinematic zoom out as wind moves through the trees and sunlight flickers across the leaves.”
-
Adjust Settings Select the video duration (up to 8 seconds) and output resolution (up to 1080p).
-
Generate the Video Submit your prompt and image—Veo 3 I2V automatically creates motion, lighting, and audio.
-
Preview & Download Review the result, refine the prompt if needed, and download the final MP4.
💡 Pro Tips
- Use bright, high-contrast images for clearer motion and lighting.
- Keep prompts focused on a single subject or action for best stability.
- Add camera directions like “tracking shot,” “slow pan,” or “handheld style” to control movement.
- Specify lighting and mood (e.g., bright daylight, soft sunset glow).
- Avoid conflicting motion requests to maintain smooth results.
📝 Notes
- Actual processing time depends on queue load and resolution.
- Optimized for cinematic shorts, ads, and social media clips.
- Ensure your uploaded image is clear, accessible, and legally usable.
- Please ensure your prompts comply with Google’s Safety Guidelines — if an error occurs, revise your prompt and try again.
Authentication
For authentication details, please refer to the Authentication Guide.
API Endpoints
Submit Task & Query Result
set -euo pipefail
export WAVESPEED_API_KEY="your-api-key"
REQUEST_BODY=$(cat <<'JSON'
{
"prompt": "A cinematic ocean wave at sunrise, highly detailed",
"image": "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg",
"aspect_ratio": "16:9",
"duration": 8,
"resolution": "1080p",
"generate_audio": true
}
JSON
)
# 1. Submit the prediction once. Never retry this request automatically:
# a retry after an unclear failure can create a second, billed task.
CHECK='The task may already exist. Check History or the predictions list before submitting again.'
if ! SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
--connect-timeout 10 --max-time 60 \
-X POST "https://api.wavespeed.ai/api/v3/google/veo3.1-fast/image-to-video" \
-H "Authorization: Bearer ${WAVESPEED_API_KEY}" \
-H "Content-Type: application/json" \
-d "${REQUEST_BODY}"); then
printf 'Submit failed. %s\n' "${CHECK}" >&2
exit 1
fi
TASK=$(printf '%s' "${SUBMIT_RESPONSE}" | jq 'if type == "object" and has("data") then .data else . end')
PREDICTION_ID=$(printf '%s' "${TASK}" | jq -r '.id // empty')
if [ -z "${PREDICTION_ID}" ]; then
printf 'Submission response did not contain a prediction id. %s\n' "${CHECK}" >&2
exit 1
fi
RESULT_URL="https://api.wavespeed.ai/api/v3/predictions/${PREDICTION_ID}/result"
# 2. Poll until the prediction reaches a final status.
BODY_FILE=$(mktemp)
trap 'rm -f "${BODY_FILE}"' EXIT
while true; do
# Transient errors (429, 5xx) are retried, honoring Retry-After.
HTTP_CODE=$(curl --silent --show-error --fail-with-body \
--connect-timeout 10 --max-time 60 --retry 5 --retry-delay 2 \
--output "${BODY_FILE}" --write-out '%{http_code}' \
"${RESULT_URL}" \
-H "Authorization: Bearer ${WAVESPEED_API_KEY}" || true)
case "${HTTP_CODE}" in
2??) ;;
000|429|5??) # dropped connection or temporary error: keep polling
printf 'Task %s: HTTP %s, polling again in 10s\n' "${PREDICTION_ID}" "${HTTP_CODE}" >&2
sleep 10; continue ;;
*) printf 'Task %s: HTTP %s\n' "${PREDICTION_ID}" "${HTTP_CODE}" >&2
cat "${BODY_FILE}" >&2; exit 1 ;;
esac
RESULT=$(jq 'if type == "object" and has("data") then .data else . end' "${BODY_FILE}")
STATUS=$(printf '%s' "${RESULT}" | jq -r '.status // empty')
case "${STATUS}" in
completed) printf '%s\n' "${RESULT}" | jq '.outputs'; break ;;
failed|cancelled|timeout|deleted)
printf 'Task %s ended with status %s\n' "${PREDICTION_ID}" "${STATUS}" >&2
printf '%s\n' "${RESULT}" | jq . >&2; exit 1 ;;
*) sleep 2 ;;
esac
doneRetry temporary errors only while polling, never the submit request. Errors, retries and timeouts
Parameters
Task Submission Parameters
Request Parameters
| Parameter | Type | Required | Default | Range | Description |
|---|---|---|---|---|---|
| prompt | string | Yes | - | The positive prompt for the generation. | |
| image | string | Yes | - | The image to use for the generation. | |
| last_image | string | No | - | - | The end image for generating the output. |
| aspect_ratio | string | No | 16:9 | 16:9, 9:16 | The aspect ratio of the generated media. |
| duration | integer | No | 8 | 8, 4, 6 | The duration of the generated media in seconds. |
| resolution | string | No | 1080p | 720p, 1080p, 4k | Video resolution. |
| generate_audio | boolean | No | true | - | Whether to generate audio. |
| negative_prompt | string | No | - | The negative prompt for the generation. | |
| seed | integer | No | - | - | The random seed to use for the generation. |
Response Parameters
| Parameter | Type | Description |
|---|---|---|
| code | integer | HTTP status code (e.g., 200 for success) |
| message | string | Status message (e.g., “success”) |
| data.id | string | Unique identifier for the prediction, Task Id |
| data.model | string | Model ID used for the prediction |
| data.outputs | array | Output values, usually URL strings; some models return text strings or structured result objects (empty when status is not completed) |
| data.urls | object | Object containing related API endpoints |
| data.status | string | Task status. completed is successful; failed, cancelled, timeout, and deleted are failure terminal statuses. |
| data.created_at | string | ISO timestamp of when the request was created (e.g., “2023-04-01T12:34:56.789Z”) |
| data.error | string | Error message (empty if no error occurred) |
| data.timings | object | Object containing timing details |
| data.timings.inference | integer | Inference time in milliseconds |
Result Request Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| id | string | Yes | - | Task ID |
Result Response Parameters
| Parameter | Type | Description |
|---|---|---|
| code | integer | HTTP status code (e.g., 200 for success) |
| message | string | Status message (e.g., “success”) |
| data | object | The prediction data object containing all details |
| data.id | string | Unique identifier for the prediction |
| data.model | string | Model ID used for the prediction |
| data.outputs | array<string | object> | Array of generated outputs (empty when status is not completed). Items are usually URL strings, but may be text strings or structured result objects, depending on the model. |
| data.urls | object | Object containing related API endpoints |
| data.status | string | Status: completed is successful; failed, cancelled, timeout, and deleted are failure terminal statuses |
| data.created_at | string | ISO timestamp of when the request was created |
| data.error | string | Error message (empty if no error occurred) |
| data.timings | object | Object containing timing details |
| data.timings.inference | integer | Inference time in milliseconds |