Wan 3.0 Prime Spicy · Image to Video
One frame in, an unfiltered clip out
- image_url
- last_image_url
- video
- task id
Wan 2.2 is the open-weights video standard - you can download it and run it tonight. Wan 3.0 is not that. This node calls Alibaba's hosted Wan 3.0 Prime endpoint (the fast tier of the 3.0 family), takes one still as the opening frame, and hands back a 2-to-30 second clip with audio baked into the file. "Spicy" here means the host's own uncensored variant, which is the whole reason a lot of people land on this node instead of a local checkpoint.
Why you'd reach for it
Local Wan 2.2 doesn't ship native audio, and it's the model everyone compares hosted video to. If your use case is "picture of a character, make them move for eight seconds, with sound", the local route means a second pass for audio and a longer fight over motion quality. Hosted Wan 3.0 does both in one request. The trade is the usual one from the API-node playbook: your inputs leave your machine, every run is metered, and the filter you're avoiding isn't yours to inspect - you're trusting that the endpoint's "unrestricted" tier really is.
Worth saying plainly: SpicyAPI as a vendor has essentially no community footprint yet. A search across the r/comfyui + r/StableDiffusion corpus turns up nothing for the name. That's not an accusation, it's an absence - you're an early user, so read the settings page and start with a small run before you trust it with anything you care about.
What you actually set
The node mirrors the hosted model's schema, so the widgets are the model's own knobs:
- prompt - subject, action, camera, light, pacing, and sound. It's a script, not a tag list.
- image_url - the opening frame. Wire a Load Image in; the pack uploads it for you when the node runs (and caches it for 12 hours by content hash, so re-running with a new prompt doesn't re-upload the same picture).
- resolution - 480p, 720p or 1080p, default 720p.
- duration_seconds - whole seconds, 2 to 30, default 5.
- aspect_ratio - leave it on
model defaultand the clip follows the opening image. Pick a ratio that doesn't match the still and the model crops it, which is a common way to lose half your framing. - generate_audio - on by default; switch it off if you're scoring the clip yourself.
- enable_prompt_expansion - off here (the Pro tiers default it on).
- seed, plus an optional last_image_url if you want the clip to land on a specific ending frame.
Outputs are video, which goes straight into Save Video, and task id, a string with the SpicyAPI task id for the console log or a support email. Note there's no separate last-frame image output on this node - that's how the schema is defined, not an oversight you can work around.
Install
ComfyUI Manager → search SpicyAPI, 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. Restart once more so the node list is rebuilt from your account's catalogue. On a headless box, set SPICY_API_KEY instead. There is nothing to pip install - the pack's dependency list is literally empty, and it uses only the aiohttp/torch/Pillow/PyAV that ComfyUI already ships. It needs Python 3.10+ and the newer V3 node API (tested against ComfyUI 0.39).
Cost, and the two traps
The badge on the node shows the current rate for the options you picked: this model runs $0.09/s at 480p, $0.18/s at 720p and $0.36/s at 1080p. A 5-second 720p clip is about $0.90. Set Max cost per run in the SpicyAPI settings and the pack quotes the request first - anything above your ceiling stops before it's charged.
Two things catch people out. First, seeds start on fixed, so queueing the same graph twice reuses the first result rather than buying a second one; switch control after generate to randomize when you actually want a new take, and remember every take is billed. Second, cancelling in ComfyUI stops the wait, not the job - the task finishes server-side, is charged if it succeeds, and the result sits in your console for 14 days.
If it doesn't run
No SpicyAPI key is set means exactly that. 40310 is an unverified account email. 40004 means no deployment serves the combination you picked - change the option the message names (resolution and duration are the usual culprits). An error ending in request_id ... is worth forwarding to support, since that id pins down the exact request, and a proxy/firewall complaint usually means HTTPS_PROXY is set wrong.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | Describe the subject, action, camera, light, pacing, and sound for the shot. | |
| image_url | IMAGE | Opening-frame image. | |
| aspect_ratio | COMBO | model default | Output aspect ratio. Omit it to let the clip adapt to the opening image; a ratio that differs from the image crops it. |
| resolution | COMBO | 720p | Output resolution. |
| duration_seconds | INT | 52–30 | Requested output length in whole seconds. |
| generate_audio | BOOLEAN | true | Request generated audio with the video. |
| enable_prompt_expansion | BOOLEAN | false | Allow the service to expand the submitted creative brief before generation. |
| 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 last frame: the clip ends on this image. Requires image_url. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| task id | STRING | The SpicyAPI task id, for the console logs or support. |