π¬ MuAPI Image-to-Video
Turning Stills Into Motion
- image_1
- image_2
- image_3
- image_4
- image_5
- image_6
- image_7
- image_8
- image_9
- video_url
- first_frame
- request_id
Image-to-video is the workhorse of AI video, and it's the one job where the closed models still have a real edge over anything you can run at home. π¬ MuAPI Image-to-Video gives you 107 of them behind one node - Seedance 2.0 and its pro/lite/1.5 variants, the omni and first-last-frame revisions, Kling O1, Veo 3.1, Wan 2.5, LTX-2, and a long tail you'll never exhaust. The default prompt even tells you how the pack expects you to work: "The character in @image1 walks through a beautiful garden."
That @image1 convention is the important part. You're not just animating one still - several of these endpoints take multiple reference images, and the prompt addresses them positionally.
The inputs that matter
Required: model, prompt, aspect_ratio (16:9, 9:16, 1:1, 4:3, 3:4, 21:9), quality (basic/high), and duration, an INT from 5 to 10 in steps of 5 - which is to say, five seconds or ten. No fifteen-second option here; that's what Extend is for.
Optional, and this is where the node earns its keep:
image_1β¦image_9- up to nine IMAGE inputs. How many a given endpoint actually uses is the model's business, but the slots are there, and the multi-image ones (character reference, first/last frame, subject reference) are the reason to reach for this node over a local I2V. The request went out to the subreddit in April 2026 asking whether these nodes integrate with existing workflows; the answer for this node is yes, and the way you do it is by rendering your stills locally in Flux or Qwen-Edit and feeding them in.video_file_1β¦video_file_3andaudio_file_1β¦audio_file_3- plain STRING paths, and they only do anything on theomni-referenceendpoints, which accept reference video and audio alongside images. That's a genuinely unusual capability: give it a character, a motion reference and a voice track in one call.custom_endpoint,extra_params_json- the usual overrides, JSON merged into the payload.
A trap in those file paths: they must be relative to ComfyUI's input or output folder. An absolute path makes the node raise "Upload path must be relative to ComfyUI input or output", and .. is rejected too. Drop reference.mp4 into ComfyUI/input/ and type reference.mp4.
How it works
Every image you connect gets uploaded to muapi's /upload_file endpoint as a JPEG at quality 95 (a URL the remote model can read, not your tensor). Then the node decides which field to use, by substring-matching the endpoint name: Seedance, Vidu, Kontext, Pixverse, Nano Banana, Kling 3.0 Omni and everything with "reference" in its name get images_list - the whole array; Wan's regular I2V, Luma, Runway, Hailuo, LTX and friends get image_url with just the first image. That hardcoded list is a fragile guess by design, and a brand-new endpoint that wants a differently-named array will fail against it. If that happens, π¬ MuAPI Generate (Generic) lets you write the field name yourself with __file_1__ placeholders.
With no image connected at all it fails immediately with "At least one image required."
Outputs
video_url is the STRING to send into π¬ MuAPI Save Video (mp4 on disk plus IMAGE frames) or Video Edit. first_frame is an IMAGE grabbed from the result, and request_id is your continuation handle for Extend.
Install
Manager β Install via Git URL β https://github.com/SamurAIGPT/muapi-comfyui β restart, or:
cd ComfyUI/custom_nodes
git clone https://github.com/SamurAIGPT/muapi-comfyui
pip install -r muapi-comfyui/requirements.txt
opencv-python is the only requirement that isn't already in a normal ComfyUI install, and it's there purely to pull frames out of returned video.
What actually goes wrong
Budget for two failures. First, jobs that outrun the poll window: the node checks the result endpoint every 10 seconds for up to 900 seconds, then errors with a timeout - but a ten-second, high quality render can still be finishing server-side, so check your MuAPI dashboard before paying for it twice. Second, quality expectations: these clips are short, and the thing that reliably improves them is the first frame. A clean, well-lit, correctly-framed still produces a much better clip than a beautiful image with three competing subjects in it - the same reference-image discipline the KB describes for character consistency in character-consistency.md.
Inputs (23)
| Name | Type | Default | Description |
|---|---|---|---|
| model | COMBO | seedance-v2.0-i2v | 107 options: seedance-v2.0-i2v, seedance-pro-i2v, seedance-pro-i2v-fast, seedance-lite-i2v, seedance-v1.5-pro-i2v, seedance-v1.5-pro-i2v-fast, +101 |
| prompt | STRING | The character in @image1 walks through a beautiful garden | β |
| aspect_ratio | COMBO | 16:9 | 6 options: 16:9, 9:16, 1:1, 4:3, 3:4, 21:9 |
| quality | COMBO | basic | 2 options: basic, high |
| duration | INT | 55β10 | β |
| api_keyopt | STRING | β | |
| image_1opt | IMAGE | β | |
| image_2opt | IMAGE | β | |
| image_3opt | IMAGE | β | |
| image_4opt | IMAGE | β | |
| image_5opt | IMAGE | β | |
| image_6opt | IMAGE | β | |
| image_7opt | IMAGE | β | |
| image_8opt | IMAGE | β | |
| image_9opt | IMAGE | β | |
| video_file_1opt | STRING | β | |
| video_file_2opt | STRING | β | |
| video_file_3opt | STRING | β | |
| audio_file_1opt | STRING | β | |
| audio_file_2opt | STRING | β | |
| audio_file_3opt | STRING | β | |
| custom_endpointopt | STRING | β | |
| extra_params_jsonopt | STRING | {} | β |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| video_url | STRING | β |
| first_frame | IMAGE | β |
| request_id | STRING | β |