Tu primer POST regresó en diez segundos con un task_id. Parecía una victoria.
Luego no pasó nada durante seis minutos. Habías copiado while status != "Success" de algún tutorial, y el bucle simplemente giraba, porque este endpoint ya no devuelve la palabra Success. Así que cambiaste a un webhook. No llegó ni una sola notificación, y nada en ninguna parte te dijo por qué. A la mañana siguiente fuiste a buscar el render del día anterior y el enlace daba 404.
Esas cuatro cosas parecen no estar relacionadas. Ninguna es culpa del modelo. Las cuatro son el contrato asíncrono, que casi nadie escribe. Aquí está el contrato completo, más un cortometraje real de dos tomas que salió al otro lado.
Conclusiones clave
- Tres endpoints, un bucle: create devuelve un
task_idy cuelga, tú haces polling, descargas. Todo lo difícil vive después de la llamada create. - Los cinco estados reales son
queued,running,succeeded,failed,cancelled. No existe el estadoexpired, sin importar lo que te haya dicho una publicación de blog. - Dos cosas caducan, y ninguna es un estado: la URL de descarga tiene límite de tiempo, y el registro de la tarea solo se puede consultar durante 7 días.
- Si usas un callback, MiniMax primero envía una solicitud de verificación con un campo
challengey debes devolverlo sin cambios en menos de 3 segundos. Si fallas, no obtienes ningún error, solo silencio para siempre. - Para generación solo de texto,
ratioes obligatorio y no puede seradaptive. Para imagen a video, el primer fotograma decide el encuadre, y cualquierratioque pases se ignora.
Lo terminado primero
Toda la recompensa de este tutorial: dos tomas de MiniMax H3 a 2K, concatenadas, 14.6 segundos. La toma A es imagen a video a partir de un primer fotograma generado, la toma B es texto a video. Enciende el sonido. El audio no es una banda sonora superpuesta; H3 renderizó los engranajes, la lluvia y la línea susurrada como parte de la misma generación.
Tres llamadas a la API hicieron eso. Un modelo de imagen para el primer fotograma, dos endpoints de H3 para las tomas, una línea de ffmpeg para unirlas. El código a continuación es el código que lo hizo.
Por qué la mayoría de los tutoriales de MiniMax H3 se rompen en la segunda solicitud
Casi todas las guías para este modelo se detienen en la llamada create. Esa es la mitad fácil. La llamada create valida tu carga útil, te entrega un task_id y se desconecta, y luego te quedas solo con un trabajo que lleva minutos y un conjunto de reglas que nadie imprimió.
Los fallos son aburridamente repetibles. Encontré cinco de estos seis en una tarde.
| Síntoma | Lo que ves | Causa real | Solución |
|---|---|---|---|
| El bucle de polling nunca sale | El terminal imprime para siempre, el trabajo terminó hace tiempo | Tu condición de salida compara con palabras v1 como Success / Fail. El endpoint de consulta v2 devuelve succeeded / failed en minúsculas | Compara con el enum v2, y lanza una excepción para cualquier estado que no reconozcas |
| 400 instantáneo en texto a video | Solicitud rechazada antes de que comience cualquier render | ratio faltante, o establecido en adaptive, que el modo solo texto rechaza | Pasa un ratio explícito como 16:9 |
| Tu ratio se ignora en silencio | El fotograma de salida no es el que pediste | Imagen a video deriva el fotograma de la imagen del primer fotograma, por lo que ratio no hace nada allí | Recorta o genera el primer fotograma con el encuadre que deseas |
| El webhook nunca se dispara, sin error | Cero notificaciones, registros limpios, sin queja de la API | El handshake de verificación falló. MiniMax envió un challenge y tu endpoint no lo devolvió sin cambios en 3 segundos | Responde al challenge de forma síncrona, antes de cualquier middleware de autenticación o cola |
| La URL de ayer da 404 | El enlace de descarga está muerto, el render parece desaparecido | La URL de descarga tiene límite de tiempo. El render está bien | Consulta el mismo task_id de nuevo para obtener una URL fresca, dentro de la ventana de 7 días |
| 429s aleatorios bajo carga | Algunos envíos rechazados, sin cola | La concurrencia tiene un límite, y es un límite estricto, no una línea de espera | Limita tu propio recuento de trabajos en vuelo y reintenta el envío, no el render |
La primera fila es la que se come noches enteras, y vale la pena ser precisos al respecto. La API de video anterior de MiniMax informaba el progreso con palabras en mayúsculas de la familia Preparing / Queueing / Processing / Success / Fail. El endpoint de consulta v2 utilizado por H3 devuelve queued, running, succeeded, failed, cancelled (Referencia de API de MiniMax, agosto de 2026). Muchos documentos de revendedores externos aún imprimen el conjunto antiguo, o mezclan ambos en una página. Si heredaste un bucle de uno de esos, no puede terminar, porque la cadena que espera nunca se envía.
Flujo de trabajo del tutorial de MiniMax H3: Tres endpoints, cinco estados, un bucle
H3 se lanzó el 31 de julio de 2026 como un modelo de video omni-modal: texto, imagen, video y audio viven todos en la misma ventana de contexto, salida de hasta 15 segundos a 2K con audio estéreo nativo (MarkTechPost, agosto de 2026). Para la API, eso significa un endpoint create con un array content, y lo que pongas en el array decide en qué modo estás.
| Modo | Qué va en content | role en el elemento de imagen | Qué hace ratio | Úsalo para |
|---|---|---|---|---|
| Texto a video | un elemento de texto | ninguna | Obligatorio, y adaptive es rechazado | Tomas sin imagen de origen, control total del encuadre |
| Imagen a video | elemento de texto más elemento de imagen | first_frame (opcionalmente también last_frame) | Ignorado, el primer fotograma decide | Animar una imagen fija que ya has dirigido artísticamente |
| Referencia a video | elemento de texto más elemento de referencia | reference_image (también reference_video, reference_audio) | Obligatorio, igual que solo texto | Mantener un personaje o una voz consistentes entre tomas |
Y la parte que tu código realmente tiene que manejar. Cinco estados, cinco ramas diferentes.
| Estado | Qué significa | Qué hace tu código |
|---|---|---|
| queued | Aceptado, esperando un espacio | Sigue haciendo polling, retrocede |
| running | Renderizando | Sigue haciendo polling, retrocede |
| succeeded | Terminado, content.url está poblado | Descarga inmediatamente, en esta iteración |
| failed | El render falló | Lee el cuerpo del error, regístralo, no reintentes a ciegas la misma carga útil |
| cancelled | El trabajo fue cancelado | Sale del bucle, trátalo como terminal |
| cualquier otra cosa | No está en el enum | Lanza una excepción. Un nuevo estado que tratas silenciosamente como "sigue esperando" es el error de la tabla de arriba |
No existe el estado expired. Esa palabra se asocia mucho a esta API y pertenece a otras dos cosas: la URL de descarga, que tiene límite de tiempo y es actualizable, y el registro de la tarea, que solo se puede consultar durante los últimos 7 días. Ambos se cubren en el Paso 4.
Un número más antes del código. La concurrencia para la generación de video en H3 está limitada por el recuento de conexiones, no por solicitudes por minuto: 2 tareas concurrentes en el nivel gratuito, 15 una vez que pagas (Límites de tasa de MiniMax, agosto de 2026). Más allá del límite, obtienes un 429 inmediatamente. Nada se pone en cola por ti. También he enviado 20 trabajos H3 concurrentes a través de una puerta de enlace de enrutamiento y los 20 llegaron, y he tenido un 429 en la misma configuración en otro día, así que trata cualquier número superior al límite documentado como clima, no como una constante.
Directo o a través de una puerta de enlace
Los tres pasos son los mismos de cualquier manera, pero las cadenas difieren, y eso importa cuando estás depurando a la 1 a.m.
| MiniMax directo | Puerta de enlace unificada (Atlas Cloud) | |
|---|---|---|
| Enviar | POST /v2/video_generation | POST /api/v1/model/generateVideo |
| Polling | GET /v2/query/video_generation/{task_id} | GET /api/v1/model/prediction/{id} |
| Palabras de estado | queued / running / succeeded / failed / cancelled | completed en éxito, failed en fallo |
| Notificaciones push | URL de callback con el handshake de desafío de 3 segundos | Polling del id de predicción |
| Concurrencia | 2 gratis, 15 de pago, 429 estricto | No publicado como un límite por modelo, medido más amplio en la práctica |
| Modelo de imagen de primer fotograma en la misma clave | No, cuenta separada | Sí, GPT Image 2 y H3 están detrás de una clave |
| Precio de H3 | Publicado por nivel de resolución | Por segundo de salida, escalonado por resolución, cotizado en el botón Ejecutar antes de enviar |
La razón por la que ejecuté la cadena de este tutorial en una puerta de enlace es puramente la penúltima fila: el primer fotograma proviene de un modelo de imagen de OpenAI y las dos tomas provienen de MiniMax, y no quería dos proveedores, dos claves y dos páginas de facturación para una película de 14 segundos. Si ya estás dentro de la plataforma de MiniMax, quédate allí, el bucle a continuación funciona sin cambios aparte de las rutas y las palabras de estado.
Generador de video Hailuo AI: Cómo usarlo antes de escribir cualquier código
Si llegaste aquí buscando cómo usar el generador de video Hailuo AI, estás en el lugar correcto y no necesitas nada del código todavía. Hailuo es la aplicación orientada al consumidor de MiniMax y H3 es el nombre del modelo que usa la API. Mismo motor, puerta diferente.
Tres minutos, sin terminal:
- Abre una página de modelo, por ejemplo MiniMax H3 imagen a video. El playground es el panel derecho de la página.
- Coloca una imagen de primer fotograma, o cambia a la página de texto a video y simplemente escribe un prompt. Establece la resolución y la duración. Di en voz alta lo que quieres escuchar, no solo lo que quieres ver: H3 genera el audio en la misma pasada, así que "lluvia golpeando el vidrio, pequeños clics de servo" es una instrucción real, no un adorno.
- Presiona Ejecutar. El botón muestra el cargo exacto para la configuración que elegiste antes de que te comprometas con ella. Espera, descarga.
Ese es todo el camino sin código, y para clips únicos es genuinamente la opción más rápida. En el momento en que quieras diez variantes, o un primer fotograma generado por otro modelo y alimentado directamente, vuelve al código. De eso se trata el resto de esto.
El tutorial de MiniMax H3: Crear, hacer polling, descargar, repetir
Un ejemplo recorre los siete pasos: un relojero repara un pequeño pájaro mecánico de latón, le susurra una línea, y el pájaro vuela fuera del taller. Dos tomas. La toma A es imagen a video para que el interior esté dirigido artísticamente. La toma B es texto a video porque no hay un fotograma de origen para el cielo.
Paso 1: Generar el primer fotograma con GPT Image 2
Imagen a video ignora ratio, por lo que el primer fotograma es donde decides el encuadre de la toma A. Genéralo a 16:9 y en el nivel de calidad más alto, porque H3 heredará cada defecto en él y luego agregará desenfoque de movimiento encima.
Modelo: openai/gpt-image-2/text-to-image. Configuración: calidad high, 2048x1152, 16:9, PNG.
text1Un taller de relojero desordenado al atardecer, lámpara de tungsteno cálida sobre un banco de roble marcado. 2Un anciano reparador con un delantal de cuero se inclina sobre un pequeño pájaro mecánico de latón 3que descansa en sus manos ahuecadas, sus placas de ala medio abiertas, pequeños engranajes visibles. 4La lluvia corre por la ventana con parteluces detrás de él; una estufa de carbón brilla ámbar en la izquierda del encuadre. 5Poca profundidad de campo, 35 mm, polvo volumétrico en el haz de la lámpara, paleta de ámbar profundo y verde azulado, fotorrealista, sin texto. 6

Playground de GPT Image 2 en Atlas Cloud con el prompt del primer fotograma de este tutorial y el taller del relojero renderizado en el panel de salida
GPT Image 2 en Atlas Cloud, calidad alta a 2048x1152. El botón Ejecutar cotiza el cargo exacto para la configuración que elegiste, $0.1745 para esta, antes de que te comprometas con ella.
Conserva la URL devuelta. El Paso 2 la alimenta directamente a H3, sin necesidad de descarga de ida y vuelta.
Paso 2: Crear la tarea de MiniMax H3 y conservar el task_id
La llamada create hace dos cosas y luego deja de preocuparse por ti: valida la carga útil y devuelve un task_id. Un 400 aquí es tu carga útil, no un fallo transitorio, así que no lo pongas detrás de un bucle de reintento. Cualquier otra clase de problema aparece más tarde, durante el polling.
El hábito que ahorra dinero real: persiste el task_id antes de hacer cualquier otra cosa. Las tareas solo se pueden consultar durante 7 días, y si tu proceso muere con el id en la memoria, has pagado por un render al que ya no puedes acceder.
python1import os, json, time, requests 2 3BASE = "https://api.minimax.io" 4HEADERS = { 5 "Authorization": f"Bearer {os.environ['MINIMAX_API_KEY']}", 6 "Content-Type": "application/json", 7} 8 9def create_task(payload: dict) -> str: 10 r = requests.post(f"{BASE}/v2/video_generation", 11 headers=HEADERS, json=payload, timeout=60) 12 if r.status_code == 400: 13 # tu carga útil es incorrecta. reintentarla solo será incorrecto de nuevo. 14 raise ValueError(f"rechazado: {r.text}") 15 r.raise_for_status() 16 task_id = r.json()["task_id"] 17 with open("tasks.jsonl", "a") as f: # persiste ANTES de cualquier otra cosa 18 f.write(json.dumps({"task_id": task_id, "at": int(time.time()), 19 "payload": payload}) + "\n") 20 return task_id 21 22SHOT_A_PROMPT = ( 23 "Las manos del viejo reparador estabilizan el pájaro de latón. Sus ojos de vidrio parpadean, " 24 "las placas de las alas se abren una a una. Se inclina y susurra, cerca del micrófono, " 25 ""Veamos si todavía recuerdas el cielo." Lento push-in de 50 mm, luz de lámpara rasgando " 26 "el latón, lluvia golpeando la ventana, estufa de carbón crepitando, pequeños clics de servo " 27 "bajo su voz. Ámbar cálido clave, relleno de ventana verde azulado. Sin texto en pantalla." 28) 29 30shot_a = create_task({ 31 "model": "MiniMax-H3", 32 "resolution": "2K", 33 "duration": 8, 34 # sin "ratio" aquí a propósito: imagen a video toma el encuadre del primer fotograma 35 "content": [ 36 {"type": "text", "text": SHOT_A_PROMPT}, 37 {"type": "image_url", "role": "first_frame", 38 "image_url": {"url": FIRST_FRAME_URL}}, 39 ], 40}) 41print("tarea shot A:", shot_a) 42
Aquí está ese mismo prompt y primer fotograma ejecutándose como un trabajo, para que puedas ver cómo se ve un envío saludable desde el otro lado:

Playground de MiniMax H3 imagen a video en Atlas Cloud con el primer fotograma del taller cargado y el clip renderizado en el panel de salida
MiniMax H3 imagen a video: primer fotograma cargado a la izquierda, clip 2K terminado en OUTPUT a la derecha. Observa el campo Relación de aspecto fijado en adaptive, y la cotización de $1.12 para 2K a 8 segundos.
Paso 3: Hacer polling y manejar los cinco estados de MiniMax H3
Este es el bucle que todos hacen mal, por lo que vale la pena escribirlo completo. Cuatro reglas: retrocede en lugar de golpear, limita la espera total, trata succeeded como "descargar ahora", y lanza una excepción para cualquier estado que no esté en el enum.
python1TERMINAL_OK = {"succeeded"} 2TERMINAL_BAD = {"failed", "cancelled"} 3IN_FLIGHT = {"queued", "running"} 4 5def poll(task_id: str, timeout_s: int = 900) -> dict: 6 delay, deadline = 3.0, time.time() + timeout_s 7 while time.time() < deadline: 8 r = requests.get(f"{BASE}/v2/query/video_generation/{task_id}", 9 headers=HEADERS, timeout=30) 10 r.raise_for_status() 11 task = r.json()["task"] 12 status = task["status"] 13 14 if status in TERMINAL_OK: 15 return task # content.url está vivo AHORA 16 if status in TERMINAL_BAD: 17 raise RuntimeError(f"{status}: {json.dumps(r.json())[:400]}") 18 if status not in IN_FLIGHT: 19 # un estado que el enum no tiene. NO caigas en "sigue esperando". 20 raise RuntimeError(f"estado desconocido {status!r} -- lee el changelog") 21 22 print(f" {status} ... próxima comprobación en {delay:.0f}s") 23 time.sleep(delay) 24 delay = min(delay * 1.5, 15.0) # 3s -> techo de 15s 25 raise TimeoutError(f"{task_id} aún no es terminal después de {timeout_s}s") 26
Tres cosas en esto son deliberadas:
status not in IN_FLIGHT lanza una excepción en lugar de continuar. Si MiniMax agrega un sexto estado el próximo trimestre, quieres un fallo fuerte, no un bucle que espera una palabra que nunca llega. Esta sola línea es la diferencia entre el tutorial roto y este.
failed no reintenta. Un render fallido generalmente significa que el prompt activó un filtro o la carga útil tenía una combinación incorrecta, y disparar la misma carga útil nuevamente te compra el mismo fallo a precio completo. Registra el cuerpo, míralo, luego decide.
El retroceso comienza en 3 segundos y llega a 15. H3 a 2K lleva minutos, no segundos. Hacer polling una vez por segundo solo quema tu límite de tasa en el endpoint de consulta.
Paso 4: Descargar antes de que la URL caduque
En el momento en que llega succeeded, transmite el archivo al disco. La URL en content.url es explícitamente un enlace con límite de tiempo: "Descárgala o guárdala rápidamente; vuelve a consultar para obtener una nueva URL después de que caduque" (Referencia de API de MiniMax, agosto de 2026). No es una ruta de CDN que puedas poner en tu base de datos y olvidar.
Esa segunda mitad es la buena noticia, y es la respuesta al 404 que obtuviste a la mañana siguiente. El render no ha desaparecido. Consulta el mismo task_id de nuevo y obtienes una URL nueva, hasta 7 días después de la creación.
python1def download(url: str, path: str) -> str: 2 with requests.get(url, stream=True, timeout=300) as r: 3 r.raise_for_status() 4 with open(path, "wb") as f: 5 for chunk in r.iter_content(1 << 20): 6 f.write(chunk) 7 return path 8 9def refresh_url(task_id: str) -> str: 10 """¿Enlace muerto? El render está bien. Pregunta de nuevo, dentro de la ventana de 7 días.""" 11 r = requests.get(f"{BASE}/v2/query/video_generation/{task_id}", 12 headers=HEADERS, timeout=30) 13 r.raise_for_status() 14 return r.json()["task"]["content"]["url"] 15 16task = poll(shot_a) 17download(task["content"]["url"], "shot-a.mp4") 18
Lo que regresa para la toma A, junto a la imagen fija de la que partió:

Lado a lado: el primer fotograma generado a la izquierda, un fotograma del clip terminado de MiniMax H3 a la derecha, mostrando las placas de las alas del pájaro abiertas y los ojos iluminados
Izquierda: la imagen fija de GPT Image 2 del Paso 1, exactamente como se envió. Derecha: un fotograma extraído del clip 2K que devolvió H3. Mismo set, misma luz, las placas de las alas y los ojos son lo que se movió.
Paso 5: Toma B con MiniMax H3 texto a video, donde ratio es obligatorio
No hay un fotograma de origen para el cielo, así que la toma B es solo texto. Eso cambia la regla de ratio de "ignorado" a "obligatorio": para un prompt solo de texto, ratio es obligatorio y no puede ser adaptive (Referencia de API de MiniMax, agosto de 2026). Si lo omites o envías adaptive obtienes un 400 inmediato, antes de que comience cualquier render.
Modelo: minimax/h3/text-to-video. Configuración: 2K, duración 6, ratio 16:9.
text1El pájaro de latón irrumpe a través de un tragaluz del taller entreabierto hacia un cielo vespertino 2lavado por la lluvia, alas batiendo en un zumbido de engranajes, gotas salpicando las plumas 3metálicas mientras asciende sobre techos de pizarra mojados hacia una brecha de nube dorada. 4La cámara se eleva detrás de él, 24 mm, contraluz de borde del sol bajo. Sonido: servos de alas 5zumbando, viento creciente, campana de iglesia lejana, lluvia desvaneciéndose. Sin texto. 6
python1shot_b = create_task({ 2 "model": "MiniMax-H3", 3 "resolution": "2K", 4 "duration": 6, 5 "ratio": "16:9", # obligatorio aquí. omítelo o pasa "adaptive" -> 400 6 "content": [{"type": "text", "text": SHOT_B_PROMPT}], 7}) 8download(poll(shot_b)["content"]["url"], "shot-b.mp4") 9

Playground de MiniMax H3 texto a video en Atlas Cloud con el prompt del pájaro alzando el vuelo y el clip terminado en el panel de salida
MiniMax H3 texto a video con el prompt de la toma B y Relación de aspecto establecida explícitamente en 16:9. Esta ejecución usó los 8 segundos predeterminados de la página en lugar de los 6 de la carga útil anterior.
Paso 6: Saltarse el polling con un callback y devolver el challenge en 3 segundos
Si prefieres que te avisen en lugar de preguntar, pasa callback_url en la llamada create. Hay exactamente una trampa, está documentada en un solo paréntesis en la referencia de la API, y es la forma más común en que fallan los callbacks autoalojados.
Antes de que MiniMax te envíe algo, envía una solicitud de verificación que contiene un campo challenge, y "debes devolver el challenge sin cambios en menos de 3 segundos para completar la verificación" (Referencia de API de MiniMax, agosto de 2026). Si fallas, no hay ningún error en ninguna parte. Tus llamadas create siguen teniendo éxito, tus renders siguen terminando, y simplemente nunca recibes una notificación. Nada en ningún registro dice por qué.
Doce líneas de FastAPI, y el orden dentro de ellas es todo el punto:
python1from fastapi import FastAPI, Request 2 3app = FastAPI() 4 5@app.post("/minimax/callback") 6async def callback(req: Request): 7 body = await req.json() 8 if "challenge" in body: # handshake de verificación, respóndelo PRIMERO 9 return {"challenge": body["challenge"]} # sin cambios, síncrono, sin puerta de autenticación 10 task_id = body.get("task_id") 11 status = body.get("status") 12 enqueue(task_id, status) # notificación real: delega, devuelve rápido 13 return {"ok": True} 14
Los errores que lo matan, en orden de frecuencia con que los he visto:
- La solicitud de challenge pasa por tu middleware de autenticación y obtiene un 401 o una redirección. La verificación no está autenticada por definición. Pon la ruta en la lista blanca.
- El manejador empuja el challenge a una cola y responde de forma asíncrona. Demasiado tarde. Esa respuesta debe estar en el cuerpo de la respuesta de esa solicitud.
- El valor se vuelve a serializar, se recorta o se envuelve. Devuélvelo byte por byte.
- Estás probando a través de un túnel contra un servidor de desarrollo serverless, y el arranque en frío solo supera los 3 segundos. Caliéntalo primero, o verifica contra un proceso que ya se esté ejecutando.
El polling está perfectamente bien, por cierto. Si tienes un puñado de trabajos por hora, el bucle en el Paso 3 es menos código y menos que se rompa. El callback vale la pena cuando tienes muchos trabajos y no quieres un poller por trabajo.
Paso 7: Concatenar las dos tomas en una sola película
Ambas tomas regresaron como h264 2560x1440 a 24 fps con audio estéreo AAC a 32 kHz. Mismo contenedor, mismo todo, así que esto es una copia de flujo en lugar de una recodificación. Sin pérdida de calidad, sin espera.
Una pequeña sorpresa que vale la pena esperar: pedir 6 segundos me dio un archivo de 6.58 segundos. Las duraciones vuelven cerca de lo que pediste, no exactas al fotograma, por lo que las dos tomas suman 14.62 segundos en lugar de un limpio 14.
bash1printf "file 'shot-a.mp4'\nfile 'shot-b.mp4'\n" > list.txt 2ffmpeg -f concat -safe 0 -i list.txt -c copy brass-bird-two-shot.mp4 3
Esa salida es el video al principio de este artículo. Si -c copy se queja, tus dos tomas tienen diferentes resoluciones o frecuencias de cuadros, lo que en H3 significa que cambiaste resolution entre llamadas. Hazlas coincidir, o elimina -c copy y acepta una recodificación.
Variaciones del tutorial de MiniMax H3 que vale la pena robar
Cinco cosas que vale la pena probar una vez que el bucle anterior funciona, en orden aproximado de cuánto dinero te ahorran.
Borrador a 768P, terminar a 2K. Ambos niveles son el mismo modelo, y 768P cuesta aproximadamente un 29% menos por segundo. Renderiza tus candidatos cortos y baratos, míralos, luego vuelve a ejecutar solo el ganador a 2K con el mismo prompt. Aquí es donde viven la mayoría de los ahorros en una lista de tomas. Qué nivel necesitas realmente para la entrega es un argumento aparte, y lo hice en 768P vs 2K.
La duración es cualquier número entero de 4 a 15. No un conjunto de valores preestablecidos. Si la acción termina a los 7 segundos, pide 7 y deja de pagar por 8.
Primer fotograma más último fotograma. Envía un segundo elemento de imagen con role: "last_frame" y H3 construirá la transición entre ellos. Útil para transiciones entre tomas que ya has dirigido artísticamente.
Referencia a video para continuidad. role: "reference_image" mantiene un personaje a través de las tomas en lugar de volver a generar su cara en cada generación. Hay un rol reference_audio correspondiente con una ventana de 2 a 15 segundos para el clip de referencia, que es cómo mantienes una voz consistente. Consulta referencia a video.
Cabeza parlante vertical. ratio: "9:16" con una línea de diálogo en el prompt es el uso de mayor volumen de este modelo en este momento, porque el audio sale de la misma pasada y los labios coinciden sin un paso de sincronización labial separado.
La elaboración de prompts es una habilidad separada de la fontanería asíncrona, y si tus tomas son técnicamente limpias pero visualmente planas, el problema está aguas arriba de este artículo. Comienza con la guía de prompts de H3.
Cuánto costó ejecutar este tutorial de MiniMax H3
Elementos de línea reales de la ejecución que produjo la película al principio, cotizados por el botón Ejecutar y verificados el 12 de agosto de 2026. H3 factura por segundo de salida y la tarifa está escalonada por resolución: los trabajos en 2K cotizaron $1.12 por 8 segundos, que es $0.14 por segundo, y la tarifa inicial del catálogo de $0.10 es el nivel de 768P. Los tres endpoints de H3 están a precio completo ahora mismo, sin descuento aplicado.
| Paso | Modelo | Configuración | Cargo |
|---|---|---|---|
| Primer fotograma | GPT Image 2 texto a imagen | calidad alta, 2048x1152 | $0.1745 |
| Toma A | H3 imagen a video | 2K, 8s | $1.12 |
| Toma B | H3 texto a video | 2K, 16:9, 6s | $0.84 |
| Película entregada | 14.6s, dos tomas, 2560x1440, audio estéreo | $2.13 | |
| Ejecuciones de captura de pantalla para este artículo | H3 i2v + t2v | 2K, 8s cada una | $2.24 |
Vale la pena señalar que las mismas dos tomas borrador a 768P habrían sido $0.80 y $0.60 en lugar de $1.12 y $0.84, aproximadamente un 29% de descuento, para material del que puedes juzgar absolutamente una toma.
Dos detalles de facturación que son fáciles de aprender de la manera costosa. Una solicitud rechazada en el envío no cuesta nada, por lo que un 400 por un ratio faltante es gratuito. Una solicitud que renderiza algo inútil no es gratuita: si el trabajo llega a succeeded, se te cobra, incluso si la salida no es lo que querías. Ese es el argumento real para hacer borradores a 768P.
Las tarifas por segundo, la comparación de 768P y 2K, y cómo se comporta el cargo en diferentes duraciones se desglosan adecuadamente en el precio de la API de MiniMax H3 complementario a este artículo. Este es el código, ese es la factura.
Atribución y territorio antes de enviar
Dos cosas que verificar antes de que esto vaya a algún lado público. Los términos de la API de MiniMax incluyen una obligación de defensa condicional que cubre reclamaciones de patentes y derechos de autor contra la salida de la API, y esa obligación no se extiende a marcas comerciales o imágenes, por lo que un logotipo reconocible o una persona real en tu prompt sigue siendo tu problema. Por separado, la licencia de pesos abiertos para H3 conlleva una cláusula de Territorios Excluidos, y esa cláusula rige los pesos descargados y sus salidas, no la API alojada, cuyos términos nombran una región de servicio de EE. UU. que puedes seleccionar. Lee el contrato que realmente firmaste. Y etiqueta la salida de H3 como salida de H3 en tu interfaz de usuario.
Preguntas frecuentes del tutorial de MiniMax H3
¿Cuáles son los estados de las tareas de MiniMax H3, y existe uno expired?
Cinco: queued, running, succeeded, failed, cancelled. No existe el estado expired. Otras dos cosas caducan y se confunden con una: la URL de descarga en content.url tiene límite de tiempo, y el registro de la tarea solo se puede consultar durante los últimos 7 días.
¿Tengo que usar un callback, o está bien el polling para MiniMax H3?
El polling está bien y es menos código. Usa un callback cuando tengas suficientes trabajos concurrentes como para que un poller por trabajo sea una tontería. Si lo haces, el endpoint debe devolver el campo challenge sin cambios en menos de 3 segundos, de forma síncrona, antes de cualquier middleware de autenticación. Un handshake fallido no produce ningún mensaje de error, solo silencio permanente.
¿Por qué mi solicitud de texto a video de MiniMax H3 da 400 con "ratio is required and cannot be adaptive"?
Porque estás en modo solo texto, donde no hay un primer fotograma del que inferir el encuadre. Pasa un valor explícito: 21:9, 16:9, 4:3, 1:1, 3:4 o 9:16. La misma regla es por qué ratio parece no hacer nada en imagen a video, donde el primer fotograma decide y cualquier ratio que envíes se ignora.
¿Cuántos trabajos de MiniMax H3 puedo ejecutar en paralelo?
El límite documentado se basa en la conexión: 2 tareas concurrentes gratis, 15 de pago. Por encima del límite obtienes un 429 inmediato en lugar de un espacio en la cola, así que limita tu propio recuento de trabajos en vuelo. Las puertas de enlace de enrutamiento a veces absorben más, y he tenido 20 trabajos concurrentes completados, pero también he recibido un 429 en la misma configuración otro día. No construyas un programador que asuma el número más alto.
Mi URL de video de MiniMax H3 da 404 un día después. ¿El render ha desaparecido?
No. La URL caducó, el render no. Consulta el mismo task_id de nuevo y la respuesta trae una URL nueva, en cualquier momento dentro de la ventana de consulta de 7 días. Después de 7 días, el registro de la tarea ya no se puede consultar, por lo que el Paso 2 persiste el task_id antes de hacer cualquier otra cosa.
Busqué "hailuo ai video generator how to use" y aterricé en un tutorial de MiniMax H3. ¿Estoy en el lugar correcto?
Sí. Hailuo es la aplicación de consumo y H3 es el nombre del modelo utilizado por la API. Mismo motor. Si quieres un solo clip, usa la ruta del playground en la sección de flujo de trabajo anterior, sin código necesario. Si quieres diez variantes o un primer fotograma canalizado desde otro modelo, los siete pasos son para ti.






