Overview
Use your API key to generate videos via Seedance API. The API supports both text-to-video and image-to-video generation. Video generation is asynchronous - you submit a task and then query for results.
Endpoints
Generate Video
- Method:
POST - URL:
https://api.seedanceapi.dev/v1/video/generate
Query Task
- Method:
POST - URL:
https://api.seedanceapi.dev/v1/video/query
Authentication
Include your API key in the Authorization header:
Authorization: Bearer YOUR_API_KEY
Content-Type: application/jsonGenerate Video Request
{
"prompt": "A cat wearing sunglasses walking on a beach with palm trees in the background",
"model": "seedance-pro-5s",
"image": "https://example.com/reference-image.jpg"
}Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
prompt | string | Yes* | Text description for the video |
model | string | No | Model to use (default: seedance-pro-5s) |
image | string | No* | Reference image URL for image-to-video |
*Either prompt or image is required.
Supported Models
| Model | Resolution | Duration | Credits |
|---|---|---|---|
seedance-lite-5s | 720p | 5s | 12 |
seedance-lite-10s | 720p | 10s | 24 |
seedance-pro-5s | 1080p | 5s | 35 |
seedance-pro-10s | 1080p | 10s | 70 |
seedance-1.5-pro-5s | 1080p + Audio | 5s | 50 |
seedance-1.5-pro-10s | 1080p + Audio | 10s | 100 |
Generate Response
{
"code": 0,
"message": "ok",
"data": {
"task_id": "abc123-def456-789",
"status": "pending",
"model": "seedance-pro-5s",
"scene": "text-to-video"
}
}Query Task Request
{
"task_id": "abc123-def456-789"
}Query Response
{
"code": 0,
"message": "ok",
"data": {
"task_id": "abc123-def456-789",
"status": "success",
"model": "seedance-pro-5s",
"scene": "text-to-video",
"videos": [
{
"url": "https://cdn.seedanceapi.dev/videos/abc123.mp4"
}
],
"error": null
}
}Task Status Values
| Status | Description |
|---|---|
pending | Task is queued |
processing | Video is being generated |
success | Video generation completed |
failed | Generation failed |
Examples
cURL - Generate Video
curl -X POST "https://api.seedanceapi.dev/v1/video/generate" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"prompt": "A cat wearing sunglasses walking on a beach",
"model": "seedance-pro-5s"
}'cURL - Query Task
curl -X POST "https://api.seedanceapi.dev/v1/video/query" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"task_id": "abc123-def456-789"
}'Node.js
async function generateVideo() {
// Step 1: Submit video generation task
const genRes = await fetch('https://api.seedanceapi.dev/v1/video/generate', {
method: 'POST',
headers: {
Authorization: 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
prompt: 'A cat wearing sunglasses walking on a beach',
model: 'seedance-pro-5s',
}),
});
const genResult = await genRes.json();
if (genResult.code !== 0) throw new Error(genResult.message);
const taskId = genResult.data.task_id;
console.log('Task submitted:', taskId);
// Step 2: Poll for results
while (true) {
await new Promise((r) => setTimeout(r, 15000)); // Wait 15 seconds
const queryRes = await fetch('https://api.seedanceapi.dev/v1/video/query', {
method: 'POST',
headers: {
Authorization: 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({ task_id: taskId }),
});
const queryResult = await queryRes.json();
if (queryResult.code !== 0) throw new Error(queryResult.message);
const { status, videos, error } = queryResult.data;
if (status === 'success') {
console.log('Video ready:', videos[0].url);
return videos[0].url;
}
if (status === 'failed') {
throw new Error(error || 'Video generation failed');
}
console.log('Status:', status);
}
}Python
import requests
import time
def generate_video():
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
}
# Step 1: Submit video generation task
gen_res = requests.post(
'https://api.seedanceapi.dev/v1/video/generate',
headers=headers,
json={
'prompt': 'A cat wearing sunglasses walking on a beach',
'model': 'seedance-pro-5s',
},
timeout=60
)
gen_result = gen_res.json()
if gen_result.get('code') != 0:
raise Exception(gen_result.get('message'))
task_id = gen_result['data']['task_id']
print(f'Task submitted: {task_id}')
# Step 2: Poll for results
while True:
time.sleep(15) # Wait 15 seconds
query_res = requests.post(
'https://api.seedanceapi.dev/v1/video/query',
headers=headers,
json={'task_id': task_id},
timeout=60
)
query_result = query_res.json()
if query_result.get('code') != 0:
raise Exception(query_result.get('message'))
data = query_result['data']
status = data['status']
if status == 'success':
video_url = data['videos'][0]['url']
print(f'Video ready: {video_url}')
return video_url
if status == 'failed':
raise Exception(data.get('error') or 'Video generation failed')
print(f'Status: {status}')
if __name__ == '__main__':
generate_video()Error Responses
{
"code": 400,
"message": "Insufficient credits"
}Common error codes:
400: Invalid request parameters or insufficient credits401: Invalid API key403: No permission to access the task404: Task not found500: Server error