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 | URL of the input video. (File URL after upload, not file content; Accepted types: video/mp4, video/quicktime, video/x-matroska; Max size: 100.0MB) | |
| image_url | IMAGE | URL of the input image. (File URL after upload, not file content; Accepted types: image/jpeg, image/png, image/webp; Max size: 5.0MB) | |
| resolutionopt | COMBO | 720p | Resolution of the generated video (720p). |
| nsfw_checkeropt | BOOLEAN | false | Defaults to false. When false, no additional content filtering is applied and results are returned directly by the model. |
| 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 | — |