Begin exactly at Image 1 and end at Image 2. In one continuous five-second locked shot, the same red fox slowly uncurls, plants its paws and rises to stand facing right. Preserve facial features, red fur, white chest, tail, rock and snowy woodland. Natural gentle body mechanics, no cuts or camera movement. No text, lettering, captions, logos, watermarks, brands, advertising or product packaging.
Wan 2.7 Image to Video API
alibaba/wan-2.7/image-to-videoWan 2.7 Image to Video animates still images into continuous 2–15 second videos at 720p or 1080p, supporting first-and-last frame interpolation, realistic lighting continuity, and camera motion guidance. It preserves subject appearance, clothing texture, and native image framing while introducing expressive, physically plausible motion.
Drag and drop files, paste from clipboard, or provide a URL.
1/1 files added
Drag and drop files, paste from clipboard, or provide a URL.
1/1 files added
Drag and drop files, paste from clipboard, or provide a URL.
Drag and drop files, paste from clipboard, or provide a URL.
Examples
REST API Reference
Quick Start
Submit a task and query its status.
Step 1: Set up authentication
Create an API key in the dashboard and attach Authorization: Bearer <API_KEY> when submitting a task.
- Submit Endpoint
- POST
https://api.vidgo.ai/api/generate/submit - Authorization Header
- Authorization: Bearer VIDGO_API_KEY
Step 2: Submit a task
POST /api/generate/submit · alibaba/wan-2.7/image-to-video
REQUEST_BODY=$(cat <<'JSON'
{
"model": "alibaba/wan-2.7/image-to-video",
"input": {
"resolution": "720p",
"duration": 5,
"image_urls": [
"https://example.com/start.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"Step 3: Poll for completion
Poll with task_id while status is not_started or running, and stop at finished or failed. On success, read data.files[].file_url; on failure, read data.error_message.
Status Endpoint
GET https://api.vidgo.ai/api/generate/status/{task_id}Poll with task_id while status is not_started or running, and stop at finished or failed. On success, read data.files[].file_url; on failure, read data.error_message.
not_startedrunningfinishedfailed{
"code": 200,
"data": {
"task_id": "task-example",
"status": "running",
"created_time": "2026-09-21T08: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 executable script
Expand to review an end-to-end script with automatic polling, error handling, and timeout safeguards.
set -euo pipefail
: "${VIDGO_API_KEY:?Set VIDGO_API_KEY in your environment}"
REQUEST_BODY=$(cat <<'JSON'
{
"model": "alibaba/wan-2.7/image-to-video",
"input": {
"resolution": "720p",
"duration": 5,
"image_urls": [
"https://example.com/start.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
doneRequest Parameters (input object)
Supported generation parameters inside the input object when submitting to /api/generate/submit:
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| prompt | string | No | — | Prompt, trimmed; maximum 5,000 Unicode characters. Optional for image-to-video. |
| image_urls | array | Yes | — | One or two images in order: required start frame, optional end frame. HTTP(S), Data URI or Base64. |
| audio_url | string | No | — | Optional public HTTP(S) audio URL. |
| resolution | string | No | 720p | 720p or 1080p. Default: 720p. |
| duration | integer | No | 5 | 2–15 whole seconds; default 5. |
| multi_shots | boolean | No | — | Optional multi-shot control. Omitted by default. |
| seed | integer | No | — | Optional integer from 0 to 2147483647. |
| enable_safety_checker | boolean | No | — | Optional safety checker setting; omitted by default. |
| video_url | string | No | — | Public HTTP(S) video URL. Required for video editing; optional for image-to-video. |
Response Fields (Status Query)
Details returned by GET /api/generate/status/{task_id}:
| Field | Type | Description |
|---|---|---|
| code | integer | HTTP/business response status code (200 indicates success). |
| data.task_id | string | Globally unique task identifier. |
| data.status | string | Task lifecycle state: not_started, running, finished, or failed. |
| data.files | array | Array of output assets containing file_url and file_type upon completion. |
| data.error_message | string | null | Error diagnostic details if the task status is failed. |
Task Lifecycle
Clients should poll status until reaching either the finished or failed terminal state:
not_startedQueued
runningGenerating
finishedReady
failedFailed
Polling & Error Handling
- Polling frequencyStart polling with a 2 to 3-second interval, gradually increasing to 5 seconds for extended takes.
- Network resiliencyTransient 5xx responses or timeouts do not signify task failure; retry status requests after a short backoff.
- Webhook callbacksProvide a top-level callback_url in your submission payload to receive completion notifications automatically.
Specifications
| Specification | Value | Description |
|---|---|---|
| Model | alibaba/wan-2.7/image-to-video | |
| Resolution | 720p / 1080p | Default: 720p |
| Duration | 2–15 whole seconds; default 5. |
Wan 2.7 Image to Video API frequently asked questions
What is the Wan 2.7 Image to Video API?
Wan 2.7 Image to Video is an Alibaba Tongyi Lab model for animating still images into video. It transforms one or two input images into 2 to 15-second high-definition videos at 720p or 1080p, supporting first-and-last frame interpolation, character identity preservation, and camera trajectory control. Built on a Diffusion Transformer architecture with Wan-VAE 3D temporal compression, it preserves source composition, lighting style, and subject details while adding realistic physical motion. You can call it programmatically or try it from the playground above.
How does Wan 2.7 Image to Video handle first and last frame control?
You can provide two image URLs in the image_urls array. The first image acts as the opening frame and the second image anchors the ending frame, enabling the model to calculate smooth, physically plausible transitions between the two compositions.
What duration range does Wan 2.7 Image to Video support?
Wan 2.7 Image to Video supports any whole second integer from 2 seconds up to 15 seconds. The default value is 5 seconds, which you can adjust depending on the required movement scope and credit budget.
Does Wan 2.7 Image to Video require a text prompt?
No, the prompt parameter is optional for Wan 2.7 Image to Video. If left empty, the model automatically analyzes the visual context of the image to generate natural ambient motion; if provided, it follows your camera and action directives.
How does Wan 2.7 Image to Video determine the video aspect ratio?
Wan 2.7 Image to Video does not take an aspect_ratio parameter. Instead, it natively adapts to the dimensions and aspect ratio of your input starting image, ensuring that original framing and compositions are preserved without distortion.
How does Wan 2.7 Image to Video maintain character face consistency?
The model extracts deep spatial-temporal visual features directly from the input starting image. Throughout the generated frames, facial identity, skin tone, hair, and clothing details are anchored by the Diffusion Transformer attention mechanisms to prevent drift.
Does Wan 2.7 Image to Video support multi-shot scene transitions?
Yes, setting multi_shots to true allows the model to organize the clip into sequential visual phases or subtle perspective shifts, which is particularly effective for longer 10 to 15-second generation runs.