KovAPIKovAPI
gemini-omni-1.2-flash

Gemini Omni 1.2 Flash · API

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

Gemini Omni 1.2 Flash es el modelo de generación y edición de vídeo que Google lanzó en noviembre de 2026. Envía un trabajo asíncrono con POST /v1/videos/generations: sin imagen es texto a vídeo, una imagen es el primer fotograma, dos son primer y último fotograma, de 1 a 3 imágenes de referencia, o un vídeo de 1 a 15 s para editarlo. 720P / 1080P / 4K, 16:9 o 9:16, con sonido y sin marca de agua visible. Se factura por segundo; las ediciones, por los segundos del original.

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": "gemini-omni-1.2-flash", "prompt": "un barco de papel flota por una calle de neones bajo la lluvia al anochecer mientras un niño con impermeable amarillo lo persigue riendo", "duration": 10, "resolution": "720P", "size": "16:9"}'

Respuesta (HTTP 202)

JSON
{
  "id": "img_5c2e8f1a9b3d7e6f0a4c8b2d",
  "object": "video.generation.job",
  "status": "queued",
  "created": 1791281400,
  "model": "gemini-omni-1.2-flash"
}

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": "gemini-omni-1.2-flash",
  "data": [
    {"url": "https://img.kovapi.com/i/8c1f0e5d2b7a49e3a6d0c4f1b9e2a7d5.mp4"}
  ],
  "usage": {"clips": 1, "model": "gemini-omni-1.2-flash"}
}

Paso 3 · data[0].url es el clip (MP4). Se guarda 7 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": "gemini-omni-1.2-flash",
    "prompt": "un barco de papel flota por una calle de neones bajo la lluvia al anochecer mientras un niño con impermeable amarillo lo persigue riendo",
    "duration": 10,
    "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("gemini-omni-1.2-flash.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ón3-15 s en pasos de un segundo (por defecto 10) · fotogramas 3-10 s · las ediciones siguen al original (1-15 s)
Resolución720P / 1080P / 4K
Proporción16:9 / 9:16
Imágenes de referenciaprimer fotograma 1 · primero y último 2 · referencias 1-3 · hasta 5 referencias en una edición
Edición de vídeoEdición de vídeo: un vídeo original de 1 a 15 s, mp4 / mov, hasta 50 MB · se factura por sus segundos
Audio de referenciano se admite
SonidoSiempre activo (describe diálogos, música y efectos en el prompt); no se puede desactivar (audio: false se rechaza)
Longitud del prompthasta 20 000 caracteres (el chino y el inglés cuentan igual)
Forma de cobroPor segundo: tarifa por segundo de la resolución elegida x la duración (en las ediciones, los segundos del original)

Parámetros de la petición

El cuerpo JSON de POST /v1/videos/generations:

ParámetroTipoObligatorioDescripción
modelstringSíEl ID del modelo: gemini-omni-1.2-flash.
promptstringSíDescribe el vídeo, la cámara, la acción y el sonido, hasta 20 000 caracteres (el chino y el inglés cuentan igual). Nombra varias referencias como @Image1 / @Image2; en una edición, di qué cambiar, p. ej. «hazlo de noche, deja todo lo demás igual». negative_prompt no está disponible: escribe en el prompt lo que no quieres.
durationintegerNoDuración: un entero de 3 a 15 segundos (por defecto 10); alias seconds. Modo de fotogramas: 3-10 s; en una edición no lo envíes, el resultado sigue la duración del original. Se factura por segundo; consulta Precios más abajo.
resolutionstringNoResolución: 720P (por defecto) / 1080P / 4K (1080P y 4K son el reescalado oficial; 4K vertical es 2160x3840). También se aceptan 720p, 1080p, 4k y 2160p. 360P no está disponible.
sizestringNoRelación de aspecto: 16:9 (por defecto) / 9:16; alias aspect_ratio. Otras proporciones se rechazan. En una edición, si se omite, se usa la orientación del original.
imagesarrayNoVarias imágenes (hasta 16 MB cada una): 2-3 son referencias por defecto (3 como máximo); con image_role=first_frame dos son primer y último fotograma; una edición admite hasta 5 referencias. También se aceptan image_urls e image_with_roles ([{"url": ..., "role": "first_frame" | "last_frame" | "reference"}]). Superar el límite se rechaza, nunca se recorta. Una imagen (URL pública, data: URI o base64): por defecto es el primer fotograma (3-10 s); con image_role=reference es una referencia. También se aceptan first_frame_image y last_frame_image.
image_rolestringNofirst_frame (primer fotograma o primero y último, 3-10 s) o reference (1-3 referencias). Si se omite, una imagen es el primer fotograma y 2-3 son referencias. También se aceptan otras formas habituales: first_frame_image, last_frame_image, image_urls, image_with_roles, omni_reference_task_type.
video_urlsarrayNoEdición de vídeo: un vídeo de 1 a 15 s (mp4 / mov, hasta 50 MB; enlace público, data:video/mp4;base64,... o una subida del Playground); alias video_url / video_references. El resultado sigue la duración del original y se factura por sus segundos; lo que pase del último segundo entero se corta (4,5 s se editan y facturan como 4 s). No se combina con fotogramas; la continuación (extend) no está disponible.
audiobooleanNoEste modelo siempre genera sonido (describe diálogos, música y efectos en el prompt); el parámetro se puede omitir (false se rechaza).
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.

Los demás campos (seed, negative_prompt, fps, watermark y similares) no se reenvían y no cambian el precio; los resultados siempre son MP4 y se devuelven como url.

Precio

Por segundo: coste = tarifa por segundo de la resolución elegida x la duración. Una edición se factura por los segundos del original (lo que pase del último segundo entero se corta y no se cobra). Las imágenes de referencia no se cobran. Ese importe se retiene al enviar y se cobra al terminar con éxito; los fallos se reembolsan íntegramente. 1 crédito = $0.005.

ResoluciónCréditos / sUSD / sClip de 10 segundosEdición de un original de 8 s
720P7$0.035$0.35$0.28
1080P10$0.05$0.50$0.40
4K20$0.10$1.00$0.80

Material de referencia

  • Primer / primer y último fotograma: una imagen en image es el primer fotograma; dos en images con image_role: first_frame son primer y último fotograma. Hasta 10 segundos. Haz coincidir la orientación de las imágenes con size.
  • Referencias: de 1 a 3 imágenes en images con image_role: reference (2-3 imágenes son referencias por defecto); las personas, objetos o escenarios aparecen en el clip sin convertirse en fotograma. Nómbralas @Image1 / @Image2 en el prompt.
  • Edición de vídeo: un vídeo de 1 a 15 s en video_urls y un prompt que diga qué cambiar, p. ej. «hazlo de noche bajo la luna, deja todo lo demás igual»; pueden acompañarlo hasta 5 imágenes de referencia («sustituye a la persona por la de @Image1»). Descargamos el original al enviar y lo medimos: ilegible, de menos de 1 s o de más de 15 s devuelve 400, sin cargo.
  • Aún no disponible: 360P, continuación (extend), vídeo / audio de referencia, negative_prompt (escribe en el prompt lo que no quieres).
  • Cada imagen puede ser una URL pública de imagen, un data: URI o base64, de hasta 16 MB; para enviar varias, ponlas en un array en images. Guardamos las imágenes antes de poner el trabajo en cola; si alguna no se puede leer, la petición se rechaza con 400, message indica cuál y no se cobra nada.
  • Los archivos de referencia que alojamos y los resultados se guardan 7 días.

Edición de vídeo: cambiar el escenario y poner a la persona de una imagen de referencia

curl
curl https://kovapi.com/v1/videos/generations \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "gemini-omni-1.2-flash", "prompt": "hazlo de noche bajo la luna y sustituye a la persona del centro por la de @Image1, deja todo lo demás igual", "video_urls": ["https://example.com/clip-8s.mp4"], "images": ["https://example.com/person.png"], "resolution": "720P"}'

El resultado sigue la duración del original; un original de 8 s se factura como 8 s y la imagen de referencia no se cobra.

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, 7 días.

Cuánto tarda

Nuestras pruebas: 3-6 s en 720P cerca de 1 minuto, 13 s en 1080P unos 2,5 minutos, 4K unos 3 minutos, ediciones cerca de 1,5 minutos; más con cola, hasta 20 minutos, después reembolso íntegro.

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_source_videoEl vídeo original no se aceptó: no se pudo leer su duración, dura menos de 1 s o más de 15 s, o el archivo está dañado.Envía en su lugar un mp4 / mov reproducible de 1 a 15 s; esta solicitud no se cobró.
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_policyEl prompt o una imagen de referencia no superaron la revisión de contenido del proveedor del modelo.Reescribe el prompt o cambia la referencia antes de volver a enviarlo; la misma entrada se rechaza otra vez.
invalid_requestEl proveedor del modelo no acepta esta combinación (por ejemplo, un modo y una resolución). message indica el motivo.Ajusta los parámetros según indica message y vuelve a enviarlo.
wait_timeoutVídeo: no hubo resultado en 120 minutos, así que el trabajo se dio por agotado y se reembolsaron todos los créditos; si el vídeo termina después, se entrega gratis.Vuelve a enviarlo.
upstream_errorCualquier otro fallo: los reintentos automáticos no bastaron, el trabajo esperó 15 minutos sin empezar, el proveedor lo rechazó sin dar motivo, etc.; message indica cuál.Volver a enviarlo suele funcionar.

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": "gemini-omni-1.2-flash", "prompt": "un barco de papel flota por una calle de neones bajo la lluvia al anochecer mientras un niño con impermeable amarillo lo persigue riendo", "duration": 10, "resolution": "720P", "size": "16:9", "callback_url": "https://your-domain.com/webhook"}'