Introduction
Seedance 1.5 Pro Spicy image-to-video makes the still you send the first frame and animates it for up to 12 seconds. With camera_fixed set, the composition you supplied is the composition for the whole clip.
Seedance 1.5 Pro Spicy is the LoRA-tuned, uncensored member of ByteDance's Seedance 1.5 Pro generation, published as an image-to-video endpoint alongside a video-extend endpoint. image_url is the only required field, and clips run 4 to 12 seconds at 480p, 720p or 1080p with sound rendered in the same pass.
Key features & highlights
A locked frame lets a small movement carry the clip
Set camera_fixed to true and the frame stops dead while the subject keeps moving inside it. In close, unhurried footage that matters: a wandering camera turns a held look into a music video, while a locked frame lets a breath, a shifted ankle or a hand on a duvet carry the whole clip.
What the still shows is already in the clip
Wardrobe, pose, skin and exposure arrive with the picture before the prompt is read. That is why frame-driven work survives briefs a blank page will not, and why a sharp, correctly exposed still beats any amount of prompt patching afterwards.
Hard limits worth knowing
This generation stops at 1080p and twelve seconds and has no reference endpoint. If a shot needs 4K or thirty seconds, Seedance 2.5 Spicy goes there, but it has no camera lock. aspect_ratio defaults to adaptive, which follows the ratio of your still.
Request parameters
| Parameter | Required | Description |
|---|---|---|
image_url | Yes | Required, and the only required field. |
prompt | No | Optional here, and with |
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. |
duration_seconds | No | Length of the finished clip in whole seconds, 4 to 12, default 5, and the billed quantity. |
resolution | No | Output resolution: 480p, 720p by default, or 1080p. It selects a rate tier and governs the delivered format only — it adds no detail the opening frame does not already have. |
generate_audio | No | Whether a native soundtrack is rendered in sync with the picture. On by default, and it moves the request into a higher rate tier. Default: |
camera_fixed | No | Off by default. Switched on, the camera is held still so that only the subject moves — a more reliable way to get a locked-off shot than arguing for one in the prompt. 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
| Resolution | Generate audio: No | Generate audio: Yes |
|---|---|---|
| $0.012 / second | $0.024 / second |
| $0.026 / second | $0.052 / second |
| $0.052 / second | $0.104 / second |
Use cases
First-person and point-of-view clips
Feet at the end of a bed, a hand on a duvet, a look held straight down the lens: shots that only work when the camera behaves like a person lying still. camera_fixed is what makes that possible rather than approximate.
Loops that do not drift
Send the same still as image_url and last_image_url, set camera_fixed, and keep the motion to a breath or a shift of weight. A locked frame and a small movement return close to where they started, so the cut back to the start is invisible.
A client change without a reshoot
Pin seed on an approved take, change one clause, such as the hand moving left instead of right or the light warming, and run it again. With the camera locked and the frame fixed, the second version is recognisably the same shot.
Prompt guide & pro tips
Compose the opening frame as a locked shot
Frame the still the way you want the whole clip framed, because with camera_fixed set that is exactly what you get. Compose it wide enough that the subject has room to move without the camera helping. Each side must be between 300 and 6000 pixels.
Give every verb to the subject
With the camera locked, the prompt should describe only movement inside the frame: a breath, a hand, a shifted ankle, a look held. A camera instruction and a locked camera pull against each other. Seedance's own layer still refuses a narrow band of wording, kissing most consistently, so put that beat in the frame instead of the sentence.
Adapt the included example
The published example uses camera_fixed true, duration_seconds 5, generate_audio true and resolution 720p.
Camera stays locked off. Her crossed ankles rock slowly and one foot flexes. She slides one hand out from behind her head and rests it on her stomach, her fingers tracing a slow circle on the camisole, while her other hand stays tucked behind her head. Her chest rises with a long breath. Nothing else in frame moves except the light shifting on the sheets.
The opening still supplies the composition and the wardrobe, camera_fixed keeps the frame dead still, and the prompt only moves her ankles, her hand and her breathing.
Check short before paying for twelve
A shot driven by a single frame drifts further the longer it runs, so confirm the motion at 4 or 5 seconds first. generate_audio moves the request into a higher rate tier; switch it off while you are only checking framing.
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-1.5-pro-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.
















