Wan 2.2 Animate
Playground
Try it on WavespeedAI!Wan2.2-Animate unified character animation & replacement model replicating movement and expression; generates 720p videos up to 120s. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing.
Features
Wan2.2-Animate
What is Wan2.2-Animate?
Wan2.2-Animate is an Alibaba Wan 2.2–based motion-transfer model that turns a single character image into a full performance. It copies body movement and facial expressions from a driving video while keeping the output stable, realistic, and identity-consistent.
Modes: animate vs replace
Wan2.2-Animate supports two behaviors:
-
animate The person or object in the input image is animated to follow the motion in the driving video. Use this when you want to bring a still portrait, illustration, or character design to life.
-
replace The model replaces the main performer in the video with the person or object from the image, keeping the original motion, scene, and camera. Use this when you want to swap a new character into an existing shot (presenter, actor, mascot, etc.).
Pricing
Pricing depends on output length and resolution.
| Resolution | Price per 5 s | Max billed length |
|---|---|---|
| 480p | 0.20 USD | 120 s |
| 720p | 0.40 USD | 120 s |
Billing rules
Underlying logic (no math required on your side):
-
Billed duration is clamped to the range 5–120 seconds
- If the video is shorter than 5 s → billed as 5 s
- If the video is longer than 120 s → billed as 120 s
-
480p
- 0.20 USD per 5 s → 0.04 USD per second
-
720p
- Double 480p → 0.40 USD per 5 s → 0.08 USD per second
So, for example:
- 30 s at 480p → 30 × 0.04 = 1.20 USD
- 30 s at 720p → 30 × 0.08 = 2.40 USD
- 150 s at 720p (over the cap) → billed as 120 s → 120 × 0.08 = 9.60 USD
How to use Wan2.2-Animate
-
image (required) Upload a clear character image.
- Prefer PNG or JPG
- Avoid WEBP and heavily compressed images
-
video (required) Upload the driving video whose pose, movement, and expressions you want to copy.
-
mode (required)
- animate: make the image character move like the subject in the video
- replace: swap the image character into the video
-
prompt (optional) Short guidance such as:
- “Preserve outfit, natural expression, no background change.”
- “Smoother head motion, cinematic lighting.”
-
resolution Choose 480p for faster, cheaper previews or 720p for higher-quality output.
-
seed (optional)
- Leave default for a fresh variation each run.
- Set a fixed integer if you want to reproduce the same layout and motion.
-
Run generation, review the result, and adjust image, video, mode, prompt, and resolution as needed.
Practical tips
-
Match composition and pose Try to keep the image and video similar in camera angle, crop, and body pose. This reduces artifacts and identity drift, especially in replace mode.
-
Keep aspect ratio consistent Use the same or very similar aspect ratio for both the image and the video for more stable framing.
-
Use clean, well-lit faces Avoid heavy occlusion by hands, microphones, or props, and avoid strong motion blur in the driving video.
-
Prototype at 480p Start with 480p and short clips to find good settings, then switch to 720p and longer durations once you like the behavior.
This gives you a predictable-cost, two-mode pipeline for driving AI characters and doing high-quality character replacement in existing footage.
Authentication
For authentication details, please refer to the Authentication Guide.
API Endpoints
Submit Task & Query Result
# Submit the task
curl --location --request POST "https://api.wavespeed.ai/api/v3/wavespeed-ai/wan-2.2/animate" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer ${WAVESPEED_API_KEY}" \
--data-raw '{
"mode": "animate",
"resolution": "480p",
"seed": -1
}'
# Get the result
curl --location --request GET "https://api.wavespeed.ai/api/v3/predictions/${requestId}/result" \
--header "Authorization: Bearer ${WAVESPEED_API_KEY}"
Parameters
Task Submission Parameters
Request Parameters
| Parameter | Type | Required | Default | Range | Description |
|---|---|---|---|---|---|
| image | string | Yes | - | The image for generating the output. | |
| video | string | Yes | - | The video for generating the output. | |
| prompt | string | No | - | The positive prompt for the generation. | |
| mode | string | No | animate | animate, replace | The mode of the generation. Animate Mode: animate the character in input image with movements from the input video. Replace Mode: replace the character in input video with the character in input image. |
| resolution | string | No | 480p | 480p, 720p | The resolution of the output video. |
| seed | integer | No | -1 | -1 ~ 2147483647 | The random seed to use for the generation. -1 means a random seed will be used. |
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 | Array of URLs to the generated content (empty when status is not completed) |
| data.urls | object | Object containing related API endpoints |
| data.urls.get | string | URL to retrieve the prediction result |
| data.has_nsfw_contents | array | Array of boolean values indicating NSFW detection for each output |
| data.status | string | Status of the task: created, processing, completed, or failed |
| 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, the ID of the prediction to get |
| data.model | string | Model ID used for the prediction |
| data.outputs | string | Array of URLs to the generated content (empty when status is not completed). |
| data.urls | object | Object containing related API endpoints |
| data.urls.get | string | URL to retrieve the prediction result |
| data.status | string | Status of the task: created, processing, completed, or failed |
| 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 |