MiniMax H3 Generate Video
The H3 Node You'll Actually Start With
- content
- video_url
- task_id
- status
- task_json
- request_json
Here's the thing to get straight before anything else: this node does not run H3 on your machine. There are open H3 weights - 33B, around 42.5 GB, licence-geofenced out of the US, EU, UK and South Korea - and this is not that. This node is a client for MiniMax's hosted H3 Video V2 API. Nothing downloads, nothing sizzles your PSU, and the territory carve-out on the weights never comes up, because you're renting the model by the second instead of owning a copy.
That's the trade. You get 2K video with native stereo audio without a 24 GB card, and you pay per second of output for it.
The base H3 model, in practice
MiniMax H3 Generate Video is the plain H3 tier: 768P or 2K, 4 to 15 seconds, the full spread of ratios (adaptive, 21:9, 16:9, 4:3, 1:1, 3:4, 9:16). Everything it sends lives in the request body of POST /v2/video_generation, plus two settings you can't see or change: AIGC watermarking is hardcoded off, and polling is always on. Submit, then the node queries the task every 5 seconds until it succeeds, fails, or blows the hour-long wait budget.
Inputs and outputs
Four required inputs. content comes from Content Builder - that's the only sane way in. resolution defaults to 2K, which is the pack's pitch and also the expensive corner of the menu. duration is a string menu from 4 to 15. ratio is the list above; two rules apply. Text-only content with ratio set to adaptive raises an error, because there's no source frame to adapt to. Attach a first or last frame and the ratio is quietly rewritten to adaptive no matter what you selected.
Five outputs, and the useful ones are video_url and request_json. The URL goes to Preview Video to download a real file, or to Query Task if you want metadata. request_json is the entire request body you just sent, which sounds boring until you want Regenerate 2K - that node needs this exact JSON, and it only accepts a 768P request. Save it in your first draft run; you can't reconstruct it later.
task_id, status and task_json are the bookkeeping outputs. task_json is the raw API response, which is where you'd dig if something failed and status says so.
What it costs
The node estimates the bill in its UI after each run - in CNY at ¥0.50/second for 768P and ¥0.80/second for 2K, plus ¥0.20 per input image past the fifth. It also converts to credits at 1000/7 per yuan, so a 5-second 2K clip lands around ¥4.00, or roughly 572 credits. If base_url points at https://api.minimax.io you're billed in USD by MiniMax directly; the node's display handles that on the Max tiers. Either way the estimate is advisory - your account's invoice is the truth.
Practical upshot: draft at 768P. It's under two-thirds the price, and it's the format Regenerate 2K requires anyway.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/magicwang1111/ComfyUI-MiniMax-H3-API
Restart ComfyUI, then in the pack folder:
cp local.example.json local.json
and put your key in local.json. Set base_url to https://api.minimax.cn with a China-region key or https://api.minimax.io with an overseas one - a mismatched pair is the classic first-run failure. The file is gitignored and, by design, the key is read at execution time and never written into workflow files or request outputs. Dependencies are requests and Pillow; there are no checkpoints to fetch. ComfyUI Manager users can just search ComfyUI-MiniMax-H3-API.
Where people get burned
Missing local.json. Copy local.example.json to local.json and add api_key. is error one, and it's literally what you'll see.
Then there's waiting. The submit call isn't retried - only the polling GETs get three attempts on transient 429s and 5xxs. If a clip is slow, raise max_wait_seconds in local.json (default 3600) rather than re-running the node, because re-running submits a new paid task.
Finally, this is a third-party API wrapper holding your key - which is the category that already shipped credential-stealing malware once (ComfyUI_LLMVISION). This pack keeps the key in a gitignored file rather than a node widget, which is the right shape. Read the source before you paste a key into any pack like it.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| content | MINIMAX_H3_CONTENT | — | |
| resolution | COMBO | 2K | 2 options: 768P, 2K |
| duration | COMBO | 5 | 12 options: 4, 5, 6, 7, 8, 9, +6 |
| ratio | COMBO | 16:9 | 7 options: adaptive, 21:9, 16:9, 4:3, 1:1, 3:4, +1 |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| video_url | STRING | — |
| task_id | STRING | — |
| status | STRING | — |
| task_json | STRING | — |
| request_json | STRING | — |