La API de Seedance 2.0 proporciona acceso programatico al modelo de generacion de video con IA de ByteDance. Esta guia cubre todo lo que los desarrolladores necesitan para integrar Seedance en aplicaciones y flujos de trabajo de produccion, desde la autenticacion hasta el polling asincrono y las arquitecturas basadas en webhooks.
Descripcion general de la API
La API REST de Seedance 2.0 expone endpoints para generacion de texto a video, generacion de imagen a video, consulta de estado y recuperacion de resultados. Toda la generacion es asincrona: envias una solicitud, recibes un ID de tarea y consultas o esperas un webhook para obtener el resultado.
| Capacidad | Endpoint | Metodo |
|---|---|---|
| Texto a Video | /v2/generate/text | POST |
| Imagen a Video | /v2/generate/image | POST |
| Consulta de estado | /v2/tasks/{task_id} | GET |
| Descarga de resultado | /v2/tasks/{task_id}/result | GET |
| Config. de Webhook | /v2/webhooks | POST |
| Info de cuenta | /v2/account | GET |
URL base: https://api.seedance.ai
Formato de respuesta: Todos los endpoints devuelven JSON con una estructura consistente que incluye campos status, data y error.
Inicio rapido (5 minutos)
Pasa de cero a tu primer video generado en tres pasos.
Paso 1: Obtiene tu clave API. Crea una cuenta en el portal de desarrolladores de Dreamina y navega a Configuracion > Claves API para generar una clave.
Paso 2: Envia una solicitud de generacion.
curl -X POST https://api.seedance.ai/v2/generate/text \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2.0",
"prompt": "A golden retriever running through a field of sunflowers at sunset, slow motion, cinematic lighting",
"aspect_ratio": "16:9",
"duration": 4
}'Paso 3: Consulta el resultado.
curl https://api.seedance.ai/v2/tasks/TASK_ID \
-H "Authorization: Bearer YOUR_API_KEY"Cuando status devuelve "completed", la respuesta incluye un campo video_url con un enlace de descarga firmado valido por 24 horas.
Autenticacion
Todas las solicitudes de API requieren un token Bearer en el encabezado Authorization. Tu clave API esta vinculada a tu cuenta y plan de facturacion.
JavaScript
const SEEDANCE_API_KEY = process.env.SEEDANCE_API_KEY
const headers = {
'Authorization': `Bearer ${SEEDANCE_API_KEY}`,
'Content-Type': 'application/json',
}Python
import os
import requests
SEEDANCE_API_KEY = os.environ["SEEDANCE_API_KEY"]
headers = {
"Authorization": f"Bearer {SEEDANCE_API_KEY}",
"Content-Type": "application/json",
}cURL
curl -H "Authorization: Bearer $SEEDANCE_API_KEY" \
-H "Content-Type: application/json" \
https://api.seedance.ai/v2/accountMejores practicas de seguridad:
- Almacena claves API en variables de entorno, nunca en el codigo fuente
- Rota las claves regularmente a traves del panel de desarrollador
- Usa claves separadas para entornos de desarrollo y produccion
- Monitorea el uso a traves del panel de cuenta para detectar uso no autorizado
Endpoint de Texto a Video
Genera videos a partir de descripciones de texto. Este es el endpoint principal para la mayoria de los casos de uso.
Parametros de solicitud:
| Parametro | Tipo | Requerido | Defecto | Descripcion |
|---|---|---|---|---|
model | string | Si | -- | Version del modelo (seedance-2.0) |
prompt | string | Si | -- | Descripcion del video (30-500 chars) |
negative_prompt | string | No | -- | Elementos a excluir |
aspect_ratio | string | No | 16:9 | 16:9, 9:16 o 1:1 |
duration | integer | No | 4 | 4 u 8 segundos |
seed | integer | No | aleatorio | Semilla de reproducibilidad |
webhook_url | string | No | -- | URL para notificacion de finalizacion |
Ejemplo en JavaScript
async function generateTextToVideo(prompt) {
const response = await fetch('https://api.seedance.ai/v2/generate/text', {
method: 'POST',
headers,
body: JSON.stringify({
model: 'seedance-2.0',
prompt,
aspect_ratio: '16:9',
duration: 4,
}),
})
const data = await response.json()
if (!data.data?.task_id) {
throw new Error(`Generation failed: ${data.error?.message ?? 'Unknown error'}`)
}
return data.data.task_id
}Ejemplo en Python
def generate_text_to_video(prompt: str) -> str:
response = requests.post(
"https://api.seedance.ai/v2/generate/text",
headers=headers,
json={
"model": "seedance-2.0",
"prompt": prompt,
"aspect_ratio": "16:9",
"duration": 4,
},
)
response.raise_for_status()
data = response.json()
task_id = data.get("data", {}).get("task_id")
if not task_id:
raise ValueError(f"Generation failed: {data.get('error', {}).get('message', 'Unknown')}")
return task_idPara escribir prompts efectivos, consulta nuestra guia de prompts de Seedance con mas de 50 plantillas listas para usar.
Endpoint de Imagen a Video
Anima imagenes estaticas con prompts de movimiento. La imagen proporciona el punto de partida visual, y el prompt de movimiento describe como la escena debe moverse.
Parametros de solicitud:
| Parametro | Tipo | Requerido | Descripcion |
|---|---|---|---|
model | string | Si | seedance-2.0 |
image | file/URL | Si | Imagen fuente (JPEG/PNG, max 10MB) |
motion_prompt | string | Si | Descripcion del movimiento deseado |
duration | integer | No | 4 u 8 segundos |
seed | integer | No | Semilla de reproducibilidad |
webhook_url | string | No | URL de notificacion de finalizacion |
Ejemplo en JavaScript (carga de archivo)
async function generateImageToVideo(imagePath, motionPrompt) {
const imageBuffer = await fs.promises.readFile(imagePath)
const blob = new Blob([imageBuffer], { type: 'image/png' })
const formData = new FormData()
formData.append('model', 'seedance-2.0')
formData.append('image', blob, 'input.png')
formData.append('motion_prompt', motionPrompt)
formData.append('duration', '4')
const response = await fetch('https://api.seedance.ai/v2/generate/image', {
method: 'POST',
headers: { 'Authorization': `Bearer ${SEEDANCE_API_KEY}` },
body: formData,
})
const data = await response.json()
return data.data.task_id
}Ejemplo en JavaScript (referencia por URL)
async function generateImageToVideoFromUrl(imageUrl, motionPrompt) {
const response = await fetch('https://api.seedance.ai/v2/generate/image', {
method: 'POST',
headers,
body: JSON.stringify({
model: 'seedance-2.0',
image_url: imageUrl,
motion_prompt: motionPrompt,
duration: 4,
}),
})
const data = await response.json()
return data.data.task_id
}Ejemplo en Python
def generate_image_to_video(image_path: str, motion_prompt: str) -> str:
with open(image_path, "rb") as f:
files = {"image": ("input.png", f, "image/png")}
data = {
"model": "seedance-2.0",
"motion_prompt": motion_prompt,
"duration": "4",
}
response = requests.post(
"https://api.seedance.ai/v2/generate/image",
headers={"Authorization": f"Bearer {SEEDANCE_API_KEY}"},
files=files,
data=data,
)
response.raise_for_status()
return response.json()["data"]["task_id"]Generacion asincrona y polling de estado
Toda la generacion de la API de Seedance es asincrona. Despues de enviar una solicitud, recibes un task_id y debes consultar el estado hasta que se complete. El tiempo tipico de generacion es de 30-120 segundos dependiendo de la duracion y la carga del servidor.
Valores de estado de tarea:
| Estado | Descripcion |
|---|---|
pending | Solicitud recibida, en cola para procesamiento |
processing | Generacion en progreso |
completed | Video listo para descarga |
failed | Generacion fallida (ver campo de error) |
Implementacion de polling en JavaScript
async function pollForResult(taskId, maxAttempts = 60, intervalMs = 3000) {
for (let attempt = 0; attempt < maxAttempts; attempt++) {
const response = await fetch(
`https://api.seedance.ai/v2/tasks/${taskId}`,
{ headers }
)
const data = await response.json()
const status = data.data?.status
if (status === 'completed') {
return data.data.video_url
}
if (status === 'failed') {
throw new Error(`Generation failed: ${data.data?.error ?? 'Unknown error'}`)
}
await new Promise((resolve) => setTimeout(resolve, intervalMs))
}
throw new Error('Generation timed out after maximum polling attempts')
}Implementacion de polling en Python
import time
def poll_for_result(task_id: str, max_attempts: int = 60, interval: float = 3.0) -> str:
for _ in range(max_attempts):
response = requests.get(
f"https://api.seedance.ai/v2/tasks/{task_id}",
headers=headers,
)
response.raise_for_status()
data = response.json()["data"]
if data["status"] == "completed":
return data["video_url"]
if data["status"] == "failed":
raise RuntimeError(f"Generation failed: {data.get('error', 'Unknown')}")
time.sleep(interval)
raise TimeoutError("Generation timed out")Mejores practicas de polling:
- Comienza con intervalos de 3 segundos para los primeros 30 segundos
- Aumenta a intervalos de 5 segundos despues de 30 segundos
- Establece un timeout maximo de 3-5 minutos
- Implementa backoff exponencial para respuestas con limite de velocidad
Integracion de Webhooks
Los webhooks eliminan la necesidad de polling al enviar una notificacion a tu servidor cuando la generacion se completa. Este es el enfoque recomendado para sistemas en produccion.
Configuracion de Webhook
// Registrar un endpoint de webhook
async function registerWebhook(url) {
const response = await fetch('https://api.seedance.ai/v2/webhooks', {
method: 'POST',
headers,
body: JSON.stringify({
url,
events: ['generation.completed', 'generation.failed'],
}),
})
return response.json()
}Payload del Webhook
Cuando la generacion se completa, Seedance envia una solicitud POST a tu URL de webhook:
{
"event": "generation.completed",
"task_id": "task_abc123",
"status": "completed",
"video_url": "https://cdn.seedance.ai/results/...",
"duration": 4,
"created_at": "2026-02-11T10:30:00Z",
"completed_at": "2026-02-11T10:31:15Z"
}Manejador de Webhook con Express.js
app.post('/webhooks/seedance', express.json(), (req, res) => {
const { event, task_id, video_url, status } = req.body
if (event === 'generation.completed') {
// Procesar el video completado
processCompletedVideo(task_id, video_url)
}
if (event === 'generation.failed') {
// Manejar fallo
handleGenerationFailure(task_id)
}
res.status(200).json({ received: true })
})Seguridad de webhooks:
- Verifica el encabezado de firma del webhook para confirmar que las solicitudes provienen de Seedance
- Usa solo endpoints HTTPS
- Responde con estado 200 dentro de 5 segundos para evitar reintentos
- Implementa procesamiento idempotente para manejar entregas duplicadas
Manejo de errores
La API de Seedance usa codigos de estado HTTP estandar con respuestas de error estructuradas. El manejo adecuado de errores es critico para la fiabilidad en produccion.
Formato de respuesta de error:
{
"status": "error",
"error": {
"code": "RATE_LIMITED",
"message": "Rate limit exceeded. Retry after 30 seconds.",
"retry_after": 30
}
}Codigos de error comunes:
| Estado HTTP | Codigo de error | Descripcion | Accion |
|---|---|---|---|
| 400 | INVALID_PARAMS | Parametros de solicitud invalidos | Corregir cuerpo de solicitud |
| 401 | UNAUTHORIZED | Clave API invalida o expirada | Verificar/rotar clave |
| 403 | FORBIDDEN | El plan no permite esta accion | Actualizar plan |
| 429 | RATE_LIMITED | Demasiadas solicitudes concurrentes | Esperar y reintentar |
| 500 | INTERNAL_ERROR | Fallo del lado del servidor | Reintentar con backoff |
| 503 | SERVICE_UNAVAILABLE | Mantenimiento temporal | Reintentar despues de espera |
Manejo de errores con reintento en JavaScript
async function apiRequestWithRetry(url, options, maxRetries = 3) {
for (let attempt = 0; attempt < maxRetries; attempt++) {
const response = await fetch(url, options)
if (response.ok) {
return response.json()
}
if (response.status === 429) {
const data = await response.json()
const retryAfter = data.error?.retry_after ?? 30
await new Promise((resolve) => setTimeout(resolve, retryAfter * 1000))
continue
}
if (response.status >= 500) {
const backoffMs = Math.pow(2, attempt) * 1000
await new Promise((resolve) => setTimeout(resolve, backoffMs))
continue
}
const errorData = await response.json()
throw new Error(`API error ${response.status}: ${errorData.error?.message ?? 'Unknown'}`)
}
throw new Error('Maximum retries exceeded')
}Manejo de errores con reintento en Python
def api_request_with_retry(method: str, url: str, max_retries: int = 3, **kwargs) -> dict:
for attempt in range(max_retries):
response = requests.request(method, url, headers=headers, **kwargs)
if response.ok:
return response.json()
if response.status_code == 429:
retry_after = response.json().get("error", {}).get("retry_after", 30)
time.sleep(retry_after)
continue
if response.status_code >= 500:
time.sleep(2 ** attempt)
continue
response.raise_for_status()
raise RuntimeError("Maximum retries exceeded")Limites de velocidad y cuotas
Los limites de velocidad varian por plan y se aplican a solicitudes concurrentes, no al volumen total diario.
| Plan | Solicitudes concurrentes | Solicitudes/Minuto | Limite diario |
|---|---|---|---|
| Gratis | 2 | 10 | 5 generaciones |
| Pro | 10 | 60 | 100 generaciones |
| Business | 50+ | Personalizado | Ilimitado |
Encabezados de limite de velocidad: Cada respuesta de la API incluye informacion de limites de velocidad:
X-RateLimit-Limit: 10
X-RateLimit-Remaining: 7
X-RateLimit-Reset: 1707654321Monitorea estos encabezados para gestionar proactivamente tu tasa de solicitudes y evitar alcanzar los limites durante el uso pico.
Construccion de flujos de trabajo en produccion
Para sistemas de produccion que generan video a escala, implementa procesamiento basado en colas para gestionar la concurrencia, manejar fallos de manera elegante y optimizar el rendimiento.
Patron de procesamiento por lotes
async function processBatch(prompts) {
const concurrencyLimit = 5
const results = []
for (let i = 0; i < prompts.length; i += concurrencyLimit) {
const batch = prompts.slice(i, i + concurrencyLimit)
const batchResults = await Promise.allSettled(
batch.map(async (prompt) => {
const taskId = await generateTextToVideo(prompt)
const videoUrl = await pollForResult(taskId)
return { prompt, videoUrl }
})
)
const settled = batchResults.map((result) =>
result.status === 'fulfilled'
? result.value
: { error: result.reason.message }
)
results.push(...settled)
}
return results
}Arquitectura basada en colas
Para aplicaciones de alto volumen, usa una cola de mensajes para desacoplar el envio del procesamiento:
Cliente -> API Gateway -> Cola de mensajes -> Pool de workers -> API de Seedance
|
Almacen de estado -> Webhook / PollingServicios de cola recomendados: Bull (Redis), AWS SQS, Google Cloud Tasks o RabbitMQ.
Monitoreo de costos
Rastrea el gasto de API programaticamente monitoreando el endpoint de cuenta:
async function checkUsage() {
const response = await fetch('https://api.seedance.ai/v2/account', {
headers,
})
const data = await response.json()
return {
plan: data.data.plan,
usedToday: data.data.generations_today,
limitToday: data.data.generations_limit,
billingCycleSpend: data.data.current_spend,
}
}Para informacion detallada de precios incluyendo descuentos por volumen, consulta nuestra guia de precios de Seedance.
Preguntas frecuentes
Como obtengo una clave API de Seedance?
Crea una cuenta en el portal de desarrolladores de Seedance (plataforma Dreamina), navega a tu panel y genera una clave API. El acceso API del plan gratuito esta disponible.
Que lenguajes de programacion soporta la API de Seedance?
La API de Seedance es una API REST que funciona con cualquier lenguaje que pueda hacer solicitudes HTTP. Se proporcionan ejemplos oficiales en JavaScript, Python y cURL.
Cuanto tarda la generacion de la API de Seedance?
La generacion tipicamente toma 30-120 segundos dependiendo de la resolucion y la configuracion de duracion. La API usa polling asincrono para verificar el estado de la generacion.
Cual es el limite de velocidad de la API de Seedance?
Los limites de velocidad dependen de tu plan. El plan gratuito permite aproximadamente 2 solicitudes concurrentes, Pro permite hasta 10 y los planes Business tienen limites personalizados.
La API de Seedance soporta webhooks?
Si. Puedes configurar una URL de webhook para recibir notificaciones cuando la generacion de video se complete, evitando la necesidad de polling de estado.
Puedo usar la API de Seedance para proyectos comerciales?
Si. El uso de API de los planes Pro y Business incluye licencia comercial. Consulta los terminos de servicio para derechos de uso especificos.
Articulos relacionados
- Tutorial de Seedance 2.0 -- Guia completa para principiantes de Seedance
- Guia de prompts de Seedance -- Mas de 50 plantillas de prompts para mejores resultados con la API
- Precios de Seedance -- Niveles de precios de API y descuentos por volumen
- Seedance vs Sora 2026 -- Comparacion de API con OpenAI Sora

