API de Seedance 2.0: Guia completa de integracion (2026)

feb. 11, 2026

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.

CapacidadEndpointMetodo
Texto a Video/v2/generate/textPOST
Imagen a Video/v2/generate/imagePOST
Consulta de estado/v2/tasks/{task_id}GET
Descarga de resultado/v2/tasks/{task_id}/resultGET
Config. de Webhook/v2/webhooksPOST
Info de cuenta/v2/accountGET

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/account

Mejores 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:

ParametroTipoRequeridoDefectoDescripcion
modelstringSi--Version del modelo (seedance-2.0)
promptstringSi--Descripcion del video (30-500 chars)
negative_promptstringNo--Elementos a excluir
aspect_ratiostringNo16:916:9, 9:16 o 1:1
durationintegerNo44 u 8 segundos
seedintegerNoaleatorioSemilla de reproducibilidad
webhook_urlstringNo--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_id

Para 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:

ParametroTipoRequeridoDescripcion
modelstringSiseedance-2.0
imagefile/URLSiImagen fuente (JPEG/PNG, max 10MB)
motion_promptstringSiDescripcion del movimiento deseado
durationintegerNo4 u 8 segundos
seedintegerNoSemilla de reproducibilidad
webhook_urlstringNoURL 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:

EstadoDescripcion
pendingSolicitud recibida, en cola para procesamiento
processingGeneracion en progreso
completedVideo listo para descarga
failedGeneracion 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 HTTPCodigo de errorDescripcionAccion
400INVALID_PARAMSParametros de solicitud invalidosCorregir cuerpo de solicitud
401UNAUTHORIZEDClave API invalida o expiradaVerificar/rotar clave
403FORBIDDENEl plan no permite esta accionActualizar plan
429RATE_LIMITEDDemasiadas solicitudes concurrentesEsperar y reintentar
500INTERNAL_ERRORFallo del lado del servidorReintentar con backoff
503SERVICE_UNAVAILABLEMantenimiento temporalReintentar 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.

PlanSolicitudes concurrentesSolicitudes/MinutoLimite diario
Gratis2105 generaciones
Pro1060100 generaciones
Business50+PersonalizadoIlimitado

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: 1707654321

Monitorea 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 / Polling

Servicios 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

AIVidPipeline

Equipo editorial

AIVidPipeline publica tutoriales, comparativas de modelos y guías de flujo de trabajo para creadores de video, imagen y música con IA. Nuestro proceso editorial sigue las actualizaciones de producto, verifica capacidades y precios, y convierte esa investigación en orientación práctica.

pages.blog.messages.cta_title

pages.blog.messages.cta_description