Seedance 2.5
Genera videos con Seedance 2.5 utilizando texto, primer y último fotograma o referencias multimodales. Esta página cubre el flujo completo de trabajo, desde la petición hasta el resultado final.
ID de modelo de la API: seedance-2-5
La generación es asíncrona. Guarda el taskId devuelto al crear una tarea, luego consulta su estado o recibe un webhook.
Capacidades
| Función | Valores admitidos |
|---|---|
| Resolución de salida | 480p · 720p · 1080p |
| Duración de salida | 4 a 30 segundos |
| Relación de aspecto | 16:9, 4:3, 1:1, 3:4, 9:16, 21:9, adaptive |
| Imágenes de referencia | Hasta 30 imágenes |
| Videos de referencia | Hasta 10 videos |
| Audios de referencia | Hasta 10 archivos de audio |
| Suma de referencias | Hasta 50 archivos de referencia en total |
| Duración total por grupo de video/audio | 30 segundos |
| seed | No admitido |
Precios y créditos
La generación de video se cobra en créditos según la duración facturable en segundos. Sin video de entrada, la duración facturable equivale a la del video generado; si se incluye un video de entrada, también se contabiliza la duración del video de referencia.
La siguiente tabla muestra los créditos cobrados por segundo, no el costo total de la tarea. La tarifa varía según el modelo, la resolución de salida y si se proporcionan videos de referencia en el modo de referencia a video. Para saber cómo calcular el costo total, consulta las fórmulas y los ejemplos que aparecen debajo de la tabla.
| Resolución de salida | Sin video de referencia | Con video de referencia |
|---|---|---|
480p | 10 créditos/segundo | 6 créditos/segundo |
720p | 20 créditos/segundo | 12 créditos/segundo |
1080p | 30 créditos/segundo | 20 créditos/segundo |
- Sin video de referencia: segundos de salida × tarifa sin video.
- Con video de referencia: (segundos de salida + segundos del video de referencia medidos) × tarifa con video. El servidor mide la duración total del video de referencia y la redondea al entero superior en segundos antes de facturar.
- Las referencias de imagen o de audio por sí solas usan la tarifa sin video. La tarifa con video de referencia solo se aplica en el modo de referencia a video cuando se proporcionan archivos de video.
Ejemplos de cálculo del coste
Video a partir de texto de 5 segundos a 720p: 5 × 20 = 100 créditos.
Video de salida de 5 segundos con un video de referencia de 5 segundos: (5 + 5) × 12 = 120 créditos.
Los créditos se reservan al enviar la petición y se cobran al completarse con éxito. Las tareas que fallen o expiren entran en el proceso de reembolso. El estado refund_failed significa que el reembolso no se completó; revisa los registros de la API o contacta al soporte técnico.
Cómo se cobran los créditos cuando duration=-1
Si la duración se establece en -1, la duración del resultado final no será fija, sino que la determinará el propio modelo.
En la mayoría de los casos, es mejor configurar la duración exacta que necesitas en lugar de -1. Te recomendamos usar -1 únicamente para la edición de video y no para otros escenarios de generación.
| Entradas de referencia | Cómo se calcula el cargo | Ejemplo |
|---|---|---|
| Con videos de referencia | Se suman las duraciones de todos los videos de referencia y el total se redondea al siguiente segundo completo (este valor se llamará T). El cargo es (T + T) × la tarifa con video: una T representa la duración estimada del resultado y la otra representa la duración del video de entrada. | 720p con un video de referencia de 5 segundos: (5 + 5) × 12 = 120 créditos. |
| Sin videos de referencia (solo imágenes o audio) | Se toman 30 segundos como la duración estimada del resultado. El cargo es 30 × la tarifa sin video. | 720p sin videos de referencia: 30 × 20 = 600 créditos. |
Autenticación
Crea una clave de API en el panel de control. La clave completa se mostrará una sola vez. Almacénala de forma segura en tu servidor y envíala como Bearer token en cada petición.
URL base
https://api.seevio.aiAuthorization: Bearer sk_live_your_api_key
Content-Type: application/jsonDefine la variable de entorno SEEVIO_API_KEY antes de ejecutar estos ejemplos. Los ejemplos en JavaScript se ejecutan en tu servidor con Node.js; los de Python usan el paquete requests.
Inicio rápido
Envía esta petición mínima, guarda el taskId recibido y usa el ejemplo de consulta de tarea más abajo. El valor de créditos en la respuesta de creación es el monto reservado.
curl --fail-with-body https://api.seevio.ai/v1/videos/generations \
-H "Authorization: Bearer $SEEVIO_API_KEY" \
-H "Content-Type: application/json" \
--data '{
"model": "seedance-2-5",
"input": {
"prompt": "A cat surfing at sunset, cinematic lighting",
"duration": 5,
"resolution": "720p",
"generation_type": "text-to-video",
"aspect_ratio": "16:9",
"generate_audio": true
}
}'Ejemplo de respuesta de creación de tarea
Una vez aceptada la solicitud anterior, la API devuelve esta respuesta JSON. El parámetro taskId es el identificador de la tarea que se utilizará para las consultas de estado posteriores; credits representa la cantidad de créditos reservados para esta tarea. Esta respuesta confirma la creación de la tarea, pero no significa que el video esté listo. Deberá realizar consultas periódicas del estado de la tarea (polling) o utilizar un Webhook para recibir los resultados del video.
{
"taskId": "3f2aK9mR7xQp4TnZ8bLc6YwH",
"credits": 100
}Crear una tarea
POST https://api.seevio.ai/v1/videos/generationsEnvía un objeto JSON con el modelo, los datos de entrada y una callback_url opcional. Especifica siempre el ID de modelo indicado en esta página; omitir el modelo seleccionará seedance-2-0.
Cuerpo de la petición
| Campo | Tipo | Requerido | Descripción y restricciones |
|---|---|---|---|
model | string | Sí | ID del modelo. Para utilizar Seedance 2.5, establece este campo como seedance-2-5. |
callback_url | string | No | Endpoint público HTTPS para recibir callbacks POST en caso de éxito o fallo. No se permiten redes privadas ni localhost. Ejemplo: https://example.com/webhooks/seevio |
input | object | Sí | Ajustes de generación. Debe contener un prompt que no esté vacío. |
Parámetros de entrada
Proporcione image_urls, video_urls y audio_urls como arrays de cadenas de URL (string[]). Todas las URL facilitadas deben ser accesibles públicamente a través de HTTPS, incluidos los archivos multimedia omitidos por el modo seleccionado.
| Campo | Tipo | Requerido | Por defecto | Descripción y restricciones |
|---|---|---|---|---|
input.prompt | string | Sí | — | Obligatorio en todos los modos, incluso con referencias solo de archivos multimedia. Admite hasta 10000 caracteres antes de ser recortado; debe incluir texto visible (no solo espacios). Ejemplo: A cat surfing at sunset |
input.generation_type | string | No | text-to-video | text-to-video usa solo el prompt; image-to-video usa 1 o 2 imágenes; reference-to-video admite referencias de imagen, video o audio. Valores admitidos text-to-video | image-to-video | reference-to-video |
input.image_urls | string[] | Condicional | [] | image-to-video: 1 imagen para el primer fotograma, o 2 en orden para el primer y último fotograma. reference-to-video: hasta 30 imágenes. Se ignora en text-to-video. Ejemplo: ["https://example.com/first-frame.jpg"] |
input.video_urls | string[] | Condicional | [] | Solo se procesan en reference-to-video; hasta 10 videos con un máximo combinado de 30 segundos. Se ignora en los demás modos. Ejemplo: ["https://example.com/source.mp4"] |
input.audio_urls | string[] | Condicional | [] | Solo se procesan en reference-to-video; hasta 10 archivos de audio con un máximo combinado de 30 segundos. Se ignora en los demás modos. Ejemplo: ["https://example.com/music.mp3"] |
input.duration | integer | No | 5 | Duración de salida en segundos (número entero entre 4 y 30). También admite -1 únicamente en reference-to-video. Úsalo con un video de origen para edición; la facturación se rige por la regla especial descrita arriba. Valores admitidos -1 | 4–30Ejemplo: 5 |
input.aspect_ratio | string | No | adaptive | Relación de aspecto del video de salida. adaptive permite que el modelo defina la relación automáticamente. image-to-video solo admite adaptive; omite este campo o configúralo como adaptive. Valores admitidos 16:9, 4:3, 1:1, 3:4, 9:16, 21:9, adaptiveEjemplo: adaptive |
input.resolution | string | No | 720p | Utiliza una de las resoluciones de salida admitidas que se detallan aquí. Valores admitidos 480p | 720p | 1080pEjemplo: 720p |
input.generate_audio | boolean | No | true | Solicita la generación de audio sincronizado. Valores admitidos true | falseEjemplo: true |
input.watermark | boolean | No | false | Solicita una marca de agua de IA en el video generado. Valores admitidos true | falseEjemplo: false |
input.web_search | boolean | No | false | Permite realizar búsquedas web si el modelo lo admite. Valores admitidos true | falseEjemplo: false |
input.return_last_frame | boolean | No | false | Solicita el último fotograma. El resultado de la consulta contendrá data.last_frame_url cuando el fotograma esté disponible; de lo contrario será null. Valores admitidos true | falseEjemplo: true |
Los campos booleanos deben ser true o false en formato JSON, no strings ni números.
Respuesta de creación
HTTP 200 devuelve taskId (string) y credits (number). Esto confirma que la tarea se creó correctamente, no que haya finalizado. El monto de ejemplo corresponde al inicio rápido de 5 segundos a 720p.
{
"taskId": "3f2aK9mR7xQp4TnZ8bLc6YwH",
"credits": 100
}Modos de generación y ejemplos
Texto a video
Genera video a partir de una descripción de texto. Las URL multimedia no se procesan en este modo.
curl --fail-with-body https://api.seevio.ai/v1/videos/generations \
-H "Authorization: Bearer $SEEVIO_API_KEY" \
-H "Content-Type: application/json" \
--data '{
"model": "seedance-2-5",
"input": {
"prompt": "A cat surfing at sunset, cinematic lighting",
"duration": 5,
"resolution": "720p",
"generation_type": "text-to-video",
"aspect_ratio": "16:9",
"generate_audio": true
}
}'Primer fotograma
Proporciona una imagen como primer fotograma y describe el movimiento deseado en el prompt.
curl --fail-with-body https://api.seevio.ai/v1/videos/generations \
-H "Authorization: Bearer $SEEVIO_API_KEY" \
-H "Content-Type: application/json" \
--data '{
"model": "seedance-2-5",
"input": {
"prompt": "A cat surfing at sunset, cinematic lighting",
"duration": 5,
"resolution": "720p",
"generation_type": "image-to-video",
"image_urls": [
"https://example.com/first-frame.jpg"
],
"aspect_ratio": "adaptive"
}
}'Primer y último fotograma
Proporciona dos URL de imagen en orden: primero el fotograma inicial y luego el final. Este ejemplo también solicita el último fotograma del video generado.
curl --fail-with-body https://api.seevio.ai/v1/videos/generations \
-H "Authorization: Bearer $SEEVIO_API_KEY" \
-H "Content-Type: application/json" \
--data '{
"model": "seedance-2-5",
"input": {
"prompt": "A cat surfing at sunset, cinematic lighting",
"duration": 5,
"resolution": "720p",
"generation_type": "image-to-video",
"image_urls": [
"https://example.com/first-frame.jpg",
"https://example.com/last-frame.jpg"
],
"aspect_ratio": "adaptive",
"return_last_frame": true
}
}'Referencia multimodal
Combina referencias de imagen, video y audio. El prompt sigue siendo obligatorio. El video de referencia cambia la fórmula de facturación.
curl --fail-with-body https://api.seevio.ai/v1/videos/generations \
-H "Authorization: Bearer $SEEVIO_API_KEY" \
-H "Content-Type: application/json" \
--data '{
"model": "seedance-2-5",
"input": {
"prompt": "Follow the reference camera movement and keep the character consistent. Use the audio for ambience.",
"duration": 5,
"resolution": "720p",
"generation_type": "reference-to-video",
"image_urls": [
"https://example.com/character.jpg"
],
"video_urls": [
"https://example.com/camera.mp4"
],
"audio_urls": [
"https://example.com/ambience.mp3"
],
"aspect_ratio": "adaptive"
}
}'Referencia de audio
Utiliza audio como única referencia, junto con un prompt de texto obligatorio que describa el video deseado.
curl --fail-with-body https://api.seevio.ai/v1/videos/generations \
-H "Authorization: Bearer $SEEVIO_API_KEY" \
-H "Content-Type: application/json" \
--data '{
"model": "seedance-2-5",
"input": {
"prompt": "Create a coastal sunrise scene matching the rhythm of this audio.",
"duration": 5,
"resolution": "720p",
"generation_type": "reference-to-video",
"audio_urls": [
"https://example.com/music.mp3"
]
}
}'Edición de video
Describe la edición y proporciona el video de origen. Configura duration=-1 y usa una relación de aspecto adaptive. Usa un clip de origen de al menos 4 segundos para este flujo de trabajo. La regla de facturación para duration=-1 se detalla arriba.
curl --fail-with-body https://api.seevio.ai/v1/videos/generations \
-H "Authorization: Bearer $SEEVIO_API_KEY" \
-H "Content-Type: application/json" \
--data '{
"model": "seedance-2-5",
"input": {
"prompt": "Edit the source video: change the character’s coat to blue and preserve the camera movement.",
"duration": -1,
"resolution": "720p",
"generation_type": "reference-to-video",
"video_urls": [
"https://example.com/source.mp4"
],
"aspect_ratio": "adaptive"
}
}'Extensión de video
Describe cómo debe continuar el video de origen. Usa una relación de aspecto adaptive y define una duración de salida normal dentro del rango permitido del modelo.
curl --fail-with-body https://api.seevio.ai/v1/videos/generations \
-H "Authorization: Bearer $SEEVIO_API_KEY" \
-H "Content-Type: application/json" \
--data '{
"model": "seedance-2-5",
"input": {
"prompt": "Continue the camera movement from the source video, revealing a forest clearing.",
"duration": 8,
"resolution": "720p",
"generation_type": "reference-to-video",
"video_urls": [
"https://example.com/source.mp4"
],
"aspect_ratio": "adaptive"
}
}'Consultar una tarea
GET https://api.seevio.ai/v1/tasks/{taskId}Reemplaza el ID de ejemplo por el taskId obtenido al crear la tarea. Las consultas solo devuelven tareas que pertenecen al usuario de la clave API; los ID inaccesibles o desconocidos devuelven HTTP 404.
Realiza consultas cada 10 o 20 segundos como punto de partida, reduce la frecuencia si recibes un HTTP 429 y detente cuando el estado sea completed o failed. Para entornos de producción, se recomienda usar webhooks. Cada ejemplo de código abajo realiza una sola consulta.
curl --fail-with-body https://api.seevio.ai/v1/tasks/3f2aK9mR7xQp4TnZ8bLc6YwH \
-H "Authorization: Bearer $SEEVIO_API_KEY"| Estado | Descripción y restricciones |
|---|---|
queued | Aceptada y en cola para procesamiento. |
generating | Generación en curso. |
completed | Finalizada correctamente. Descarga el archivo de data.results antes de que expire. |
failed | Error al procesar. Revisa failed_reason y billing_status. |
| Campo | Tipo | Descripción y restricciones |
|---|---|---|
id | string | Identificador de la tarea. Corresponde al taskId de la respuesta de creación. |
created_at | number | Fecha de creación de la tarea en formato de tiempo Unix (segundos). |
model | string | El ID del modelo público utilizado para esta tarea. |
billing_status | string | reserved, charged, refunded o refund_failed. |
credits | number | Créditos reservados para la tarea. Este valor se mantiene tras un reembolso; revisa billing_status para conocer el estado final de la facturación. |
failed_reason | string | null | Razón del fallo en tareas fallidas; de lo contrario null. Las respuestas de consulta fallidas omiten el objeto data. |
data | object | Presente en consultas de tareas que no han fallado. Contiene los detalles de procesamiento y el resultado. |
data.results | string[] | Array de URL del video. Vacío hasta que finalice la generación o si el video ha expirado. |
data.video_expires_at | string | null | Fecha de expiración del video en formato ISO 8601, o null antes de estar disponible. Guarda el resultado antes de esta fecha. |
data.last_frame_url | string | null | URL del último fotograma si se solicitó y está disponible; de lo contrario null. |
data.processing_time | number | null | Duración de procesamiento del proveedor en segundos si está disponible; de lo contrario null. |
Tarea completada: respuesta de consulta con resultados del video
Cuando la consulta devuelve status=completed, significa que la generación del video ha finalizado. Puede obtener las URL de los videos desde data.results y descargarlos antes de la fecha indicada en data.video_expires_at. El estado billing_status=charged indica que se han cobrado los créditos reservados.
{
"id": "3f2aK9mR7xQp4TnZ8bLc6YwH",
"created_at": 1788652800,
"model": "seedance-2-5",
"status": "completed",
"billing_status": "charged",
"credits": 100,
"failed_reason": null,
"data": {
"results": [
"https://cdn.seevio.ai/api/videos/example.mp4"
],
"video_expires_at": "2026-09-07T00:00:00Z",
"last_frame_url": null,
"processing_time": 48
}
}Tarea fallida: respuesta de consulta con detalles del error y facturación
Cuando la consulta devuelve status=failed, significa que el proceso de generación ha fallado. Consulte failed_reason para conocer el motivo del error y billing_status para saber si se ha realizado el reembolso. En este ejemplo, refunded indica que se han devuelto los créditos. El campo credits conserva el valor reservado originalmente y la respuesta no incluye data.
{
"id": "3f2aK9mR7xQp4TnZ8bLc6YwH",
"created_at": 1788652800,
"model": "seedance-2-5",
"status": "failed",
"billing_status": "refunded",
"credits": 100,
"failed_reason": "provider_failed"
}Webhooks
Configura callback_url en la petición de creación para recibir un POST con formato JSON cuando la tarea se complete o falle. Responde con un código 2xx en menos de 15 segundos. Los envíos fallidos se reintentan; procesa los envíos repetidos de forma idempotente usando el ID de la tarea.
Tu endpoint de callback debe aceptar solicitudes POST con un cuerpo en formato JSON (Content-Type: application/json).
Crear una tarea con callback
curl --fail-with-body https://api.seevio.ai/v1/videos/generations \
-H "Authorization: Bearer $SEEVIO_API_KEY" \
-H "Content-Type: application/json" \
--data '{
"model": "seedance-2-5",
"input": {
"prompt": "A cat surfing at sunset, cinematic lighting",
"duration": 5,
"resolution": "720p",
"generation_type": "text-to-video",
"aspect_ratio": "16:9",
"generate_audio": true
},
"callback_url": "https://example.com/webhooks/seevio"
}'Los datos del webhook difieren de las respuestas de consulta de tareas: omiten billing_status y credits; los detalles del fallo se encuentran en data.failed_reason y data.credits_refunded. El campo created_at del webhook es la hora de creación del evento en segundos Unix.
Tarea completada: carga útil del callback exitosa
Si la generación se realiza correctamente, el callback devolverá status=completed. Usa el id para identificar la tarea y data.results para obtener las URL de los videos. Asegúrate de descargar y guardar los resultados antes de la fecha indicada en data.video_expires_at.
{
"id": "3f2aK9mR7xQp4TnZ8bLc6YwH",
"created_at": 1788652800,
"model": "seedance-2-5",
"status": "completed",
"data": {
"results": [
"https://cdn.seevio.ai/api/videos/example.mp4"
],
"video_expires_at": "2026-09-07T00:00:00Z",
"last_frame_url": null,
"processing_time": 48
}
}Tarea fallida: carga útil del callback con error
Si la generación falla, el callback devolverá status=failed. Usa el id para identificar la tarea, data.failed_reason para conocer el motivo del fallo y data.credits_refunded para ver la cantidad de créditos reembolsados.
{
"id": "3f2aK9mR7xQp4TnZ8bLc6YwH",
"created_at": 1788652800,
"model": "seedance-2-5",
"status": "failed",
"data": {
"failed_reason": "provider_failed",
"credits_refunded": 100
}
}Ejemplo de receptor
export async function POST(request: Request) {
const callbackData = await request.json();
if (callbackData.status === "completed") {
const videoUrls = callbackData.data.results;
// Save the video URLs and mark this task as completed in your application.
console.log(callbackData.id, videoUrls);
}
if (callbackData.status === "failed") {
const { failed_reason, credits_refunded } = callbackData.data;
// Record the failure reason and refunded credits for this task.
console.error(callbackData.id, failed_reason, credits_refunded);
}
return new Response(null, { status: 200 });
}Este ejemplo de Next.js lee el cuerpo de la llamada JSON y procesa directamente las tareas completadas y fallidas. Te recomendamos implementar persistencia y deduplicación de ID de tareas en tu aplicación, así como encolar las tareas lentas antes de confirmar la recepción del callback.
Requisitos y límites de archivos multimedia
- Todos los archivos multimedia y las URL de callback deben ser direcciones HTTPS públicas. Evita localhost, IP privadas y archivos que requieran cookies o inicio de sesión. Las URL de referencia de video o audio deben enlazar directamente al archivo multimedia.
- En el modo reference-to-video, proporciona al menos una referencia, con un límite de 30 imágenes, 10 videos, 10 archivos de audio y un total de 50 elementos combinados. La duración total del video y la del audio no pueden superar los 30 segundos cada una.
- El modo text-to-video ignora todas las referencias multimedia. image-to-video solo procesa la primera y última imagen, ignorando las referencias de video y audio. Usa reference-to-video para combinar archivos multimedia.
- Cada archivo de video y audio de referencia debe durar entre 2 y 30 segundos. Para los ejemplos de edición de video, utiliza clips de origen de al menos 4 segundos.
Requisitos de las imágenes
- Cada imagen debe pesar menos de 30 MB.
- Formatos admitidos: jpeg, png, webp, bmp, tiff y gif.
- Relación de aspecto (ancho ÷ alto): entre 0,4 y 2,5, ambos inclusive.
- El ancho y el alto deben estar entre 300 y 6.000 píxeles, ambos inclusive.
Requisitos de los videos
- Formatos admitidos: mp4 y mov.
- Cada video no debe superar los 100 MB.
- Velocidad de fotogramas: entre 24 y 60 FPS, ambos inclusive.
- Relación de aspecto (ancho ÷ alto): entre 0,4 y 2,5, ambos inclusive.
- Píxeles totales (ancho × alto): entre 407.696 y 8.295.044, ambos inclusive. Por ejemplo: 614 × 664 = 407.696 y 3.326 × 2.494 = 8.295.044. Estos valores son ejemplos de resolución total, no requisitos de ancho y alto fijos.
Requisitos de los audios
- Formatos admitidos: wav y mp3.
- Cada archivo de audio no debe superar los 15 MB.
Errores
Los errores HTTP contienen un objeto error con un código (code) y un mensaje (message). Una tarea aceptada con éxito puede fallar más tarde; consulta su estado o gestiona el callback de fallo.
{
"error": {
"code": "invalid_request",
"message": "input.prompt is required."
}
}| HTTP | Campo | Qué hacer |
|---|---|---|
| 400 | invalid_request | Corrige el JSON, el prompt faltante, el rango de parámetros o la URL del archivo multimedia antes de reintentar. |
| 401 | invalid_api_key | Verifica el Bearer token y asegúrate de que la clave API esté activa. |
| 402 | insufficient_credits | Añade créditos o reduce el costo de la tarea. La respuesta puede indicar la cantidad de créditos requeridos y disponibles. |
| 403 | forbidden | Revisa la restricción de cuenta detallada en el mensaje de error. |
| 404 | not_found | Verifica el ID de la tarea y que la clave pertenezca al usuario que la creó. |
| 429 | rate_limited | Espera a que transcurra el intervalo indicado en Retry-After antes de intentarlo de nuevo. |
| 500 | internal_error | Revisa el mensaje de error y los registros de la API. Reintenta con precaución; reenviar una petición de creación puede generar otra tarea facturable. |
Límites de peticiones
Creación de tareas: cada clave de API permite de forma predeterminada un máximo de 100 solicitudes por minuto. Actualmente no están disponibles los límites de tarifa personalizados.
Consulta de tareas: cada clave de API permite de forma predeterminada un máximo de 120 solicitudes por minuto. Las solicitudes de consulta y las de creación de tareas se contabilizan de forma independiente.