# Seedance 2.0 > ByteDance's flagship video model with text-to-video, image-to-video, and reference-to-video (multi-image/video/audio) generation, cinematic output, native synchronized audio, multi-shot editing, and director-level camera control. ## Quick Reference - Model ID: seedance-2.0 - Creator: ByteDance - Status: active - Family: seedance - Base URL: https://api.lumenfall.ai/v1 ## Specifications - Max Input Images: 9 - Max Video Duration: 15 seconds - Input Modalities: text, image, video, audio - Output Modalities: video, audio - Supported Modes: Text to Video, Image to Video, Video to Video ## API Parameters The compiled parameter schema for this model is available via the API: `GET /v1/models/seedance-2.0?schema=true`. ### Core Parameters - `prompt` (string) — REQUIRED: Text prompt for video generation. Modes: Text to Video, Image to Video, Video to Video - `seed` (integer): Random seed for reproducibility. Modes: Text to Video, Image to Video, Video to Video - `duration` (number): Video duration in seconds. Values: 10, 11, 12, 13, 14, 15, 4, 5, 6, 7, 8, 9. Modes: Text to Video, Image to Video, Video to Video ### Size & Layout - `size` (string): Video dimensions as WxH pixels (e.g. "1920x1080") or aspect ratio (e.g. "16:9"). Values: auto, 1563x670, 1365x768, 768x1365, 887x1182, 1024x1024, 1183x887. Modes: Text to Video, Image to Video, Video to Video - `aspect_ratio` (string): Aspect ratio of the output video (e.g. "16:9", "1:1"). Values: auto, 9:16, 3:4, 1:1, 4:3, 16:9, 21:9. Modes: Text to Video, Image to Video, Video to Video - `resolution` (string): Output resolution tier (e.g. "1K", "4K"). Values: auto, 1K. Modes: Text to Video, Image to Video, Video to Video ### Media Inputs - `input_reference` (array) — REQUIRED: Input image(s) to animate into video. Modes: Image to Video, Video to Video - `input_video` (string) — REQUIRED: Input video URL to transform. Modes: Video to Video ### Audio - `generate_audio` (boolean): Whether to generate audio alongside video. Modes: Text to Video, Image to Video, Video to Video ### Output & Format - `n` (integer): Number of videos to generate. Default: 1. Modes: Text to Video, Image to Video, Video to Video ### Additional Parameters - `end_image` (string): End frame image URL for video interpolation. Modes: Image to Video - `audio_urls` (array): Reference audio clips (up to 3) for lip-sync or scoring.. Modes: Video to Video. Only available via fal - `end_user_id` (string): Optional end user identifier.. Modes: Text to Video, Image to Video, Video to Video. Only available via fal ## Model Identifiers - Primary Slug: seedance-2.0 - Aliases: seedance-2-0, seedance-2 ## Tags video-generation, text-to-video, image-to-video, video-to-video, audio-generation ## Available Providers ### fal.ai - Config Key: fal/seedance-2.0 - Provider Model ID: bytedance/seedance-2.0/text-to-video - Pricing: $0.303/second - Source: https://fal.ai/models/bytedance/seedance-2.0/text-to-video ### fal.ai - Config Key: fal/seedance-2.0-i2v - Provider Model ID: bytedance/seedance-2.0/image-to-video - Pricing: $0.302/second - Source: https://fal.ai/models/bytedance/seedance-2.0/image-to-video ### fal.ai - Config Key: fal/seedance-2.0-r2v - Provider Model ID: bytedance/seedance-2.0/reference-to-video - Pricing: $0.181/second - Source: https://fal.ai/models/bytedance/seedance-2.0/reference-to-video ## Performance Metrics Provider performance over the last 30 days. ### fal - Median Generation Time (p50): 244ms - 95th Percentile Generation Time (p95): 2014ms - Average Generation Time: 925ms - Success Rate: 100.0% - Total Requests: 28 ## Image Gallery 4 images available for this model. Browse all at https://lumenfall.ai/models/bytedance/seedance-2.0/gallery ### Arena Video Results - : Elo . Prompt: "Cinematic 4k drone shot gliding over a vibrant futuristic greenhouse city. In the foreground, a s..." - Celebrity Arrival: Elo 1117. Prompt: "Ultra-realistic celebrity arrival scene in New York City, filmed as one continuous handheld shot ..." - The Rubik's Gauntlet: Elo 1047. Prompt: "Hyper-realistic cinematic close-up of a professional speedcuber solving a 3x3 Rubik's Cube at wor..." - Neon Rain Reverie: Elo 1000. Prompt: "Hyper-realistic cinematic video of an elegant young woman in a flowing white silk dress dancing g..." ## Example Prompt The following prompt was used to generate an example video in our playground: Cinematic 4k drone shot gliding over a vibrant futuristic greenhouse city. In the foreground, a sleek metallic drone hovers, scanning luminescent exotic plants. The name "Seedance 2.0" is holographically projected in the air. In the blurry mid-ground, a calm capybara sits peacefully on a stone bench next to a robotic gardener, unbothered by the high-tech surroundings. Smooth camera movement, natural light filtering through glass panels, hyper-realistic textures, and atmospheric synth foley. ## Code Examples ### Text to Video (/v1/videos/generations) — Async #### cURL # Step 1: Submit video generation request VIDEO_ID=$(curl -s -X POST \ https://api.lumenfall.ai/v1/videos \ -H "Authorization: Bearer $LUMENFALL_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "seedance-2.0", "prompt": "", "size": "1024x1024" }' | jq -r '.id') echo "Video ID: $VIDEO_ID" # Step 2: Poll for completion while true; do RESULT=$(curl -s \ https://api.lumenfall.ai/v1/videos/$VIDEO_ID \ -H "Authorization: Bearer $LUMENFALL_API_KEY") STATUS=$(echo $RESULT | jq -r '.status') echo "Status: $STATUS" if [ "$STATUS" = "completed" ]; then echo $RESULT | jq -r '.output.url' break elif [ "$STATUS" = "failed" ]; then echo $RESULT | jq -r '.error.message' break fi sleep 5 done #### JavaScript const BASE_URL = 'https://api.lumenfall.ai/v1'; const API_KEY = 'YOUR_API_KEY'; // Step 1: Submit video generation request const submitRes = await fetch(`${BASE_URL}/videos`, { method: 'POST', headers: { 'Authorization': `Bearer ${API_KEY}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ model: 'seedance-2.0', prompt: '', size: '1024x1024' }) }); const { id: videoId } = await submitRes.json(); console.log('Video ID:', videoId); // Step 2: Poll for completion while (true) { const pollRes = await fetch(`${BASE_URL}/videos/${videoId}`, { headers: { 'Authorization': `Bearer ${API_KEY}` } }); const result = await pollRes.json(); if (result.status === 'completed') { console.log('Video URL:', result.output.url); break; } else if (result.status === 'failed') { console.error('Error:', result.error.message); break; } await new Promise(r => setTimeout(r, 5000)); } #### Python import requests import time BASE_URL = "https://api.lumenfall.ai/v1" API_KEY = "YOUR_API_KEY" HEADERS = { "Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json" } # Step 1: Submit video generation request response = requests.post( f"{BASE_URL}/videos", headers=HEADERS, json={ "model": "seedance-2.0", "prompt": "", "size": "1024x1024" } ) video_id = response.json()["id"] print(f"Video ID: {video_id}") # Step 2: Poll for completion while True: result = requests.get( f"{BASE_URL}/videos/{video_id}", headers=HEADERS ).json() if result["status"] == "completed": print(f"Video URL: {result['output']['url']}") break elif result["status"] == "failed": print(f"Error: {result['error']['message']}") break time.sleep(5) ### Image to Video (/v1/videos/generations) — Async #### cURL # Step 1: Submit image-to-video request VIDEO_ID=$(curl -s -X POST \ https://api.lumenfall.ai/v1/videos \ -H "Authorization: Bearer $LUMENFALL_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "seedance-2.0", "prompt": "", "image_url": "https://example.com/start-frame.jpg", "duration": "10", "aspect_ratio": "16:9" }' | jq -r '.id') echo "Video ID: $VIDEO_ID" # Step 2: Poll for completion while true; do RESULT=$(curl -s \ https://api.lumenfall.ai/v1/videos/$VIDEO_ID \ -H "Authorization: Bearer $LUMENFALL_API_KEY") STATUS=$(echo $RESULT | jq -r '.status') echo "Status: $STATUS" if [ "$STATUS" = "completed" ]; then echo $RESULT | jq -r '.output.url' break elif [ "$STATUS" = "failed" ]; then echo $RESULT | jq -r '.error.message' break fi sleep 5 done #### JavaScript const BASE_URL = 'https://api.lumenfall.ai/v1'; const API_KEY = 'YOUR_API_KEY'; // Step 1: Submit image-to-video request const submitRes = await fetch(`${BASE_URL}/videos`, { method: 'POST', headers: { 'Authorization': `Bearer ${API_KEY}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ model: 'seedance-2.0', prompt: '', image_url: 'https://example.com/start-frame.jpg', duration: '10', aspect_ratio: '16:9' }) }); const { id: videoId } = await submitRes.json(); console.log('Video ID:', videoId); // Step 2: Poll for completion while (true) { const pollRes = await fetch(`${BASE_URL}/videos/${videoId}`, { headers: { 'Authorization': `Bearer ${API_KEY}` } }); const result = await pollRes.json(); if (result.status === 'completed') { console.log('Video URL:', result.output.url); break; } else if (result.status === 'failed') { console.error('Error:', result.error.message); break; } await new Promise(r => setTimeout(r, 5000)); } #### Python import requests import time BASE_URL = "https://api.lumenfall.ai/v1" API_KEY = "YOUR_API_KEY" HEADERS = { "Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json" } # Step 1: Submit image-to-video request response = requests.post( f"{BASE_URL}/videos", headers=HEADERS, json={ "model": "seedance-2.0", "prompt": "", "image_url": "https://example.com/start-frame.jpg", "duration": "10", "aspect_ratio": "16:9" } ) video_id = response.json()["id"] print(f"Video ID: {video_id}") # Step 2: Poll for completion while True: result = requests.get( f"{BASE_URL}/videos/{video_id}", headers=HEADERS ).json() if result["status"] == "completed": print(f"Video URL: {result['output']['url']}") break elif result["status"] == "failed": print(f"Error: {result['error']['message']}") break time.sleep(5) ### Video to Video (/v1/videos/generations) — Async #### cURL # Step 1: Submit video-to-video request VIDEO_ID=$(curl -s -X POST \ https://api.lumenfall.ai/v1/videos \ -H "Authorization: Bearer $LUMENFALL_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "seedance-2.0", "prompt": "Apply cinematic color grading to @Video1", "video_url": "https://example.com/source.mp4", "keep_audio": true, "aspect_ratio": "16:9" }' | jq -r '.id') echo "Video ID: $VIDEO_ID" # Step 2: Poll for completion while true; do RESULT=$(curl -s \ https://api.lumenfall.ai/v1/videos/$VIDEO_ID \ -H "Authorization: Bearer $LUMENFALL_API_KEY") STATUS=$(echo $RESULT | jq -r '.status') echo "Status: $STATUS" if [ "$STATUS" = "completed" ]; then echo $RESULT | jq -r '.output.url' break elif [ "$STATUS" = "failed" ]; then echo $RESULT | jq -r '.error.message' break fi sleep 5 done #### JavaScript const BASE_URL = 'https://api.lumenfall.ai/v1'; const API_KEY = 'YOUR_API_KEY'; // Step 1: Submit video-to-video request const submitRes = await fetch(`${BASE_URL}/videos`, { method: 'POST', headers: { 'Authorization': `Bearer ${API_KEY}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ model: 'seedance-2.0', prompt: 'Apply cinematic color grading to @Video1', video_url: 'https://example.com/source.mp4', keep_audio: true, aspect_ratio: '16:9' }) }); const { id: videoId } = await submitRes.json(); console.log('Video ID:', videoId); // Step 2: Poll for completion while (true) { const pollRes = await fetch(`${BASE_URL}/videos/${videoId}`, { headers: { 'Authorization': `Bearer ${API_KEY}` } }); const result = await pollRes.json(); if (result.status === 'completed') { console.log('Video URL:', result.output.url); break; } else if (result.status === 'failed') { console.error('Error:', result.error.message); break; } await new Promise(r => setTimeout(r, 5000)); } #### Python import requests import time BASE_URL = "https://api.lumenfall.ai/v1" API_KEY = "YOUR_API_KEY" HEADERS = { "Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json" } # Step 1: Submit video-to-video request response = requests.post( f"{BASE_URL}/videos", headers=HEADERS, json={ "model": "seedance-2.0", "prompt": "Apply cinematic color grading to @Video1", "video_url": "https://example.com/source.mp4", "keep_audio": True, "aspect_ratio": "16:9" } ) video_id = response.json()["id"] print(f"Video ID: {video_id}") # Step 2: Poll for completion while True: result = requests.get( f"{BASE_URL}/videos/{video_id}", headers=HEADERS ).json() if result["status"] == "completed": print(f"Video URL: {result['output']['url']}") break elif result["status"] == "failed": print(f"Error: {result['error']['message']}") break time.sleep(5) ## Frequently Asked Questions ### How much does Seedance 2.0 cost? Seedance 2.0 starts at $0.1814 per video through Lumenfall. Pricing varies by provider. Lumenfall does not add any markup to provider pricing. ### How do I use Seedance 2.0 via API? You can use Seedance 2.0 through Lumenfall's OpenAI-compatible API. Send requests to the unified endpoint with model ID "seedance-2.0". Code examples are available in Python, JavaScript, and cURL. ### Which providers offer Seedance 2.0? Seedance 2.0 is available through fal.ai on Lumenfall. Lumenfall automatically routes requests to the best available provider. ## Links - Model Page: https://lumenfall.ai/models/bytedance/seedance-2.0 - About: https://lumenfall.ai/models/bytedance/seedance-2.0/about - Providers, Pricing & Performance: https://lumenfall.ai/models/bytedance/seedance-2.0/providers - API Reference: https://lumenfall.ai/models/bytedance/seedance-2.0/api - Benchmarks: https://lumenfall.ai/models/bytedance/seedance-2.0/benchmarks - Use Cases: https://lumenfall.ai/models/bytedance/seedance-2.0/use-cases - Gallery: https://lumenfall.ai/models/bytedance/seedance-2.0/gallery - Playground: https://lumenfall.ai/playground?model=seedance-2.0 - API Documentation: https://docs.lumenfall.ai