API de Seedance 2.0

Integre la generación de video en su producto con la creación asincrónica de tareas, sondeo de estado, webhooks y facturación basada en créditos.

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

Introducción

La API le permite enviar tareas de generación de video de Seedance 2.0 de forma programática. La generación es asincrónica: cree una tarea, reciba un ID de tarea inmediatamente y luego obtenga el video terminado sondeando el endpoint de la tarea o recibiendo un webhook.

Tareas asincrónicas

El sondeo funciona bien para el desarrollo y las integraciones simples.

Listo para webhook

Se recomienda el uso de webhooks para la producción porque evitan el sondeo agresivo y notifican a su servicio cuando una tarea alcanza un estado terminal.

Consciente de créditos

Los créditos se reservan al enviar la tarea. Las tareas exitosas se cargan de esa reserva; las tareas fallidas o con tiempo de espera agotado se reembolsan automáticamente.

Autenticación

Cree una clave de API en el panel de control y envíela como un token de portador en cada solicitud. La clave completa se muestra solo una vez en el momento de la creación.

Authorization: Bearer sk_live_xxxxxxxx
sk_live_

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

sk_test_

Utilice las claves sk_test_ para pruebas de integración de sandbox con el mismo contrato de API.

401

Las claves perdidas, inválidas o revocadas devuelven invalid_api_key con HTTP 401.

Guía de inicio rápido

Primero, envíe una tarea. Una vez que la tarea sea aceptada, elija un método de entrega de resultados: sondeando el endpoint de la tarea o recibiendo el resultado terminal a través de un webhook.

Enviar una tarea

Cree una tarea de video asincrónica y reciba un ID de tarea inmediatamente.

curl https://api.seedance2.ai/v1/videos/generations \
  -H "Authorization: Bearer sk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedance-2-0",
    "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": "720p",
      "generate_audio": true,
      "watermark": false,
      "web_search": false,
      "return_last_frame": false,
      "seed": -1
    }
  }'
Opción de resultado: Sondeo

Obtenga el endpoint de estado de la tarea cuando su integración prefiera un sondeo explícito.

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

Pase callback_url al enviar la tarea, luego reciba las devoluciones de llamada de finalización o fallo y actualice su propio registro de tareas.

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

Cree una tarea de video con POST /v1/videos/generations. El cuerpo de la solicitud tiene un modelo de nivel superior, un callback_url opcional y un objeto de entrada que contiene la solicitud y la configuración de generación.

POST
/v1/videos/generations
curl https://api.seedance2.ai/v1/videos/generations \
  -H "Authorization: Bearer sk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedance-2-0",
    "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": "720p",
      "generate_audio": true,
      "watermark": false,
      "web_search": false,
      "return_last_frame": false,
      "seed": -1
    }
  }'

Modos de generación

generation_type controla qué entradas de medios se aceptan y cómo las interpreta el modelo.

ModoMedios requeridosMedios opcionalesNotas
text-to-videopromptduración, relación_aspecto, resolución, seedSolo texto. image_urls, video_urls y audio_urls no son necesarios.
image-to-videoprompt + array de image_urls (1-2 URLs de imagen)duración, relación_aspecto, resolución, seedimage_urls debe ser un array. Proporcione 1 URL de imagen para el primer fotograma, o 2 URLs de imagen para el primer y último fotograma. El video y el audio se ignoran.
reference-to-videoprompt + al menos una imagen o videoimágenes, videos y audio dentro de los límites de materialEl audio no se puede usar solo con texto. Agregue al menos una imagen o video cuando se proporcione audio.
text-to-video

Utilice texto a video cuando la solicitud sea la única entrada creativa. (text-to-video)

curl https://api.seedance2.ai/v1/videos/generations \
  -H "Authorization: Bearer sk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedance-2-0",
    "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": "720p",
      "generate_audio": true,
      "watermark": false,
      "web_search": false,
      "return_last_frame": false,
      "seed": -1
    }
  }'
image-to-video

Utilice imagen a video cuando input.image_urls sea una matriz con 1-2 URLs de imagen: una URL establece el primer fotograma y dos URLs establecen el primer y último fotograma. Las referencias de video y audio se ignoran en este modo. (image-to-video)

curl https://api.seedance2.ai/v1/videos/generations \
  -H "Authorization: Bearer sk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedance-2-0",
    "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

Utilice referencia a video para una dirección más rica con imágenes, videos y audio de referencia. El audio no se puede usar solo con texto; incluya al menos una imagen o video cuando se proporcione audio. (reference-to-video)

Límites de material

  • Hasta 9 imágenes de referencia
  • Hasta 3 videos de referencia, duración total <= 15 segundos
  • Hasta 3 audios de referencia, duración total <= 15 segundos
  • Máximo 12 materiales en total en todos los tipos

Combinaciones de entrada compatibles

Texto + Imagen
Texto + Video
Texto + Imagen + Video
Texto + Imagen + Audio
Texto + Video + Audio
Texto + Imagen + Video + Audio
curl https://api.seedance2.ai/v1/videos/generations \
  -H "Authorization: Bearer sk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedance-2-0",
    "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": "1080p"
    }
  }'

Parámetros de solicitud

Los nombres de los parámetros, los valores de enumeración, las rutas de los endpoints y los ejemplos forman parte del contrato de la API. Las descripciones a continuación explican cómo se comporta cada campo.

Encabezados

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

Campos de nivel superior

CampoTipoRequeridoPredeterminadoRango / EnumeraciónModosEjemplo
model

Variante de modelo utilizada para la generación.

string-seedance-2-0 | seedance-2-0-fasttodosseedance-2-0
callback_url

Endpoint HTTPS que recibe las devoluciones de llamada de finalización y fallo de la tarea.

stringNo-URL HTTPS, sin redes privadastodoshttps://your-domain.com/hook
input

Configuración de generación y referencias multimedia.

object--todos-

input.* campos

CampoTipoRequeridoPredeterminadoRango / EnumeraciónModosEjemplo
input.prompt

Texto que describe el video a crear.

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

Modo de generación. Por defecto es texto a video. (text-to-video)

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

URLs de imágenes accesibles públicamente. Para imagen a video, envíe 1 imagen para el primer fotograma o 2 imágenes para el primer y último fotograma. Para referencia a video, envíe hasta 9 imágenes como referencias visuales. (image-to-video) (reference-to-video)

string[]Condicional[]Imagen a video: 1 o 2 imágenes. Referencia a video: hasta 9 imágenes. (image-to-video) (reference-to-video)image-to-video / reference-to-video["https://.../a.jpg"]
input.video_urls

Videos de referencia accesibles públicamente solo para referencia a video. Puede enviar hasta 3 archivos de video, y su tiempo de reproducción combinado debe ser de 15 segundos o menos. (reference-to-video)

string[]No[]Hasta 3 videos. La duración combinada del video debe ser de 15 segundos o menos.reference-to-video[]
input.audio_urls

Archivos de audio de referencia accesibles públicamente solo para referencia a video. Puede enviar hasta 3 archivos de audio, y su tiempo de reproducción combinado debe ser de 15 segundos o menos. (reference-to-video)

string[]No[]Hasta 3 archivos de audio. La duración combinada del audio debe ser de 15 segundos o menos.reference-to-video[]
input.duration

Duración del video de salida en segundos.

intNo54-15 segundostodos5
input.aspect_ratio

Relación de aspecto de salida. 'adaptive' permite que el servicio infiera la mejor relación.

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

Nivel de resolución de salida.

stringNo720p480p | 720p | 1080ptodos720p
input.generate_audio

Si el modelo debe generar audio cuando sea compatible.

booleanNotrueverdadero | falsotodostrue
input.watermark

Si se debe agregar una marca de agua.

booleanNofalseverdadero | falsotodosfalse
input.web_search

Si se permite la aumentación de búsqueda web cuando sea compatible.

booleanNofalseverdadero | falsotodosfalse
input.return_last_frame

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

booleanNofalseverdadero | falsotodosfalse
input.seed

Semilla determinista. Use -1 para una semilla aleatoria.

intNo-1-1 o 0-4294967295todos-1

Los créditos varían según la resolución, la duración, el modelo y si el video de referencia incluye referencias de video. El valor de créditos devuelto por la respuesta de creación es la cantidad reservada real para esa tarea. (reference-to-video)

Ver precios de créditos

Respuesta

Esta es la respuesta de éxito de POST /v1/videos/generations. Significa que la tarea ha sido aceptada y los créditos han sido reservados. Utilice el taskId devuelto para sondear GET /v1/tasks/:id o para coincidir con una devolución de llamada de finalización o fallo.

Respuesta de éxito de POST /v1/videos/generations

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

Obtener estado de la tarea

Utilice GET /v1/tasks/:id para recuperar el estado actual de la tarea. No sondee más de una vez cada 10 segundos. Para sistemas de producción, prefiera los webhooks.

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

Respuesta de tarea completada

{
  "id": "3f2aK9mR...",
  "status": "completed",
  "created_at": 1781234567,
  "model": "seedance-2-0",
  "billing_status": "charged",
  "credits": 60,
  "failed_reason": null,
  "data": {
    "results": ["https://cdn.seedance2.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-0",
  "billing_status": "refunded",
  "credits": 60,
  "failed_reason": "provider_failed"
}
ValorSignificado
status=queuedAceptado y esperando ser enviado o procesado.
status=generatingEl proveedor está procesando la generación.
status=completedVideo completado y data.results contiene la URL del resultado.
status=failedLa generación falló o el tiempo de espera se agotó.
billing_status=reservedLos créditos se reservan mientras la tarea está en progreso.
billing_status=chargedLa tarea tuvo éxito y la reserva se liquidó.
billing_status=refundedLa tarea falló o el tiempo de espera se agotó y los créditos fueron devueltos.
billing_status=refund_failedLa transacción de reembolso falló y necesita manejo manual.

Después de video_expires_at, data.results está vacío. Descargue y almacene el archivo antes de que finalice la ventana de validez.

Webhooks

Cuando callback_url está presente, Seedance llama a su endpoint cuando la tarea se completa o falla, y envía datos JSON que describen el resultado final. Si su endpoint devuelve una respuesta que no es 2xx o no responde en 15 segundos, la entrega se reintenta hasta 5 veces. Los reintentos reutilizan el mismo ID de tarea, así que elimine duplicados por ID. Devuelva una respuesta 200 tan pronto como haya registrado de forma segura los datos de devolución de llamada.

Devolución de llamada de finalización de tarea

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

Devolución de llamada de fallo de tarea

{
  "id": "3f2aK9mR...",
  "status": "failed",
  "created_at": 1781234567,
  "model": "seedance-2-0",
  "data": {
    "failed_reason": "provider_failed",
    "credits_refunded": 60
  }
}
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 });
}

Valide la forma de los datos de devolución de llamada, elimine duplicados por ID, actualice su propio registro de tareas y responda rápidamente.

callback_url debe ser HTTPS y no debe apuntar a rangos de red privados, de bucle invertido o de enlace local.

Errores

POST /v1/videos/generations y GET /v1/tasks/:id devuelven esta forma de error cuando la solicitud de la API en sí falla, como parámetros inválidos, clave de API inválida, créditos insuficientes, límite de tasa o tarea no encontrada. Algunos errores incluyen campos adicionales como required, available o retry_after, según la situación.

{
  "error": {
    "code": "insufficient_credits",
    "message": "Not enough credits for this task.",
    "required": 60,
    "available": 12
  }
}
CódigoHTTPSignificado¿Reintentar?
invalid_request400Parámetros faltantes o inválidos.No, corrija la solicitud.
invalid_api_key401La clave de API falta, es inválida o ha sido revocada.No, use una clave válida.
insufficient_credits402Créditos insuficientes. La tarea no es aceptada ni cargada.Después de recargar.
forbidden403La clave de API no tiene el alcance requerido.No.
not_found404La tarea no existe o no pertenece al propietario de la clave.No.
rate_limited429Se excedió la tasa de solicitudes.Sí, siga Retry-After.
internal_error500Error del servidor.Sí, reintente más tarde.

Límites de tasa

Los límites de tasa se aplican por clave de API con una ventana deslizante. La generación por defecto es de 60 solicitudes por minuto; las consultas de estado son más indulgentes. Las respuestas HTTP 429 incluyen Retry-After.

Generación

60/min

Consultas de estado

Más indulgente

Encabezado 429

Retry-After

Facturación y créditos

La API utiliza reserva al enviar, cobro al tener éxito y reembolso al fallar. Las páginas de uso del panel de control muestran el historial de créditos de la API, los registros de tareas y las estadísticas de uso basadas en el tiempo.

Reservado

Los créditos se verifican y reservan cuando la tarea es aceptada.

Cargado

Las tareas completadas liquidan la reserva existente.

Reembolsado

Las tareas fallidas o con tiempo de espera agotado devuelven los créditos reservados automáticamente.

Inspeccionar el uso en el panel de control

Vea los registros de la API, las líneas de tiempo de las tareas, el historial de créditos y las métricas de uso basadas en el tiempo.

Registros de API