NezhaGateNezhaGate
POST https://nezhagate.com/v1/videos/generations

Kling 4.0 es el modelo de vídeo de nueva generación de Kling, de Kuaishou. Envía un trabajo asíncrono con POST /v1/videos/generations: sin referencias es texto a vídeo, o hasta 10 imágenes, 5 vídeos y 3 audios de referencia juntos. De 3 a 30 segundos, 720P / 1080P, 16:9 o 9:16, siempre con sonido. Se factura por segundo; con vídeos de referencia se facturan los segundos de salida más los de los vídeos de referencia.

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://nezhagate.com/v1/videos/generations \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "kling-4.0", "prompt": "una bailarina gira entre hojas de arce que caen mientras la cámara la rodea despacio", "duration": 5, "resolution": "720P", "size": "16:9"}'

Respuesta (HTTP 202)

JSON
{
  "id": "img_5c2e8f1a9b3d7e6f0a4c8b2d",
  "object": "video.generation.job",
  "status": "queued",
  "created": 1791281400,
  "model": "kling-4.0"
}

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

curl
curl https://nezhagate.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": "kling-4.0",
  "data": [
    {"url": "https://img.nezhagate.com/i/8c1f0e5d2b7a49e3a6d0c4f1b9e2a7d5.mp4"}
  ],
  "usage": {"clips": 1, "model": "kling-4.0"}
}

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://nezhagate.com/v1"
HEADERS = {"Authorization": "Bearer YOUR_API_KEY"}

# 1. enviar el trabajo
job = requests.post(f"{BASE}/videos/generations", headers=HEADERS, json={
    "model": "kling-4.0",
    "prompt": "una bailarina gira entre hojas de arce que caen mientras la cámara la rodea despacio",
    "duration": 5,
    "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("kling-4.0.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ónde 3 a 30 s en pasos de un segundo (5 s por defecto)
Resolución720P / 1080P
Proporción16:9 / 9:16
Imágenes de referenciahasta 10 · todas como referencias (personajes, vestuario, objetos, escenarios), nunca primer fotograma
Vídeos de referenciahasta 5 · cada uno de 2 a 30 s y de 700 a 4553 px de alto, 30 s en total · cuentan en los segundos facturados
Audio de referenciahasta 3 · cada uno de 5 a 30 s de voz humana clara, fija la voz · no se cobra
Sonidosiempre activo, no se puede desactivar (audio: false se rechaza)
Longitud del prompthasta 2500 caracteres (el chino y el inglés cuentan igual)
Forma de cobropor segundo: (segundos de salida + segundos de los vídeos de referencia) x tarifa de la resolución

Parámetros de la petición

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

ParámetroTipoObligatorioDescripción
modelstringSíEl ID del modelo: kling-4.0.
promptstringSíQué pasa, la cámara, la acción y el sonido, hasta 2500 caracteres. Con referencias, indica para qué sirve cada una, p. ej. «el personaje de la imagen 1 blande la lanza en el bosque de la imagen 2, con los movimientos del vídeo de referencia, y dice con la voz del audio de referencia: ¡vamos!».
durationintegerNoDuración de salida, un entero de 3 a 30, por defecto 5; alias seconds.
resolutionstringNo720P (por defecto) o 1080P.
sizestringNo16:9 (por defecto) o 9:16; alias aspect_ratio. Otras proporciones se rechazan (400).
imagesarrayNoHasta 10 imágenes de referencia (enlaces públicos, data: URI o base64, 16 MB como máximo cada una); también image (una) o reference_images. Todas son referencias, nunca primer fotograma; start_frame, end_frame e image_role=first_frame se rechazan.
video_referencesarrayNoHasta 5 vídeos de referencia (mp4 / mov, cada uno de 2 a 30 s, de 700 a 4553 px de alto y hasta 50 MB, 30 s en total): enlaces de descarga directa, base64 (data:video/mp4;base64,...) o enlaces de una subida en el Playground. Se factura por segundo, ver Precios más abajo.
audio_referencearrayNoHasta 3 audios de referencia (mp3 / wav / m4a, cada uno de 5 a 30 s y hasta 15 MB) que fijan la voz de un personaje: solo voz humana clara (la música o los efectos fallan); solo enlaces http(s), junto con una imagen o un vídeo de referencia. No se cobra.
audiobooleanNoCada vídeo trae 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.

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

Se factura por segundo: coste = tarifa por segundo de la resolución x (segundos de salida + los segundos de cada vídeo de referencia). El mismo enlace de vídeo cuenta una vez; las imágenes y los audios de referencia son gratis. El importe se retiene al enviar, se liquida igual si sale bien y se reembolsa íntegro si falla. 1 crédito = $0.005.

ResoluciónCréditos / sUSD / sClip de 5 segundos10 s de salida + vídeo de referencia de 5 s (15 s facturados)
720P18$0.09$0.45$1.35
1080P25$0.125$0.625$1.875

Material de referencia

  • Imágenes de referencia: son referencias, nunca primer fotograma. Indica en el prompt para qué sirve cada una por su número, p. ej. «el personaje de la imagen 1», «el escenario de la imagen 2».
  • Vídeos de referencia: fijan el movimiento y la cámara y se combinan con imágenes. Cada uno de 2 a 30 s y de 700 a 4553 px de alto (p. ej. 1280x720 horizontal o 720x1280 vertical; un vídeo 480P falla), 30 s en total. Al enviar descargamos y medimos cada uno: uno cuya duración no se puede leer, demasiado corto o con poca altura recibe un 400 y no se cobra.
  • Audio de referencia: fija la voz de un personaje y debe ser de 5 a 30 s de voz humana clara; la música, los efectos o los clips de menos de 5 s se rechazan. Escribe en el prompt las frases que se dicen.
  • 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 se guardan 7 días; los resultados, 15 días.

Con imágenes, un vídeo y un audio de referencia

curl
curl https://nezhagate.com/v1/videos/generations \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "kling-4.0", "prompt": "el personaje de la imagen 1 blande la lanza en el bosque de la imagen 2 con los movimientos del vídeo de referencia y grita con la voz del audio de referencia: vamos", "images": ["https://example.com/character.png", "https://example.com/forest.png"], "video_references": ["https://example.com/moves-1280x720.mp4"], "audio_reference": ["https://example.com/voice-8s.mp3"], "duration": 10, "resolution": "720P", "size": "16:9"}'

Este trabajo genera 10 s con un vídeo de referencia de 5 s, así que se facturan 15 segundos; el audio de referencia es gratis.

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 todas las líneas están ocupadas, mientras se vuelve a obtener un clip ya terminado o tras un reinicio del servicio. Si una línea no puede terminar un trabajo, la pasarela puede pasarlo a la siguiente línea para generarlo de nuevo; pase por las líneas que pase, 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

Nuestras pruebas (720P / 1080P, 3-5 s) tardaron normalmente 3-5 minutos; tarda más si hay cola. Esperamos hasta 120 minutos y reembolsamos íntegro si se agota el tiempo.

Mediana del tiempo de generación en nuestras pruebas: 3.3 min.

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_rejectedNo se aceptó una referencia: el audio de referencia no es de 5 a 30 s de voz humana clara, o un vídeo de referencia tiene una duración no válida. Con param audio es el audio.Usa una voz de al menos 5 s (o quita el audio de referencia) y recorta los vídeos de referencia a 2-30 s antes de reenviar; sin cambios vuelve a fallar.
render_failedVídeo: esta vez no salió ningún clip; suele ser algo puntual.Volver a enviar la misma petición suele funcionar.
render_timeoutVídeo: la cola o el render tardaron demasiado y el proveedor abandonó el trabajo.Vuelve a enviarlo.
result_fetch_failedEl vídeo se generó, pero su descarga o almacenamiento falló una y otra vez de nuestro lado.Vuelve a enviarlo.
upstream_errorCualquier otro fallo: se probaron todas las líneas, 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://nezhagate.com/v1/videos/generations \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "kling-4.0", "prompt": "una bailarina gira entre hojas de arce que caen mientras la cámara la rodea despacio", "duration": 5, "resolution": "720P", "size": "16:9", "callback_url": "https://your-domain.com/webhook"}'