Kling 3.0 · Image to Video
3 to 15 seconds, 4K if you're feeling wealthy, and a real shot list
- image_url
- last_image_url
- video
- task id
Kling 3.0 takes your opening frame and renders between three and fifteen seconds at 720p, 1080p or 4K, with native audio you can switch on or off - and, uniquely in this pack, with an actual shot list you can write yourself. It's the most controllable node here, and the pricing table reads like a menu of exactly those choices:
| Options | Per second | | --- | --- | | 720p, silent | $0.0672 | | 1080p, silent | $0.0896 | | 720p, with audio | $0.1008 | | 1080p, with audio | $0.1344 | | 4K, either way | $0.336 |
4K is 2.5x the 1080p-with-audio rate and, from most accounts, not 2.5x the value - the detail is real but so is the drift over long clips. Use 4K when the clip is short and the shot is a hero, not for exploration.
The inputs
- image_url - opening frame,
IMAGE, JPEG or PNG. Uploaded for the run. - last_image_url - optional closing frame. Feed both ends and the model interpolates between them, which is how you get a match cut or a specific landing pose out of a single job. Underused, and cheap to try.
- prompt - what happens after the opening frame: the action, the camera, and with sound on, the sounds. Dialogue in quotes gets voiced.
- negative_prompt - concrete things to keep out (objects, artefacts, unwanted motion). Still functional on 3.0.
- resolution -
720p(default),1080por4k. - generate_audio - off by default; a native soundtrack of voices, effects and ambience, at a higher per-second rate. Unlike 2.5 Turbo, you get the choice.
- duration_seconds - a whole number from
3to15, default5. - guidance_scale - 0 to 1, default
0.5. A literalness dial rather than CFG: higher follows the prompt more tightly, lower gives the model latitude. - shot_type -
single(default) renders one continuous shot;multilets the model cut your prompt into several shots on its own;customizefollows the shot list you write inmulti_prompt. - multi_prompt - the shot list, as JSON: a list of objects, each with a
promptand aduration_seconds, in order. The durations must add up toduration_seconds- that's the rule that trips everyone up the first time.
A working shot list looks like this:
[
{"prompt": "wide establishing shot of the pier at dawn, slow push in", "duration_seconds": 4},
{"prompt": "close-up on her face as she turns toward the water", "duration_seconds": 3}
]
Outputs: video (VIDEO - Save Video or a preview node) and task id (STRING, the console handle for the run).
Install
cd ComfyUI/custom_nodes
git clone https://github.com/spicyapi-ai/comfyui-spicyapi
Restart ComfyUI. Open Settings > SpicyAPI, paste a key from spicyapi.ai/console/keys, restart once more so the node list is fetched from your account. Manager search: "SpicyAPI". Headless boxes use SPICY_API_KEY. Zero dependencies, zero downloads - this runs on a laptop because the rendering doesn't happen on your machine.
A note on trust, since it applies to the whole pack: this is a third-party wrapper around a metered API, which is the category where ComfyUI's one real malware incident happened. That's not a reason to avoid it - the pack is MIT, auditable, and its key handling is deliberately conservative: your key lives in user/spicyapi/config.json (owner-only permissions) or in SPICY_API_KEY, never in a node widget, a workflow file, or the metadata of a saved image, precisely so that sharing a PNG doesn't leak a credential. A handful of third-party video endpoints have also been caught quietly serving a different model than advertised - so if the output looks nothing like Kling, check the model id on the node against the model page before assuming the model is bad.
Before you queue
Set Max cost per run in the SpicyAPI settings. This is the node that needs it most: 15 seconds at 1080p with audio is $2.02, and it's two dropdowns away from a 5-second silent take at 45 cents. Every job is quoted before submission and anything above your ceiling aborts without charging.
Trimming is free, re-rendering isn't. Seeds default to fixed, so re-queueing the same graph returns the first result instead of billing you again; flip control after generate to randomize when you genuinely want a new sample. Interrupting a run stops your wait but not the server-side job - it keeps running, is charged if it succeeds, and its result is in your console for up to 14 days.
Standard errors: No SpicyAPI key is set (settings step skipped), 40310 (unverified email), 40004 (that exact combination isn't served - change the field the message names), and a proxy/firewall message if HTTPS_PROXY is broken. A model that's missing from your node search needs a ComfyUI restart, not a reinstall.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | Describe what happens after the opening frame: the action, the camera and, with sound on, the sounds. | |
| negative_prompt | STRING | What to keep out of the clip: objects, looks or motion you do not want. | |
| image_url | IMAGE | Opening frame. The clip starts from this image. | |
| resolution | COMBO | 720p | Output resolution. Higher tiers cost more per second. |
| generate_audio | BOOLEAN | false | Generate a native soundtrack (voices, effects, ambience) with the picture. Audio costs more per second. |
| duration_seconds | INT | 53–15 | Output length in whole seconds, from 3 to 15. Billed per second. |
| shot_type | COMBO | single | single keeps one continuous shot; multi lets the model cut the prompt into several shots on its own; customize follows the shot list you give in multi_prompt. |
| multi_prompt | STRING | Shot list for shot_type customize: one entry per shot, in order, each with its own prompt and length in seconds. The lengths must add up to duration_seconds. JSON. A list of objects with "duration_seconds", "prompt". | |
| guidance_scale | FLOAT | 0.500–1 | How closely the clip follows the prompt, from 0 to 1. Higher sticks to the prompt more; lower gives the model more freedom. |
| seed | INT | 00–2147483647 | This model takes no seed, so the number is never sent. Changing it makes ComfyUI run the node again: set 'control after generate' to randomize for a new result on every run; every run is billed. |
| last_image_urlopt | IMAGE | Optional closing frame the clip should end on. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| task id | STRING | The SpicyAPI task id, for the console logs or support. |