Introduction
Seedance 2.0 Spicy image-to-video makes the still you send the first frame and animates it for up to 15 seconds, with sound in the same pass. image_url is the only required field; the prompt directs the motion rather than arguing for the content.
Seedance 2.0 Spicy is the LoRA-tuned, frame-driven member of ByteDance's Seedance 2.0 line, published as an image-to-video endpoint alongside a video-extend endpoint. Clips run 4 to 15 seconds at 480p, 720p, 1080p or 4K.
Key features & highlights
What the still shows is already in the clip
Wardrobe, pose, skin, steam and light all arrive with the picture before the prompt is read. Frame-driven work therefore survives briefs a blank page will not, and the prompt is left free to direct motion.
Adaptive by default, six fixed ratios when needed
Unlike Seedance 2.5 Spicy, this family publishes aspect_ratio, and it defaults to adaptive: the output keeps the geometry of your opening frame, so a portrait still stays portrait without cropping. Name 9:16, 1:1 or 21:9 only when a placement demands it, and check that the subject is still inside the safe area.
Choose where the clip ends
last_image_url pins the final frame as well as the first, so the model has to arrive at a picture you chose. Send the same still twice and the clip opens and closes on it for a seamless loop; send two different stills for a reveal or a change of look. Stills that differ wildly in framing or light make the middle hard to steer.
Request parameters
| Parameter | Required | Description |
|---|---|---|
image_url | Yes | Required, and the only required field. |
prompt | No | Optional here, and that is the point: the opening frame already fixes what is on screen, so the prompt only has to direct movement — the action, where the eyes go, the camera dr… at most 5000 characters |
last_image_url | No | Optional closing frame. It decides the picture the shot lands on: a transition, a before-and-after pair, or a loop that opens and closes on the same still. |
aspect_ratio | No | Output framing, adaptive by default, which follows the ratio of the frame you supplied and spares you a pre-crop. |
resolution | No | Output resolution: 480p, 720p by default, 1080p or 4k. It selects a rate tier and governs the delivered format only — it adds no detail the first frame does not already have. |
duration_seconds | No | Length of the finished clip in whole seconds, 4 to 15, default 5, and the billed quantity. |
generate_audio | No | Whether a native soundtrack is rendered in sync with the picture. On by default. Default: |
seed | No | Integer seed; omit it and each run draws its own. Fix it with everything else held constant to judge what a prompt edit actually changed. |
Pricing
| Specification | Price |
|---|---|
| $0.114 / second |
| $0.228 / second |
| $0.57 / second |
| $1.14 / second |
Use cases
Scenes other platforms refuse
Steam and condensation, close interiors, couples of any gender and first-person points of view are not reviewed on our side. Put the content in the opening frame and Seedance 2.0 Spicy animates what the picture actually shows.
Vertical cuts for a paid feed
Leave aspect_ratio on adaptive and a 3:4 or 9:16 still comes back in its own shape, ready for a phone. Four to six seconds at 720p covers a feed tile; save 1080p or 4K for the piece behind the paywall.
An existing still set turned into motion
Run every keeper from a shoot you already own at five seconds and 720p, discard the ones that move badly, then render the survivors longer and larger. Each run is a fresh take, so keep the best of a couple.
Prompt guide & pro tips
Put the content in the opening frame
Shoot the still or generate it. Wardrobe, pose, light and framing all have to be there, because resolution adds no detail the frame never had and the prompt cannot argue content into a picture that does not show it.
Know where Seedance's filter still applies
Seedance's own safety layer still runs before generation on this endpoint. Kissing wording comes back rejected before a frame renders, while the same beat framed as a whisper at the ear or foreheads touching passes. Put the action in the frame rather than in the sentence. last_image_url is accepted only alongside image_url, never on its own.
Adapt the included example
The published example uses duration_seconds 5, generate_audio true and resolution 720p.
She wipes a wider streak through the fogged mirror, steam curling back across the glass, then leans in closer to her reflection and exhales, the robe slipping a little further off her shoulder. Slow push toward the mirror, warm vanity bulbs, water dripping.
The opening still supplies the wardrobe, the steam and the mirror, and the prompt does nothing but move her. Nothing in it describes the wardrobe, because the frame already did.
Scale up what worked
Draft at 720p and five seconds to check framing and motion. A longer or larger run is a new take rather than an upscale of the draft, so once the prompt reads right, render the final at 1080p or 4K and expect to pick from more than one.
API quick start
# Generate the idempotency key once; reuse it when retrying after a lost response.
export SPICY_IDEMPOTENCY_KEY="${SPICY_IDEMPOTENCY_KEY:-$(uuidgen)}"
curl -X POST https://api.spicyapi.ai/api/v1/jobs/createTask \
-H "Authorization: Bearer $SPICY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $SPICY_IDEMPOTENCY_KEY" \
-d '{
"model": "bytedance/seedance-2.0-spicy/image-to-video",
"input": {
"aspect_ratio": "adaptive",
"duration_seconds": 5,
"generate_audio": true,
"image_url": "https://example.com/reference.png",
"resolution": "720p"
}
}'
# Copy data.taskId from the response into TASK_ID, then poll the status.
TASK_ID="TASK_ID_FROM_RESPONSE"
curl "https://api.spicyapi.ai/api/v1/jobs/recordInfo?taskId=$TASK_ID" \
-H "Authorization: Bearer $SPICY_API_KEY"
See the API reference for authentication, the complete schema, polling, and error handling.
















