Kling Goods Studio (Ace Data Cloud)
Product photos in, a 60-second ad out
- status
- task_id
- media_urls_json
- first_media_url
- result_json
- trace_id
The one that makes something long
Most Kling video in this pack is five seconds. Goods Studio is the outlier: duration is an enum of 15, 30 or 60 seconds, which puts it in a different league from every other node here. It takes reference images of a product plus a title and description, and produces a finished product video - the shape of thing you'd otherwise be assembling in an editor with stock music.
That length is the reason to use it and the reason to be careful. Longer renders cost more, and the pack will happily take your Credits for a 60-second job that fails on a detail you could have caught in a 15-second one. Build the workflow against the short duration, get the composition right, then scale up.
The two inputs that matter
contents is a JSON array with a minimum of two entries, each tagged by type. Three types exist:
ref_image- a product image URLgoods_title- text, capped at 200 charactersgoods_description- text, capped at 2000 characters
So the floor is "one image and one line of copy," and the ceiling is more images with fuller copy.
settings is the one to get right, because it's required by the contract - this node won't run without it, and the contract requires two specific keys inside it:
{"aspect_ratio": "9:16", "duration": 15, "resolution": "1080p"}
aspect_ratio is 9:16, 1:1 or 16:9. duration is 15, 30 or 60. resolution is 720p or 1080p and is optional in the schema, so it falls back to the API default if you leave it out. The short list of aspect ratios is the tell that this is a marketing tool rather than a cinema tool; portrait for social, square for marketplaces, landscape for a landing page.
watermark is a STRING widget that expects true or false; the client coerces it into a real boolean. callback_url is there if you want a webhook instead of polling.
Inputs, outputs, plumbing
Widgets: parameters_json, contents, settings, watermark, callback_url. All strings, all validated locally against the published contract before the request goes out - a malformed settings object is a free error.
Outputs: status, task_id, media_urls_json, first_media_url, result_json, trace_id, all STRING. The render is asynchronous, so the first run returns pending with an empty first_media_url. Poll with Kling Retrieve Task (you can set wait_seconds up to 240 there) and load the finished clip with Kling Load Video.
Do the polling honestly. A 60-second render is not going to be ready in a couple of seconds, and since submissions aren't retried - the client fires paid requests exactly once - it's much safer to query an existing task ID than to suspect a failure and re-queue. Re-queuing is a second charge for the same video.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/AceDataCloud/KlingComfyUI
cd KlingComfyUI && python -m pip install -r requirements.txt
# restart ComfyUI
Manager: search Kling, publisher acedatacloud, package Kling by Ace Data Cloud, Registry ID kling. Two Python dependencies, no models, no GPU. The native video loader wants ComfyUI 0.39.0 or newer.
export ACEDATACLOUD_API_KEY=your_key_here # then launch ComfyUI
Common issues
"Invalid settings: does not meet the API's required constraint." You passed a settings object without aspect_ratio or duration. Both are mandatory even though the rest of the object is optional.
Duration as a string in the wrong place. Type 15, not "15s" or fifteen. The contract coerces numeric strings, so 15 works; anything else is a validation error.
Text limits are real. 200 characters for the title, 2000 for the description. Overlong copy fails locally - which is the good outcome, since the alternative is finding out from an error after a paid render.
Reference images must be URLs. No upload widget; local files can't be reached by the service.
Check the price before a 60-second run. The pack's own docs say it plainly: check the current service price before a paid action. Three durations means three price points, and the long one is not a rounding difference.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| parameters_json | STRING | {} | — |
| contents | STRING | — | |
| settings | STRING | — | |
| watermark | 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 | — |