MiniMax H3 Generate Video (Ace Data Cloud)
An API call wearing a ComfyUI costume
- status
- task_id
- media_urls_json
- first_media_url
- result_json
- trace_id
This node renders nothing on your machine. It packages your prompt into an HTTPS request, sends it to Ace Data Cloud, and hands you back a task ID you then have to go and collect. No GPU, no checkpoint, no 42 GB download - and no refund if you queue it five times because you got impatient.
H3 makes that trade more tempting than usual. MiniMax H3 is a 33B omni-modal video model with native stereo audio, 4–15 second clips at up to 2K, and it took #1 in Video Editing (With Audio) on Artificial Analysis at launch. The open weights dropped in August 2026 - but the Community License's Applicable Territory excludes the US, the EU, the UK and South Korea, so a large chunk of this community isn't licensed to run the local weights at all. For those users the hosted call isn't a convenience, it's the only legal door. Add that Wan 2.5 and later ship API-only, and calling a video model from inside the graph reads a lot less like a compromise than it did in 2024.
What happens when you hit Run
The node posts to https://api.acedata.cloud/minimax/videos with your ACEDATACLOUD_API_KEY as a bearer token, and - this is the part people miss - it forces the async path, so it doesn't sit there for three minutes. You get back status: pending and a task_id almost immediately. The render is now the server's problem. Drop the task_id into MiniMax H3 Retrieve Task, or wire first_media_url into MiniMax H3 Load Video once it's done.
Before the request goes anywhere, the node validates your payload against a copy of the published API contract, so a misspelled field name fails locally with Invalid parameters: does not meet the API's additionalProperties constraint instead of costing you a call. Good design, and rarer than it should be.
The fields that actually matter
content is the trap. It looks like a prompt box. It is not a prompt box - the API wants an array of content parts, and the node parses whatever you type as JSON. Type a cat surfing and you get content must contain valid JSON. What works:
[{"type":"text","text":"a cat surfing a wave at golden hour"}]
The other part types are the interesting bit, because this is what "unified context" means in practice:
[
{"type":"text","text":"she turns and smiles at the camera"},
{"type":"image_url","image_url":{"url":"https://example.com/her.jpg"},"role":"first_frame"},
{"type":"video_url","video_url":{"url":"https://example.com/motion.mp4"},"role":"reference_video"},
{"type":"audio_url","audio_url":{"url":"https://example.com/vo.mp3"},"role":"reference_audio"}
]
Text is capped at 7000 characters. Image parts take first_frame, last_frame or reference_image; video parts take reference_video (that's the V2V motion transfer people compared to Kling); audio takes reference_audio.
model has exactly one real choice, MiniMax-H3. Leave it on the (from JSON/default) sentinel and it resolves from JSON or the provider default.
resolution, duration, ratio and callback_url are plain strings - 768P or 2K, an integer 4–15, and one of adaptive/21:9/16:9/4:3/1:1/3:4/9:16. Defaults are 768P, 4 seconds, 16:9. Any non-empty widget overrides the matching key in parameters_json.
480P is listed in the contract and is a dead end: the node refuses it client-side with "The verified MiniMax H3 service supports 768P and 2K." Save yourself the confusion and don't type it.
Outputs, and how to use them
Six strings: status, task_id, media_urls_json, first_media_url, result_json, trace_id. On submit, status is usually pending and everything URL-shaped is empty - that's normal, not a failure. task_id is the one you must not lose; first_media_url is what you feed the loader later, and result_json is the response with internal routing fields and any request body scrubbed out. trace_id is your reference if you have to ask the provider what happened.
Install
cd ComfyUI/custom_nodes && git clone https://github.com/AceDataCloud/MiniMaxH3ComfyUI
python -m pip install -r requirements.txt # requests, jsonschema - that's the lot
Or search MiniMax H3 in ComfyUI Manager and confirm publisher acedatacloud (registry ID ace-minimax-h3). Then set ACEDATACLOUD_API_KEY in the ComfyUI process environment and restart - a key pasted into the node or the workflow JSON travels with every workflow you share. The pack is new and has essentially no community footprint yet, so this is a pack where you read the source before trusting it: it's ~1000 lines of readable Python, no obfuscation, no bundled binaries.
Where people get burned
- Nothing generates after a connection drop. Paid submissions get exactly one attempt by design; read-only queries get three. If the request dies mid-flight, check your request history for an accepted task ID before queueing again, or you'll pay twice for one clip.
- Missing key throws
Set ACEDATACLOUD_API_KEY in the ComfyUI process environment and restart.- that's an environment problem, not a node problem, and restarting ComfyUI is genuinely required. - Credits. Every accepted generation bills at the current service price, scaled by duration and resolution. Query costs nothing; regenerate costs again.
- A failed render surfaces as an exception, not as a polite
status: failed. Keep the task ID from the error and use Retrieve Task to see what the service says.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| parameters_json | STRING | {} | — |
| model | COMBO | (from JSON/default) | 2 options: (from JSON/default), MiniMax-H3 |
| content | STRING | — | |
| resolution | STRING | — | |
| duration | STRING | — | |
| ratio | STRING | — | |
| callback_url | STRING | — |
Outputs (6)
| Name | Type | Description |
|---|---|---|
| status | STRING | — |
| task_id | STRING | — |
| media_urls_json | STRING | — |
| first_media_url | STRING | — |
| result_json | STRING | — |
| trace_id | STRING | — |