π¬ MuAPI Text-to-Video
73 Video Models Behind One Prompt Box
- video_url
- first_frame
- request_id
Every model in this node's dropdown has one thing in common: you are never going to run it at home. Veo, Sora, Kling, Seedance, Runway, Pixverse, Hailuo - closed weights, no download, no local path at any VRAM. So the question isn't "should I use an API for this," it's "which API," and this node's answer is: all of them, one dropdown, one key.
That last part is the real pitch. The official ComfyUI API nodes cover roughly the same closed frontier on prepaid credits. This pack is a third-party client for an aggregator called MuAPI, which resells 600+ endpoints from one balance. One key, 73 text-to-video models, and no per-vendor billing setup.
How it works
It's not a sampler. The node POSTs a JSON body to https://api.muapi.ai/api/v1/<endpoint> with your key in an x-api-key header, then polls predictions/<request_id>/result every 10 seconds until the job reports completed. Video jobs are slow, so the poll loop waits up to 900 seconds - 15 minutes - before giving up with a timeout error. The render happens on their GPUs; the node's only local work is downloading a frame back.
The inputs you'll actually touch
Required: model, prompt, aspect_ratio (16:9, 9:16, 1:1, 4:3, 3:4, 21:9), quality (basic or high), and duration - an INT from 4 to 30 seconds in steps of 1, which is a wider range than the image-to-video node offers. Twenty seconds of 1080p is where a session starts costing real money, so keep draft runs at 5.
The model list is worth a slow read. The default is seedance-v2.0-t2v, and the pack's own promoted workflows lean hard on Seedance 2.0 - the one the author posted that actually landed was a Seedance time-freeze effect workflow at 165 upvotes, so it's the endpoint with the most public mileage behind it. Around it: veo3.1-text-to-video and veo3.1-fast-text-to-video (native audio, still the capability nothing open-weight matches cleanly), openai-sora-2-* including a storyboard variant, kling-v3.0-pro-text-to-video, the Wan 2.5/2.6 line, hunyuan-text-to-video, minimax-hailuo-*, pixverse-v5.5-t2v, ltx-2.3-text-to-video. There's a custom option for anything newer.
Optional: api_key, custom_endpoint, extra_params_json - raw JSON merged into the request, which is how you reach anything the widgets don't expose.
Outputs, and why request_id matters
video_url is a STRING pointing at the CDN - not a video in ComfyUI's sense. Send it to π¬ MuAPI Save Video to get an mp4 on disk plus IMAGE frames, or to π¬ MuAPI Video Edit for a second pass. first_frame is an IMAGE grabbed from the result, which is a handy free still and also a silent-failure trap: frame extraction uses OpenCV, and if it can't read the file you get a black 64Γ64 tensor while the console explains what happened. request_id is the continuation handle - that's the input π¬ MuAPI Extend Video wants when you need more than 30 seconds.
Notice what's not here: no seed, no LoRA, no ControlNet socket. Conditioning is prompt plus, on the other nodes, reference images. The user who asked on r/comfyui how to use LoRAs and OpenPose with these nodes was asking for something the architecture can't give you - the answer is to do the controlled generation locally and hand the result in as a reference image, or use one of the API's own "lora" endpoints through extra_params_json.
Install
Manager β Install via Git URL β https://github.com/SamurAIGPT/muapi-comfyui β restart. Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/SamurAIGPT/muapi-comfyui
pip install -r muapi-comfyui/requirements.txt
No weights to download - requirements.txt is requests, Pillow, numpy, torch, opencv-python. Then get a key at muapi.ai and wire π MuAPI API Key into api_key.
Where it goes wrong
Three failures cover most of it. Timeout after 15 minutes doesn't mean the render died - long or high quality jobs can outrun the poll window, so check your MuAPI dashboard before burning credits on a retry. Insufficient credits (HTTP 402) is the balance, not the node. Auth failed (401) means the key, usually because a directly-typed field is shadowing the hub node. And if you're extending: request_id from a different MuAPI account is useless, because that id only exists on the server that created it.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| model | COMBO | seedance-v2.0-t2v | 73 options: seedance-v2.0-t2v, seedance-pro-t2v, seedance-pro-t2v-fast, seedance-lite-t2v, seedance-v1.5-pro-t2v, seedance-v1.5-pro-t2v-fast, +67 |
| prompt | STRING | A cinematic aerial shot of a futuristic city at dusk | β |
| 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 | 54β30 | β |
| api_keyopt | STRING | β | |
| custom_endpointopt | STRING | β | |
| extra_params_jsonopt | STRING | {} | β |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| video_url | STRING | β |
| first_frame | IMAGE | β |
| request_id | STRING | β |