Seedance 2.5 · Image to Video
30-second clips, and why 'adaptive' is your only ratio
- image_url
- last_image_url
- video
- last frame
- task id
The headline change in Seedance 2.5 is length: 4 to 30 seconds in one generation, instead of the 15-second ceiling the 2.0 family lives under. That's the difference between a cutaway and an actual scene, and it's why people reach past 2.0 for this node even at $0.1234 per second.
The second change is subtler and will confuse you if you don't read the tooltip. aspect_ratio on this node has exactly one option: adaptive. Seedance 2.5 anchors an image-to-video clip on the first frame, so the frame's own ratio is the output ratio - there's nothing to pick. It's a dropdown with one entry, which looks like a bug until you understand why. Set your still's aspect ratio in whatever local node produced it.
The rest of the schema
image_url is an IMAGE socket; Load Image wires in and the pack uploads the file for you (PNG up to 10 MiB, JPEG fallback above). prompt describes action, camera, mood, and it has more room to matter here - a 30-second clip needs a prompt with an arc, not a snapshot description.
resolution gives you 480p, 720p or 1080p, at $0.1234/s, $0.2773/s and $0.6823/s respectively. Audio doesn't move those numbers, so leaving generate_audio on costs nothing. That pricing shape is deliberate across the 2.x line - throughput at the bottom, resolution at the top.
duration_seconds is an integer slider, 4 to 30. This is the billed quantity, so a 30-second 1080p take is real money; the node's badge updates as you drag it.
output_format picks mp4 or mov - a delivery choice, not a quality one.
enable_web_search lets the model look things up before rendering. On 2.5 the published rate table doesn't add a surcharge for it (unlike the 2.0 nodes, which explicitly bill at the web-search rate), so it's a cheap switch here if the shot needs a real place or object in it.
return_last_frame also emits the final frame as an IMAGE - with 30-second clips that's a genuinely useful handoff into the next segment. watermark asks the model to mark the video as AI-generated.
seed is fixed after generate by default; re-queueing the graph reuses the cached render rather than charging a second time.
Optional last_image_url gives the shot a closing frame - "only accepted together with image_url" - which on a 30-second clip is how you land a move precisely.
Outputs
video → Save Video. last frame → an IMAGE, present only when return_last_frame is on. task id → a string; the run's id in the SpicyAPI console and the one thing support will ask 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 and paste a key from spicyapi.ai/console/keys - or set SPICY_API_KEY in the environment if you run ComfyUI headless. Restart once more so the node list is built from your account's catalogue. The pack declares no dependencies and downloads no weights; the model runs server-side, so a machine with no GPU is fine.
Seedance itself is ByteDance's closed video line - API-only by design, part of the same two-track strategy that has the company shipping open components and keeping every flagship generation product behind an endpoint. This node is the sanctioned way in.
Before you commit to a 30-second 1080p take
Set Settings > SpicyAPI > Max cost per run. Runs are quoted before submission and anything above the ceiling stops without charge. Interrupting a run doesn't cancel the job: it keeps generating on SpicyAPI, is charged if it succeeds, and its result stays in your console for up to 14 days. 40004 means the option combination isn't served and names the field to change; an error ending in request_id is ready-made for support.
Inputs (12)
| 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 | adaptive | Aspect ratio of the generated video. Seedance 2.5 frames an image-to-video clip on the first frame, so adaptive is the only accepted value. |
| resolution | COMBO | 720p | Output resolution. Super-resolution tiers are not offered. |
| duration_seconds | INT | 54–30 | Clip length in seconds. This is the billed quantity. |
| generate_audio | BOOLEAN | true | Generate a native soundtrack synchronised to the picture. |
| output_format | COMBO | mp4 | Container of the returned video. |
| enable_web_search | BOOLEAN | false | Let the model search the web for information related to the prompt before rendering. |
| 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. |
| return_last_frame | BOOLEAN | false | Also return the clip’s final frame as a separate image. |
| watermark | BOOLEAN | false | Ask the model to watermark the video as AI-generated. |
| last_image_urlopt | IMAGE | URL of the image used as the closing frame. Only accepted together with image_url. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| last frame | IMAGE | Needs return_last_frame turned on. |
| task id | STRING | The SpicyAPI task id, for the console logs or support. |