VIDEOS
Extend a Video
Generate a new segment that continues an existing clip. Returns a video object immediately; the completed job's content is the newly generated segment.
Authorization
AuthorizationstringheaderrequiredBearer token — your API key. Example: Bearer sk-...
Models
| Model | Segment duration | Input clip | Max input resolution |
|---|---|---|---|
seedance-2.0-mini | 4–15s | 2–15s | 720p |
seedance-2.0-fast | 4–15s | 2–15s | 720p |
seedance-2.0 | 4–15s | 2–15s | 1080p (auto-pin cap) |
seedance-2.5 | 4–30s | 2–30s | 1080p |
The output resolution pins automatically to the input clip's resolution
class, capped at 1080p and clamped to the model's ceiling. Audio-capable
models always generate a synchronized track on extensions (there is no
audio parameter here).
Input requirements
The input clip must be MP4 or QuickTime, H.264 or H.265 (AAC/MP3 audio if present), 24–60fps, with 300–6000 px sides, up to 200 MB, and within the model's input-clip duration window (see the table). Validation happens synchronously at staging — an unusable clip is a 400, never a failed job. The staged clip is kept alongside the job and cannot be deleted while the job is queued or running.
Segment semantics
seconds is the NEW segment's length, and the completed job's seconds
and downloadable content describe the delivered segment — never a stitched
input+output total (a documented divergence from OpenAI's stitched
semantics). To include original footage, direct the model in the prompt
("…and then end with the original scene").
Billing
Extension jobs bill their entire token count at the model's with-video rate — the token count covers input + output duration, and a per-request minimum applies upstream. The estimated maximum cost is reserved against your credit balance at creation and settles from the actual usage; failed extensions are never charged.
Request body
multipart/form-datamodelstringrequiredA video model with video-input support (e.g. "seedance-2.0"). See the model table below.
promptstringrequiredText description of the new segment (1–32,000 characters). Passed to the model verbatim after the extension formula.
secondsstringrequiredRequired. The NEW segment's duration as an integer string within the model's supported range — never a stitched total, and never "auto".
videoany | objectrequiredThe clip to extend, in one of three forms: a multipart file upload, {"id": "video_…"} naming a completed job of yours, or {"url": "https://…"}. Every form is staged and measured before the job is accepted.
Response
idstringrequiredThe video ID (e.g. "video_abc123").
object"video"requiredObject type — always "video".
modelstringrequiredThe model used for the generation.
status"queued" | "in_progress" | "completed" | "failed"requiredThe current status of the generation job.
queuedin_progresscompletedfailedprogressintegerrequiredEstimated completion percentage. 0 while queued, an elapsed-time estimate (capped at 95) while in progress, 100 on completion.
created_atintegerrequiredUnix timestamp of when the job was created.
completed_atintegerrequiredUnix timestamp of when the job reached a terminal state.
expires_atintegerrequiredUnix timestamp of when the stored video expires. Currently always null — generated videos are retained until you delete them.
promptstringrequiredThe prompt used for the generation.
sizestringrequiredOutput size as WIDTHxHEIGHT. Shows the requested size while the job is pending, and the actual rendered pixels once completed (some models render close-but-not-exact sizes, e.g. 1248x704 for a 1280x720 request).
secondsstringrequiredClip duration in seconds. Shows the requested value while pending and the actual rendered duration once completed.
audiobooleanrequiredWhether the video was generated with a synchronized audio track. Always false on models that only produce silent video.
errorobjectrequiredError details when the job failed; null otherwise.
remixed_from_video_idstringrequiredAlways null — remixing is not supported.
Request
curl 'https://api.scx.ai/v1/videos/extensions' \
-H 'Authorization: Bearer your-scx-api-key' \
-F model=seedance-2.0 \
-F prompt='the camera pulls back to reveal the whole valley' \
-F seconds=8 \
-F video=@clip.mp4curl 'https://api.scx.ai/v1/videos/extensions' \
-H 'Authorization: Bearer your-scx-api-key' \
-F model=seedance-2.0 \
-F prompt='the camera pulls back to reveal the whole valley' \
-F seconds=8 \
-F video=@clip.mp4Response
{
"id": "video_31b7bd1c-0d6d-4a2f-9f6c-2c4e1c39d1a0",
"object": "video",
"model": "seedance-2.0",
"status": "queued",
"progress": 0,
"created_at": 1783652619,
"completed_at": null,
"expires_at": null,
"prompt": "the camera pulls back to reveal the whole valley",
"size": "auto",
"seconds": "8",
"audio": true,
"error": null,
"remixed_from_video_id": null
}{
"id": "video_31b7bd1c-0d6d-4a2f-9f6c-2c4e1c39d1a0",
"object": "video",
"model": "seedance-2.0",
"status": "queued",
"progress": 0,
"created_at": 1783652619,
"completed_at": null,
"expires_at": null,
"prompt": "the camera pulls back to reveal the whole valley",
"size": "auto",
"seconds": "8",
"audio": true,
"error": null,
"remixed_from_video_id": null
}