Bytedance Seedance 2.0 Video Extend API Documentation

Bytedance Seedance 2.0 Video Extend API Documentation

Playground

Try it on WaveSpeedAI!

Seedance 2.0 (Video-Extend) extends an input video with a new cinematic continuation generated from its last frame and a natural-language prompt. Ready-to-use REST API, best performance, no coldstarts, affordable pricing.

Features

Seedance 2.0 Video-Extend appends a new cinematic continuation to an existing video. The model generates a fresh segment from the input video’s last frame and a natural-language prompt, then the original and new segment are concatenated into a single output.


Key Features

  • Seamless continuation — Generation starts from the input video’s last frame so the join is visually consistent.
  • Optional target last frame — Provide last_image to steer the new segment toward a specific end frame.
  • Director-level control — Camera movement, lighting, shadows, and character performance via prompts.
  • Native audio synchronization — Audio from both the original video and the new segment are preserved in the final output.

Parameters

ParameterRequiredDescription
promptYesDescribe the cinematic continuation.
videoYesInput video URL. Generation continues from the last frame.
last_imageNoOptional target last-frame URL. Interpolates from the input’s last frame to this image.
durationNoLength in seconds of the new segment (4-15, default 5).
resolutionNo480p, 720p (default), 1080p, or 4k.
generate_audioNoGenerate synchronized audio for the output video (default: true)
enable_web_searchNoEnable web search for real-time context.

How to Use

  1. Upload the input video. The new segment will be appended to it.
  2. Write the prompt. Describe the continuation in cinematic detail.
  3. (Optional) Upload a target last frame. The new segment will interpolate to this image.
  4. Pick a duration and resolution.
  5. Run. Receive the original video plus the new segment concatenated into one output.

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
weakmake it longer
strongFrom 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

Billed per second of the new segment only. Resolution multipliers match Seedance 2.0 image-to-video.

ResolutionPer second
480p$0.12
720p$0.24
1080p$0.60
4k$1.20

Examples (5s extension):

ResolutionCost
480p$0.60
720p$1.20
1080p$3.00
4k$6.00

Notes

  • Pricing is based on the new segment length only — the input video is not re-billed.
  • Aspect ratio of the new segment matches the input video’s last frame automatically.
  • Native audio generation is included for the new segment; the original video’s audio is preserved.


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/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
done

Parameters

Task Submission Parameters

Request Parameters

ParameterTypeRequiredDefaultRangeDescription
promptstringYes-Describe the cinematic continuation - action, camera movement, lighting, mood.
videostringYes-URL of the input video to extend. Generation continues from the last frame.
last_imagestringNo--Optional target last-frame URL. If provided, the new segment interpolates from the input video's last frame to this image.
resolutionstringNo720p480p, 720p, 1080p, 4kOutput resolution of the new segment.
durationintegerNo54 ~ 15Length in seconds of the new segment to append (4-15).
enable_web_searchbooleanNofalse-Enable web search for real-time information.
generate_audiobooleanNotrue-Whether to generate native audio synchronized with the output video. Defaults to true.

Response Parameters

ParameterTypeDescription
codeintegerHTTP status code (e.g., 200 for success)
messagestringStatus message (e.g., “success”)
data.idstringUnique identifier for the prediction, Task Id
data.modelstringModel ID used for the prediction
data.outputsarrayOutput values, usually URL strings; some models return text strings or structured result objects (empty when status is not completed)
data.urlsobjectObject containing related API endpoints
data.statusstringTask status. completed is successful; failed, cancelled, timeout, and deleted are failure terminal statuses.
data.created_atstringISO timestamp of when the request was created (e.g., “2023-04-01T12:34:56.789Z”)
data.errorstringError message (empty if no error occurred)
data.timingsobjectObject containing timing details
data.timings.inferenceintegerInference time in milliseconds

Result Request Parameters

ParameterTypeRequiredDefaultDescription
idstringYes-Task ID

Result Response Parameters

ParameterTypeDescription
codeintegerHTTP status code (e.g., 200 for success)
messagestringStatus message (e.g., “success”)
dataobjectThe prediction data object containing all details
data.idstringUnique identifier for the prediction
data.modelstringModel ID used for the prediction
data.outputsarray<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.urlsobjectObject containing related API endpoints
data.statusstringStatus: completed is successful; failed, cancelled, timeout, and deleted are failure terminal statuses
data.created_atstringISO timestamp of when the request was created
data.errorstringError message (empty if no error occurred)
data.timingsobjectObject containing timing details
data.timings.inferenceintegerInference time in milliseconds
© 2026 WaveSpeedAI. All rights reserved.