Introduction
Wan 2.2 Animate turns an approved character image and a separate motion reference into a new character-performance clip. Use it when appearance and movement have already been decided in different assets, rather than asking one source to supply both.
It works in two modes. With animation_mode set to animate, the character from your image moves with the motion of the driving video; with replace, the person in the driving video is swapped for the one in your image and the video's own scene is kept. The output runs as long as the driving video, 2 to 30 seconds, at 480p or 720p.
Key features & highlights
A clean A-pose is worth more than a long prompt
The published reference plate is the kind of image this endpoint wants: whole body in frame, neutral A-pose, seamless backdrop, even light. Everything the output looks like comes from that image. A cropped or heavily occluded plate limits every clip you will ever make from it, and no prompt recovers it.
The clip is as long as the source, up to 30 seconds
The output is as long as the driving video, which must run 2 to 30 seconds, so a two-minute source has to be trimmed first. Billing follows the seconds actually delivered rather than the cap used for the quote, so trimming the driving video before you upload it is the direct way to control cost.
Check the likeness at 480p before paying for 720p
The published clip is that same plate driven by a reference video: same burgundy top, same wide-leg trousers, now mid-turn. Resolution is a price tier, and 720p costs more per second than 480p, so confirm that the identity and silhouette survive at 480p on the shortest usable driving video first.
Request parameters
| Parameter | Required | Description |
|---|---|---|
animation_mode | No | Animate moves the character from your image using the motion of the driving video. |
image_url | Yes | The character image. The person here is the one that gets animated, so use a full-body plate with a clear silhouette and even light. at least 1 characters |
video_url | Yes | The driving video, 2 to 30 seconds long: upload an MP4, or pass an MP4 or MOV URL. at least 1 characters |
resolution | No | 480p or 720p, default 720p, and a price tier. Prove the transfer at 480p, then re-render the takes you intend to ship. |
prompt | No | Optional, up to 2000 characters. It guides animation style and content — not identity, which belongs to the character image. at most 2000 characters |
seed | No | 0 to 2147483647; zero requests a random seed. Fix it to compare two runs over the same driving video. |
Pricing
Output length follows the driving video, and you are billed per second of it.
| Specification | Price |
|---|---|
| $0.053 / second |
| $0.11 / second |
Use cases
Put your character into existing footage
With animation_mode set to replace, the person in the driving video is swapped for the character in your image while the footage keeps its own scene. Use it when the location already exists on video and only the performer needs to change.
Short loops from one character sheet
Up to 30 seconds covers a feed loop, a sticker or a reaction clip. Keep one plate and swap driving videos to build a library of gestures, such as a wave, a turn or a shrug, that all read as the same character because they share the same reference image.
Dance and performance routines
A character plate plus a driving video of the routine you want: wardrobe and build stay fixed by the plate while timing, weight and camera come from the footage. What bounds the work is ownership: you need the rights to both the plate and the driving video, and you are responsible for how the result is used.
Testing a plate before a longer render
Run a five-second 480p transfer to see whether a new character plate holds its face, hands and silhouette under motion. It is the cheapest way to reject a bad plate before committing it to a full 30-second job.
Prompt guide & pro tips
Build the character plate
Whole body in frame, neutral pose, plain backdrop, even light. This image decides the face, the wardrobe and the proportions of every clip you drive with it, so it is worth generating and rejecting a few before you commit. If no face or person can be found in it, the task is rejected with invalid_request. The published plate came from this prompt: “Full-body studio photograph of an adult female dancer standing in a neutral A-pose against a seamless grey backdrop, wearing a cropped burgundy tank top and high-waisted wide-leg trousers, barefoot, hair tied back, even soft studio lighting, sharp full-length framing, clean reference plate for character animation.”
Trim the driving video to the seconds you need
Output length equals source length, which must be 2 to 30 seconds, and you pay for the seconds delivered. Upload the MP4, or pass a direct link to an MP4 or MOV file; a web page that merely plays the video is not a file, and the call fails with the charge refunded.
Use the prompt for style, not identity
prompt is optional and takes up to 2000 characters. It guides the animation style and content; identity belongs to the character image. Fix seed when you want to compare two runs over the same driving video.
Check the result before iterating
Both inputs are required and not interchangeable: identity comes from the image, motion from the video. In animate mode the setting stays with the character image; in the reference run the driving video was shot in a kitchen and the result stayed on the plate's grey studio backdrop, with only the movement and camera carried across. A longer source is not compressed, so trim it before you upload.
API quick start
# Generate the idempotency key once; reuse it when retrying after a lost response.
export SPICY_IDEMPOTENCY_KEY="${SPICY_IDEMPOTENCY_KEY:-$(uuidgen)}"
curl -X POST https://api.spicyapi.ai/api/v1/jobs/createTask \
-H "Authorization: Bearer $SPICY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $SPICY_IDEMPOTENCY_KEY" \
-d '{
"model": "alibaba/wan-2.2-animate/character-animation",
"input": {
"animation_mode": "animate",
"image_url": "https://example.com/reference.png",
"resolution": "720p",
"video_url": "https://example.com/reference.mp4"
}
}'
# Copy data.taskId from the response into TASK_ID, then poll the status.
TASK_ID="TASK_ID_FROM_RESPONSE"
curl "https://api.spicyapi.ai/api/v1/jobs/recordInfo?taskId=$TASK_ID" \
-H "Authorization: Bearer $SPICY_API_KEY"
See the API reference for authentication, the complete schema, polling, and error handling.




























