Seedance 2.5
Generate 4–30 second videos at 480p, 720p or 1080p from text, a first and last frame, or up to 30 images, 10 videos and 10 audio clips as references; edit or extend a video.
- Asynchronous: the create call returns a task ID; the video arrives when the task succeeds (usually a few minutes).
- Four ways in: text only, a first frame, a first and last frame, or reference images, videos and audio in any mix (audio alone works too).
task_typesays whether reference videos are material for a new video, a video to edit, or a video to extend, so the request is checked before you pay.- Sound is generated by default at no extra cost; MP4 by default, MOV on request.
- Billed by the size and length of the video, plus the length of any reference videos. A failed task costs nothing.
Opens this model in the API Explorer. Enter your BeatAPI API key to create a task: the call is real and is billed to your own balance.
Model IDs
Four Seedance models share this endpoint. The values below come straight from the gateway contract; only Seedance 2.5 accepts task_type, output_format and seed.
Endpoint and authentication
POST https://api.beatapi.io/v1/videos/tasks
Authorization
string
Required
Your BeatAPI API key, sent as Bearer <BEATAPI_API_KEY>. Create keys in the Dashboard. Keep keys on your server; never ship them in a browser or mobile app.
Send the body as JSON with Content-Type: application/json. Idempotency-Key is optional: send a unique value (at most 255 characters) per logical request and reuse it only to retry that exact body. Within 24 hours a retry with the same key and body returns the first response again with Idempotent-Replayed: true; the same key with a different body returns 409 idempotency_conflict. Responses other than 2xx are not stored, so a retry after a 400 or 402 runs again.
How a request works
Create the task
POST the parameters below to the endpoint. A 201 means the task was accepted and its price reserved from your balance; the work runs in the background. Save data.id.
Wait for it to finish
Call GET /v1/tasks/{task_id} and wait data.poll_after_seconds between calls (5 s for images, 8 s for videos) until status is succeeded or failed. Or register a webhook for task.succeeded and task.failed; keep polling as the fallback, because a task stopped by the processing timeout sends no event.
Save the result
On succeeded, download every data.output.media[].url and store the files you need; BeatAPI does not promise how long result URLs stay available. On failed, read data.error_code and data.error_message: the reserved amount was returned to your balance, and data.retryable says whether sending the same request again can succeed.
Input modes
Request parameters
model
string
Required
The model to run.
Value: seedance-2.5
If the value is wrong
- Missing:
"model" is required - An image model sent to this endpoint:
"model" nano-banana-2 is served by POST /v1/images/tasks, not this endpoint
prompt
string
Required
What happens in the video: subject, action, camera movement, style and sound. With references, say what each input is for.
Length: 1–5000 characters
- Length is counted in characters (a CJK character counts as one).
- Refer to inputs by their position, for example “the first reference image” or “the second reference video”.
- When you make a new video from reference videos, avoid words such as “replace”, “remove” or “extend”, or the model may read the request as an edit; send
task_type: "reference"to be sure. Foredit, say what to change and what to keep. Forextend, describe what happens next.
If the value is wrong
- Missing:
"prompt" is required - Empty or longer than the limit:
"prompt" has an unsupported length
images
string[]
Optional
A first frame, or a first and a last frame.
Items: 1–2
Each item is a public https:// URL. For a local file, upload it first with POST /v1/files and pass the returned data.url.
- One link: the video starts from this image. Two links:
images[0]is the first frame andimages[1]the last. - The video takes the aspect ratio of the first image;
aspect_ratiois not applied. - For more pictures, or pictures that guide the video without being frames, use
reference_imagesinstead.
If the value is wrong
- More than two links:
"images" accepts at most 2 items - Combined with any reference_* field:
Cannot combine "images" with reference inputs in one task - Not an https:// link:
"images[0]" must be a public HTTPS URL
reference_images
string[]
Optional
Pictures that guide the content, characters, products or style of the video.
Items: 1–30
Each item is a public https:// URL. For a local file, upload it first with POST /v1/files and pass the returned data.url.
- Images are used in list order; refer to them in the prompt by position.
If the value is wrong
- More than the maximum:
"reference_images" accepts at most 30 items - Combined with
images:Cannot combine "images" with reference inputs in one task
reference_videos
string[]
Optional
Videos to take motion, camera work or content from, or the video to edit or extend (see task_type).
Items: 1–10
Each item is a public https:// URL. For a local file, upload it first with POST /v1/files and pass the returned data.url.
- Each link must return an MP4 or MOV file whose host allows byte-range requests: the gateway reads the length of every clip before creating the task, because reference seconds are billed.
- Required for
task_typeeditandextend.
Reference videos add to the price for every second they run (see Billing). Trim them to the part you need.
If the value is wrong
- More than the maximum:
"reference_videos" accepts at most 10 items - The clip cannot be read:
A reference video could not be read: reference_videos[0]: its host does not allow byte-range requests. Send an MP4 or MOV file at a public HTTPS URL whose host allows byte-range requests.
reference_audios
string[]
Optional
Music, voice or sound to follow. Audio alone, without any image or video reference, is accepted.
Items: 1–10
Each item is a public https:// URL. For a local file, upload it first with POST /v1/files and pass the returned data.url.
- WAV and MP3 clips are measured against the limits below; other formats are passed to the model unmeasured.
If the value is wrong
- More than the maximum:
"reference_audios" accepts at most 10 items
duration
integer
OptionalDefault: 5
Length of the video in seconds, a whole number.
Default: 5
Range: 4–30
- If you leave it out,
5is sent — also withtask_typeautoandreference. - With
task_type: "extend", always send it: it is the length of the finished video including the source. To add 5 seconds to a 5-second clip, send10; leaving it out asks for 5 seconds in total. - With
task_type: "edit", leave it out: the result keeps the source video’s length.
If the value is wrong
- Outside the range or not a whole number:
"duration" is outside its supported range - Sent with
task_type: "edit":task_type "edit" keeps the reference video's length: leave "duration" out
aspect_ratio
string
OptionalDefault: adaptive
Shape of the video as width:height. adaptive lets the model choose from the inputs.
Allowed values: adaptive, 21:9, 16:9, 4:3, 1:1, 3:4, 9:16
Default: adaptive
- Ignored when
imagescarries a first frame: the video takes the frame’s aspect ratio. - With
task_typeeditorextend, leave it out or sendadaptive: the result keeps the source video’s shape. - With
adaptive(or frames) the reservation assumes the largest frame of the chosen resolution, so it can be slightly higher than with a fixed ratio.
If the value is wrong
- A value not in the list:
"aspect_ratio" must be one of: [adaptive 21:9 16:9 4:3 1:1 3:4 9:16] - A fixed ratio with
editorextend:task_type "edit" keeps the reference video's aspect ratio: leave "aspect_ratio" out or send "adaptive"
resolution
string
OptionalDefault: 720p
Output resolution. Higher resolution costs more per second.
Allowed values: 480p, 720p, 1080p
Default: 720p
- Lower case only. 4K is not available on Seedance 2.5 (use
seedance-2).
If the value is wrong
- A value not in the list (for example
4kor720P):"resolution" must be one of: [480p 720p 1080p]
generate_audio
boolean
OptionalDefault: true
Whether the video has a generated soundtrack. The price is the same either way.
Default: true
If the value is wrong
- Not true or false:
"generate_audio" must be a boolean
seed
integer
Optional
A fixed number makes results easier to repeat; leave it out or send -1 for a random seed.
Range: -1–4294967295
- The same seed with the same request gives similar, not guaranteed identical, results.
If the value is wrong
- Outside the range:
"seed" is outside its supported range
task_type
string
Optional
What to do with reference_videos: make a new video from them (reference), edit one (edit), or extend one (extend). auto (or leaving it out) lets the model decide from the prompt.
Allowed values: auto, reference, edit, extend
- Naming the type lets the gateway check the request before anything is charged; see Task types below for the rules of each.
- With
autoorreferencea duration is always sent (5if you leave it out), so a prompt the model reads as an edit fails after submission (refunded) or is re-run as an edit billed at the source video’s length. Sendeditwhen you mean an edit.
If the value is wrong
- A value not in the list:
"task_type" must be one of: [auto reference edit extend] editorextendwithout a reference video:task_type "edit" needs a video in "reference_videos"referencewithout any reference input:task_type "reference" needs reference inputs
output_format
string
Optional
Container of the result: mp4 (used when you leave it out) or mov. The price is the same.
Allowed values: mp4, mov
movsuits further editing. It is not always available; when it is not, the request is refused before anything is charged with a sentence naming the formats you can use now.
If the value is wrong
- A value not in the list:
"output_format" must be one of: [mp4 mov]
The gateway also checks these combinations before creating the task:
- images cannot be combined with reference inputs
Input media limits
The gateway reads every input before the task is created and refuses one outside these limits with a 400 bad_request that names the input. Nothing is charged.
- Reference videos must be MP4 or MOV, at a public HTTPS link whose host answers byte-range requests. A clip whose length cannot be read is always refused, because its seconds are billed.
- Image size is checked when the host reports it. Use JPEG, PNG or WebP; a file the model cannot use fails the task after submission with
bad_request, and the task is refunded. - Limits are reported in the order length, sides, aspect ratio, pixels, frame rate and size. The message names the input by list and position, counting from 0 like the field errors:
reference_videos[0] is 1.5 seconds long; this model takes reference video of 2 to 30 seconds. - Lengths are measured with a 0.1-second tolerance. Sizes are checked only when the host reports them.
- Image and audio links are refused at create only when the host answers with a 4xx error or returns an empty file, for example
images[1] could not be downloaded: the URL returned HTTP 404.; other problems with them surface after submission. - A clip at 23.976 FPS counts as below 24 and is refused; re-export it at 24 FPS or higher.
- Have a local file? Upload it with
POST /v1/filesand pass the returneddata.url.
Task types
The “Needs” and “Leave out” columns are checked when the task is created: a request that breaks them is refused with 400 bad_request and costs nothing.
- These can still fail the task after it was created (
bad_request, refunded): an edit whose source video is shorter than 4 or longer than 30 seconds, and a prompt the model reads as a different kind of task than the one you named. The message says what to change — whichtask_typeto send, or how to word the prompt.
Writing the prompt for each task type
Fields this model does not accept
Sending one of these is refused before anything is charged, instead of being ignored:
watermark,quality,sound,multi_shotsorcharacter_orientation→field "watermark" is not supported by model seedance-2.5(with the field you sent).- A name no BeatAPI video model uses →
unknown field: <name>. duration: -1(model-chosen length) →"duration" is outside its supported range; send a whole number of seconds.
Request examples
Text to video
A 5-second 720p landscape clip with sound.
First and last frame
The video moves from the first image to the second.
Image and audio references
A performance that follows a character image and a music clip.
Image, video and audio references
Replace the video link with your own MP4 or MOV. Every second of the reference video is billed (see Billing).
Edit a video
Replace the link with your own MP4 or MOV of 4 to 30 seconds. Leave out duration and aspect_ratio: the result keeps the source’s length and shape.
Extend a video
Replace the link with your own clip. For a 5-second source, duration: 10 adds five seconds.
Responses
Create a task (201)
The task object. output is null until the task succeeds. Fields marked “while running” disappear once the task finishes.
Finished task
GET /v1/tasks/{task_id} returns HTTP 200 with status: "succeeded" and the result in data.output.
Output fields
Failed task
A failed task is still HTTP 200 on GET /v1/tasks/{task_id}: the failure is in the body. The reservation is returned in full, so nothing is charged.
Complete example
Create a task, wait for it with the server’s polling hint, and print the result URLs. Set BEATAPI_API_KEY in your environment and install requests.
Billing
- The price follows the size and length of the video: more seconds, a higher resolution or a larger frame cost more. Sound and
output_formatdo not change it; reference images and audio add nothing. - Without reference video, a 16:9 clip costs about 0.228 (720p) or $0.564 (1080p) per second. Other aspect ratios differ by a few percent.
- With
reference_videos, the whole request moves to the lower “with video input” rate, and every second of reference video counts like a second of output: about 0.137 (720p) or $0.337 (1080p) per second of output plus reference, at 16:9. - The table below shows 8-second clips; its “with video input” rows include an 8-second reference video.
- An edit pays for the source video twice — once as the reference and once as the output, which keeps the source’s length (rounded up to a whole second).
usage.billable_duration_secondsshows the output seconds. - The price is reserved when the task is created. With
adaptiveor frames the reservation assumes the largest frame of the resolution. You pay the reservation, or the actual amount if the delivered video comes to more. - A very short reference video can be billed for a minimum length, which can bring the settled amount above the reservation;
usageon the finished task shows what was charged. - A failed task, including one refused by moderation after submission, is refunded in full.
Current list prices, the same as on Pricing. An account with a negotiated discount pays less; data.usage on the task always shows the amount actually charged.
Common errors
HTTP errors at a glance
Errors before a task exists arrive as a non-2xx response, and nothing is charged. Branch on error.code or error.retryable; message names the problem. The full list and retry policy are on Errors.
Differences from Seedance 2.0
Authentication
Send your API key as Authorization: Bearer <BEATAPI_API_KEY>.
Headers
Send the body as JSON with Content-Type: application/json. Idempotency-Key is optional: send a unique value (at most 255 characters) per logical request and reuse it only to retry that exact body. Within 24 hours a retry with the same key and body returns the first response again with Idempotent-Replayed: true; the same key with a different body returns 409 idempotency_conflict. Responses other than 2xx are not stored, so a retry after a 400 or 402 runs again.
Request
The model to run.
Value: seedance-2.5
If the value is wrong
- Missing:
"model" is required - An image model sent to this endpoint:
"model" nano-banana-2 is served by POST /v1/images/tasks, not this endpoint
What happens in the video: subject, action, camera movement, style and sound. With references, say what each input is for.
Length: 1–5000 characters
- Length is counted in characters (a CJK character counts as one).
- Refer to inputs by their position, for example “the first reference image” or “the second reference video”.
- When you make a new video from reference videos, avoid words such as “replace”, “remove” or “extend”, or the model may read the request as an edit; send
task_type: "reference"to be sure. Foredit, say what to change and what to keep. Forextend, describe what happens next.
If the value is wrong
- Missing:
"prompt" is required - Empty or longer than the limit:
"prompt" has an unsupported length
Shape of the video as width:height. adaptive lets the model choose from the inputs.
Allowed values: adaptive, 21:9, 16:9, 4:3, 1:1, 3:4, 9:16
Default: adaptive
- Ignored when
imagescarries a first frame: the video takes the frame’s aspect ratio. - With
task_typeeditorextend, leave it out or sendadaptive: the result keeps the source video’s shape. - With
adaptive(or frames) the reservation assumes the largest frame of the chosen resolution, so it can be slightly higher than with a fixed ratio.
If the value is wrong
- A value not in the list:
"aspect_ratio" must be one of: [adaptive 21:9 16:9 4:3 1:1 3:4 9:16] - A fixed ratio with
editorextend:task_type "edit" keeps the reference video's aspect ratio: leave "aspect_ratio" out or send "adaptive"
Length of the video in seconds, a whole number.
Default: 5
Range: 4–30
- If you leave it out,
5is sent — also withtask_typeautoandreference. - With
task_type: "extend", always send it: it is the length of the finished video including the source. To add 5 seconds to a 5-second clip, send10; leaving it out asks for 5 seconds in total. - With
task_type: "edit", leave it out: the result keeps the source video’s length.
If the value is wrong
- Outside the range or not a whole number:
"duration" is outside its supported range - Sent with
task_type: "edit":task_type "edit" keeps the reference video's length: leave "duration" out
Whether the video has a generated soundtrack. The price is the same either way.
Default: true
If the value is wrong
- Not true or false:
"generate_audio" must be a boolean
A first frame, or a first and a last frame.
Items: 1–2
Each item is a public https:// URL. For a local file, upload it first with POST /v1/files and pass the returned data.url.
- One link: the video starts from this image. Two links:
images[0]is the first frame andimages[1]the last. - The video takes the aspect ratio of the first image;
aspect_ratiois not applied. - For more pictures, or pictures that guide the video without being frames, use
reference_imagesinstead.
If the value is wrong
- More than two links:
"images" accepts at most 2 items - Combined with any reference_* field:
Cannot combine "images" with reference inputs in one task - Not an https:// link:
"images[0]" must be a public HTTPS URL
Container of the result: mp4 (used when you leave it out) or mov. The price is the same.
Allowed values: mp4, mov
movsuits further editing. It is not always available; when it is not, the request is refused before anything is charged with a sentence naming the formats you can use now.
If the value is wrong
- A value not in the list:
"output_format" must be one of: [mp4 mov]
Music, voice or sound to follow. Audio alone, without any image or video reference, is accepted.
Items: 1–10
Each item is a public https:// URL. For a local file, upload it first with POST /v1/files and pass the returned data.url.
- WAV and MP3 clips are measured against the limits below; other formats are passed to the model unmeasured.
If the value is wrong
- More than the maximum:
"reference_audios" accepts at most 10 items
Pictures that guide the content, characters, products or style of the video.
Items: 1–30
Each item is a public https:// URL. For a local file, upload it first with POST /v1/files and pass the returned data.url.
- Images are used in list order; refer to them in the prompt by position.
If the value is wrong
- More than the maximum:
"reference_images" accepts at most 30 items - Combined with
images:Cannot combine "images" with reference inputs in one task
Videos to take motion, camera work or content from, or the video to edit or extend (see task_type).
Items: 1–10
Each item is a public https:// URL. For a local file, upload it first with POST /v1/files and pass the returned data.url.
- Each link must return an MP4 or MOV file whose host allows byte-range requests: the gateway reads the length of every clip before creating the task, because reference seconds are billed.
- Required for
task_typeeditandextend.
Notes: Reference videos add to the price for every second they run (see Billing). Trim them to the part you need.
If the value is wrong
- More than the maximum:
"reference_videos" accepts at most 10 items - The clip cannot be read:
A reference video could not be read: reference_videos[0]: its host does not allow byte-range requests. Send an MP4 or MOV file at a public HTTPS URL whose host allows byte-range requests.
Output resolution. Higher resolution costs more per second.
Allowed values: 480p, 720p, 1080p
Default: 720p
- Lower case only. 4K is not available on Seedance 2.5 (use
seedance-2).
If the value is wrong
- A value not in the list (for example
4kor720P):"resolution" must be one of: [480p 720p 1080p]
A fixed number makes results easier to repeat; leave it out or send -1 for a random seed.
Range: -1–4294967295
- The same seed with the same request gives similar, not guaranteed identical, results.
If the value is wrong
- Outside the range:
"seed" is outside its supported range
What to do with reference_videos: make a new video from them (reference), edit one (edit), or extend one (extend). auto (or leaving it out) lets the model decide from the prompt.
Allowed values: auto, reference, edit, extend
- Naming the type lets the gateway check the request before anything is charged; see Task types below for the rules of each.
- With
autoorreferencea duration is always sent (5if you leave it out), so a prompt the model reads as an edit fails after submission (refunded) or is re-run as an edit billed at the source video’s length. Sendeditwhen you mean an edit.
If the value is wrong
- A value not in the list:
"task_type" must be one of: [auto reference edit extend] editorextendwithout a reference video:task_type "edit" needs a video in "reference_videos"referencewithout any reference input:task_type "reference" needs reference inputs
Response
The task object. output is null until the task succeeds. Fields marked “while running” disappear once the task finishes.

