Introduction
Seedance 2.0 Fast image-to-video starts the clip on a picture you supply and animates it for up to 15 seconds. Add a closing still and the shot has to arrive there, which is what makes transitions and before-and-after pairs repeatable.
Seedance 2.0 Fast is the speed tier of ByteDance's Seedance 2.0 line. Its three endpoints return 4 to 15 second clips at 480p or 720p, with audio generated alongside the picture.
Choose a Seedance 2.0 Fast mode by starting material
| Starting material | Mode |
|---|---|
| A script or scene description | Seedance 2.0 Fast Text to Video |
| An approved opening still | Seedance 2.0 Fast Image to Video |
| Separate appearance, motion or audio references | Seedance 2.0 Fast Reference to Video |
Key features & highlights
One field set, three sources
All three endpoints take the same core fields: prompt, duration_seconds from 4 to 15 (or -1 to let the model choose), resolution at 480p or 720p, aspect_ratio, generate_audio and seed. What changes is the source that anchors the picture: nothing, an opening frame, or a set of references. A request built for one mode moves to another by adding or removing that source.
Picture and sound in one pass
generate_audio is on by default and renders ambience, movement effects and voice locked to the frames. Switching it off does not lower the rate in this tier, so turn it off only for silent loops or for material you will score in post.
Adaptive framing by default
aspect_ratio defaults to adaptive: image-to-video keeps the proportions of the opening frame, reference-to-video follows the primary reference, and text-to-video lets the model pick the shape the prompt suggests. The six fixed ratios, 16:9, 9:16, 4:3, 3:4, 1:1 and 21:9, are there when a placement dictates the shape.
Request parameters
| Parameter | Required | Description |
|---|---|---|
prompt | No | Optional, but worth writing: say what happens after the frame rather than restate what is already visible — the action, the camera move, the passage of time, the sound. at least 1 characters |
image_url | Yes | Public, directly downloadable link to the first frame; required. |
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: the clip keeps the proportions of your opening frame, so nothing is cropped away. |
resolution | No | Output resolution: 480p, or 720p by default. 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; -1 lets the model choose, with the estimate assuming 15 seconds. |
generate_audio | No | Whether a native soundtrack is rendered in sync with the picture. On by default; switching it off does not lower the rate in this tier. 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. |
return_last_frame | No | Also returns the clip’s final frame as a separate image next to the video. Send it to image-to-video as the next opening frame to chain shots without exporting a still yourself. Default: |
bitrate_mode | No | Encoding bitrate of the delivered file: |
watermark | No | Adds the model’s own visible "AI generated" watermark to the video. Off by default; switch it on when the place you publish requires AI-made footage to be labelled. Default: |
Pricing
| Specification | Price |
|---|---|
| $0.04499712 / second |
| $0.096768 / second |
Use cases
Literal results from your own frame
Whatever the opening frame shows is already in the clip, so the prompt only has to describe motion and does not have to argue for content. This is the dependable path when Seedance's own filter refuses the same beat written as text.
Before-and-after and transition pairs
Send last_image_url with image_url and the shot has to land on the closing still. The published example fills a bare room with a rug, a sofa and lamps over ten seconds with the camera locked, which is the shape of a renovation reveal or a product transformation.
Draft at 480p, deliver at 720p
Sweep cheap 480p passes until the action and the framing read, then re-run the same request at 720p for the take you keep. Resolution changes the delivered format only; it adds no detail the first frame does not already have.
Prompt guide & pro tips
Prepare the frame first
image_url fixes composition, how the subject looks, the grade and the quality ceiling. Text, watermarks and logos carry into the video, so clean them off first. Each side of the image must be between 300 and 6000 pixels, or the request is refused before any render starts.
Describe what happens next, not what is visible
The prompt is optional, but worth writing: name the action, the camera move, the passage of time and the sound. A shot driven by a single frame drifts further the longer it runs, so confirm the motion at 4 or 5 seconds before paying for 15.
Adapt the included example
The published example uses aspect_ratio 16:9, duration_seconds 6, generate_audio true and resolution 720p, with a shopfront still as image_url.
A hand reaches into frame and flips the door sign from CLOSED to OPEN, then withdraws; steam drifts off the machine behind the glass and the street reflection keeps moving. Camera stays where it is.
16:9 is named explicitly for a fixed landscape placement instead of leaving adaptive to follow the still. Keep the locked camera and one clear action when you swap in your own frame.
Keep both frames the same shape
When you add last_image_url, give it the same proportions as the opening frame; if they differ, the closing frame is cropped to match. Keep camera and light steady between the two and change one clear state, or the middle of the clip turns into a cut.
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-fast/image-to-video",
"input": {
"aspect_ratio": "adaptive",
"bitrate_mode": "standard",
"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"
}
}'
# 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.
















