Seedance 1.5 Pro · Image to Video
The still you already made, now moving
- image_url
- last_image_url
- video
- task id
Seedance 1.5 Pro is ByteDance's closed video model, and closed is the whole point: there are no weights to download, so the only way it enters a ComfyUI graph is through a node that uploads your inputs and downloads the result. This node is that door for bytedance/seedance-1.5-pro/image-to-video - you hand it a still, it hands back 4 to 12 seconds of motion with sound, and it bills by the second.
Reach for it when the picture is already good and you just want it to breathe. Render in whatever local checkpoint you trust, upscale it, then let this node do the part your GPU can't.
How it actually works
Nothing runs locally. When you hit Run, the pack uploads your image (PNG if it fits the 10 MiB ceiling, otherwise a high-quality JPEG), asks SpicyAPI for a quote, submits the task, then polls while the model works on their hardware. The finished MP4 is downloaded and handed back as an ordinary ComfyUI VIDEO value, the same type a local video node would emit. Your machine only needs to reach api.spicyapi.ai.
Dropping a picture into the node is an upload to a third-party service. Worth saying out loud once - that is the price of a model you were never allowed to download.
The inputs that matter
You wire Load Image into image_url and write the prompt - subject, action, camera movement, mood. Ignore the _url suffix; it takes a ComfyUI IMAGE socket, not a link.
Then four decisions:
duration_seconds- 4 to 12, whole seconds. This is the billed quantity, so a 12-second clip is three times the price of a 4-second one.resolution- 480p, 720p, 1080p. This is where the money is: 480p is $0.0112/s with audio off and $0.0223/s with it on, 720p is $0.0227/s and $0.0454/s, and 1080p is $0.0491/s and $0.0982/s. Audio roughly doubles the rate, so a silent 480p draft is about a ninth the price of a 1080p one with sound. The node's badge shows your current combination before you commit.aspect_ratio- 21:9, 16:9, 4:3, 1:1, 3:4, 9:16. Note there's noadaptiveon this node: it does not read the ratio off your still, so set it to match or your framing gets re-cut.camera_fixed- off by default. Turn it on when you want a locked-off shot; leave it off when you want the model to invent a move.
seed starts on fixed, deliberately. Queue the same graph twice and you get the cached first result instead of a second charge. Switch control-after-generate to randomize when you want a new take, and remember each take costs real money.
Optional last_image_url gives the shot a closing frame it has to land on - but only at 480p and 720p. At 1080p the combination isn't served, and the run dies with a 40004 telling you which option is the problem.
Outputs
Two sockets: video and task id. Wire video into Save Video (or a preview) and you're done. The task id is a plain string - it's the id in your SpicyAPI console, and the one thing support needs if a run misbehaves.
Install
ComfyUI Manager → search SpicyAPI → Install, or from a terminal:
cd ComfyUI/custom_nodes
git clone https://github.com/spicyapi-ai/comfyui-spicyapi
Restart ComfyUI, then open Settings > SpicyAPI and paste a key from spicyapi.ai/console/keys. Restart once more so the node list is built from your account. On a server, set SPICY_API_KEY in the environment instead. There is nothing to pip install and no model files to download - the pack declares zero dependencies beyond what ComfyUI already ships.
Where people get burned
- "No SpicyAPI key is set" - the node finds no key. Add it in Settings, or export
SPICY_API_KEY. - Cancelling doesn't cancel. Interrupting stops your wait; the job keeps running on SpicyAPI and is charged if it succeeds. The result stays in your console for up to 14 days.
- Uncapped spend. Set Settings > SpicyAPI > Max cost per run before you start experimenting. Anything quoted above it stops before a cent is charged.
- A node you saw on the site isn't in the menu. The list rebuilds at startup. Restart.
- Your key in a shared workflow? It isn't - the key lives in
user/spicyapi/config.json, not in node settings, workflows, or PNG metadata.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | What to generate: subject, action, camera movement and mood. | |
| image_url | IMAGE | URL of the image used as the first frame. | |
| aspect_ratio | COMBO | 16:9 | Aspect ratio of the generated video. |
| resolution | COMBO | 720p | Output resolution. Super-resolution tiers are not offered. |
| duration_seconds | INT | 54–12 | Clip length in seconds. This is the billed quantity. |
| generate_audio | BOOLEAN | true | Generate a native soundtrack synchronised to the picture. |
| camera_fixed | BOOLEAN | false | Lock the camera to produce a stable, fixed-position shot. |
| seed | INT | 00–2147483647 | Same seed and settings, same result. Set 'control after generate' to randomize to get a new result on every run; every run is billed. |
| last_image_urlopt | IMAGE | Optional closing frame the shot has to land on (480p and 720p). |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| task id | STRING | The SpicyAPI task id, for the console logs or support. |