KovAPIKovAPI
seedance-2.5-30s

Seedance 2.5 · Special · API

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

Duración entera de 4–30 s, 720P, 16:9 o 9:16. Hasta 30 imágenes y 10 audios de referencia; sin vídeo de referencia. $2/clip (400 créditos) sin audio de referencia y $3/clip (600 créditos) con él, independientemente de la duración. La banda sonora generada no es audio de referencia. Disponibilidad temporal, sin garantía de continuidad. El tiempo depende de la cola; consulte la tarea original sin reenviarla. Reembolso completo si falla.

Probar en el Playground →

Inicio rápido

Tres pasos: envía un trabajo, consúltalo y toma el enlace del vídeo. Sustituye YOUR_API_KEY por tu clave y los comandos de abajo funcionan tal cual.

Paso 1 · Envía el trabajo (devuelve al momento un id de trabajo, HTTP 202)

curl
curl https://kovapi.com/v1/videos/generations \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "seedance-2.5-30s", "prompt": "Un viajero recorre un pueblo de un valle en otoño desde el amanecer hasta el anochecer, la cámara lo sigue durante todo el recorrido", "duration": 25, "resolution": "720P", "size": "16:9"}'

Respuesta (HTTP 202)

JSON
{
  "id": "img_5c2e8f1a9b3d7e6f0a4c8b2d",
  "object": "video.generation.job",
  "status": "queued",
  "created": 1791281400,
  "model": "seedance-2.5-30s"
}

Paso 2 · Consulta cada 5–10 segundos hasta que status sea succeeded o failed

curl
curl https://kovapi.com/v1/videos/jobs/img_5c2e8f1a9b3d7e6f0a4c8b2d \
  -H "Authorization: Bearer YOUR_API_KEY"

Respuesta cuando sale bien

JSON
{
  "id": "img_5c2e8f1a9b3d7e6f0a4c8b2d",
  "object": "video.generation.job",
  "status": "succeeded",
  "created": 1791281400,
  "model": "seedance-2.5-30s",
  "data": [
    {"url": "https://img.kovapi.com/i/8c1f0e5d2b7a49e3a6d0c4f1b9e2a7d5.mp4"}
  ],
  "usage": {"clips": 1, "model": "seedance-2.5-30s"}
}

Paso 3 · data[0].url es el clip (MP4). Se guarda 15 días; descárgalo en tu propio almacenamiento para conservarlo más tiempo.

Ejemplo completo (Python: enviar, esperar y guardar en disco)

Python
import time
import requests

BASE = "https://kovapi.com/v1"
HEADERS = {"Authorization": "Bearer YOUR_API_KEY"}

# 1. enviar el trabajo
job = requests.post(f"{BASE}/videos/generations", headers=HEADERS, json={
    "model": "seedance-2.5-30s",
    "prompt": "Un viajero recorre un pueblo de un valle en otoño desde el amanecer hasta el anochecer, la cámara lo sigue durante todo el recorrido",
    "duration": 25,
    "resolution": "720P",
    "size": "16:9",
}).json()
if "error" in job:
    raise SystemExit(job["error"]["message"])

# 2. consultar cada 10 segundos, durante una hora como máximo
deadline = time.time() + 3600
while job["status"] not in ("succeeded", "failed") and time.time() < deadline:
    time.sleep(10)
    job = requests.get(f"{BASE}/videos/jobs/{job['id']}", headers=HEADERS).json()

# 3. descargar el vídeo
if job["status"] == "succeeded":
    url = job["data"][0]["url"]
    with open("seedance-2.5-30s.mp4", "wb") as f:
        f.write(requests.get(url).content)
    print("saved", url)
elif job["status"] == "failed":
    print("failed:", job["error"]["code"], job["error"]["message"])
else:
    print("still", job["status"], job["id"])

Mientras está en cola, la consulta también devuelve queue_position (trabajos por delante del tuyo) y eta_seconds (espera estimada). Si se agota el tiempo máximo que fijaste, no vuelvas a enviarlo: el trabajo sigue ahí, así que vuelve a consultar el mismo id más tarde.

Autenticación

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

Crea una clave API en la consola para empezar.

De un vistazo

Duración4–30 s
Resolución720P
Proporción16:9 / 9:16
Imágenes de referenciahasta 30 · como referencia (sujeto, escena, estilo), nunca como fotograma
Vídeos de referenciano se admite
Audio de referenciahasta 10
Sonidosiempre activado; no se puede desactivar (audio: false se rechaza)
Forma de cobropor clip: un solo precio, sea cual sea la duración

Parámetros de la petición

ParámetroTipoObligatorioDescripción
modelstringSíID del modelo; aquí seedance-2.5-30s.
promptstringSíDescribe el contenido, la cámara y las acciones.
durationintegerNoDuracion en segundos, cualquier entero de 4 a 30 (por defecto 30, es decir el mas largo: se factura POR CLIP, asi que la duracion no cambia el precio); alias seconds.
resolutionstringNo720P
sizestringNoRelación de aspecto: 16:9 / 9:16 (por defecto 16:9); alias aspect_ratio. Este modelo no admite 21:9.
imagestringNoImage-to-video: include a reference image (public URL, data: URI or base64); omit for text-to-video.
imagesarrayNoVarias imágenes de referencia. Hasta 30. Si superas el límite se rechaza en lugar de recortar. Alias reference_images.
audio_referencestring / arrayNoURL HTTPS pública o lista, hasta 10 audios; requiere al menos una imagen. MP3/WAV/M4A, hasta 15 MB y 30 s cada uno. Con audio de referencia: $3 (600 créditos) por clip.
audiobooleanNoCada clip sale con sonido y no se puede desactivar; false se rechaza (400), así que no lo envíes.
callback_urlstringNoAdónde enviar el resultado cuando termine el trabajo; consulta la sección de webhooks más abajo.
nintegerNoCada trabajo genera un solo clip; no hace falta enviarlo. Un valor mayor que 1 también genera un solo clip, pero al enviar se retiene el precio de n clips y lo retenido de más se devuelve cuando termina el trabajo.

Precio

Disponibilidad temporal · por clip

Créditos / clipUSD / clip
Sin audio de referencia400$2.00
Con audio de referencia600$3.00

Duración entera de 4–30 s, 720P, 16:9 o 9:16. Hasta 30 imágenes y 10 audios de referencia; sin vídeo de referencia. $2/clip (400 créditos) sin audio de referencia y $3/clip (600 créditos) con él, independientemente de la duración. La banda sonora generada no es audio de referencia. Disponibilidad temporal, sin garantía de continuidad. El tiempo depende de la cola; consulte la tarea original sin reenviarla. Reembolso completo si falla.

Material de referencia

Duración entera de 4–30 s, 720P, 16:9 o 9:16. Hasta 30 imágenes y 10 audios de referencia; sin vídeo de referencia. $2/clip (400 créditos) sin audio de referencia y $3/clip (600 créditos) con él, independientemente de la duración. La banda sonora generada no es audio de referencia. Disponibilidad temporal, sin garantía de continuidad. El tiempo depende de la cola; consulte la tarea original sin reenviarla. Reembolso completo si falla.

Hasta 30 imágenes de referencia fijan el sujeto, la escena y el estilo, y nunca se usan como fotograma; menciónalas en el prompt como @Image1, @Image2.

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.

JSON · $3
{
  "model": "seedance-2.5-30s",
  "prompt": "Follow @Image1 and use @Audio1 as the soundtrack",
  "duration": 25, "resolution": "720P", "size": "16:9",
  "images": ["https://example.com/reference.png"],
  "audio_reference": ["https://example.com/reference.mp3"]
}

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. El audio de referencia que subas también se revisa, y la música con derechos de autor usada como referencia puede ser rechazada.

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

upstream_line_unavailable: Si el servicio está sobrecargado o se agota la capacidad, el error es upstream_line_unavailable. Las tareas fallidas no se cobran y se devuelven los créditos reservados; inténtalo más tarde. Este error no señala un problema concreto de parámetros o materiales. Los errores de duración, referencias ilegibles y revisión conservan duration_rejected, reference_unreadable y content_policy; sigue la indicación correspondiente.

Estado y campos del trabajo

GET /v1/videos/jobs/{id} devuelve estos estados; cada campo se describe en Trabajos asíncronos. Consulta cada 5–10 segundos o deja que un webhook (más abajo) te envíe el resultado. Las consultas son gratis, y cualquier clave de la misma cuenta puede consultar el trabajo.

EstadoSignificado
queuedEn cola. Incluye queue_position (trabajos por delante del tuyo) y eta_seconds (espera estimada).
processingGenerándose.
succeededTerminado. El resultado está en data[0].url y el detalle del cobro en usage.
failedFalló. El motivo está en error; los créditos reservados se devuelven íntegros.
  • processing puede volver a queued, por ejemplo mientras el servicio está saturado, mientras se vuelve a obtener un clip ya terminado o tras un reinicio del servicio. Si un trabajo no se puede terminar, la pasarela puede volver a generarlo automáticamente; se reintente las veces que se reintente, el trabajo se cobra una sola vez.
  • Cada cuenta ejecuta hasta 50 trabajos a la vez; los demás esperan en orden de envío, y un trabajo que no ha empezado a los 15 minutos falla y se reembolsa íntegro. Los registros de trabajos se guardan 3 días y los enlaces de los vídeos, 15 días.

Cuánto tarda

Duración entera de 4–30 s, 720P, 16:9 o 9:16. Hasta 30 imágenes y 10 audios de referencia; sin vídeo de referencia. $2/clip (400 créditos) sin audio de referencia y $3/clip (600 créditos) con él, independientemente de la duración. La banda sonora generada no es audio de referencia. Disponibilidad temporal, sin garantía de continuidad. El tiempo depende de la cola; consulte la tarea original sin reenviarla. Reembolso completo si falla.

Errores y reembolsos

Un error al enviar se devuelve al momento como HTTP 4xx / 5xx: no se crea ningún trabajo y no se cobra nada. Un fallo después de que el trabajo fue aceptado lo informa el endpoint del trabajo, y la retención se reembolsa íntegra. Todos los códigos están en Códigos de error.

Errores al enviar

HTTPcodeCausaQué hacer
400invalid_requestUn parámetro no es válido: la duración, la resolución, la proporción o la cantidad de referencias está fuera del rango de este modelo, el prompt es demasiado largo, no se puede leer una imagen o un vídeo de referencia, se envió audio: false a un modelo cuyos clips siempre llevan sonido, etc. message indica cuál.Corrige lo que indica message y vuelve a enviar la petición.
400invalid_callback_urlcallback_url no es una dirección http(s) pública o supera los 2000 caracteres.Usa una dirección accesible desde internet.
400model_not_foundEl ID del modelo está mal escrito, falta model, o el modelo no se puede usar en este endpoint (por ejemplo, un modelo de chat en el endpoint de imágenes).Usa un ID de modelo de GET /v1/models o de la referencia de la API.
401invalid_api_keyLa clave no existe, se eliminó o está desactivada, o la cuenta está desactivada.Revisa la clave en la página API Keys de la consola.
402insufficient_quotaNo hay saldo suficiente para retener el importe de esta petición. La pasarela retiene primero el coste máximo posible de la petición, así que una ráfaga de llamadas simultáneas también puede provocarlo.Si se debe a una ráfaga, espera unos segundos y reintenta; si no, recarga.
429rate_limit_exceededSe superó el límite de peticiones por minuto configurado en esta clave (contado sobre los últimos 60 segundos). Sin cabecera Retry-After.Espera unos segundos y reintenta, o sube el límite de la clave en la consola.
503model_maintenanceEl modelo está en mantenimiento y no acepta peticiones; mientras tanto, ningún otro modelo responde en su lugar.Reintenta cuando termine el mantenimiento; consulta el estado del servicio.
503service_unavailableUn fallo temporal de nuestro lado, por ejemplo al guardar un archivo de referencia. No se creó ningún trabajo y no se cobró nada.Reintenta en breve.

Trabajos fallidos (status failed)

codeCuándo apareceQué hacer
content_policyVídeo: el prompt, una referencia, o la imagen o el sonido generados no superaron la revisión de contenido (param es audio cuando lo que se marcó fue el sonido). Wan Standard y Prime: la entrada no superó la revisión. error.reason es FaceDetectionSuspect (posible rostro humano real) o DataInspectionFailed (fallo de revisión del contenido de entrada). error.message explica el motivo y cómo ajustar la solicitud. Las tareas fallidas no se cobran.Reescribe el prompt o cambia la referencia antes de volver a enviarlo; la misma entrada se rechaza otra vez.
duration_rejectedVídeo: no se aceptó la duración. Lo más habitual es que un audio o un vídeo de referencia supere el límite, aunque sea por una fracción de segundo.Recorta el audio o el vídeo de referencia hasta quedar dentro del límite y vuelve a enviarlo; la misma entrada volverá a fallar.
reference_unreadableVídeo: el modelo no pudo descargar una imagen, un vídeo o un audio de referencia; lo más habitual es que el enlace sea una página web, como YouTube o una carpeta compartida en la nube.Usa un enlace que descargue el archivo en sí o sube el archivo en el Playground; la misma entrada volverá a fallar.
invalid_video_requestLos parámetros o las referencias se rechazaron al enviar; no se generó nada.Revise la duración, el formato y las referencias, y vuelva a enviar. No se cobra.
special_failedLa generación falló y no se obtuvo ningún vídeo.No se cobra. Puede volver a enviarla sin cambios.
special_unknownNo hubo una respuesta clara sobre si se aceptó el envío. Para no generar dos veces, no se volvió a enviar.No se cobra. Puede volver a enviarla.
special_fetchEl vídeo se generó, pero no se pudo recuperar el archivo tras varios intentos.No se cobra. Vuelva a enviarla.
special_unavailableEsta tarifa no estaba disponible, o el trabajo no empezó en 120 minutos.No se cobra. Inténtelo más tarde.

Decide según code, no según el texto de message. Trata cualquier code que no reconozcas (o un error sin code) como upstream_error: volver a enviarlo suele funcionar. Todos los trabajos fallidos se reembolsan íntegros.

Webhooks en lugar de consultas

Añade callback_url al enviar y, en cuanto termine el trabajo, con éxito o con error, la pasarela enviará a esa URL exactamente lo mismo que devuelve el endpoint de consulta, firmado y con reintentos si la entrega falla. También puedes configurar una dirección para toda la cuenta en Configuración → Webhook, en la consola. Documentación de webhooks →

curl · callback_url
curl https://kovapi.com/v1/videos/generations \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "seedance-2.5-30s", "prompt": "Un viajero recorre un pueblo de un valle en otoño desde el amanecer hasta el anochecer, la cámara lo sigue durante todo el recorrido", "duration": 25, "resolution": "720P", "size": "16:9", "callback_url": "https://your-domain.com/webhook"}'