Seedance 2.5 (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.
Idle
$0.99per run·~10 / $10
eamlessly continues from previous video clip, muscles in its neck and shoulders tense gradually. It pushes its hooves against the ground, rises steadily from the ground onto four legs. After standing fully upright, it shakes its head vigorously from side to side, its soft antlers and fur swaying along with the movement, loose dust drifts off its coat, calm alert expression, realistic wildlife cinematography, natural soft forest light, 8k, high detail, lifelike fur texture, smooth continuous motion.
Seedance 2.5 Video Extend appends a new cinematic continuation to an existing video. The model continues from the ending of the input video, using the recent motion and audio context to generate a coherent new segment that preserves movement, subject continuity, and sound flow.
Seamless video continuation
Generate a new segment that continues naturally from the end of the source video.
Motion and scene continuity
Use the input video's ending context to preserve subject movement, camera direction, and scene flow.
Prompt-guided extension
Describe what should happen next, including action, lighting, camera movement, mood, and atmosphere.
Native audio synchronization
Generate synchronized audio for the extended segment while preserving the original video's audio.
Flexible resolution options
Choose 480p, 720p, 1080p, or 4k depending on quality and cost needs.
| Parameter | Required | Description |
|---|---|---|
| prompt | Yes | Describe the cinematic continuation, including action, camera movement, lighting, mood, and scene progression. |
| video | Yes | Input video URL. The model continues from the ending of the video, using up to the last 30 seconds as context. |
| duration | No | Length in seconds of the new segment. Range: 4–30. Default: 5. |
| resolution | No | Output resolution: 480p, 720p, 1080p, or 4k. Default: 720p. |
| generate_audio | No | Generate synchronized audio for the output video. Default: true. |
4 to 30 seconds.480p, 720p, 1080p, or 4k.generate_audio enabled when synchronized audio is needed.Extension continues your source video forward or backward. Your prompt describes what happens in the new footage — the model matches the existing look and motion.
Use a continuation trigger (continue, extend forward, extend backward) and describe the new action.
Describe motion, camera, and pacing that flow naturally from where the source leaves off — abrupt changes break the seam. 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.
Write these directly; the model understands them:
For a niche term, add a plain-language gloss: "rack focus: the sharp foreground softens as the background comes into focus."
Positive descriptions work best, but you can suppress subtitles and audio:
| prompt | |
|---|---|
| weak | make it longer |
| strong | Continue the video for 5 more seconds: 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 is based on the combined duration of reference duration + new segment duration.
The reference duration is calculated from the input video context, clamped to 2–30 seconds. The new segment duration is controlled by the duration parameter.
| Resolution | Per second |
|---|---|
| 480p | $0.11 |
| 720p | $0.22 |
| 1080p | $0.55 |
| 4k | $1.10 |
| Resolution | Cost |
|---|---|
| 480p | $1.65 |
| 720p | $3.30 |
| 1080p | $8.25 |
| 4k | $16.50 |
| Resolution | Cost |
|---|---|
| 480p | $4.40 |
| 720p | $8.80 |
| 1080p | $22.00 |
| 4k | $44.00 |
480p or 720p for iteration and 1080p or 4k for higher-quality output.Grab a WaveSpeedAI API key, then call POST https://api.wavespeed.ai/api/v3/bytedance/seedance-2.5/video-extend with your input as JSON. The endpoint returns a prediction id. Start polling the result endpoint around every 2 seconds, increase the interval for long-running tasks, and stop on any terminal status. On completed, read output values from data.outputs. Examples for Seedance 2.5 Video Extend below.
set -euo pipefail
: "${WAVESPEED_API_KEY:?Set WAVESPEED_API_KEY}"
REQUEST_BODY=$(cat <<'JSON'
{
"prompt": "A cinematic shot of a city at sunset, soft golden light",
"video": "https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4",
"resolution": "720p",
"duration": 5,
"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.5/video-extend" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $WAVESPEED_API_KEY" \
-d "$REQUEST_BODY")
TASK=$(printf '%s' "$SUBMIT_RESPONSE" | jq 'if has("data") then .data else . end')
PREDICTION_ID=$(printf '%s' "$TASK" | jq -r '.id')
if [ -z "$PREDICTION_ID" ] || [ "$PREDICTION_ID" = "null" ]; 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 has("data") then .data else . end')
STATUS=$(printf '%s' "$RESULT" | jq -r '.status')
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
doneconst submitUrl = "https://api.wavespeed.ai/api/v3/bytedance/seedance-2.5/video-extend";
const apiKey = process.env.WAVESPEED_API_KEY;
if (!apiKey) throw new Error('Set WAVESPEED_API_KEY');
async function requestJson(url, options = {}) {
const response = await fetch(url, options);
if (!response.ok) throw new Error(await response.text());
return response.json();
}
// 1. Submit the prediction.
const body = await requestJson(submitUrl, {
method: "POST",
headers: {
"Authorization": `Bearer ${apiKey}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"prompt": "A cinematic shot of a city at sunset, soft golden light",
"video": "https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4",
"resolution": "720p",
"duration": 5,
"generate_audio": true
}),
});
const task = body.data ?? body;
if (!task.id) throw new Error("Submission response did not contain a prediction id");
const resultUrl = `https://api.wavespeed.ai/api/v3/predictions/${task.id}/result`;
// 2. Poll until the prediction finishes.
while (true) {
const resultBody = await requestJson(resultUrl, {
headers: { "Authorization": `Bearer ${apiKey}` },
});
const result = resultBody.data ?? resultBody;
if (result.status === "completed") {
console.log(result.outputs);
break;
}
if (["failed", "cancelled", "timeout", "deleted"].includes(result.status)) throw new Error(JSON.stringify(result));
await new Promise(resolve => setTimeout(resolve, 2000));
}import json
import os
import time
from urllib.request import Request, urlopen
api_key = os.environ["WAVESPEED_API_KEY"]
headers = {"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"}
payload = {
"prompt": "A cinematic shot of a city at sunset, soft golden light",
"video": "https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4",
"resolution": "720p",
"duration": 5,
"generate_audio": True
}
def request_json(url, data=None):
request = Request(url, data=data, headers=headers, method="POST" if data else "GET")
with urlopen(request) as response:
return json.load(response)
# 1. Submit the prediction.
body = request_json("https://api.wavespeed.ai/api/v3/bytedance/seedance-2.5/video-extend", json.dumps(payload).encode())
task = body.get("data", body)
if not task.get("id"):
raise RuntimeError("Submission response did not contain a prediction id")
result_url = f"https://api.wavespeed.ai/api/v3/predictions/{task['id']}/result"
# 2. Poll until the prediction finishes.
while True:
result_body = request_json(result_url)
result = result_body.get("data", result_body)
status = result.get("status")
if status == "completed":
print(result.get("outputs", []))
break
if status in {"failed", "cancelled", "timeout", "deleted"}:
raise RuntimeError(result)
time.sleep(2)Seedance 2.5 Video Extend is a ByteDance model for video extension, exposed as a REST API on WaveSpeedAI. Seedance 2.5 (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. You can call it programmatically or try it from the playground above.
POST your input parameters to the model's REST endpoint (shown in the API tab of this playground) with your WaveSpeedAI API key in the Authorization header. Submission returns a prediction ID. Poll the result endpoint starting around every 2 seconds, increase the interval for long-running tasks, and stop on any terminal status. The playground generates production-oriented Python, JavaScript, and cURL examples with timeouts, transient-error handling, and safe GET retries. Full request/response shape is documented at https://wavespeed.ai/docs/docs-api/bytedance/bytedance-seedance-2.5-video-extend.
Seedance 2.5 Video Extend starts at $1.10 per run. That figure is the base price — the final charge scales with the parameters you set in the form (output size, length, count, references, or whatever knobs this model exposes), so a higher-quality or larger output costs more than a minimal one. The exact cost for your current input is shown live next to the Generate button before you submit, and the actual per-call charge is recorded on the prediction afterwards.
Key inputs: `prompt`, `video`, `resolution`, `duration`, `generate_audio`. The full JSON schema (types, defaults, allowed values) is rendered above the Generate button and mirrored in the API reference at https://wavespeed.ai/docs/docs-api/bytedance/bytedance-seedance-2.5-video-extend.
Median end-to-end generation time on WaveSpeedAI is around 586 seconds per request, based on recent successful runs. Queue time varies with global demand; live status is visible in the prediction record.
Commercial usage rights depend on the model's license, set by its provider (ByteDance). The license summary appears on the model card above; see WaveSpeedAI's Terms of Service for platform-level conditions.