ByteDance
Seedance 1.0
ByteDance's video generation family, in Pro and Lite variants, covering text-to-video and image-to-video at 480p and 720p. Available as a hosted endpoint; weights are not publicly released.
Capabilities
Characteristics reported by ByteDance in the Seedance 1.0 model introduction. Treat them as vendor claims, not independent measurements.
Multi-shot coherence
Subject appearance and scene layout are held stable across shot changes within a single generation, rather than each cut resampling the subject.
Motion and physics
The Pro variant is tuned for plausible trajectory and contact behaviour — the difference most visible in sports, vehicles and cloth.
Prompt adherence
Handles compound prompts that specify subject, action, camera move and style together, instead of collapsing to the dominant noun.
Style range
Covers photographic output through to stylised and animated looks from the same checkpoint.
Reported evaluations
ByteDance publishes results on its internal SeedVideoBench-1.0 suite and points to the public Artificial Analysis arena. Both charts below are ByteDance's own; we have not reproduced the numbers, and the arena leaderboard changes over time, so check the live ranking before quoting it.
Variants
Pro targets output quality; Lite trades some fidelity for a lower cost per run. Per-run pricing is listed on each model page — it changes, so we don't mirror it here.
| Endpoint | Variant | Task | Resolution |
|---|---|---|---|
bytedance/seedance-v1-pro-t2v-480p | Pro | Text-to-video | 480p |
bytedance/seedance-v1-pro-i2v-480p | Pro | Image-to-video | 480p |
bytedance/seedance-v1-pro-i2v-720p | Pro | Image-to-video | 720p |
bytedance/seedance-v1-lite-t2v-480p | Lite | Text-to-video | 480p |
bytedance/seedance-v1-lite-i2v-480p | Lite | Image-to-video | 480p |
bytedance/seedance-v1-lite-i2v-720p | Lite | Image-to-video | 720p |
Run it
Swap the endpoint path for any variant in the table above; the request body is otherwise the same.
# 1. submit the job
curl -X POST "https://api.wavespeed.ai/api/v3/bytedance/seedance-v1-pro-i2v-480p" \
-H "Authorization: Bearer $WAVESPEED_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"image": "https://example.com/still.jpg",
"prompt": "The camera pushes in slowly as steam rises from the cup",
"duration": 5,
"enable_sync_mode": false
}'
# -> {"code": 200, "data": {"id": "<request-id>", "status": "created", ...}}
# 2. poll until status is "completed"
curl "https://api.wavespeed.ai/api/v3/predictions/<request-id>/result" \
-H "Authorization: Bearer $WAVESPEED_API_KEY"
# -> {"code": 200, "data": {"status": "completed", "outputs": ["https://..."]}}
import os, time, requests
API = "https://api.wavespeed.ai/api/v3"
KEY = os.environ["WAVESPEED_API_KEY"]
HEADERS = {"Authorization": f"Bearer {KEY}"}
# submit
res = requests.post(
f"{API}/bytedance/seedance-v1-pro-i2v-480p",
headers={**HEADERS, "Content-Type": "application/json"},
json={
"image": "https://example.com/still.jpg",
"prompt": "The camera pushes in slowly as steam rises from the cup",
"duration": 5,
"enable_sync_mode": false
},
timeout=30,
)
res.raise_for_status()
request_id = res.json()["data"]["id"]
# poll
while True:
data = requests.get(
f"{API}/predictions/{request_id}/result",
headers=HEADERS,
timeout=30,
).json()["data"]
if data["status"] == "completed":
print(data["outputs"][0])
break
if data["status"] == "failed":
raise RuntimeError(data.get("error", "generation failed"))
time.sleep(1.5)
const API = "https://api.wavespeed.ai/api/v3";
const KEY = process.env.WAVESPEED_API_KEY;
const headers = { Authorization: `Bearer ${KEY}` };
// submit
const submit = await fetch(`${API}/bytedance/seedance-v1-pro-i2v-480p`, {
method: "POST",
headers: { ...headers, "Content-Type": "application/json" },
body: JSON.stringify({
"image": "https://example.com/still.jpg",
"prompt": "The camera pushes in slowly as steam rises from the cup",
"duration": 5,
"enable_sync_mode": false
}),
});
const { data: { id } } = await submit.json();
// poll
for (;;) {
const res = await fetch(`${API}/predictions/${id}/result`, { headers });
const { data } = await res.json();
if (data.status === "completed") {
console.log(data.outputs[0]);
break;
}
if (data.status === "failed") throw new Error(data.error ?? "generation failed");
await new Promise((r) => setTimeout(r, 1500));
}
Requests are asynchronous: POST returns a request id, then you poll /predictions/<id>/result until status is completed. Set enable_sync_mode: true to have the call block and return outputs directly.
API keys are created in the WaveSpeed dashboard.
Limitations
Worth knowing before you build on it: output is synthetic and unsuitable as a source of factual imagery; results inherit biases present in the training data; image-to-video quality tracks input image quality closely, and small changes to a prompt or seed can move the result noticeably. Each endpoint is fixed to the resolution listed above.