Seedance 2.5
ByteDance Seedance 2.5 — next-generation async video generation. Coming soon to reAPI. This page is a preview seeded from the current Seedance generation; final parameters and pricing land at launch.
Coming soon. The Seedance 2.5 API is not available yet. The endpoint, parameters, and pricing below are a preview seeded from the current Seedance generation and may change when the model ships. Watch the model page for launch.
ByteDance's next-generation async video model, coming to reAPI. Seedance 2.5
turns text, photos, clips, or audio into short video. Like the current
Seedance family, mode is implicit: which media fields you set (prompt,
image_urls, image_with_roles, video_urls, audio_urls) decides whether
the request runs as text-to-video, image-to-video, first/last-frame
transition, or reference-driven generation. See pricing on the
model page.
Status
Seedance 2.5 is coming soon. This documentation is a preview so you can plan an integration ahead of launch. When the model ships:
- The
modelids, full parameter set, constraints, and per-second rates are finalized here. - The playground on the model page becomes live.
- This banner is removed.
The shape below mirrors the current Seedance generation. Treat every field as provisional until launch.
Quick example (preview)
curl https://reapi.ai/api/v1/videos/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2.5",
"prompt": "A kitten yawning at the camera, cinematic warm tones",
"resolution": "720p",
"size": "16:9",
"duration": 5
}'import requests
resp = requests.post(
"https://reapi.ai/api/v1/videos/generations",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"model": "seedance-2.5",
"prompt": "A kitten yawning at the camera, cinematic warm tones",
"resolution": "720p",
"size": "16:9",
"duration": 5,
},
timeout=30,
)
print(resp.json())const r = await fetch("https://reapi.ai/api/v1/videos/generations", {
method: "POST",
headers: {
Authorization: "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
model: "seedance-2.5",
prompt: "A kitten yawning at the camera, cinematic warm tones",
resolution: "720p",
size: "16:9",
duration: 5,
}),
});
console.log(await r.json());package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
)
func main() {
body, _ := json.Marshal(map[string]any{
"model": "seedance-2.5",
"prompt": "A kitten yawning at the camera, cinematic warm tones",
"resolution": "720p",
"size": "16:9",
"duration": 5,
})
req, _ := http.NewRequest("POST",
"https://reapi.ai/api/v1/videos/generations", bytes.NewReader(body))
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
out, _ := io.ReadAll(resp.Body)
fmt.Println(string(out))
}These calls will return 404 model not found until Seedance 2.5 launches.
Authentication
Every call needs a Bearer token. Generate keys at reapi.ai/settings/apikeys.
Authorization: Bearer YOUR_API_KEYKeys carry the active workspace's billing scope — there is no separate project header.
Endpoint
POST /api/v1/videos/generations
GET /api/v1/tasks/{id}Submission is async. The POST returns immediately with a task_id; the task
endpoint returns the same envelope until completion. Polling does not consume
credits.
Variants (preview)
Seedance 2.5 is expected to ship as a family of variants sharing one parameter
shape, picked via model:
| Variant | Speed | 1080p | Real-person uploads |
|---|---|---|---|
seedance-2.5 | standard | ✅ | — |
seedance-2.5-fast | faster | ❌ (480p / 720p only) | — |
seedance-2.5-face | standard | ✅ | ✅ |
seedance-2.5-fast-face | faster | ❌ (480p / 720p only) | ✅ |
reAPI never silently substitutes one variant for another. Final variant ids are confirmed at launch.
Request body (preview)
Mode is implicit — which media fields you set decides text-to-video, image-to-video, first/last-frame, or reference-driven generation.
| Field | Type | Default | Notes |
|---|---|---|---|
model | string | — | One of the variants above. Required. |
prompt | string | — | Describe the video. Optional when a reference field carries content. |
duration | integer | 5 | Output length in seconds, 4–15. |
size | string | 16:9 | 16:9 / 9:16 / 1:1 / 4:3 / 3:4 / 21:9 / adaptive. |
resolution | string | 480p | 480p / 720p / 1080p. 1080p on standard / face variants only. |
seed | integer | — | Reproducibility hint. |
generate_audio | boolean | false | Synthesize an audio track to play with the video. |
return_last_frame | boolean | false | Return output.last_frame_url for continuous chaining. |
tools | object[] | — | [{ "type": "web_search" }] to let the model query the web. |
image_urls | string[] | — | Up to 9 reference images (image-to-video). Public HTTP(S) URLs. |
image_with_roles | object[] | — | First / last frame interpolation ({ url, role }). |
video_urls | string[] | — | Up to 3 reference clips, combined ≤ 15s. |
audio_urls | string[] | — | Up to 3 reference audio tracks for lip-sync. |
No data: URIs. reAPI rejects base64 inputs platform-wide — every URL
field must be a public HTTP(S) URL. Upload to your own object storage (S3, R2,
OSS, …) and pass the URL.
Response envelope
Submit and poll share the same shape — only status and output fill in over
time.
{
"id": "task_018f5a3a1b6e7d9f8c2b4d6e8f0a2c4e",
"model": "seedance-2.5",
"status": "completed",
"created_at": 1735000000,
"output": {
"video_urls": ["https://cdn.reapi.ai/media/tasks/.../0.mp4"],
"last_frame_url": "https://cdn.reapi.ai/media/tasks/.../0.png"
},
"error": null
}Poll GET /api/v1/tasks/{id} (see the Tasks reference) until
status === "completed". output.video_urls holds the generated MP4 URL.
output.last_frame_url is present when the request set return_last_frame: true.
Pricing
Seedance 2.5 will bill per-second, scaled by resolution and reference mode — the same dimensions as the current Seedance family:
credits = ceil(per_second_usd × billable_seconds × 1000)where 1 credit = $0.001. Final per-second rates are published on the
model page at launch — that table is
dynamic and always reflects the current rate. Failed jobs are refunded
automatically.