Real outputs from the public examples of this model on Replicate, with the prompt and settings that produced them. They were not generated live on this page.
[Low-angle tracking shot] A small fox trots nimbly through the forest. Sunlight filters down through gaps in the leaves. The fox stops, alertly perking up its ears. [Cut to] Spotting danger, it quickly turns and flees, with the camera chasing after the fox as it dodges through the dense woods.
ByteDance Seed is the foundation-model research arm of ByteDance, the company behind TikTok, Douyin and CapCut. Formed in 2023 (initially called 'Doubao Foundation Model' / 'Skylark', renamed Seed in 2024), the team is led by Wu Yonghui and ships the Doubao consumer assistant, the Skylark / Doubao LLM family, and the Seedance and Seedream video and image models. Seedance launched in early 2025 with two tiers: Seedance Pro for high-fidelity creative work and Seedance Lite for fast, high-volume generation. The lite tier targets short-form social workflows on TikTok-adjacent surfaces and CapCut integrations, where latency and cost are paramount.
Seedance Lite is the speed-tier variant of ByteDance's Seedance text-to-video and image-to-video model. It is a closed Diffusion Transformer operating on a 3D spatio-temporal latent, distilled from Seedance Pro via consistency-style training and quantization to compress the diffusion sampler into far fewer denoising steps. Conditioning uses a bilingual Chinese/English text encoder (based on ByteDance's Doubao / Skylark LLM family) and image embeddings for first-frame conditioning. Output is 5-second clips at 720p / 24 fps. The lite tier is designed to be deployed at very high volume across ByteDance's consumer surfaces (Doubao app, CapCut, TikTok creator tools in China) where per-clip cost matters more than maximum fidelity. The base Seedance corpus is closed but ByteDance hold privileged access to large-scale TikTok / Douyin video data which is presumed to inform training.
Speed-tier distilled video model for high-volume use
Text-to-video and image-to-video
5-second clips at 720p / 24 fps
Bilingual Chinese/English prompts
Low per-clip cost and latency
Tight integration with CapCut and Doubao consumer surfaces
Director-style camera control vocabulary (limited)
Available via Doubao API and CapCut creator tools
Best for: high-volume social-media production, rapid iteration.
Formation & licence
Closed corpus including licensed video, web video and platform data (TikTok / Douyin, under ByteDance terms); bilingual dense captions; exact size undisclosed.
Licence: Proprietary commercial licence via Doubao / ByteDance Seed terms.
curl https://railwail.com/api/v1/videos/generations \
-H "Authorization: Bearer $RAILWAIL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-lite",
"prompt": "A slow drone shot over a misty pine forest at sunrise"
}'
# Response: {"job_id": "...", "status": "queued", ...}
# Poll until status is completed, failed or cancelled:
curl https://railwail.com/api/v1/jobs/JOB_ID \
-H "Authorization: Bearer $RAILWAIL_API_KEY"
import os
import time
import requests
API = "https://railwail.com/api/v1"
headers = {"Authorization": f"Bearer {os.environ['RAILWAIL_API_KEY']}"}
job = requests.post(
f"{API}/videos/generations",
headers=headers,
json={
"model": "seedance-lite",
"prompt": "A slow drone shot over a misty pine forest at sunrise",
},
).json()
while True:
status = requests.get(f"{API}/jobs/{job['job_id']}", headers=headers).json()
if status["status"] in ("completed", "failed", "cancelled"):
break
time.sleep(5)
print(status["status"], status.get("output_url"))
const API = "https://railwail.com/api/v1";
const headers = {
Authorization: `Bearer ${process.env.RAILWAIL_API_KEY}`,
"Content-Type": "application/json",
};
const job = await fetch(`${API}/videos/generations`, {
method: "POST",
headers,
body: JSON.stringify({
model: "seedance-lite",
prompt: "A slow drone shot over a misty pine forest at sunrise"
}),
}).then((r) => r.json());
let status;
do {
await new Promise((r) => setTimeout(r, 5000));
status = await fetch(`${API}/jobs/${job.job_id}`, { headers }).then((r) => r.json());
} while (!["completed", "failed", "cancelled"].includes(status.status));
console.log(status.status, status.output_url);