Seedance 2.0 Spicy · Image to Video
Uncensored, and it goes to 4K
- image_url
- last_image_url
- video
- task id
Here's the trap with the Spicy line: "uncensored" is easy to find, but "uncensored with real resolution options" is not. Mini Spicy and Fast Spicy both stop at 720p. Only two nodes in this whole family let you go higher with the filter off - this one and 2.5 Spicy - and this is the cheaper of the two by a wide margin.
bytedance/seedance-2.0-spicy/image-to-video goes up to 4K, runs 4 to 15 seconds, includes audio, and starts at $0.114 per second at 480p. The ladder is steep and worth having in your head before you pick a resolution:
| Resolution | Rate | | --- | --- | | 480p | $0.114/s | | 720p | $0.228/s | | 1080p | $0.570/s | | 4k | $1.140/s |
A 15-second 4K take is over $17. The node's badge shows the rate for whatever combination you've dialled in, and every run is quoted before it starts - read both.
What's on the node
The Spicy schema is deliberately small: no bitrate_mode, no watermark, no return_last_frame.
image_url is an IMAGE socket and leads the field list - Load Image straight in, and the pack handles the upload (PNG, with a JPEG fallback if the picture is over 10 MiB). prompt is the direction: scene, action, camera movement, mood.
aspect_ratio defaults to adaptive, which follows the still's own ratio, and also accepts 16:9, 9:16, 4:3, 3:4, 1:1 and 21:9. resolution is where this node earns its keep: 480p, 720p, 1080p, 4k.
duration_seconds is an integer slider from 4 to 15 - no smart-duration -1 on the Spicy variants, so you always name the length, and that length is the billed quantity. generate_audio is on by default and produces native synced sound; turning it off doesn't reduce the rate on this model, so leave it.
seed is fixed after generate, so re-queueing an identical graph reuses the cached result rather than charging twice. That default is deliberate: every run costs money.
Optional last_image_url sets a closing frame - "last frame image URL for video continuation" - which pairs with the first frame for a two-anchor move.
Outputs
video is a normal ComfyUI VIDEO; Save Video takes it directly. task id is a plain string - the job's id in your SpicyAPI console, and the identifier support asks for.
Install
ComfyUI Manager → search SpicyAPI → Install. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/spicyapi-ai/comfyui-spicyapi
Restart ComfyUI, then Settings > SpicyAPI → paste a key from spicyapi.ai/console/keys (or set SPICY_API_KEY on a server). Restart once more so the node list is built from your account's catalogue. No pip installs, no weights, no GPU requirement - the model runs on SpicyAPI's servers, which is the only way a closed ByteDance model gets into a local graph at all.
Two honest caveats
Uncensored is a policy claim, not a weight you can inspect. There's nothing local to patch or merge; you're trusting that the Spicy endpoint runs with a looser filter, which is the same bargain as every unofficial route to a closed model. Test on your own content first.
Everything leaves your machine. Prompt and image go to SpicyAPI, which calls ByteDance's model. That's the mechanism, not a bug - but it's worth knowing before you feed it anything you wouldn't upload.
When it misbehaves
"No SpicyAPI key is set" is the plain-language one. 40310 is an unverified email. 40004 means no deployment serves the option combination and the message names the offending field. An error ending in request_id is what support wants pasted in full. And interrupting a run doesn't cancel it: the job continues on SpicyAPI, is charged if it succeeds, and the output waits in your console for up to 14 days. Set Max cost per run in Settings before you start pushing this node's resolution ladder.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| image_url | IMAGE | Start image URL to guide the video generation. | |
| prompt | STRING | Describe the scene, action, camera movement, and mood for the video. | |
| aspect_ratio | COMBO | adaptive | The aspect ratio of the generated video. Use adaptive to follow the input image. |
| resolution | COMBO | 720p | The output video resolution. |
| duration_seconds | INT | 54–15 | The duration of the generated video in seconds (4-15s). |
| generate_audio | BOOLEAN | true | Whether to generate native audio synchronized with the output video. Defaults to true. |
| 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 | Last frame image URL for video continuation. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| task id | STRING | The SpicyAPI task id, for the console logs or support. |