MiniMax H3 Max (BudgetPixel)
The Hailuo you rent instead of download
- audio
- end_image
- image
- reference_audios
- reference_images
- reference_videos
- video
- video
What this node is, and why you'd reach for it
MiniMax H3 Max is the post-trained H3 - the model MiniMax sells as Hailuo 3.0 - tuned for prompt adherence and better looks, with audio generated alongside the picture rather than bolted on after. It's hosted: no checkpoint, no quant, nothing on your SSD. You call it.
The odd part: H3 did open its weights in August 2026 - native synced stereo audio in an open video model, #1 in Video Editing (With Audio) on Artificial Analysis. But the MiniMax H3 Community License geofences those weights out of the US, EU, UK and South Korea, where running them isn't a hardware question but a licence one - and hosted is the licensed route.
So that's the case for this node: H3-family video, with audio, in your graph without a 33B footprint. You trade privacy for it - prompt and reference media leave your machine, like any API-wrapper node. BudgetPixel is the aggregator: one key, 60-odd hosted models. Price here is 105 credits per output second, so a 5-second clip is 525, and reference video input bills separately at 170 credits per second of input - the number that surprises people.
How it works
The pack builds nodes at import from a committed schemas/minimax-h3-max.json snapshot of BudgetPixel's OpenAPI spec - hence widgets that mirror typed API params, enums and defaults included. One output, video, on ComfyUI's core VIDEO type: the MP4 lands in ComfyUI's temp directory wrapped as a VideoFromFile.
Server-side it's async: POST a job, poll every 10 seconds, walk the progress bar through pending → starting → processing → completing, give up client-side after 40 minutes.
One detail bites: interrupting the graph does not cancel the job - you stop waiting, the server keeps rendering and billing. Media goes to the API and never into your workflow file, and neither does your key.
The inputs that matter
prompt is the only required field, and that one box covers four modes depending on what you wire in. In reference mode you address assets by order - "Image 1", "Video 1", "Audio 1" - and when extending a clip you describe what happens next, not what's already on screen. The modes are mutually exclusive, which is the trap:
- Text-to-video -
promptplusaspect_ratio(16:9, 9:16, 1:1, 4:3, 3:4, 21:9),resolution(480p/768p/1080p),length_seconds(5-15). - Image-to-video -
imageas the first frame,end_imageoptionally as the last; the clip interpolates between them.aspect_ratiois ignored, because the output follows your frame. - Reference-to-video -
reference_images(up to 5; first two free, each extra adds 50 credits),reference_videos(up to 3),reference_audios(up to 3, free). Batch IMAGE frames and they map onto the references in order. - Extension - a
videoinput continues forlength_secondsof new footage: the only mode with2k, andaspect_ratiodefaults toauto.
image/end_image can't be combined with reference media or video. Neither can audio - a soundtrack pinned to a text- or image-to-video output that replaces the generated audio, trimmed to the video length.
seed is -1 for random. force_rerun matters more than it looks - with it off, re-queuing identical inputs serves ComfyUI's cached result instead of billing you again, which is why "it didn't regenerate" isn't a bug.
Wire video into Save Video, a frame extractor, or an upscaler - and before any reference-mode run, drop in BudgetPixel Cost Estimate (model id plus your params as JSON) for the exact pre-flight price.
Installing it
ComfyUI Manager: search BudgetPixel, install, restart. Or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/budgetpixel-ai/comfyui-budgetpixel.git
pip install -r comfyui-budgetpixel/requirements.txt
Dependencies are requests and nothing else: no torch, no compilation, no model downloads. You do want a 2025-or-newer ComfyUI for the core VIDEO type.
Then provide a key: the env var BUDGETPIXEL_API_KEY=bpx_live_..., or a budgetpixel.json inside the pack folder holding {"api_key": "bpx_live_..."} - included in every paid plan. There's no key widget on the node by design: shared workflows can't leak what they don't contain, which is also why there's nowhere on the node to paste it.
Common issues
"No BudgetPixel API key found." The error spells out both fixes. A bad key gets a 401; insufficient_credits and api_access_not_enabled point at top-up or upgrade.
The bill is bigger than the clip. Reference video input and an extension source both bill at 170 credits per second of input, on top of the output price, and the third and later reference images add 50 each.
A reference clip was rejected. They need to be 2-15s each and 15s combined, MP4/MOV, 50MB max; an extension source is 1.6-60s at 50MB. A string into a video socket can be a URL or a local file path; audio wants a URL only. And an IMAGE batch into image uses just its first frame.
Inputs (13)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | Text description of the video. In reference mode, address assets by order: "Image 1", "Video 1", "Audio 1". When extending, describe what happens next, not the source. | |
| aspect_ratioopt | COMBO | 16:9 | Aspect ratio. Text-to-video uses it directly; image-to-video follows the frame image and ignores it; reference-to-video also accepts "adaptive" (the default there); extension accepts "auto" (follow the source — the default there) or a ratio to crop to. Defaults: 16:9 for text-to-video. |
| audioopt | AUDIO | Optional soundtrack (≥2s, ≤15MB, MP3/WAV) pinned to a text-to-video or image-to-video output: it replaces the generated audio, trimmed to the video length. Provide a public audio URL or an uploaded-file URL from POST /v1/uploads. Not available with reference media or `video`. | |
| end_imageopt | IMAGE | Optional last frame. With `image` the video interpolates between the two frames; on its own it is an end-keyframe generation. Same input forms as `image`. | |
| imageopt | IMAGE | Optional first frame for image-to-video — the output follows its framing. Provide a public image URL, a data URI, raw base64, or an uploaded-file URL from POST /v1/uploads. Can't be combined with reference media or `video`. | |
| length_secondsopt | INT | 55–15 | Output length in seconds (5-15). When extending, the seconds of NEW footage appended to the source. |
| reference_audiosopt | AUDIO | Optional reference audio clips (up to 3; each 2-15s, 15s combined; WAV/MP3) for sound/voice guidance, addressed as "Audio 1"… Each item is a public audio URL or an uploaded-file URL from POST /v1/uploads. Free. Can't be combined with `image`/`end_image`. | |
| reference_imagesopt | IMAGE | Optional reference images (up to 5) for subjects/style in reference-to-video mode, addressed in the prompt as "Image 1", "Image 2"… The first two are free; each additional image adds 50 credits. Each item is a public image URL, a data URI, raw base64, or an uploaded-file URL from POST /v1/uploads. Can't be combined with `image`/`end_image`. | |
| reference_videosopt | VIDEO | Optional reference video clips (up to 3; each 2-15s, 15s combined; MP4/MOV, ≤50MB each) for motion/identity guidance, addressed as "Video 1"… Each item is a public video URL or an uploaded-file URL from POST /v1/uploads (passed by URL, not inlined). Billed at 170 credits per second of INPUT on top of the output — estimate via POST /v1/cost. Can't be combined with `image`/`end_image`. | |
| resolutionopt | COMBO | 768p | Output resolution. Pricing varies by resolution — see `resolution_pricing` in GET /v1/models. 2k is only available when extending a `video`. |
| seedopt | INT | -1-1–2147483647 | Seed for reproducible generation. Omit for random. |
| videoopt | VIDEO | Optional video to EXTEND (1.6-60s, ≤50MB, aspect ratio between 2:5 and 5:2). The model continues it for `length_seconds` of new footage guided by `prompt`, and the output is the source followed by the continuation. Provide a public video URL or an uploaded-file URL from POST /v1/uploads. Can't be combined with any other media input. The source is billed at 170 credits per second (first 15 seconds) — estimate via POST /v1/cost. | |
| force_rerunopt | BOOLEAN | false | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |