API de Seedance

Integra la generación de video en tu producto con Seedance 2.5 o Seedance 2.0, tareas asíncronas, webhooks y cobros basados en créditos.

URL base
https://api.seevio.ai
En esta página

Introducción

La API te permite enviar tareas de generación de video con Seedance 2.5 y Seedance 2.0 mediante código. Seedance 2.5 es el modelo recomendado y admite texto a video, imagen a video (con primer fotograma o con primer y último fotograma) y referencia multimodal a video. La generación es asíncrona: creas una tarea, recibes un ID de tarea al instante y luego obtienes el video finalizado consultando el endpoint de la tarea (polling) o mediante un webhook.

Tareas asíncronas

El sondeo (polling) es ideal para desarrollo e integraciones sencillas.

Listo para webhooks

Se recomiendan los webhooks para entornos de producción, ya que evitan consultas continuas y notifican a tu servicio cuando una tarea alcanza un estado final.

Control de créditos

Los créditos se reservan al enviar la tarea. Las tareas completadas con éxito se cobran de esa reserva; las tareas fallidas o que superen el tiempo de espera se reembolsan automáticamente.

Autenticación

Crea una clave de API en el panel de control y envíala como un token Bearer en cada solicitud. La clave completa se muestra solo una vez al momento de crearla.

Authorization: Bearer sk_live_xxxxxxxx
sk_live_

Usa claves sk_live_ para el tráfico de producción.

sk_test_

Usa claves sk_test_ para pruebas de integración en entornos de sandbox con el mismo contrato de API.

401

Si faltan claves, son inválidas o están revocadas, se devolverá invalid_api_key con un código HTTP 401.

Guía de inicio rápido

Primero, envía una tarea. Una vez aceptada, elige un método para recibir el resultado: consulta el endpoint de la tarea o recibe el resultado final a través de un webhook.

Enviar una tarea

Crea una tarea de video asíncrona y recibe un ID de tarea de inmediato.

curl https://api.seevio.ai/v1/videos/generations \
  -H "Authorization: Bearer sk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedance-2-5",
    "callback_url": "https://your-domain.com/api/seedance/webhook",
    "input": {
      "prompt": "a cat surfing on a neon wave, cinematic lighting",
      "generation_type": "text-to-video",
      "duration": 5,
      "aspect_ratio": "16:9",
      "resolution": "1080p",
      "generate_audio": true,
      "watermark": false,
      "web_search": false,
      "return_last_frame": false
    }
  }'
Opción de resultado: Sondeo (Polling)

Consulta el endpoint del estado de la tarea cuando tu integración prefiera realizar sondeos explícitos.

curl https://api.seevio.ai/v1/tasks/3f2aK9mR7xQp4TnZ8bLc6YwH \
  -H "Authorization: Bearer sk_live_xxx"
Opción de resultado: Webhook

Envía un callback_url al crear la tarea para recibir notificaciones cuando se complete o falle, y actualiza tus propios registros.

export async function POST(request: Request) {
  const callbackData = await request.json();

  if (callbackData.status === "completed") {
    const videoUrl = callbackData.data.results[0];
    // Save the video URL or update your own task record here.
  }

  if (callbackData.status === "failed") {
    const errorMessage = callbackData.data.failed_reason;
    // Mark your own task record as failed here.
  }

  return new Response(null, { status: 200 });
}

Crear una tarea de video

Crea una tarea de video mediante una solicitud POST a /v1/videos/generations. El cuerpo de la solicitud incluye el modelo en el nivel superior, un callback_url opcional y un objeto input con el prompt y la configuración de generación.

POST
/v1/videos/generations
curl https://api.seevio.ai/v1/videos/generations \
  -H "Authorization: Bearer sk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedance-2-5",
    "callback_url": "https://your-domain.com/api/seedance/webhook",
    "input": {
      "prompt": "a cat surfing on a neon wave, cinematic lighting",
      "generation_type": "text-to-video",
      "duration": 5,
      "aspect_ratio": "16:9",
      "resolution": "1080p",
      "generate_audio": true,
      "watermark": false,
      "web_search": false,
      "return_last_frame": false
    }
  }'

Modos de generación

generation_type define qué archivos multimedia se aceptan y cómo los interpreta el modelo.

Capacidades de Seedance 2.5
seedance-2-5

Define el modelo como seedance-2-5 para generar videos con resolución de 480p, 720p o 1080p y de 4 a 30 segundos de duración.

  • Texto a video con relación de aspecto adaptable, 16:9, 9:16, 1:1, 4:3, 3:4 o 21:9
  • Imagen a video a partir de una imagen de primer fotograma o dos imágenes de primer y último fotograma; la relación de aspecto debe ser adaptable
  • Referencia a video con hasta 30 imágenes, 10 videos y 10 archivos de audio (con un límite máximo de 50 recursos en total)
  • Cada referencia de video o audio debe durar entre 2 y 30 segundos; la duración total combinada de video y de audio no debe superar los 30 segundos por separado
  • Se admite la entrada de referencias solo de audio y return_last_frame; no se admite el parámetro seed
ModoMultimedia obligatorioMultimedia opcionalNotas
text-to-videopromptduration, aspect_ratio, resolution, seedSolo prompt de texto. No se necesitan image_urls, video_urls ni audio_urls.
image-to-videoprompt + matriz image_urls (1-2 URLs de imagen)duration, aspect_ratio, resolution, seedimage_urls debe ser una matriz. Proporciona 1 URL de imagen para el primer fotograma o 2 URLs para el primer y último fotograma. Se ignoran los videos y audios.
reference-to-videoprompt + al menos una referencia de imagen, video o audioimágenes, videos y audios dentro de los límites de recursosSeedance 2.5 admite referencias solo de audio. Para Seedance 2.0, añade al menos una imagen o video cuando proporciones audio.
text-to-video

Usa texto a video cuando el prompt sea la única entrada creativa.

curl https://api.seevio.ai/v1/videos/generations \
  -H "Authorization: Bearer sk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedance-2-5",
    "callback_url": "https://your-domain.com/api/seedance/webhook",
    "input": {
      "prompt": "a cinematic drone shot over a futuristic coastal city at sunrise",
      "generation_type": "text-to-video",
      "duration": 5,
      "aspect_ratio": "16:9",
      "resolution": "1080p",
      "generate_audio": true,
      "watermark": false,
      "web_search": false,
      "return_last_frame": false
    }
  }'
image-to-video

Usa imagen a video cuando input.image_urls sea una matriz de 1 o 2 URLs de imagen: una URL define el primer fotograma y dos definen el primer y el último fotograma. Las referencias de video y audio se ignoran en este modo.

curl https://api.seevio.ai/v1/videos/generations \
  -H "Authorization: Bearer sk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedance-2-5",
    "input": {
      "prompt": "the subject turns toward camera, soft studio motion",
      "generation_type": "image-to-video",
      "image_urls": ["https://your.cdn.com/first-frame.jpg"],
      "duration": 5,
      "resolution": "720p"
    }
  }'
reference-to-video

Usa referencia a video para un control más preciso mediante imágenes, videos y audios de referencia. Seedance 2.5 admite audio como único tipo de referencia; Seedance 2.0 requiere al menos una imagen o video cuando se proporciona audio.

Límites de recursos

  • Seedance 2.5: hasta 30 imágenes de referencia
  • Seedance 2.5: hasta 10 videos de referencia, cada uno de 2 a 30 segundos y con una duración total <= 30 segundos
  • Seedance 2.5: hasta 10 audios de referencia, cada uno de 2 a 30 segundos y con una duración total <= 30 segundos
  • Seedance 2.5: un máximo de 50 recursos en total entre todos los tipos
  • Las variantes de Seedance 2.0 mantienen sus límites actuales: 9 imágenes, 3 videos, 3 audios y 15 segundos por grupo de video/audio

Combinaciones de entrada admitidas

Texto + Imagen
Texto + Video
Texto + Audio (Seedance 2.5)
Texto + Imagen + Video
Texto + Imagen + Audio
Texto + Video + Audio
Texto + Imagen + Video + Audio
curl https://api.seevio.ai/v1/videos/generations \
  -H "Authorization: Bearer sk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedance-2-5",
    "input": {
      "prompt": "use the product from image 1 and the camera motion from the reference video",
      "generation_type": "reference-to-video",
      "image_urls": ["https://your.cdn.com/product.jpg"],
      "video_urls": ["https://your.cdn.com/camera-motion.mp4"],
      "audio_urls": [],
      "duration": 8,
      "resolution": "720p"
    }
  }'

Parámetros de la solicitud

Los nombres de parámetros, valores de enum, rutas de endpoints y ejemplos forman parte del contrato de la API. Las siguientes descripciones detallan el comportamiento de cada campo.

Cabeceras

CabeceraObligatorioDescripciónEjemplo
AuthorizationClave de API Bearer utilizada para autenticar la solicitud.Bearer sk_live_xxx
Content-TypeTodas las solicitudes de escritura utilizan JSON.application/json

Campos de nivel superior

CampoTipoObligatorioPor defectoRango / EnumModosEjemplo
model

Variante del modelo utilizada para la generación. Usa seedance-2-5 para Seedance 2.5, seedance-2-0 para Seedance 2.0, seedance-2-0-fast para Seedance 2.0 Fast o seedance-2-0-mini para Seedance 2.0 Mini.

string-seedance-2-5 | seedance-2-0 | seedance-2-0-fast | seedance-2-0-minitodosseedance-2-5
callback_url

Endpoint HTTPS que recibe las notificaciones de finalización o fallo de la tarea.

stringNo-URL HTTPS, no se permiten redes privadastodoshttps://your-domain.com/hook
input

Configuración de generación y recursos multimedia de referencia.

object--todos-

input.* campos

CampoTipoObligatorioPor defectoRango / EnumModosEjemplo
input.prompt

Prompt de texto que describe el video que se quiere generar.

string-texto no vacíotodosa cat surfing
input.generation_type

Modo de generación. Por defecto es text-to-video.

stringNotext-to-videotext-to-video | image-to-video | reference-to-video-image-to-video
input.image_urls

URLs de imágenes de acceso público. Para imagen a video, envía 1 imagen para el primer fotograma o 2 imágenes para el primer y último fotograma. Para referencia a video, Seedance 2.5 admite hasta 30 imágenes y Seedance 2.0 admite hasta 9.

string[]Condicional[]Imagen a video: 1 o 2 imágenes. Referencia a video: hasta 30 para Seedance 2.5; hasta 9 para Seedance 2.0.image-to-video / reference-to-video["https://.../a.jpg"]
input.video_urls

Videos de referencia de acceso público solo para el modo de referencia a video. Seedance 2.5 admite hasta 10 videos, cada uno de 2 a 30 segundos y con una duración total <= 30 segundos. Seedance 2.0 admite hasta 3 con una duración total <= 15 segundos.

string[]No[]Seedance 2.5: hasta 10 videos, cada uno de 2 a 30 segundos, duración combinada <= 30 segundos. Seedance 2.0: hasta 3, duración combinada <= 15 segundos.reference-to-video[]
input.audio_urls

Archivos de audio de referencia de acceso público solo para el modo de referencia a video. Seedance 2.5 admite hasta 10 archivos de audio, cada uno de 2 a 30 segundos, con una duración total <= 30 segundos y permite referencias únicamente de audio. Seedance 2.0 admite hasta 3 con una duración total <= 15 segundos.

string[]No[]Seedance 2.5: hasta 10 archivos de audio, cada uno de 2 a 30 segundos, duración combinada <= 30 segundos. Seedance 2.0: hasta 3, duración combinada <= 15 segundos.reference-to-video[]
input.duration

Duración del video generado en segundos.

intNo5Seedance 2.5: 4-30 segundos. Seedance 2.0: 4-15 segundos.todos5
input.aspect_ratio

Relación de aspecto del video generado. El valor adaptive permite al servicio definir la mejor proporción. El modo imagen a video de Seedance 2.5 solo admite adaptive.

stringNoadaptive16:9 | 4:3 | 1:1 | 3:4 | 9:16 | 21:9 | adaptivetodos16:9
input.resolution

Resolución del video generado.

stringNo720pSeedance 2.5: 480p | 720p | 1080p. Seedance 2.0: 480p | 720p | 1080p | 4k (según la variante).todos720p
input.generate_audio

Indica si el modelo debe generar audio si es compatible.

booleanNotruetrue | falsetodostrue
input.watermark

Indica si se debe añadir una marca de agua.

booleanNofalsetrue | falsetodosfalse
input.web_search

Indica si se permite la búsqueda web para optimizar la generación si es compatible.

booleanNofalsetrue | falsetodosfalse
input.return_last_frame

Indica si se debe devolver la URL del último fotograma cuando esté disponible.

booleanNofalsetrue | falsetodosfalse
input.seed

Semilla determinista para las variantes de Seedance 2.0. Seedance 2.5 no admite este campo; omítelo.

intNo-1-1 o de 0 a 4294967295todos-1

El consumo de créditos varía según la resolución, duración, modelo y si la referencia a video incluye videos de referencia. El valor de créditos devuelto en la respuesta de creación corresponde a la cantidad exacta reservada para esa tarea.

Ver tarifas de créditos

Respuesta

Esta es la respuesta correcta de una solicitud POST a /v1/videos/generations. Significa que la tarea se ha aceptado y que se han reservado los créditos correspondientes. Utiliza el taskId devuelto para consultar el estado mediante GET /v1/tasks/:id o para identificar la tarea en un webhook de finalización o fallo.

Respuesta correcta de POST /v1/videos/generations

{
  "taskId": "3f2aK9mR...",
  "credits": 100
}

Consultar estado de la tarea

Usa GET /v1/tasks/:id para consultar el estado actual de una tarea. No realices consultas con una frecuencia menor a 10 segundos. Para sistemas en producción, se recomienda el uso de webhooks.

curl https://api.seevio.ai/v1/tasks/3f2aK9mR7xQp4TnZ8bLc6YwH \
  -H "Authorization: Bearer sk_live_xxx"

Respuesta de tarea completada

{
  "id": "3f2aK9mR...",
  "status": "completed",
  "created_at": 1781234567,
  "model": "seedance-2-5",
  "billing_status": "charged",
  "credits": 100,
  "failed_reason": null,
  "data": {
    "results": ["https://cdn.seevio.ai/.../x.mp4"],
    "video_expires_at": "2026-06-13T10:00:00Z",
    "last_frame_url": null,
    "processing_time": 48
  }
}

Respuesta de tarea fallida

{
  "id": "3f2aK9mR...",
  "status": "failed",
  "created_at": 1781234567,
  "model": "seedance-2-5",
  "billing_status": "refunded",
  "credits": 100,
  "failed_reason": "provider_failed"
}
ValorSignificado
status=queuedAceptada y en espera de ser enviada o procesada.
status=generatingEl proveedor está procesando la generación.
status=completedVideo completado con éxito; data.results contiene la URL del resultado.
status=failedLa generación falló o superó el tiempo de espera.
billing_status=reservedLos créditos permanecen reservados mientras la tarea está en curso.
billing_status=chargedLa tarea finalizó correctamente y se confirma el cobro de la reserva.
billing_status=refundedLa tarea falló o superó el tiempo de espera y se devolvieron los créditos.
billing_status=refund_failedLa devolución falló y requiere intervención manual.

Después de la fecha indicada en video_expires_at, el objeto data.results estará vacío. Descarga y almacena el archivo antes de que expire este plazo.

Webhooks

Si incluyes callback_url, Seedance llamará a tu endpoint cuando la tarea se complete o falle, enviando la información del resultado en formato JSON. Si tu endpoint devuelve un código de estado que no sea 2xx o no responde en 15 segundos, se reintentará el envío hasta 5 veces. Los reintentos mantienen el mismo ID de tarea, por lo que se recomienda eliminar duplicados usando este ID. Devuelve una respuesta 200 en cuanto hayas registrado correctamente los datos del callback.

Callback de tarea completada

{
  "id": "3f2aK9mR...",
  "status": "completed",
  "created_at": 1781234567,
  "model": "seedance-2-5",
  "data": {
    "results": ["https://cdn.seevio.ai/.../x.mp4"],
    "video_expires_at": "2026-06-13T10:00:00Z",
    "last_frame_url": null,
    "processing_time": 48
  }
}

Callback de tarea fallida

{
  "id": "3f2aK9mR...",
  "status": "failed",
  "created_at": 1781234567,
  "model": "seedance-2-5",
  "data": {
    "failed_reason": "provider_failed",
    "credits_refunded": 100
  }
}
export async function POST(request: Request) {
  const callbackData = await request.json();

  if (callbackData.status === "completed") {
    const videoUrl = callbackData.data.results[0];
    // Save the video URL or update your own task record here.
  }

  if (callbackData.status === "failed") {
    const errorMessage = callbackData.data.failed_reason;
    // Mark your own task record as failed here.
  }

  return new Response(null, { status: 200 });
}

Valida la estructura de los datos del callback, elimina duplicados usando el ID, actualiza tus registros y responde rápidamente.

La URL callback_url debe ser HTTPS y no debe apuntar a rangos de red privados, de bucle local (loopback) o de enlace local (link-local).

Errores

POST /v1/videos/generations y GET /v1/tasks/:id devuelven este formato de error cuando falla la solicitud de API, como en el caso de parámetros inválidos, clave de API incorrecta, créditos insuficientes, límite de frecuencia superado o tarea no encontrada. Algunos errores incluyen campos adicionales como required, available o retry_after según el caso.

{
  "error": {
    "code": "insufficient_credits",
    "message": "Not enough credits for this task.",
    "required": 100,
    "available": 12
  }
}
CódigoHTTPSignificado¿Reintentar?
invalid_request400Parámetros faltantes o inválidos.No, corrige la solicitud.
invalid_api_key401La clave de API falta, es inválida o ha sido revocada.No, utiliza una clave válida.
insufficient_credits402Créditos insuficientes. La tarea no se acepta ni se cobra.Tras realizar una recarga.
forbidden403La clave de API no tiene los permisos necesarios.No.
not_found404La tarea no existe o no pertenece al propietario de la clave.No.
rate_limited429Se ha superado el límite de solicitudes.Sí, respetando la cabecera Retry-After.
internal_error500Error interno del servidor.Sí, inténtalo más tarde.

Límites de frecuencia

Los límites de frecuencia se aplican por clave de API mediante una ventana deslizante. Por defecto, el límite para generación es de 100 solicitudes por minuto; las consultas de estado son más flexibles. Las respuestas HTTP 429 incluyen la cabecera Retry-After.

Generación

100/min

Consultas de estado

Más flexible

Cabecera 429

Retry-After

Facturación y créditos

La API funciona mediante reserva al enviar, cobro al completarse con éxito y reembolso en caso de fallo. Las páginas de consumo del panel muestran el historial de créditos de la API, los registros de tareas y estadísticas de uso por periodo.

Reservado

Se verifica y se reserva el saldo de créditos al aceptar la tarea.

Cobrado

Las tareas completadas con éxito confirman el cobro de la reserva existente.

Reembolsado

Las tareas fallidas o que superen el tiempo de espera devuelven automáticamente los créditos reservados.

Consulta tu consumo en el panel

Revisa los registros de la API, el historial de créditos, el estado de las tareas y métricas de uso detalladas.

Registros de la API