Wan - Animate Move
Borrow the motion from a clip, keep your own character
- video_url
- image_url
- video
- url
- all_urls_json
- task_id
- raw_json
- credits_consumed
- credits_left
This is motion transfer, the thing that used to mean DWPose skeleton extraction, driving videos, and a mask pipeline before you got anything. Wan Animate is Alibaba's first-party take on it - one of the task-specific Apache 2.0 models that still ships open even though the numbered Wan base is frozen at 2.2 - and on KIE it's a hosted endpoint with a two-socket ComfyUI wrapper.
The pitch, in one line: give it a video and a picture of your character, and it puts your character through that performance. That's it. Reels, dance clips, lip-sync-adjacent stuff, replacing a reference actor in a take you already shot.
How it works
Two required inputs, video_url (VIDEO) and image_url (IMAGE), and no prompt field at all - the motion is the instruction. The node converts your video to a temp MP4, uploads it and the image to KIE, then submits to /api/v1/jobs/createTask with the marketplace model wan/2-2-animate-move, polls /api/v1/jobs/recordInfo until the task completes, and downloads the result into ComfyUI/output/KIE-Results/videos. You get a native VIDEO back.
Worth knowing what the local version of this is, because it shapes expectations: Wan Animate and the community's later SCAIL models disagree about how to do this. SCAIL-2's whole argument was dropping the stick-figure intermediate, because the depth and contact information lost in pose extraction is exactly what makes a transferred performance feel grounded. Animate Move is on the older side of that line - simple to use, sometimes stiffer than a 2026 reference-model workflow.
Inputs that matter
video_url- the driving clip. Framing matters more than resolution; a clear upper body beats a wide shot.image_url- the character to move. Needs to be a good, well-lit reference of the person, ideally with a similar aspect ratio to the driving video.resolution-480p(default),580p, or720p. Start at 480p.
Then the pair you'll see on every node in this pack: nsfw_checker, which defaults to off, and timeout_seconds at 1200, plus callback_url which wants to stay empty in ComfyUI. There's no seed - you can't reproduce a take by number, so keep the outputs you like.
Outputs
video is the deliverable. Alongside it: url (the hosted file), all_urls_json, task_id for tracking, raw_json, and credits_consumed / credits_left, with a credits receipt printed on the node after the run. Because there's no seed and these jobs cost real money, the task_id socket is worth wiring to a text display if you're running batches - a batch you can't retrace is a batch you'll re-pay for.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/felipederosilva/ComfyUI-KIE-Nodes-Next
cd ComfyUI-KIE-Nodes-Next && pip install -r requirements.txt
Restart ComfyUI. No model files, no GPU requirement beyond what ComfyUI itself needs - the weights are KIE's. The node tree is built from KIE's live API catalog at startup, so individual model nodes appear under folders like KIE Next / Video / Wan rather than one catch-all API node.
Key setup is one-time for the whole pack: Settings → KIE.ai Nodes Next → Connection → Paste / replace KIE.ai API key. It's validated against KIE before it overwrites anything, then you get a masked fingerprint and a ✅ CONNECTED. KIE_API_KEY env var overrides it for server installs. KIE sells credits à la carte with no subscription.
Common issues
"No complete upper body detected in the video." KIE rejects clips where the subject isn't clearly visible. Tighten the crop on the driving clip - this is a validation failure, not a bad model run, and you won't be charged for finishing a generation that never started.
The face drifts or the identity slides. Motion transfer isn't identity lock. If the face is the point, run the other direction: generate your character consistently (or train a LoRA) and only then animate.
Body proportions look wrong compared to the driving clip. Known complaint in this family - transfer models tend to stretch the subject toward the source's proportions. Try a reference image whose build is closer to the driving performer.
Nothing renders after a successful run. Add a video preview or save node; this node returns a VIDEO and isn't an output node itself.
Update ComfyUI if you get a comfy_api.latest error - the native video object depends on a current build.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| video_url | VIDEO | — | |
| image_url | IMAGE | — | |
| resolutionopt | COMBO | 480p | Resolution of the generated video (480p, 580p, or 720p). |
| nsfw_checkeropt | BOOLEAN | false | Defaults to false. You can set it to false based on your needs. If set to false, our content filtering will be disabled, and all results will be returned directly by the model itself. Note: There is no guarantee that everything can be filtered out; if you are not satisfied with the results, you will need to make your own arrangements. |
| timeout_secondsopt | INT | 120030–7200 | — |
| callback_urlopt | STRING | Optional KIE callback URL. Leave empty for normal ComfyUI use. |
Outputs (7)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| url | STRING | — |
| all_urls_json | STRING | — |
| task_id | STRING | — |
| raw_json | STRING | — |
| credits_consumed | FLOAT | — |
| credits_left | FLOAT | — |