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.
https://api.seedance2.aiEn 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_xxxxxxxxUtilice las claves sk_live_ para el tráfico de producción.
Utilice las claves sk_test_ para pruebas de integración de sandbox con el mismo contrato de API.
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.
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
}
}'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"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.
/v1/videos/generationscurl 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.
| Modo | Medios requeridos | Medios opcionales | Notas |
|---|---|---|---|
text-to-video | prompt | duración, relación_aspecto, resolución, seed | Solo texto. image_urls, video_urls y audio_urls no son necesarios. |
image-to-video | prompt + array de image_urls (1-2 URLs de imagen) | duración, relación_aspecto, resolución, seed | image_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-video | prompt + al menos una imagen o video | imágenes, videos y audio dentro de los límites de material | El audio no se puede usar solo con texto. Agregue al menos una imagen o video cuando se proporcione audio. |
text-to-videoUtilice 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-videoUtilice 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-videoUtilice 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
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
| Encabezado | Requerido | Descripción | Ejemplo |
|---|---|---|---|
Authorization | Sí | Clave de API Bearer utilizada para autenticar la solicitud. | Bearer sk_live_xxx |
Content-Type | Sí | Todas las solicitudes de escritura usan JSON. | application/json |
Campos de nivel superior
| Campo | Tipo | Requerido | Predeterminado | Rango / Enumeración | Modos | Ejemplo |
|---|---|---|---|---|---|---|
modelVariante de modelo utilizada para la generación. | string | Sí | - | seedance-2-0 | seedance-2-0-fast | todos | seedance-2-0 |
callback_urlEndpoint HTTPS que recibe las devoluciones de llamada de finalización y fallo de la tarea. | string | No | - | URL HTTPS, sin redes privadas | todos | https://your-domain.com/hook |
inputConfiguración de generación y referencias multimedia. | object | Sí | - | - | todos | - |
input.* campos
| Campo | Tipo | Requerido | Predeterminado | Rango / Enumeración | Modos | Ejemplo |
|---|---|---|---|---|---|---|
input.promptTexto que describe el video a crear. | string | Sí | - | texto no vacío | todos | a cat surfing |
input.generation_typeModo de generación. Por defecto es texto a video. (text-to-video) | string | No | text-to-video | text-to-video | image-to-video | reference-to-video | - | image-to-video |
input.image_urlsURLs 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_urlsVideos 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_urlsArchivos 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.durationDuración del video de salida en segundos. | int | No | 5 | 4-15 segundos | todos | 5 |
input.aspect_ratioRelación de aspecto de salida. 'adaptive' permite que el servicio infiera la mejor relación. | string | No | adaptive | 16:9 | 4:3 | 1:1 | 3:4 | 9:16 | 21:9 | adaptativo | todos | 16:9 |
input.resolutionNivel de resolución de salida. | string | No | 720p | 480p | 720p | 1080p | todos | 720p |
input.generate_audioSi el modelo debe generar audio cuando sea compatible. | boolean | No | true | verdadero | falso | todos | true |
input.watermarkSi se debe agregar una marca de agua. | boolean | No | false | verdadero | falso | todos | false |
input.web_searchSi se permite la aumentación de búsqueda web cuando sea compatible. | boolean | No | false | verdadero | falso | todos | false |
input.return_last_frameSi se debe devolver la URL del último fotograma cuando esté disponible. | boolean | No | false | verdadero | falso | todos | false |
input.seedSemilla determinista. Use -1 para una semilla aleatoria. | int | No | -1 | -1 o 0-4294967295 | todos | -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éditosRespuesta
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"
}| Valor | Significado |
|---|---|
status=queued | Aceptado y esperando ser enviado o procesado. |
status=generating | El proveedor está procesando la generación. |
status=completed | Video completado y data.results contiene la URL del resultado. |
status=failed | La generación falló o el tiempo de espera se agotó. |
billing_status=reserved | Los créditos se reservan mientras la tarea está en progreso. |
billing_status=charged | La tarea tuvo éxito y la reserva se liquidó. |
billing_status=refunded | La tarea falló o el tiempo de espera se agotó y los créditos fueron devueltos. |
billing_status=refund_failed | La 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ódigo | HTTP | Significado | ¿Reintentar? |
|---|---|---|---|
invalid_request | 400 | Parámetros faltantes o inválidos. | No, corrija la solicitud. |
invalid_api_key | 401 | La clave de API falta, es inválida o ha sido revocada. | No, use una clave válida. |
insufficient_credits | 402 | Créditos insuficientes. La tarea no es aceptada ni cargada. | Después de recargar. |
forbidden | 403 | La clave de API no tiene el alcance requerido. | No. |
not_found | 404 | La tarea no existe o no pertenece al propietario de la clave. | No. |
rate_limited | 429 | Se excedió la tasa de solicitudes. | Sí, siga Retry-After. |
internal_error | 500 | Error 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.