KovAPIKovAPI
POST https://kovapi.com/v1/videos/generations

Generación de vídeo con Seedance 2.0 Mini (asíncrona): el nivel de entrada, el más barato por segundo de la plataforma; la duración es cualquier entero de 5 a 15 segundos, resolución 480P / 720P (por defecto 720P), cinco relaciones de aspecto, y audio activa o desactiva la banda sonora (por defecto true); incluye image para imagen a vídeo. Devuelve un id de trabajo (HTTP 202); consulta GET /v1/videos/jobs/{id}. Se factura por segundo (incluidos los segundos de los vídeos de referencia) y se reembolsa íntegramente si falla.

Probar en el Playground →

Autenticación

Header
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json

Crea una clave API en la consola para empezar.

Cuerpo de la petición

ParámetroTipoObligatorioDescripción
model string Sí ID del modelo; aquí seedance-2.0-mini.
prompt string Sí Prompt de texto que describe el vídeo, la cámara y el movimiento. Máximo 5000 bytes (UTF-8; un carácter chino cuenta como 3). Con varias imágenes de referencia puedes mencionarlas como @Image1 / @Image2 en el prompt, por ejemplo «el personaje de @Image1 en la escena de @Image2»; sin esas marcas, el modelo decide por su cuenta.
duration integer No Duración en segundos, cualquier entero de 5 a 15 (por defecto 5); alias seconds. Se factura por segundo.
resolution string No Resolución: 480P / 720P (por defecto 720P; cada nivel tiene su propia tarifa, consulta la página del modelo).
size string No Relación de aspecto: 16:9 / 9:16 / 1:1 / 4:3 / 3:4 (por defecto 16:9); alias aspect_ratio.
audio boolean No Cada vídeo sale con sonido (diálogo, efectos y música generados a partir del prompt); no se puede desactivar y false no tiene efecto.
image string No Una imagen de referencia (URL pública, data: URI o base64) que llega al modelo como referencia de los personajes, los objetos, la escena o el estilo; para varias usa images. Esta línea no controla el primer fotograma, así que la imagen no tiene por qué abrir el clip. Sin ninguna referencia es texto a vídeo.
images array No Varias imágenes de referencia. Este modelo admite hasta 9. Cada elemento puede ser una URL pública, un data: URI o base64. Si superas el límite se rechaza en lugar de recortar. Alias reference_images. Cada imagen hasta 16 MB, jpg / png / webp / gif; menciónalas en orden como @Image1, @Image2, ... en el prompt.
image_role string No Opcional. Las imágenes de referencia se usan siempre como referencia (personajes, escena, estilo) y se mencionan como @Image1... en el prompt; el modelo no controla el primer ni el último fotograma.
audio_reference string / array No Enlaces http(s) públicos de audio de referencia. Hasta 3, y deben acompañar a una imagen o un vídeo de referencia. Alias audio_references (no envíes ambos a la vez). También admite base64 (data:audio/mpeg;base64,...), mp3 / wav / m4a; menciónalo como @Audio1 en el prompt.
video_references array No Vídeos de referencia, hasta 3. Cada uno puede ser una URL http(s) pública o un archivo local enviado en línea como base64 (data:video/mp4;base64,..., mp4 / mov, hasta 50 MB cada uno); lo alojamos nosotros y pasamos el enlace al proveedor. Se puede combinar con imágenes de referencia en la misma solicitud (por ejemplo, fotos para el aspecto de los personajes y un vídeo para el movimiento y la cámara); menciónalos en el prompt como @Image1 / @Video1. Cada vídeo dura como máximo 30 s, 15 s en total; las referencias que alojamos se guardan 7 días.

Ejemplo de petición

cURL
# 1) submit -> 202 {"id":"img_...","status":"queued"}
curl https://kovapi.com/v1/videos/generations -H 'Authorization: Bearer YOUR_API_KEY' -H 'Content-Type: application/json' -d '{"model": "seedance-2.0-mini", "prompt": "a cat surfing a wave at sunset", "duration": 5, "resolution": "720P", "size": "16:9"}'
# with references: add "images": ["https://example.com/a.png"], "video_references": ["https://example.com/move.mp4"], "audio_reference": ["https://example.com/bgm.mp3"] and name them @Image1 / @Video1 / @Audio1 in the prompt
# 2) poll every ~5s until status=succeeded, then read data[0].url
curl https://kovapi.com/v1/videos/jobs/img_3f9a...c2 -H 'Authorization: Bearer YOUR_API_KEY'

Respuesta

200 · JSON
{
  "id": "img_3f9a...c2",
  "object": "video.generation.job",
  "status": "queued",
  "model": "seedance-2.0-mini"
}

Trabajo de vídeo asíncrono (enviar → consultar)

Al enviar recibes al instante HTTP 202 y un id de trabajo; consulta hasta que status=succeeded y lee data[0].url (un enlace mp4). Los valores admitidos de duración, resolución y tamaño están en la tabla de parámetros de arriba; añade un parámetro image para imagen a vídeo.

curl · enviar (texto a vídeo)
curl https://kovapi.com/v1/videos/generations -H 'Authorization: Bearer YOUR_API_KEY' -H 'Content-Type: application/json' -d '{"model": "seedance-2.0-mini", "prompt": "un gato surfeando al atardecer", "size": "16:9"}'
Con referencias: images (imágenes de referencia), video_references (vídeos de referencia) y audio_reference (audio de referencia) pueden ir juntos en una misma petición, como URL públicas, data: URI o base64; menciónalos como @Image1 / @Video1 / @Audio1 en el prompt. Las imágenes de referencia fijan el sujeto, la escena y el estilo; no se usan como primer fotograma.
Se admiten rostros humanos reales como imágenes de referencia, sin necesidad de ocultarlos. Asegúrate de tener derecho a usar la imagen de las personas que aparecen.
Ejemplo de respuesta
{ "id": "img_3f9a...c2", "object": "video.generation.job", "status": "queued", "model": "seedance-2.0-mini" }
curl · consultar
curl https://kovapi.com/v1/videos/jobs/img_3f9a...c2 -H 'Authorization: Bearer YOUR_API_KEY'
Ejemplo de respuesta
{
  "id": "img_3f9a...c2",
  "object": "video.generation.job",
  "status": "succeeded",
  "model": "seedance-2.0-mini",
  "data": [{ "url": "https://img.kovapi.com/i/9f86d081a8....mp4" }]
}

🕑 data[0].url es un enlace de nuestro alojamiento de imágenes que se conserva 15 días y después se elimina automáticamente; si necesitas seguir usándolo, descárgalo y guárdalo en tu propio almacenamiento o CDN.

Facturado por segundo ($0.046/s x duración); la retención coincide exactamente con el cargo, y un render fallido o caducado se reembolsa íntegramente de forma automática.

¿Prefieres no consultar el estado? Añade callback_url al enviar la tarea y te enviaremos el resultado a tu servidor cuando termine, o configura un endpoint por defecto en la consola. Documentación de webhooks →

Requisitos de contenido

Todos los trabajos de Seedance pasan por una revisión de contenido que cubre el prompt, los archivos de referencia y el vídeo final, tanto la imagen como el sonido. Un trabajo que no la supera termina con content_policy y no se cobra.

Cuándo se revisa

Al enviar se revisan el prompt y las referencias; cuando el vídeo está generado se revisan de nuevo la imagen y el sonido. Por eso un rechazo puede llegar segundos después de enviar o solo al terminar el renderizado (puede tardar más de media hora). Un trabajo que termina con status failed y error.code content_policy no superó la revisión; con un webhook recibes el evento video.failed.

Sin cargo

Un trabajo rechazado no cuesta nada: el importe retenido al enviarlo se devuelve íntegro cuando termina, y el registro de llamadas lo muestra como no cobrado.

Sonido

El sonido (diálogos, narración, canto y efectos) lo genera el modelo a partir de tu prompt y se revisa junto con la imagen: los diálogos, la narración y las letras del prompt se locutan o se cantan. Para un vídeo sin voces, no pongas diálogos ni letras en el prompt. Este modelo siempre añade sonido; no se puede desactivar y audio: false no tiene efecto. El audio de referencia que subas también se revisa, y la música con derechos de autor usada como referencia puede ser rechazada. Cuando el sonido no supera la revisión, error.param es audio y el mensaje indica si fue el sonido generado o tu audio de referencia.

Contenido que más se rechaza

  • Contenido sexual, desnudos o insinuación sexual, incluidas imágenes generadas o compuestas con IA
  • Sangre, crueldad, autolesiones y heridas violentas como disparos o hemorragias
  • Armas de fuego, explosivos y drogas
  • Cualquier contenido sexualizado con menores; también se rechazan menores con alcohol, tabaco, drogas o en situaciones de peligro
  • Políticos, famosos, deportistas, empresarios y otras figuras públicas, por su aspecto o su voz, incluidos los parecidos
  • Personajes y propiedad intelectual protegidos, como personajes de Disney o Marvel
  • Contenido de odio o discriminatorio, y noticias falsas

Guiones largos

Una sola toma que incumpla las normas hace fallar el vídeo entero, y donde más ocurre es en los guiones largos: un tiroteo o un primer plano de sangre en una escena de acción, o menores bebiendo o fumando, hunden todo el vídeo. Lee el guion completo antes de enviarlo y elimina o reescribe esas tomas.

Personas reales

Para usar la foto de una persona real como referencia necesitas el derecho a usar su imagen; si un modelo admite referencias de personas reales se indica más arriba en esta página.

Tras un rechazo

Reenviar lo mismo vuelve a ser rechazado. Localiza la parte que probablemente falla, reescribe el prompt o cambia la referencia y vuelve a enviarlo.

Código de error: content_policy · status: failed

Códigos de error

Todos los errores llevan error.message / error.type / error.code / error.param; decide según code. Abajo están los más habituales; la lista completa está en Códigos de error.

HTTPcodeDescripción
401invalid_api_keyFalta la clave, o es inválida o está desactivada (missing_api_key, invalid_api_key).
402insufficient_quotaSaldo insuficiente, o la clave llegó a su presupuesto (insufficient_quota).
400invalid_requestUn parámetro incorrecto o un modelo desconocido (como model_not_found); error.param indica el campo.
—content_policyNo superó la revisión de contenido: se marcó el prompt, una referencia o la imagen o el sonido generados. No se cobra; lo mismo se rechazará de nuevo, así que reescribe el prompt o cambia la referencia. En los trabajos de vídeo llega en error cuando status es failed.
429rate_limit_exceededSuperaste el límite por minuto de esta clave o la cuota diaria de un modelo gratuito, o el modelo está al límite de su capacidad (rate_limit_exceeded). Espera los segundos de Retry-After si viene, o unos segundos si no, y reintenta.
502upstream_*El proveedor falló o tardó demasiado y los reintentos automáticos no bastaron; code indica el motivo, por ejemplo upstream_timeout o upstream_unavailable. No se cobra; puedes reintentar.

Lista completa de códigos de error →