π¬ MuAPI Video Edit
A URL In, a URL Out
- secondary_image
- video_url
- first_frame
- request_id
The model dropdown on π¬ MuAPI Video Edit is 43 entries of things you'd otherwise have to build: video-effects, image-effects, ai-dance-effects, ai-dress-change, ai-video-face-swap, ai-video-upscaler and -pro, topaz-video-upscale, video-watermark-remover, two Seedance watermark removers, seedance-v2.0-video-edit, and about thirty more. One node, forty-three second passes over a clip.
It's the most "why doesn't this exist locally" node in the pack. Video upscaling and face swapping locally mean a whole pipeline - which is exactly why the hosted version is tempting.
What's required, and the gotcha
model and video_url. That's it for required fields. Optional: api_key, prompt, secondary_image (IMAGE), custom_endpoint, extra_params_json.
video_url is a URL, not a file. There is no upload socket on this node - unlike the Lipsync node, which takes a local audio_file_path, or Image-to-Video, which takes video_file_1-video_file_3 paths. A clip sitting in your ComfyUI output folder has to become a publicly reachable URL before this node can do anything with it. In practice that means either generating the clip through a MuAPI video node (so it's already on their CDN) or hosting it somewhere reachable. This is the single most common way people bounce off this node.
The prompt is only attached to the payload when it's non-empty, and its usefulness varies wildly by endpoint: on video-effects and seedance-v2.0-video-edit it steers the edit, while on an upscaler or a watermark remover there's nothing to say and an empty field is correct.
secondary_image behaves the way it does in the Enhance node - the pack picks the JSON key by matching the endpoint name. Anything with watermark in it gets watermark_image_url; everything else gets image_url, which is where your source face goes for ai-video-face-swap. Same socket, two different meanings, decided by a dropdown. Read the endpoint before connecting it.
Outputs
video_url (STRING) - into π¬ MuAPI Save Video for an mp4 plus frames. first_frame is an IMAGE from the result. request_id continues the chain with Extend.
When to pay, and when not to
The KB's upscaling.md treats video and temporal upscaling as "the third job", separate from image upscaling, and the local answer there is a real pipeline: SeedVR2 for restoration plus a Wan-family upscale pass, both free after the download. topaz-video-upscale is the closed commercial one, and on a single 10-second clip the hosted pass is genuinely the sane choice - no pipeline, no VRAM, no install. On a batch of forty clips, you've paid for a GPU you could have bought.
Face swap is a similar story. The KB's identity-preservation.md covers how solved the image case is locally (IP-Adapter FaceID, ReActor-style swapping), and a frame-by-frame local swap over a video works - it's the reassembly and the temporal coherence that wear you down. ai-video-face-swap trades credits for not doing that. If the face just has to be right for three seconds of a music video, pay.
Watermark removal is the one where local isn't a realistic option for most people, and it's the endpoint set this pack leans on hardest - three of the 43 are watermark removers. Whether you're comfortable with that is your call, not the node's.
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
requests, Pillow, numpy, torch, opencv-python - the last one only for pulling frames out of the returned clip. Nothing goes in models/.
Troubleshooting
Empty video_url fails fast with "video_url required." - good. A URL that isn't publicly reachable by muapi fails later, as an endpoint error, and looks like a bad model rather than a bad link; test the URL in a private browser window first.
Long edits run into the same 900-second polling ceiling as everything else in this pack, and a video upscale of a long clip is exactly the job that can exceed it. If you get a timeout, check the dashboard before re-queueing - you may already own the result. And since the output is just another video_url, chaining this into a second pass is free of ceremony: edit, then edit again, then save.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| model | COMBO | video-effects | 43 options: video-effects, image-effects, ai-dance-effects, ai-dress-change, ai-video-face-swap, ai-video-upscaler, +37 |
| video_url | STRING | β | |
| api_keyopt | STRING | β | |
| promptopt | STRING | β | |
| secondary_imageopt | IMAGE | β | |
| custom_endpointopt | STRING | β | |
| extra_params_jsonopt | STRING | {} | β |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| video_url | STRING | β |
| first_frame | IMAGE | β |
| request_id | STRING | β |