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.
https://api.seevio.aiEn 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_xxxxxxxxUsa claves sk_live_ para el tráfico de producción.
Usa claves sk_test_ para pruebas de integración en entornos de sandbox con el mismo contrato de API.
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.
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
}
}'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"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.
/v1/videos/generationscurl 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.
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
| Modo | Multimedia obligatorio | Multimedia opcional | Notas |
|---|---|---|---|
text-to-video | prompt | duration, aspect_ratio, resolution, seed | Solo prompt de texto. No se necesitan image_urls, video_urls ni audio_urls. |
image-to-video | prompt + matriz image_urls (1-2 URLs de imagen) | duration, aspect_ratio, resolution, seed | image_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-video | prompt + al menos una referencia de imagen, video o audio | imágenes, videos y audios dentro de los límites de recursos | Seedance 2.5 admite referencias solo de audio. Para Seedance 2.0, añade al menos una imagen o video cuando proporciones audio. |
text-to-videoUsa 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-videoUsa 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-videoUsa 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
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
| Cabecera | Obligatorio | 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 utilizan JSON. | application/json |
Campos de nivel superior
| Campo | Tipo | Obligatorio | Por defecto | Rango / Enum | Modos | Ejemplo |
|---|---|---|---|---|---|---|
modelVariante 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 | Sí | - | seedance-2-5 | seedance-2-0 | seedance-2-0-fast | seedance-2-0-mini | todos | seedance-2-5 |
callback_urlEndpoint HTTPS que recibe las notificaciones de finalización o fallo de la tarea. | string | No | - | URL HTTPS, no se permiten redes privadas | todos | https://your-domain.com/hook |
inputConfiguración de generación y recursos multimedia de referencia. | object | Sí | - | - | todos | - |
input.* campos
| Campo | Tipo | Obligatorio | Por defecto | Rango / Enum | Modos | Ejemplo |
|---|---|---|---|---|---|---|
input.promptPrompt de texto que describe el video que se quiere generar. | string | Sí | - | texto no vacío | todos | a cat surfing |
input.generation_typeModo de generación. Por defecto es 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 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_urlsVideos 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_urlsArchivos 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.durationDuración del video generado en segundos. | int | No | 5 | Seedance 2.5: 4-30 segundos. Seedance 2.0: 4-15 segundos. | todos | 5 |
input.aspect_ratioRelació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. | string | No | adaptive | 16:9 | 4:3 | 1:1 | 3:4 | 9:16 | 21:9 | adaptive | todos | 16:9 |
input.resolutionResolución del video generado. | string | No | 720p | Seedance 2.5: 480p | 720p | 1080p. Seedance 2.0: 480p | 720p | 1080p | 4k (según la variante). | todos | 720p |
input.generate_audioIndica si el modelo debe generar audio si es compatible. | boolean | No | true | true | false | todos | true |
input.watermarkIndica si se debe añadir una marca de agua. | boolean | No | false | true | false | todos | false |
input.web_searchIndica si se permite la búsqueda web para optimizar la generación si es compatible. | boolean | No | false | true | false | todos | false |
input.return_last_frameIndica si se debe devolver la URL del último fotograma cuando esté disponible. | boolean | No | false | true | false | todos | false |
input.seedSemilla determinista para las variantes de Seedance 2.0. Seedance 2.5 no admite este campo; omítelo. | int | No | -1 | -1 o de 0 a 4294967295 | todos | -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éditosRespuesta
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"
}| Valor | Significado |
|---|---|
status=queued | Aceptada y en espera de ser enviada o procesada. |
status=generating | El proveedor está procesando la generación. |
status=completed | Video completado con éxito; data.results contiene la URL del resultado. |
status=failed | La generación falló o superó el tiempo de espera. |
billing_status=reserved | Los créditos permanecen reservados mientras la tarea está en curso. |
billing_status=charged | La tarea finalizó correctamente y se confirma el cobro de la reserva. |
billing_status=refunded | La tarea falló o superó el tiempo de espera y se devolvieron los créditos. |
billing_status=refund_failed | La 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ódigo | HTTP | Significado | ¿Reintentar? |
|---|---|---|---|
invalid_request | 400 | Parámetros faltantes o inválidos. | No, corrige la solicitud. |
invalid_api_key | 401 | La clave de API falta, es inválida o ha sido revocada. | No, utiliza una clave válida. |
insufficient_credits | 402 | Créditos insuficientes. La tarea no se acepta ni se cobra. | Tras realizar una recarga. |
forbidden | 403 | La clave de API no tiene los permisos necesarios. | No. |
not_found | 404 | La tarea no existe o no pertenece al propietario de la clave. | No. |
rate_limited | 429 | Se ha superado el límite de solicitudes. | Sí, respetando la cabecera Retry-After. |
internal_error | 500 | Error 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.