API de vídeo MiniMax H3: clips en 1080P con sonido nativo siempre activado y cobro por segundo. 5–15 segundos, seis proporciones, incluida 21:9; una imagen como primer fotograma, dos como primer y último fotograma, o hasta 5 como referencias. Trabajos asíncronos; los fallos no se cobran.
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 https://nezhagate.com/v1/videos/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "minimax-h3", "prompt": "Sale vapor de una taza de café mientras cae una lluvia fina al otro lado de la ventana, la cámara la rodea lentamente", "duration": 6, "resolution": "1080P", "size": "16:9"}'Respuesta (HTTP 202)
{
"id": "img_5c2e8f1a9b3d7e6f0a4c8b2d",
"object": "video.generation.job",
"status": "queued",
"created": 1791281400,
"model": "minimax-h3"
}Paso 2 · Consulta cada 5–10 segundos hasta que status sea succeeded o failed
curl https://nezhagate.com/v1/videos/jobs/img_5c2e8f1a9b3d7e6f0a4c8b2d \ -H "Authorization: Bearer YOUR_API_KEY"
Respuesta cuando sale bien
{
"id": "img_5c2e8f1a9b3d7e6f0a4c8b2d",
"object": "video.generation.job",
"status": "succeeded",
"created": 1791281400,
"model": "minimax-h3",
"data": [
{"url": "https://img.nezhagate.com/i/8c1f0e5d2b7a49e3a6d0c4f1b9e2a7d5.mp4"}
],
"usage": {"clips": 1, "model": "minimax-h3"}
}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)
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": "minimax-h3",
"prompt": "Sale vapor de una taza de café mientras cae una lluvia fina al otro lado de la ventana, la cámara la rodea lentamente",
"duration": 6,
"resolution": "1080P",
"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("minimax-h3.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
Authorization: Bearer YOUR_API_KEY Content-Type: application/json
Crea una clave API en la consola para empezar.
De un vistazo
| Duración | 5–15 s |
| Resolución | 1080P |
| Proporción | 16:9 / 9:16 / 21:9 / 4:3 / 1:1 / 3:4 |
| Imágenes de referencia | hasta 5 · una como primer fotograma, dos como primer y último fotograma; para más, hace falta el modo de referencia |
| Vídeos de referencia | no se admite |
| Audio de referencia | no se usa (se acepta sin error, pero no tiene efecto) |
| Sonido | siempre activado; no se puede desactivar (audio: false se rechaza) |
| Longitud del prompt | hasta 2 000 bytes (UTF-8; unos 666 caracteres chinos) |
| Forma de cobro | por segundo: tarifa × los segundos que pides |
Parámetros de la petición
El cuerpo JSON de POST /v1/videos/generations:
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| model | string | Sí | El ID del modelo: minimax-h3. |
| prompt | string | Sí | Lo que ocurre en el clip: escena, cámara y movimiento. Hasta 2 000 bytes (UTF-8; un carácter chino cuenta como 3 bytes, así que caben unos 666). |
| duration | integer | No | Duración en segundos: cualquier entero de 5 a 15; si se omite, 5. Alias: seconds. |
| resolution | string | No | Solo 1080P; no hace falta enviarlo. |
| size | string | No | Proporción: 16:9 / 9:16 / 21:9 / 4:3 / 1:1 / 3:4; si se omite, 16:9. Alias: aspect_ratio. |
| images | array | No | Imágenes: una pasa a ser el primer fotograma y dos, el primer y el último fotograma; con image_role: reference son referencias, hasta 5. Una sola imagen puede ir en image. |
| image_role | string | No | Cómo se usan las imágenes: first_frame (por defecto: primer fotograma, o primer y último fotograma; 2 imágenes como máximo) o reference (referencias; el sujeto puede aparecer en cualquier parte del clip). |
| audio_reference | array | No | Este modelo no usa audio de referencia: se acepta sin error, pero no tiene efecto. |
| audio | boolean | No | Cada clip sale con sonido y no se puede desactivar; false se rechaza (400), así que no lo envíes. |
| callback_url | string | No | Adónde enviar el resultado cuando termine el trabajo; consulta la sección de webhooks más abajo. |
| n | integer | No | Cada 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 cobra por segundo: coste = tarifa por segundo de la resolución elegida × los segundos que pides. Ese importe se retiene al enviar, se liquida tal cual si sale bien y se reembolsa íntegro si falla. 1 crédito = $0.005.
| Resolución | Créditos / s | USD / s | Clip de 6 segundos |
|---|---|---|---|
| 1080P | 7.2 | $0.036 | $0.216 |
Material de referencia
- Por defecto se usa el modo de primer fotograma: una imagen es el primer fotograma (el clip empieza con esa imagen) y dos son el primer y el último fotograma; más de dos se rechaza.
image_role: referencecambia a referencias: hasta 5 imágenes cuyas personas u objetos aparecen en el clip, en cualquier parte del encuadre.- No admite vídeo de referencia; el audio de referencia se acepta, pero no se usa. Todos los clips llevan sonido.
- 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 enimages. Guardamos las imágenes antes de poner el trabajo en cola; si alguna no se puede leer, la petición se rechaza con 400,messageindica cuál y no se cobra nada. - Los archivos de referencia que alojamos se guardan 7 días; los resultados, 15 días.
Primer fotograma: dar vida a una imagen
curl https://nezhagate.com/v1/videos/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "minimax-h3", "prompt": "La persona de la imagen se gira y camina hacia la ventana mientras la brisa levanta la cortina", "image": "https://example.com/first-frame.png", "duration": 6, "size": "16:9"}'El clip empieza con esta imagen. Para usar varias imágenes como referencias, añade "image_role": "reference".
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.
| Estado | Significado |
|---|---|
| queued | En cola. Incluye queue_position (trabajos por delante del tuyo) y eta_seconds (espera estimada). |
| processing | Generándose. |
| succeeded | Terminado. El resultado está en data[0].url y el detalle del cobro en usage. |
| failed | Falló. El motivo está en error; los créditos reservados se devuelven íntegros. |
processingpuede volver aqueued, 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
Normalmente 5–10 minutos; algunos tardan unos 15.
Llamadas reales de los últimos 30 días: mediana 4.6 min; el 90% termina en 13.9 min o menos.
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
| HTTP | code | Causa | Qué hacer |
|---|---|---|---|
| 400 | invalid_request | Un 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. |
| 400 | invalid_callback_url | callback_url no es una dirección http(s) pública o supera los 2000 caracteres. | Usa una dirección accesible desde internet. |
| 400 | model_not_found | El 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. |
| 401 | invalid_api_key | La 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. |
| 402 | insufficient_quota | No 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. |
| 429 | rate_limit_exceeded | Se 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. |
| 503 | model_maintenance | El 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. |
| 503 | service_unavailable | Un 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)
| code | Cuándo aparece | Qué hacer |
|---|---|---|
| upstream_error | Esta vez no salió ningún clip: el contenido no superó la revisión, todas las líneas estaban ocupadas, el trabajo esperó 15 minutos sin empezar, etc.; message indica el motivo. | 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 https://nezhagate.com/v1/videos/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "minimax-h3", "prompt": "Sale vapor de una taza de café mientras cae una lluvia fina al otro lado de la ventana, la cámara la rodea lentamente", "duration": 6, "resolution": "1080P", "size": "16:9", "callback_url": "https://your-domain.com/webhook"}'