Introduction
Seedance 1.5 Pro image-to-video starts the clip on a picture you supply and animates it for up to 12 seconds. With camera_fixed set, the supplied framing stays exactly as composed, which is why this endpoint produces usable plates.
ByteDance Seedance 1.5 Pro publishes two endpoints, text-to-video and image-to-video. Both return 4 to 12 second clips at 480p, 720p or 1080p with native audio, and both carry a camera_fixed switch.
Choose a Seedance 1.5 Pro mode by starting material
| Starting material | Mode |
|---|---|
| An approved opening still | Seedance 1.5 Pro Image to Video |
| A script or scene description | Seedance 1.5 Pro Text to Video |
Key features & highlights
camera_fixed holds the frame
Left false, the default, the model invents its own moves: a drift, a push, a slow orbit. Set it to true and the camera stops while the subject keeps moving inside the frame. A locked frame can be tracked, keyed, composited or looped, and neither Seedance 2.0 nor 2.5 offers this switch.
Sound in the same pass
generate_audio defaults to true and renders ambience, movement effects and voice locked to the frames. It moves the request into a higher rate tier, so turn it off for product loops and for plates that will be scored later.
A clear ceiling
Clips run 4 to 12 whole seconds at 480p, 720p or 1080p, in six fixed aspect ratios with 16:9 as the default and no adaptive option. There is no reference endpoint; seed is available at 480p and 720p. Jobs that need 4K, longer takes or a multi-image cast belong on Seedance 2.0 or 2.5; what 1.5 Pro keeps is the camera lock.
Request parameters
| Parameter | Required | Description |
|---|---|---|
prompt | Yes | Required, and it should say what happens after the frame rather than restate what is already visible: the action, the passage of time, the sound. at least 3 characters |
image_url | Yes | Public, directly downloadable link to the first frame; required. |
last_image_url | No | Optional closing frame: send it with |
aspect_ratio | No | Output framing, six fixed values, 16:9 by default. |
resolution | No | Output resolution, 720p by default and 1080p at the top; nothing higher is offered here. It sets a rate tier. |
duration_seconds | No | Length in whole seconds, 4 to 12, defaulting to 5, and the billed quantity. |
generate_audio | No | Whether a native soundtrack is rendered in sync with the picture. On by default and priced in a higher tier; switch it off for silent product loops or when sound is added in post. Default: |
camera_fixed | No | Locks the camera, false by default. Set to true and the frame holds still while the subject moves within it — ideal for product shots and plates destined for a static background. Default: |
seed | No | Integer from 0 to 2147483647 for the random start; leave it out and every run draws its own. |
Pricing
| Resolution | Generate audio: No | Generate audio: Yes |
|---|---|---|
| $0.0112 / second | $0.0223 / second |
| $0.0227 / second | $0.0454 / second |
| $0.0491 / second | $0.0982 / second |
Use cases
Plates for compositing
Send a still you have already approved, set camera_fixed, and the composition holds for the whole clip while only the subject moves. The result behaves like tripod footage: a clean background to key against, a stable surface to track a title onto, a plate an editor can cut into a real sequence.
Product turntables and loops
A fixed frame with a rotating object is the classic case: nothing drifts, the horizon stays level, and the last frame lands close enough to the first to loop. Turn generate_audio off, because a product loop almost never wants room tone.
Slow environmental motion
The published example layers falling snow, rolling steam and water over a single still, with a very slow push-in so none of it is hidden by camera speed. Weather, smoke and water are the kind of motion a held composition shows off best.
Prompt guide & pro tips
Send both required fields
prompt and image_url are both required here, and the prompt needs at least 3 characters. The image must be a public, directly downloadable JPEG, PNG or WebP under 10 MB. Text, watermarks and logos in the still travel into the video, so clean them off first.
Match the aspect ratio to the still
There is no adaptive option, and aspect_ratio defaults to 16:9. When the requested ratio differs from the source, the frame is reframed and the subject can lose its margins, so pick the ratio that matches your still.
Adapt the included example
The published example uses aspect_ratio 16:9, duration_seconds 5 and resolution 720p, with the audio default left on.
Snow keeps falling through the lantern light and steam pours off the water. She sets the folded towel robe down on the rock and sinks slowly into the spring up to her collarbone, tipping her head back and exhaling a long plume of breath into the cold air. Steam swells across the frame and snow settles on her wet hair. Very slow push-in, warm lantern gold against deep blue snow.
The frame supplies the lanterns and the setting; the prompt only lowers her into the spring and lets her breathe out. Keep that split when you swap in your own still.
Keep motion inside a locked frame
With camera_fixed set to true, describe only movement that happens within the frame, because a camera instruction and a locked camera pull against each other. Confirm the motion at 4 or 5 seconds before extending to 12, since a longer shot drifts further from its source frame.
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/image-to-video",
"input": {
"aspect_ratio": "16:9",
"duration_seconds": 5,
"generate_audio": true,
"image_url": "https://example.com/reference.png",
"prompt": "A slow aerial shot drifting over a misty pine forest at sunrise",
"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.
















