Introduction
Seedance 2.0 Mini 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 repeatable.
Seedance 2.0 Mini is the smallest tier of ByteDance's Seedance 2.0 line. It publishes the same three endpoints as Seedance 2.0 Fast and returns 4 to 15 second clips at 480p or 720p, with audio generated in the same pass.
Choose a Seedance 2.0 Mini mode by starting material
| Starting material | Mode |
|---|---|
| A script or scene description | Seedance 2.0 Mini Text to Video |
| An approved opening still | Seedance 2.0 Mini Image to Video |
| Separate appearance, motion or audio references | Seedance 2.0 Mini Reference to Video |
Key features & highlights
The same contract as Seedance 2.0 Fast
Mini publishes the same endpoints and the same fields as Seedance 2.0 Fast: adaptive framing plus six fixed ratios, 4 to 15 seconds or -1 for a length the model chooses, native audio and seed, with resolution capped at 720p. A pipeline written against Mini moves to Fast by changing the model id, not the request.
Built for volume
Mini is the tier to pick when throughput matters more than the extra quality of the larger Seedance 2.0 models. Every endpoint is asynchronous: send an Idempotency-Key with each request, store the task ids and let polling or callbacks resolve them. The key is honoured for 24 hours, so a retry after a dropped connection returns the original task.
Longer sequences with Video Extend
To go past fifteen seconds, send a finished clip to the video-extend endpoint: its final frame opens a new Seedance 2.0 Mini shot and you get one file back with both joined. Each step bills only the seconds it adds, and the joined result can be extended again.
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: |
enable_web_search | No | Off by default. Switched on, the model may search the web for information related to your prompt before it renders. 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.0246078 / second |
| $0.05292 / second |
| $0.036 / second |
| $0.072 / second |
Use cases
Catalogue stills into motion
A flat product or shelf photo becomes a few seconds of movement without a reshoot. The published example restocks a chiller shelf can by can in four seconds with the camera locked off, small clinks and chiller hum included.
A time-lapse between two frames
With last_image_url, the clip has to arrive at the closing still. One of this endpoint's examples turns the same lane from late summer to deep autumn over ten seconds, locked camera, no cuts.
Beats the text filter would refuse
The opening frame carries the content, so the prompt only needs to describe motion. When Seedance's own layer refuses a beat written as text, driving it from a first frame is the way to get it.
Prompt guide & pro tips
Prepare the opening frame
image_url is required and fixes composition, look and quality ceiling; each side must be between 300 and 6000 pixels. Remove text, watermarks and logos first, because they carry into the video.
Say what changes, not what is there
The prompt is optional. Describe the action, the camera move and the sound that follow the frame; left out, the model decides the motion itself. Confirm the movement at 4 or 5 seconds before paying for 15, because a single-frame shot drifts further the longer it runs.
Adapt the included example
The published example uses aspect_ratio 16:9, duration_seconds 4, generate_audio true and resolution 720p, with a shelf photo as image_url.
A gloved hand enters from the right and fills the gap in the upper row can by can, facing each label forward, then withdraws. Camera locked off on the shelf. Small metallic clinks, chiller hum, fluorescent light unchanged throughout.
Four seconds is enough for one clear action on a locked-off shot. Swap in your own product photo and keep the single motion.
Give the closing frame the same shape
last_image_url needs the same proportions as the opening frame; otherwise it is cropped to match. Hold camera and light steady between the two frames and change one clear state, such as the season in the lane example.
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-mini/image-to-video",
"input": {
"aspect_ratio": "adaptive",
"bitrate_mode": "standard",
"duration_seconds": 5,
"enable_web_search": false,
"generate_audio": true,
"image_url": "https://example.com/reference.png"
}
}'
# 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.
















