Kling Generate Video (Ace Data Cloud)
Ten models, one node, and a meter running
- status
- task_id
- media_urls_json
- first_media_url
- result_json
- trace_id
What you're actually looking at
Kling has no weights. You cannot download it, quantize it, or run it on your 4090 - it's a closed Kuaishou model, same category as Veo and Seedance. So the only way it enters a ComfyUI graph is as a node that ships your prompt to a server and hands back a URL. That's this node.
It is not the official ComfyUI Partner Node. It's a third-party wrapper from Ace Data Cloud that calls their reseller API for Kling, billed in their Credits. Worth saying plainly: the pack itself has no Reddit footprint - a literal search for "Ace Data Cloud" in the community corpus returns nothing, while "Kling" alone appears in thousands of threads. People talk about the model constantly and about this route to it never, which is an argument for reading the code before you paste a key. It's also exactly the situation external-api-nodes.md warns about: a node whose whole job is phoning home with your credential.
Why you'd reach for it anyway
Because the alternative is doing Kling work in a browser tab and dragging files back and forth. If your workflow is prompt → Kling clip → your local upscaler or interpolator, the handoff becomes a wire instead of a download folder. That's the real pitch of API nodes, and for models you can't have locally it's a good one.
Ten model IDs are exposed here, from kling-v1 through kling-v3, kling-v3-omni and kling-o1, plus the turbo and master variants. Cost tracks the model, and the community's read on the top end is blunt - one thread priced Kling V3 Omni at "ludicrously expensive ($1.50 for a 5s clip at 1080p)". Pick the cheapest model that holds up for your shot.
How it works
Two selectors sit on the node. model picks one of the ten IDs; action picks text2video, image2video or extend. Both default to (from JSON/default), which hands the choice back to the API's own defaults - and those defaults are real: if you leave everything at the sentinel and type nothing into parameters_json, you get kling-v3-turbo, text2video, mode std, duration 5, aspect_ratio 16:9.
The pack validates your payload against the published API contract with jsonschema before anything is sent, so a malformed call is a local error, not a paid one. There are also action-specific guards: text2video without a prompt fails with "A video prompt is required", image2video wants start_image_url or image_list, and extend wants video_id.
Then the important part: the client forces async: true on the request. Every generation returns immediately with a task ID rather than holding the connection open for a render. Nothing waits for you. You poll.
Inputs that matter
prompt is the one you'll actually type. model and action are the two decisions above. mode is std, pro or 4k - quality tier, and price tier. duration is a number in seconds, defaulting to 5. aspect_ratio takes 16:9, 9:16 or 1:1.
Then the reference inputs, all optional: start_image_url and end_image_url for first/last frame, image_list as a JSON array of {"image_url": "..."} objects (up to 7, with an optional "type" of first_frame or end_frame), video_list for a single reference clip, element_list for characters saved with the Elements node, and voice_list. negative_prompt, cfg_scale (0–1), camera_control (JSON with a type like simple or forward_up, plus a config of -1..1 values), multi_shot, shot_type and multi_prompt cover the rest.
Every widget is a STRING, even the numeric ones: type 5, not five, and put arrays in as JSON. A nonempty widget overrides the same key inside parameters_json.
Outputs, and wiring them up
Six STRING outputs: status, task_id, media_urls_json, first_media_url, result_json, trace_id. On the first run status will say pending and first_media_url will be empty - that's correct behavior, not a bug.
Feed first_media_url into Kling Load Video to get a native VIDEO. Note that the loaders only accept allowlisted Ace CDN hosts over HTTPS, with no redirects. If you're still pending, the loader raises "Task is pending; retrieve the same task ID again."
Install
cd ComfyUI/custom_nodes
git clone https://github.com/AceDataCloud/KlingComfyUI
cd KlingComfyUI && python -m pip install -r requirements.txt
# restart ComfyUI
Or via ComfyUI Manager: search Kling, confirm publisher acedatacloud and package Kling by Ace Data Cloud (Registry ID kling). Dependencies are just requests and jsonschema - no models, no CUDA extensions. The native media loaders need ComfyUI 0.39.0 or newer.
The key does not go in a node field:
export ACEDATACLOUD_API_KEY=your_key_here # then launch ComfyUI
Where people get burned
The big one: paid submissions are never retried. Read-only task queries get three attempts with backoff; generation requests get exactly one. A connection failure on a submit may still have created a task - so before you hit Queue again and pay twice, look up the task ID or trace ID and check. The pack's docs make the same point, and it's the single most expensive habit to get wrong.
Second: failures are redacted by design. result_json hides request bodies, supplier fields and internal model names, and a service-side error becomes "Operation failed; use the task or trace ID to inspect the request." Keep trace_id; it's the only handle you get on a bad render.
And the standing caveat for anything in this category: your prompt and every reference image leaves the machine and goes to a third party. That's the mechanism, not a misconfiguration.
Inputs (22)
| Name | Type | Default | Description |
|---|---|---|---|
| parameters_json | STRING | {} | — |
| model | COMBO | (from JSON/default) | 11 options: (from JSON/default), kling-v3-turbo, kling-v1, kling-v1-6, kling-v2-master, kling-v2-1-master, +5 |
| action | COMBO | (from JSON/default) | 4 options: (from JSON/default), text2video, image2video, extend |
| mode | STRING | — | |
| prompt | STRING | — | |
| duration | STRING | — | |
| generate_audio | STRING | — | |
| video_id | STRING | — | |
| cfg_scale | STRING | — | |
| aspect_ratio | STRING | — | |
| callback_url | STRING | — | |
| end_image_url | STRING | — | |
| camera_control | STRING | — | |
| image_list | STRING | — | |
| video_list | STRING | — | |
| negative_prompt | STRING | — | |
| start_image_url | STRING | — | |
| multi_shot | STRING | — | |
| shot_type | STRING | — | |
| multi_prompt | STRING | — | |
| element_list | STRING | — | |
| voice_list | 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 | — |