Skip to main content
POST
Image-to-video: submit a generation task from a reference image
The interactive Playground on the right supports live debugging. Fill in your API Key under Authorization (format Bearer sk-xxx), upload a reference image, enter prompt, pick model / seconds / resolution, then send. Default group works — no dedicated group switch needed.
Scope: This page covers “generate video from a reference image” — upload one image as the visual anchor / starting frame to animate static content. If you don’t need a reference image, use the Text-to-Video endpoint (same endpoint, JSON body).
⚠️ Image-to-video constraints
  • Content-Type must be multipart/form-data (not JSON)
  • Only 1 reference image supported; field name is fixed as input_reference. Multi-image submissions only keep the first
  • Remote URLs not accepted — must be a file upload or Base64
  • Accepted formats: image/jpeg / image/png / image/webp
  • The length field is named seconds (not duration) and must be a string "4" / "6" / "8". Naming it duration is silently ignored and falls back to the default 4 sec; passing a number fails
  • At 1080p / 4k, seconds must be "8"
Google upstream Veo 3.1 supports multi-reference / first-last-frame / video extension; this Official channel does not yet expose them. For first/last frame, use the VEO 3.1 (Reverse) -fl series.

Code Samples

Python (OpenAI SDK · low-level client.post)

Python (requests + multipart)

cURL (multipart upload)

Node.js (native fetch + FormData)

Browser JavaScript (file input upload)

Already have a task_id? Two copy-paste cURL commands

If you already have a task_id (returned when you submitted the task, or visible in your console logs), just replace two placeholders below and run:
  • sk-your-api-key → your APIYI key
  • task_xxxxxxxxxxxxxxxx → your task ID

1. Check task status

When the JSON response shows status: "completed", you can download; if it shows in_progress, wait a few seconds and check again.

2. Download the video (saved as output.mp4)

The /content endpoint requires the Authorization header — opening the URL directly in a browser address bar returns 401. --retry 3 covers the occasional 400 right after status flips to completed (CDN sync delay).

Parameter Reference

Field naming difference vs JSON mode:
  • JSON mode nests under metadata.* (e.g. metadata.resolution)
  • Multipart mode flattens them as form fields (resolution / aspectRatio / seed directly)
  • The code samples above already use multipart conventions
Common mistakes:
  • Sending input_reference as a Base64 string inside a JSON body — must use multipart file field
  • Naming the field image / reference / input_image — must be exactly input_reference
  • Sending 2 images — server only keeps the first, the second is silently dropped
  • Sending a remote URL (https://cdn.../img.png) — not accepted; must be file or Base64

Response Format

The response structure is identical to Text-to-Video: Step 1 returns task_id + status: "queued", Step 2 polling returns status + coarse progress, Step 3 downloads MP4 binary from /content.
⚠️ Response field gotchas
  • task_id matches id; downstream should standardize on task_id
  • No video_url field; download from GET /v1/videos/{task_id}/content
  • progress jumps only between 0 / 50 / 100, not linear
  • /content returns 400 occasionally right after status flips to completed; retry after 4 sec
  • Image-to-video tasks typically take 10–30% longer than equivalent text-to-video tasks (extra image encoding step)
This endpoint is an async task entry. Billing happens when the task reaches completed, charged per request by model name (independent of whether input_reference is provided; fast $0.3 / standard $1.2). POST submission, polling, and download themselves are not billed; failed tasks are also not billed.

Authorizations

Authorization
string
header
required

API Key from APIYI console (Default group + Pay-per-request or Pay-as-you-go Priority Token; pure Pay-as-you-go not supported)

Body

multipart/form-data
model
enum<string>
default:veo-3.1-fast-generate-preview
required

Model ID (per-request billing):

  • veo-3.1-fast-generate-preview — $0.3/request
  • veo-3.1-generate-preview — $1.2/request
Available options:
veo-3.1-fast-generate-preview,
veo-3.1-generate-preview
prompt
string
required

Video generation prompt. Focus on how the scene should animate: camera motion, object action, lighting, audio atmosphere. Do not pass generateAudio — audio intent goes in the prompt.

Example:

"Camera slowly rises from the base of the lighthouse to the top, dusk lighting, waves lapping the rocks"

input_reference
file
required

Reference image file. Field name is fixed as input_reference, only 1 image supported.

Accepted formats: image/jpeg / image/png / image/webp. Remote URLs not accepted — must be a file upload or Base64.

seconds
enum<string>
default:8

Video length. The field name is seconds (not duration), a string enum: "4" / "6" / "8". Sending duration is silently ignored and falls back to the default 4 sec. Must be "8" at 1080p / 4k.

Available options:
4,
6,
8
size
enum<string>
default:1280x720

Output pixel dimensions; lower precedence than resolution

Available options:
1280x720,
720x1280,
1920x1080,
1080x1920,
3840x2160,
2160x3840
resolution
enum<string>
default:720p

Resolution tier (multipart mode flattens this as a top-level form field; higher precedence than size)

Available options:
720p,
1080p,
4k
aspectRatio
enum<string>
default:16:9

Aspect ratio: 16:9 landscape (default) or 9:16 portrait

Available options:
16:9,
9:16
seed
string

Random seed (multipart form field; string-encoded number is fine). Fixed seed clusters outputs in style but does not byte-reproduce.

Example:

"20260521"

negativePrompt
string

Negative prompt; recommended "blurry, watermark, distorted, low quality"

Example:

"blurry, watermark, distorted, low quality"

Response

Task submitted; returns task_id and queued status

id
string

Task ID (matches task_id; downstream should standardize on task_id)

Example:

"task_xxxxxxxxxxxxxxxx"

task_id
string

Task ID for subsequent polling and download

Example:

"task_xxxxxxxxxxxxxxxx"

object
string

Object type, fixed to video

Example:

"video"

model
string

Model ID used for this task

Example:

"veo-3.1-fast-generate-preview"

status
enum<string>

Task status:

  • queued — submitted, awaiting processing
  • in_progress — generating
  • completed — done, downloadable (/v1/videos/{task_id}/content)
  • failed — failed (not billed), retry possible
Available options:
queued,
in_progress,
completed,
failed
Example:

"queued"

progress
integer

Generation progress (coarse-grained, jumps only between 0 / 50 / 100)

Example:

0

created_at
integer

Task creation Unix timestamp (seconds)

Example:

1775025000

completed_at
integer

Task completion Unix timestamp (seconds); only present for completed status

Example:

1775025090