Bytedance Seedance 2.0 Mini Video Extend API Documentation
Playground
Try it on WaveSpeedAI!Seedance 2.0 Mini Video Extend is ByteDance’s faster, lower-cost video extension model for cinematic multi-shot continuation. It extends existing videos into seamless narrative sequences with AI camera control, consistent characters, motion continuity, 480P / 720P / 1080P / 4K output, 4-15s duration, and flexible aspect ratios. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing.
Features
ByteDance Seedance 2.0 Mini Video Extend continues an existing video by generating a new segment from the input video’s last frame. Upload a source video, describe the cinematic continuation, optionally provide a target last frame, and generate an extended video segment with synchronized native audio.
- Need to generate from text instead? Try ByteDance Seedance 2.0 Mini Text-to-Video.
- Need to generate from a start image instead? Try ByteDance Seedance 2.0 Mini Image-to-Video.
Why Choose This?
-
Video continuation
Extend an existing video by generating a new segment that continues from the input video’s last frame. -
Prompt-guided extension
Describe the action, camera movement, lighting, and mood for the new segment. -
Optional target last frame
Providelast_imagewhen you want the new segment to interpolate toward a specific ending frame. -
Native audio generation
Generate synchronized audio together with the extended video segment usinggenerate_audio. -
Flexible resolution options
Choose480p,720p,1080p, or4kdepending on your quality and cost needs. -
Web search option
Enableenable_web_searchwhen the continuation needs real-time information.
Parameters
| Parameter | Required | Description |
|---|---|---|
| prompt | Yes | Describe the cinematic continuation, including action, camera movement, lighting, and mood. |
| video | Yes | URL of the input video to extend. Generation continues from the last frame. |
| last_image | No | Optional target last-frame URL. If provided, the new segment interpolates from the input video’s last frame to this image. |
| resolution | No | Output resolution of the new segment: 480p, 720p, 1080p, or 4k. Default: 720p. |
| duration | No | Length in seconds of the new segment to append. Range: 4–15. Default: 5. |
| enable_web_search | No | Enable web search for real-time information. Default: false. |
| generate_audio | No | Whether to generate native audio synchronized with the output video. Default: true. |
How to Use
- Write your prompt — Describe how the video should continue, including subject action, camera movement, lighting, and mood.
- Upload the source video — Provide the input video that should be extended.
- Add a last image optional — Use
last_imagewhen you want to guide the ending frame of the new segment. - Choose resolution — Select
480p,720p,1080p, or4k. - Set duration — Choose the length of the new segment between
4and15seconds. - Configure audio optional — Keep
generate_audioenabled for synchronized native audio, or disable it if audio is not needed. - Submit — Generate the extended video segment.
Example Prompt
Continue the scene with a slow forward camera movement, the character walking deeper into the neon-lit street, soft rain falling, reflections glowing on the pavement, cinematic lighting, calm but mysterious atmosphere.
Writing Effective Prompts
Extension here continues your video by generating a new segment from its final frame and stitching it on. So your prompt describes what happens next, starting from that last frame — the same way you’d direct an image-to-video shot. (This differs from native extension: don’t write “continue” or “extend backward” triggers; just describe the new action.)
Direct the new segment
Describe the action, motion, and camera work that begin from the final frame. Don’t re-describe what’s already on screen — build forward from it.
From the final frame, the surfer rides the wave to shore; the camera pulls back to a wide shot.
Keep it continuous
Match the motion, camera, and pacing of the source so the seam is invisible. For longer extensions, use a timed shot list.
> 0-3s: The bee lifts off the flower, the camera following in a slow macro pull-back. > 3-5s: It drifts to a second flower and lands; pollen catches the light as it settles. >
Camera language
Write these directly; the model understands them:
- Shot size — extreme wide, wide, medium, medium close-up, close-up
- Movement — push in, pull out, pan, track, follow, orbit, tilt up, handheld shake
- Angle — low angle, overhead, eye-level, first-person
- Techniques — one-shot / long take, dolly zoom, bullet time, speed ramp
For a niche term, add a plain-language gloss: “rack focus: the sharp foreground softens as the background comes into focus.”
Negative control
Positive descriptions work best, but you can suppress subtitles and audio:
- “No subtitles.”
- “No BGM — ambient and action sounds only.”
- “No audio.”
Weak vs. strong
| prompt | |
|---|---|
| weak | make it longer |
| strong | From the final frame, the surfer rides the wave to shore, then steps off the board onto wet sand as the camera pulls back to a wide shot. Match the existing golden-hour light and handheld motion. Ocean and wind sounds, no music. |
Pricing
Per 5 Seconds
| Resolution | Cost |
|---|---|
| 480p | $0.30 |
| 720p | $0.60 |
| 1080p | $1.50 |
| 4k | $3.00 |
Per Second
| Resolution | Cost |
|---|---|
| 480p | $0.06 |
| 720p | $0.12 |
| 1080p | $0.30 |
| 4k | $0.60 |
Example Costs
| Resolution | 4s | 5s | 10s | 15s |
|---|---|---|---|---|
| 480p | $0.24 | $0.30 | $0.60 | $0.90 |
| 720p | $0.48 | $0.60 | $1.20 | $1.80 |
| 1080p | $1.20 | $1.50 | $3.00 | $4.50 |
| 4k | $2.40 | $3.00 | $6.00 | $9.00 |
Best Use Cases
- Video extension — Continue an existing clip with a newly generated segment.
- Scene continuation — Extend character action, camera movement, lighting, and atmosphere from the source video.
- Target-frame continuation — Use
last_imageto guide the ending direction of the new segment. - Cinematic short clips — Generate continued video segments with synchronized native audio.
- Creative prototyping — Test alternate continuations from the same source video.
Pro Tips
- Use a source video with a clear ending frame.
- Keep the prompt focused on what should happen next.
- Use
last_imagewhen the final frame or ending direction matters. - Describe visible motion, camera behavior, lighting, and mood.
- Use
480pfor quick testing,720pfor standard output,1080pfor higher-resolution results, and4kfor maximum-resolution output. - Keep
generate_audioenabled when you want the extended segment to include synchronized native audio.
Related Models
- ByteDance Seedance 2.0 Mini Text-to-Video — Generate video directly from text prompts.
- ByteDance Seedance 2.0 Mini Image-to-Video — Generate video from a start image and prompt.
Authentication
For authentication details, please refer to the Authentication Guide.
API Endpoints
Submit Task & Query Result
set -euo pipefail
export WAVESPEED_API_KEY="your-api-key"
REQUEST_BODY=$(cat <<'JSON'
{
"prompt": "A cinematic ocean wave at sunrise, highly detailed",
"video": "https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4",
"resolution": "720p",
"duration": 5,
"enable_web_search": false,
"generate_audio": true
}
JSON
)
# 1. Submit the prediction.
SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
-X POST "https://api.wavespeed.ai/api/v3/bytedance/seedance-2.0-mini/video-extend" \
-H "Authorization: Bearer ${WAVESPEED_API_KEY}" \
-H "Content-Type: application/json" \
-d "${REQUEST_BODY}")
TASK=$(printf '%s' "${SUBMIT_RESPONSE}" | jq 'if type == "object" and has("data") then .data else . end')
PREDICTION_ID=$(printf '%s' "${TASK}" | jq -r '.id // empty')
if [ -z "${PREDICTION_ID}" ]; then
printf 'Submission response did not contain a prediction id
' >&2
exit 1
fi
RESULT_URL="https://api.wavespeed.ai/api/v3/predictions/${PREDICTION_ID}/result"
# 2. Poll until the prediction finishes.
while true; do
RESPONSE=$(curl --silent --show-error --fail-with-body \
"${RESULT_URL}" \
-H "Authorization: Bearer ${WAVESPEED_API_KEY}")
RESULT=$(printf '%s' "${RESPONSE}" | jq 'if type == "object" and has("data") then .data else . end')
STATUS=$(printf '%s' "${RESULT}" | jq -r '.status // empty')
case "${STATUS}" in
completed) printf '%s\n' "${RESULT}" | jq '.outputs'; break ;;
failed|cancelled|timeout|deleted) printf '%s\n' "${RESULT}" | jq . >&2; exit 1 ;;
*) sleep 2 ;;
esac
doneParameters
Task Submission Parameters
Request Parameters
| Parameter | Type | Required | Default | Range | Description |
|---|---|---|---|---|---|
| prompt | string | Yes | - | Describe the cinematic continuation - action, camera movement, lighting, mood. | |
| video | string | Yes | - | URL of the input video to extend. Generation continues from the last frame. | |
| last_image | string | No | - | - | Optional target last-frame URL. If provided, the new segment interpolates from the input video's last frame to this image. |
| resolution | string | No | 720p | 480p, 720p, 1080p, 4k | Output resolution of the new segment. |
| duration | integer | No | 5 | 4 ~ 15 | Length in seconds of the new segment to append (4-15). |
| enable_web_search | boolean | No | false | - | Enable web search for real-time information. |
| generate_audio | boolean | No | true | - | Whether to generate native audio synchronized with the output video. Defaults to true. |
Response Parameters
| Parameter | Type | Description |
|---|---|---|
| code | integer | HTTP status code (e.g., 200 for success) |
| message | string | Status message (e.g., “success”) |
| data.id | string | Unique identifier for the prediction, Task Id |
| data.model | string | Model ID used for the prediction |
| data.outputs | array | Output values, usually URL strings; some models return text strings or structured result objects (empty when status is not completed) |
| data.urls | object | Object containing related API endpoints |
| data.status | string | Task status. completed is successful; failed, cancelled, timeout, and deleted are failure terminal statuses. |
| data.created_at | string | ISO timestamp of when the request was created (e.g., “2023-04-01T12:34:56.789Z”) |
| data.error | string | Error message (empty if no error occurred) |
| data.timings | object | Object containing timing details |
| data.timings.inference | integer | Inference time in milliseconds |
Result Request Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| id | string | Yes | - | Task ID |
Result Response Parameters
| Parameter | Type | Description |
|---|---|---|
| code | integer | HTTP status code (e.g., 200 for success) |
| message | string | Status message (e.g., “success”) |
| data | object | The prediction data object containing all details |
| data.id | string | Unique identifier for the prediction |
| data.model | string | Model ID used for the prediction |
| data.outputs | array<string | object> | Array of generated outputs (empty when status is not completed). Items are usually URL strings, but may be text strings or structured result objects, depending on the model. |
| data.urls | object | Object containing related API endpoints |
| data.status | string | Status: completed is successful; failed, cancelled, timeout, and deleted are failure terminal statuses |
| data.created_at | string | ISO timestamp of when the request was created |
| data.error | string | Error message (empty if no error occurred) |
| data.timings | object | Object containing timing details |
| data.timings.inference | integer | Inference time in milliseconds |