Wan 2.2 Animate · Character Animation
Put your character's face on someone else's dance
- image_url
- video_url
- video
- task id
Motion transfer is its own genre, and it has a different failure mode from everything else in video generation: you're not asking for new motion, you're asking for this motion on that character. Wan 2.2 Animate is Alibaba's open model for exactly that - one image of a character, one driving video, output matching the driving video's length - and this node calls it hosted, at 480p or 720p.
The reason to want it is that nothing else in the open ecosystem does this well enough to bother with. Wan Animate owns per-frame motion control, it's why character-replacement tests pull four-figure upvotes on r/comfyui, and it's the model people reach for when they want a character who can actually act. It's also not the newest thing in the category - newer models beat it at not distorting your character to match the driving video's proportions, which is the specific complaint you'll find at the top of every comparison thread.
Inputs
image_url- anIMAGEsocket. The character. This is the person who gets animated, so use the cleanest, most front-on image you have.video_url- aVIDEOsocket for the driving video, 2 to 30 seconds. Upload an MP4, or pass an MP4 or MOV URL. Two things are worth knowing: its motion transfers to the character, and its length sets the output length, so the driving clip is also your cost estimate. The node's tooltip is explicit that videos outside the 2–30 second range are rejected before any charge.animation_mode-animatedrives the character in the image with the driving video's motion.replaceswaps the person in the driving video for the one in your image. Same node, two different jobs; pick before you write a prompt.prompt- optional, and it guides animation style and content. Often better left alone than used to second-guess the driving video.resolution-720pby default,480pavailable. 480p is the cheap-iteration tier.seed- fixed after generate by default, so a re-queue reuses the result rather than charging for another take.
Outputs
video and task id. Wire video into Save Video; keep the task id, since it's both the support handle and how you find the job in your console.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/spicyapi-ai/comfyui-spicyapi
Restart ComfyUI. No dependency install, no model weights, no GPU - the pack is a thin client and the model runs on SpicyAPI's machines. Add a key from spicyapi.ai/console/keys under Settings > SpicyAPI and restart once so the catalogue comes from your account. On a headless box, SPICY_API_KEY.
What to watch
Cost is per second of output, so a long driving video is a long bill. Around $0.053/s means a 30-second take is around a dollar-fifty, and a five-second test is a quarter. Trim your driving clip to the section that matters before you run - it's free, and it's the single biggest saving on this node.
Your character gets stretched to fit. This is the known gripe with Wan Animate and the reason SCAIL-1 got its fifteen minutes of fame: if the person in your image and the person in the driving video have different proportions, the motion transfer distorts yours. Match your reference to the driver - same build, similar framing - or expect the model to make them match.
Identity drifts. Reference-based animation holds a face better than text-to-video ever will, and still not perfectly. Keep clips short and check the last frame before you commit to a long render.
Set the ceiling. Settings > SpicyAPI > Max cost per run makes the node quote every run and refuse anything above your limit before charging. And remember: interrupting a run only stops you waiting - the task finishes server-side and is charged if it succeeds. Failures return a task id; 40310 is an unverified email, 40004 means no deployment serves that combination.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| animation_mode | COMBO | animate | animate drives the character in the image with the motion of the driving video; replace swaps the person in the driving video for the one in the image. |
| image_url | IMAGE | Character image. The person in this image is the one that gets animated. | |
| video_url | VIDEO | Driving video, 2 to 30 seconds long; upload an MP4, or pass an MP4 or MOV URL. Its motion is transferred to the character and its length sets the output length. Videos outside that range are rejected before any charge. | |
| resolution | COMBO | 720p | Output video resolution. |
| prompt | STRING | Optional description of the motion, used to guide animation style and content. | |
| seed | INT | 00–2147483647 | Same seed and settings, same result. Set 'control after generate' to randomize to get a new result on every run; every run is billed. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| task id | STRING | The SpicyAPI task id, for the console logs or support. |