Keep the same single raccoon, face mask markings, empty shallow steel bowl and abandoned brick kiln from the reference. In one continuous locked low-angle shot, the raccoon leans forward and gently nudges the near rim of the bowl once with one front paw. The bowl rotates and wobbles a half turn in place on the dusty brick floor with a short metallic clink. The raccoon immediately withdraws the paw and watches the bowl settle. No extra paws, no other animals, no bowl deformation or teleporting. Audio: paw scuff, one metallic clink synchronized with contact and a tiny ringing decay, quiet kiln room tone. No speech or music. One continuous five-second shot. No cuts, subtitles, captions, visible writing, logos, advertising or watermarks.
Wan 2.5 Image to Video API
alibaba/wan-2.5/image-to-videoWan 2.5 Image to Video animates a still image with synchronized audio and output up to 1080p. It uses the first frame to anchor the subject and composition while motion prompts guide gestures and camera movement.
Drag and drop files, paste from clipboard, or provide a URL. Upload one JPG, JPEG, PNG, or WebP first frame, up to 10 MB, or enter a publicly accessible HTTP(S) image URL.
1/1 files added
Examples
Developer integration
Quick Start
Submit a request to the generation endpoint, then query the video using its task ID. Choose cURL, JavaScript, or Python for the example.
Set up authentication
Configure VIDGO_API_KEY on your server and pass it as a Bearer token in the Authorization header.
- Submission endpoint
- POST
https://api.vidgo.ai/api/generate/submit - Authentication
- Authorization: Bearer VIDGO_API_KEY
Submit the generation request
Send model and input in a POST request to the generation endpoint. Save the returned task_id after a successful submission.
REQUEST_BODY=$(cat <<'JSON'
{
"model": "alibaba/wan-2.5/image-to-video",
"input": {
"prompt": "The camera slowly moves closer to the subject. Keep the lighting from the image, add subtle movement in the background, and include soft ambient sound.",
"image_urls": [
"https://cdn.vidgo.ai/apis/models/alibaba/wan-2.5/image-to-video/v1/01/input.png"
],
"resolution": "720p",
"duration": 5
}
}
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"Check execution status
Send a GET request using task_id until the status becomes finished or failed.
Task lookup
GET https://api.vidgo.ai/api/generate/status/{task_id}Replace {task_id} in the URL with the identifier from the submission response and query using the same Bearer token.
not_startedrunningfinishedfailed{
"code": 200,
"data": {
"task_id": "task-wan25-example",
"status": "not_started",
"created_time": "2026-09-27T00: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
}
}Read the video file
On completion, read the video URL from data.files. On failure, read data.error_message and review the request.
set -euo pipefail
: "${VIDGO_API_KEY:?Set VIDGO_API_KEY in your environment}"
REQUEST_BODY=$(cat <<'JSON'
{
"model": "alibaba/wan-2.5/image-to-video",
"input": {
"prompt": "The camera slowly moves closer to the subject. Keep the lighting from the image, add subtle movement in the background, and include soft ambient sound.",
"image_urls": [
"https://cdn.vidgo.ai/apis/models/alibaba/wan-2.5/image-to-video/v1/01/input.png"
],
"resolution": "720p",
"duration": 5
}
}
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
Place these parameters inside the request’s input object and set model to this page’s model identifier.
| Field | Type | Required | Default | Usage and values |
|---|---|---|---|---|
| prompt | string | Yes | — | Use 1–1500 characters to describe movement of the pictured subject, camera direction, and sound. |
| image_urls | array<string> | Yes | — | Provide exactly one publicly accessible HTTP(S) image URL to use as the first frame. |
| resolution | string | No | 720p | Choose 480p, 720p, or 1080p. The default is 720p; the displayed cost updates with the resolution. |
| duration | integer | No | 5 | Choose 5 or 10 seconds. The default is 5; the displayed cost updates with the duration. |
| audio | string | No | — | Optionally provide a publicly accessible audio file URL for speech or music. Leave it empty to generate sound that matches the video. |
| negative_prompt | string | No | — | Optionally describe unwanted visual elements, such as blur, lettering, or extra people. |
| seed | integer | No | — | Optionally enter an integer to record the random seed alongside your prompt and generation settings. |
Response Fields
The submission response identifies the task. Status responses provide its execution state and video files.
| Field | Type | Usage and values |
|---|---|---|
| code | integer | Application result code; 0 or 200 indicates a successful request. |
| data.task_id | string | Identifier of the generation task, used for subsequent status checks. |
| data.status | string | Task state: not_started, running, finished, or failed. |
| data.files | array<object> | Files returned on completion. Read file_url from entries whose file_type is video. |
| data.error_message | string | null | Error details for a failed task, used to review assets or adjust the request. |
Task Lifecycle
Save the task_id from submission and use that identifier to follow the task until it finishes or fails.
not_startedThe task has been created and is waiting to start.
runningThe task is processing; continue checking the same task.
finishedThe task is complete; read the video URL from files.
failedThe task failed; read error_message and review the input.
Status Checks and Error Handling
- Keep the same task IDAfter receiving task_id, use it to check progress. If a network error interrupts a status check, retry the check for that same task.
- Review the request by fieldFor validation errors, check required fields, types, and enumerated values. Image and audio URLs should be publicly accessible.
- Inspect the completion responseWhen the status is finished, read the video file entry. If file_url is missing, retain task_id and the response for troubleshooting.
Model Specifications
| Specification | Value | Details |
|---|---|---|
| Input mode | One first-frame image and text | The image establishes the starting frame; the prompt guides subject and camera motion. |
| Video duration | 5 / 10 seconds | Select the clip length with duration; the default is 5 seconds. |
| Output resolution | 480p / 720p / 1080p | Select with resolution; the default is 720p. |
| Audio mode | Generated / Custom audio | Generate matching sound with the video, or supply a publicly accessible audio file URL through audio. |
Related Models
Wan 2.5 Image to Video API frequently asked questions
What is the Wan 2.5 Image to Video API?
Wan 2.5 Image to Video is an Alibaba Tongyi model for animating still images into videos. It combines one first frame and a motion prompt to create 5 or 10-second clips with synchronized audio, camera movement, and output up to 1080p. First-frame conditioning anchors the subject and composition while text guides how the scene moves and sounds. You can call it programmatically or try it from the playground above.
How does Wan 2.5 Image to Video use the first-frame subject?
The model starts from the person or object in the first frame and generates motion from the prompt. Choose a clearly visible subject with a complete silhouette, then specify the facing direction, clothing or product details, and the action that follows.
Does Wan 2.5 Image to Video generate synchronized audio?
Yes. The model generates matching sound alongside the moving image. Include cues such as wind, footsteps, or background music in the prompt to give the animated scene an appropriate atmosphere.
How can I use custom audio with Wan 2.5 Image to Video?
Enter a publicly accessible audio file URL in Audio to supply an existing voice track or music. Match the motion prompt to the recording, for example by describing the speaker’s action and camera direction.
What first-frame images work with Wan 2.5 Image to Video?
Use one clear portrait, product photo, or illustration. The playground accepts JPG, JPEG, PNG, or WebP uploads up to 10 MB, or a publicly accessible HTTP(S) image URL.
How should I describe motion for Wan 2.5 Image to Video?
Describe one main action for the subject already in the first frame, followed by its direction, scale, and camera movement. For example, “the person slowly turns toward the camera, which stays fixed,” or “the camera slowly moves along the side of the product.”
Can Wan 2.5 Image to Video output 1080p?
Yes. Set Resolution to 1080p, or choose 480p or 720p; the default is 720p. Compose the first frame for your intended presentation, then choose the output resolution. The displayed cost updates with the settings.
Can Wan 2.5 Image to Video generate a 10-second clip?
Yes. Set Duration to 10, or use the default of 5 seconds. Choose the length around the motion: a brief head turn can fit a shorter clip, while a slow camera move can use more time.















