Seedance 2.5 já está disponível — Primeiro na Atlas Cloud

Seu MiniMax H3 Poll Loop nunca termina. Aqui está o tutorial que realmente termina.

Um tutorial do MiniMax H3 com todo o loop assíncrono: a chamada de criação, um loop de polling que lida com todos os cinco status reais, o desafio de callback de 3 segundos e as duas coisas que expiram silenciosamente.

Seu primeiro POST voltou em dez segundos com um task_id. Parecia vitória.

Então nada aconteceu por seis minutos. Você tinha copiado while status != "Success" de algum tutorial, e o loop simplesmente rodava, porque esse endpoint não retorna mais a palavra Success. Então você mudou para um webhook. Nem um único push chegou, e nada, em lugar nenhum, te disse por quê. Na manhã seguinte você voltou para buscar o render do dia anterior e o link deu 404.

Essas quatro coisas parecem não ter relação. Nenhuma delas é culpa do modelo. Todas as quatro são o contrato assíncrono, que quase ninguém documenta. Aqui está o contrato completo, mais um curta-metragem real de dois takes que saiu do outro lado.

Principais conclusões

  • Três endpoints, um loop: create retorna um task_id e desliga, você faz polling, você baixa. Tudo que é difícil vive depois da chamada create.
  • Os cinco status reais são queued, running, succeeded, failed, cancelled. Não existe status expired, não importa o que um post de blog te disse.
  • Duas coisas expiram, e nenhuma delas é um status: a URL de download tem limite de tempo, e o registro da tarefa em si só pode ser consultado por 7 dias.
  • Se você usar um callback, o MiniMax primeiro envia uma requisição de verificação com um campo challenge e você deve ecoá-lo de volta inalterado em até 3 segundos. Falhe nisso e você não recebe erro algum, apenas silêncio para sempre.
  • Para geração apenas de texto, ratio é obrigatório e não pode ser adaptive. Para imagem-para-vídeo, o primeiro frame decide o quadro, e qualquer ratio que você passar é ignorado.

A coisa pronta primeiro

Toda a recompensa deste tutorial: dois takes do MiniMax H3 em 2K, concatenados, 14,6 segundos. Take A é imagem-para-vídeo a partir de um primeiro frame gerado, take B é texto-para-vídeo. Ligue o som. O áudio não é uma trilha sonora sobreposta, o H3 renderizou as engrenagens, a chuva e a linha sussurrada como parte da mesma geração.

Três chamadas de API fizeram isso. Um modelo de imagem para o primeiro frame, dois endpoints H3 para os takes, uma linha de ffmpeg para juntá-los. O código abaixo é o código que fez isso.

Por que a Maioria dos Tutoriais do MiniMax H3 Quebra na Segunda Requisição

Quase todo guia para este modelo para na chamada create. Essa é a metade fácil. A chamada create valida seu payload, te entrega um task_id e desconecta, e então você fica sozinho com um trabalho que leva minutos e um conjunto de regras que ninguém imprimiu.

As falhas são entediante e repetitivamente comuns. Encontrei cinco dessas seis em uma tarde.

SintomaO que você vêCausa realCorreção
Loop de polling nunca saiTerminal imprime para sempre, job terminou há temposSua condição de saída compara com palavras v1 como Success / Fail. O endpoint de consulta v2 retorna succeeded / failed em minúsculasCompare com o enum v2, e levante exceção para qualquer status que não reconhecer
400 instantâneo em texto-para-vídeoRequisição rejeitada antes de qualquer render começarratio faltando, ou definido como adaptive, que o modo só texto recusaPasse um ratio explícito como 16:9
Seu ratio é silenciosamente ignoradoFrame de saída não é o que você pediuImagem-para-vídeo deriva o frame da imagem do primeiro frame, então ratio é um no-op aliCorte ou gere o primeiro frame no quadro desejado
Webhook nunca dispara, sem erroZero pushes, logs limpos, nenhuma reclamação da APIO handshake de verificação falhou. MiniMax enviou um challenge e seu endpoint não o ecoou de volta inalterado em 3 segundosResponda ao challenge de forma síncrona, antes de qualquer middleware de autenticação ou fila
URL de ontem dá 404Link de download morto, render parece ter sumidoA URL de download tem limite de tempo. O render está intactoConsulte o mesmo task_id novamente para obter uma URL fresca, dentro da janela de 7 dias
429s aleatórios sob cargaAlguns submits rejeitados, sem filaA concorrência é limitada, e é um limite rígido, não uma fila de esperaLimite sua própria contagem em andamento e tente novamente o submit, não o render

A primeira linha é a que consome noites inteiras, e vale a pena ser preciso sobre ela. A API de vídeo mais antiga do MiniMax reportava progresso com palavras capitalizadas na família Preparing / Queueing / Processing / Success / Fail. O endpoint de consulta v2 usado pelo H3 retorna queued, running, succeeded, failed, cancelled (Referência da API MiniMax, agosto de 2026). Muitos documentos de revendedores terceiros ainda imprimem o conjunto antigo, ou misturam ambos em uma página. Se você herdou um loop de um desses, ele não pode terminar, porque a string que está esperando nunca é enviada.

Fluxo de Trabalho do Tutorial MiniMax H3: Três Endpoints, Cinco Status, Um Loop

O H3 foi lançado em 31/07/2026 como um modelo de vídeo omni-modal: texto, imagem, vídeo e áudio vivem todos na mesma janela de contexto, saída de até 15 segundos em 2K com áudio estéreo nativo (MarkTechPost, agosto de 2026). Para a API, isso significa um endpoint create com um array content, e o que você colocar no array decide em qual modo você está.

ModoO que vai no contentrole no item de imagemO que ratio fazUse para
Texto-para-vídeoum item de textonenhumObrigatório, e adaptive é rejeitadoTakes sem imagem de origem, controle total do quadro
Imagem-para-vídeoitem de texto + item de imagemfirst_frame (opcionalmente também last_frame)Ignorado, o primeiro frame decideAnimando uma imagem que você já dirigiu artisticamente
Referência-para-vídeoitem de texto + item de referênciareference_image (também reference_video, reference_audio)Obrigatório, igual ao modo só textoManter um personagem ou uma voz entre takes

E a parte que seu código realmente precisa lidar. Cinco status, cinco ramificações diferentes.

StatusO que significaO que seu código faz
queuedAceito, aguardando vagaContinue polling, recue
runningRenderizandoContinue polling, recue
succeededConcluído, content.url está populadoBaixe imediatamente, nesta iteração
failedRender falhouLeia o corpo do erro, registre, não tente novamente cegamente o mesmo payload
cancelledJob foi canceladoSaia do loop, trate como terminal
qualquer outroNão está no enumLevante exceção. Um novo status que você silenciosamente trata como "continue esperando" é o bug da tabela acima

Não existe status expired. Essa palavra é frequentemente associada a esta API, mas pertence a duas outras coisas: a URL de download, que tem limite de tempo e é renovável, e o registro da tarefa, que só pode ser consultado nos últimos 7 dias. Ambos são abordados no Passo 4.

Mais um número antes do código. A concorrência para geração de vídeo no H3 é limitada por contagem de conexões, não por requisições por minuto: 2 tarefas simultâneas no nível gratuito, 15 após pagamento (Limites de Taxa MiniMax, agosto de 2026). Acima do limite você recebe um 429 imediatamente. Nada enfileira por você. Também já enviei 20 jobs H3 simultâneos através de um gateway de roteamento e todos os 20 foram aceitos, e já recebi um 429 na mesma configuração em outro dia, então trate qualquer número acima do limite documentado como clima, não como constante.

Direto ou através de um gateway

Os três passos são os mesmos de qualquer forma, mas as strings diferem, e isso importa quando você está depurando às 1h da manhã.

MiniMax diretoGateway unificado (Atlas Cloud)
SubmeterPOST /v2/video_generationPOST /api/v1/model/generateVideo
PollingGET /v2/query/video_generation/{task_id}GET /api/v1/model/prediction/{id}
Palavras de statusqueued / running / succeeded / failed / cancelledcompleted em sucesso, failed em falha
Notificações pushURL de callback com handshake de challenge de 3sFaça polling do prediction id
Concorrência2 grátis, 15 pagos, 429 rígidoNão publicado como limite por modelo, medido de forma mais ampla na prática
Modelo de imagem para primeiro frame na mesma chaveNão, conta separadaSim, GPT Image 2 e H3 ficam atrás de uma chave
Preço H3Publicado por nível de resoluçãoPor segundo de saída, escalonado por resolução, cotado no botão Executar antes de submeter

A razão pela qual executei a cadeia deste tutorial em um gateway é puramente a penúltima linha: o primeiro frame vem de um modelo de imagem da OpenAI e os dois takes vêm do MiniMax, e eu não queria dois fornecedores, duas chaves e duas páginas de faturamento para um filme de 14 segundos. Se você já está dentro da plataforma MiniMax, fique lá, o loop abaixo funciona inalterado, exceto pelos caminhos e pelas palavras de status.

Gerador de Vídeo Hailuo AI: Como Usar Antes de Escrever Qualquer Código

Se você veio aqui procurando como usar o gerador de vídeo Hailuo AI, está no lugar certo e não precisa de nenhum código ainda. Hailuo é o aplicativo voltado ao consumidor do MiniMax e H3 é o nome do modelo que a API usa. Mesmo motor, porta diferente.

Três minutos, sem terminal:

  1. Abra uma página de modelo, por exemplo MiniMax H3 imagem-para-vídeo. O playground é o painel direito da página.
  2. Solte uma imagem de primeiro frame, ou mude para a página de texto-para-vídeo e apenas escreva um prompt. Defina resolução e duração. Diga em voz alta o que você quer ouvir, não apenas o que quer ver: o H3 gera o áudio na mesma passada, então "chuva tilintando no vidro, pequenos cliques de servo" é uma instrução real, não decoração.
  3. Clique em Executar. O botão mostra o valor exato para as configurações que você escolheu antes de se comprometer. Espere, baixe.

Esse é todo o caminho sem código, e para clipes avulsos é genuinamente a opção mais rápida. No momento em que você quiser dez variações, ou um primeiro frame gerado por outro modelo e alimentado diretamente, volte ao código. É para isso que serve o resto deste artigo.

O Tutorial MiniMax H3: Criar, Polling, Baixar, Repetir

Um exemplo percorre todos os sete passos: um relojoeiro conserta um pequeno pássaro mecânico de latão, sussurra uma linha para ele, e o pássaro voa para fora da oficina. Dois takes. O take A é imagem-para-vídeo, para que o interior seja artisticamente dirigido. O take B é texto-para-vídeo porque não há frame de origem para o céu.

Passo 1: Gerar o primeiro frame com GPT Image 2

Imagem-para-vídeo ignora ratio, então o primeiro frame é onde você decide o quadro do take A. Gere-o em 16:9 e no nível de qualidade mais alto, porque o H3 herdará todas as falhas e depois adicionará desfoque de movimento por cima.

Modelo: openai/gpt-image-2/text-to-image. Configurações: qualidade high, 2048x1152, 16:9, PNG.

text
1A oficina bagunçada de um relojoeiro ao entardecer, lâmpada de tungstênio quente sobre uma bancada de carvalho marcada. Um velho reparador em um avental de couro se inclina sobre um pequeno pássaro mecânico de latão descansando em suas mãos em concha, as placas das asas meio abertas, pequenas engrenagens visíveis. A chuva escorre pela janela de vidraças atrás dele; um fogão a carvão brilha âmbar no lado esquerdo do quadro. Profundidade de campo rasa, 35mm, poeira volumétrica no feixe da lâmpada, paleta âmbar profundo e verde-azulado, fotorrealista, sem texto.
2

Interface de gerador de imagens AI exibindo um prompt de texto e saída gerada

Playground do GPT Image 2 no Atlas Cloud com o prompt de primeiro frame deste tutorial e a oficina do relojoeiro renderizada no painel de saída

GPT Image 2 no Atlas Cloud, qualidade alta em 2048x1152. O botão Executar cita o valor exato para as configurações escolhidas, $0,1745 para este, antes de você se comprometer.

Mantenha a URL retornada. O Passo 2 a alimenta diretamente ao H3, sem ida e volta de download.

Passo 2: Criar a tarefa MiniMax H3 e segurar o task_id

A chamada create faz duas coisas e depois para de se importar com você: ela valida o payload e retorna um task_id. Um 400 aqui é seu payload, não uma falha transitória, então não coloque isso atrás de um loop de repetição. Qualquer outra classe de problema aparece depois, durante o polling.

O único hábito que economiza dinheiro real: persista o task_id antes de fazer qualquer outra coisa. As tarefas só podem ser consultadas por 7 dias, e se seu processo morrer com o id na memória, você pagou por um render que não pode mais alcançar.

python
1import 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        # seu payload está errado. repeti-lo só vai errar de novo.
14        raise ValueError(f"rejeitado: {r.text}")
15    r.raise_for_status()
16    task_id = r.json()["task_id"]
17    with open("tasks.jsonl", "a") as f:                 # persista ANTES de qualquer outra coisa
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    "As mãos do velho reparador firmam o pássaro de latão. Seus olhos de vidro acendem, "
24    "as placas das asas se abrem uma a uma. Ele se inclina e sussurra, próximo ao microfone, "
25    ""Vamos ver se você ainda se lembra do céu." Câmera lenta em 50mm, a luz da lâmpada varrendo "
26    "o latão, chuva tilintando na janela, fogo do fogão crepitando, pequenos cliques de servo "
27    "sob a voz dele. Chave âmbar quente, preenchimento da janela em verde-azulado. Sem texto na tela."
28)
29
30shot_a = create_task({
31    "model": "MiniMax-H3",
32    "resolution": "2K",
33    "duration": 8,
34    # sem "ratio" aqui de propósito: imagem-para-vídeo pega o quadro do primeiro frame
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("tarefa do take A:", shot_a)
42

Aqui está exatamente esse prompt e primeiro frame sendo executados como um job, para que você possa ver como é um submit saudável do outro lado:

Captura de tela de uma interface de gerador de vídeo AI com entrada e saída

Playground do MiniMax H3 imagem-para-vídeo no Atlas Cloud com o primeiro frame da oficina carregado e o clipe renderizado no painel de saída

MiniMax H3 imagem-para-vídeo: primeiro frame carregado à esquerda, clipe 2K finalizado em OUTPUT à direita. Observe o campo Aspect Ratio fixado em adaptive, e a cotação de $1,12 para 2K em 8 segundos.

Passo 3: Faça polling e lide com todos os cinco status do MiniMax H3

Este é o loop que todo mundo erra, então vale a pena escrever por extenso. Quatro regras: recue em vez de martelar, limite o tempo total de espera, trate succeeded como "baixe agora", e levante exceção para qualquer status que não esteja no enum.

python
1TERMINAL_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á ativo AGORA
16        if status in TERMINAL_BAD:
17            raise RuntimeError(f"{status}: {json.dumps(r.json())[:400]}")
18        if status not in IN_FLIGHT:
19            # um status que o enum não tem. NÃO caia em "continue esperando".
20            raise RuntimeError(f"status desconhecido {status!r} -- leia o changelog")
21
22        print(f"  {status} ... próxima verificação em {delay:.0f}s")
23        time.sleep(delay)
24        delay = min(delay * 1.5, 15.0)                    # 3s -> teto de 15s
25    raise TimeoutError(f"{task_id} ainda não terminal após {timeout_s}s")
26

Três coisas nisso são deliberadas:

status not in IN_FLIGHT levanta exceção em vez de continuar. Se o MiniMax adicionar um sexto status no próximo trimestre, você quer uma falha estrondosa, não um loop que espera por uma palavra que nunca chega. Esta única linha é a diferença entre o tutorial quebrado e este.

failed não tenta novamente. Um render falho geralmente significa que o prompt disparou um filtro ou o payload tinha uma combinação ruim, e disparar o mesmo payload idêntico novamente lhe dá a mesma falha idêntica pelo preço total. Registre o corpo, olhe para ele, depois decida.

O recuo começa em 3 segundos e termina em 15. O H3 em 2K leva minutos, não segundos. Fazer polling uma vez por segundo apenas queima seu limite de taxa no endpoint de consulta.

Passo 4: Baixe antes que a URL expire

No momento em que succeeded chegar, transmita o arquivo para o disco. A URL em content.url é explicitamente um link com limite de tempo: "Baixe ou armazene imediatamente; consulte novamente para obter uma nova URL após ela expirar" (Referência da API MiniMax, agosto de 2026). Não é um caminho de CDN que você pode colocar em seu banco de dados e esquecer.

Essa segunda metade é a boa notícia, e é a resposta para o 404 que você recebeu na manhã seguinte. O render não se foi. Consulte o mesmo task_id novamente e você recebe uma URL fresca, por até 7 dias após a criação.

python
1def 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    """Link morto? O render está intacto. Pergunte de novo, dentro da janela de 7 dias."""
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

O que retorna para o take A, ao lado da imagem estática de onde partiu:

Comparação lado a lado de um artesão examinando um pássaro mecânico

Lado a lado: o primeiro frame gerado à esquerda, um frame do clipe MiniMax H3 finalizado à direita, mostrando as placas das asas do pássaro abertas e os olhos acesos

Esquerda: a imagem estática do GPT Image 2 do Passo 1, exatamente como submetida. Direita: um frame extraído do clipe 2K que o H3 retornou. Mesmo cenário, mesma luz, as placas das asas e os olhos são o que se moveu.

Passo 5: Take B com MiniMax H3 texto-para-vídeo, onde ratio é obrigatório

Sem frame de origem para o céu, então o take B é apenas texto. Isso inverte a regra do ratio de "ignorado" para "obrigatório": para um prompt apenas de texto, ratio é obrigatório e não pode ser adaptive (Referência da API MiniMax, agosto de 2026). Deixe de fora ou envie adaptive e você recebe um 400 imediato, antes de qualquer render começar.

Modelo: minimax/h3/text-to-video. Configurações: 2K, duração 6, ratio 16:9.

text
1O pássaro de latão irrompe através de uma claraboia semiaberta da oficina em um céu noturno lavado pela chuva, asas batendo em um zumbido de engrenagens, gotículas respingando das penas de metal enquanto ele sobe acima dos telhados molhados de ardósia em direção a uma abertura de nuvem dourada. A câmera sobe com um crane atrás dele, 24mm, contraluz do sol baixo. Som: servos das asas zumbindo, vento aumentando, sino de igreja distante, chuva desaparecendo. Sem texto.
2
python
1shot_b = create_task({
2    "model": "MiniMax-H3",
3    "resolution": "2K",
4    "duration": 6,
5    "ratio": "16:9",          # obrigatório aqui. omita ou passe "adaptive" -> 400
6    "content": [{"type": "text", "text": SHOT_B_PROMPT}],
7})
8download(poll(shot_b)["content"]["url"], "shot-b.mp4")
9

Captura de tela de uma interface de gerador de vídeo AI mostrando entrada e saída

Playground do MiniMax H3 texto-para-vídeo no Atlas Cloud com o prompt do pássaro levantando voo e o clipe finalizado no painel de saída

MiniMax H3 texto-para-vídeo com o prompt do take B e Aspect Ratio definido explicitamente como 16:9. Esta execução usou os 8 segundos padrão da página, em vez dos 6 no payload acima.

Passo 6: Pule o polling com um callback e ecoe o challenge em 3 segundos

Se você prefere ser avisado a perguntar, passe callback_url na chamada create. Há exatamente uma pegadinha, documentada em um único parêntese na referência da API, e é a forma mais comum de callbacks auto-hospedados falharem.

Antes de o MiniMax enviar qualquer coisa para você, ele envia uma requisição de verificação contendo um campo challenge, e "você deve retornar o challenge inalterado em até 3 segundos para completar a verificação" (Referência da API MiniMax, agosto de 2026). Perda isso e não há erro em lugar nenhum. Suas chamadas create continuam bem-sucedidas, seus renders continuam terminando, e você simplesmente nunca recebe um push. Nada em nenhum log diz por quê.

Doze linhas de FastAPI, e a ordenação dentro delas é o ponto principal:

python
1from 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 verificação, responda PRIMEIRO
9        return {"challenge": body["challenge"]}   # inalterado, síncrono, sem barreira de autenticação
10    task_id = body.get("task_id")
11    status  = body.get("status")
12    enqueue(task_id, status)                # notificação real: delegue, retorne rápido
13    return {"ok": True}
14

Os erros que matam isso, em ordem de quantas vezes já vi:

  • A requisição de challenge passa pelo seu middleware de autenticação e recebe um 401 ou um redirecionamento. A verificação é não autenticada por definição. Coloque o caminho na lista de permissões.
  • O handler coloca o challenge em uma fila e responde de forma assíncrona. Tarde demais. Essa resposta tem que estar no corpo da resposta daquela requisição.
  • O valor é re-serializado, cortado ou encapsulado. Ecoe byte por byte.
  • Você está testando através de um túnel contra um servidor de desenvolvimento serverless, e a partida fria sozinha leva mais de 3 segundos. Aqueça primeiro, ou verifique contra um processo que já esteja em execução.

Fazer polling é totalmente aceitável, a propósito. Se você tem um punhado de jobs por hora, o loop no Passo 3 é menos código e menos propenso a quebrar. O callback compensa quando você tem muitos jobs e não quer um poller por job.

Passo 7: Concatenar os dois takes em um único filme

Ambos os takes retornaram como 2560x1440 h264 a 24fps com áudio estéreo AAC a 32kHz. Mesmo container, mesmas características, então isso é uma cópia de stream, não uma recompressão. Sem perda de qualidade, sem espera.

Uma pequena surpresa que vale a pena esperar: pedir 6 segundos me deu um arquivo de 6,58 segundos. As durações retornam próximas ao que você pediu, não exatas ao quadro, então os dois takes somam 14,62 segundos em vez de 14 exatos.

bash
1printf "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

Essa saída é o vídeo no topo deste artigo. Se -c copy reclamar, seus dois takes têm resoluções ou taxas de quadros diferentes, o que no H3 significa que você mudou resolution entre as chamadas. Corresponda-os, ou remova o -c copy e aceite uma recompressão.

Variações do Tutorial MiniMax H3 que Vale a Pena Roubar

Cinco coisas que valem a pena tentar assim que o loop acima funcionar, em ordem aproximada de quanto dinheiro economizam.

Rascunho em 768P, finalize em 2K. Ambos os níveis são o mesmo modelo, e 768P custa cerca de 29% menos por segundo. Renderize seus candidatos curtos e baratos, assista-os, depois execute novamente apenas o vencedor em 2K com o mesmo prompt. É aqui que mora a maior parte da economia em uma lista de takes. Qual nível você realmente precisa para entrega é outro argumento, e eu o fiz em 768P vs 2K.

Duração é qualquer inteiro de 4 a 15. Não é um conjunto de predefinições. Se a ação termina em 7 segundos, peça 7 e pare de pagar por 8.

Primeiro frame mais último frame. Envie um segundo item de imagem com role: "last_frame" e o H3 construirá a transição entre eles. Útil para transições entre takes que você já dirigiu artisticamente.

Referência-para-vídeo para continuidade. role: "reference_image" mantém um personagem entre takes, em vez de sortear seu rosto a cada geração. Há também um papel reference_audio correspondente com uma janela de 2 a 15 segundos para o clipe de referência, que é como você mantém uma voz consistente. Veja referência-para-vídeo.

Cabeça falante vertical. ratio: "9:16" com uma linha de diálogo no prompt é o uso de maior volume deste modelo agora, porque o áudio sai da mesma passada e os lábios combinam sem uma etapa separada de sincronização labial.

A arte do prompt é uma habilidade separada do encanamento assíncrono, e se seus takes estão tecnicamente limpos, mas visualmente planos, o problema está a montante deste artigo. Comece com o guia de prompts H3.

Quanto Custou Para Executar Este Tutorial MiniMax H3

Itens reais da execução que produziu o filme no topo, cotados pelo botão Executar e verificados em 12/08/2026. O H3 cobra por segundo de saída e a taxa é escalonada por resolução: os jobs em 2K cotaram $1,12 para 8 segundos, o que dá $0,14 por segundo, e a taxa inicial do catálogo de $0,10 é o nível 768P. Todos os três endpoints H3 estão a preço integral agora, sem desconto aplicado.

PassoModeloConfiguraçõesCusto
Primeiro frameGPT Image 2 texto-para-imagemqualidade alta, 2048x1152$0,1745
Take AH3 imagem-para-vídeo2K, 8s$1,12
Take BH3 texto-para-vídeo2K, 16:9, 6s$0,84
Filme entregue14,6s, dois takes, 2560x1440, áudio estéreo$2,13
Capturas de tela para este artigoH3 i2v + t2v2K, 8s cada$2,24

Vale notar que os mesmos dois takes rascunhados em 768P teriam custado $0,80 e $0,60 em vez de $1,12 e $0,84, cerca de 29% a menos, para um material que você pode absolutamente julgar.

Dois detalhes de faturamento que são fáceis de aprender caro. Uma requisição rejeitada no submit não custa nada, então um 400 por um ratio ausente é gratuito. Uma requisição que renderiza algo inútil não é gratuita: se o job chegar a succeeded, você é cobrado, mesmo que a saída não seja o que você queria. Esse é o verdadeiro argumento para rascunhar em 768P.

As taxas por segundo, a comparação 768P e 2K, e como o custo se comporta em diferentes durações são detalhados adequadamente no preço da API MiniMax H3, complementar a este artigo. Este é o código, aquele é a conta.

Atribuição e Território Antes de Enviar

Duas coisas para verificar antes de tornar isso público. Os termos da API do MiniMax incluem uma obrigação de defesa condicional que cobre reivindicações de patentes e direitos autorais contra a saída da API, e essa obrigação não se estende a marcas registradas ou imagem, portanto, um logotipo reconhecível ou uma pessoa real em seu prompt ainda é problema seu. Separadamente, a licença de pesos abertos para o H3 contém uma cláusula de Territórios Excluídos, e essa cláusula rege os pesos baixados e suas saídas, não a API hospedada, cujos termos nomeiam uma região de serviço nos EUA que você pode selecionar. Leia o contrato que você realmente assinou. E identifique a saída do H3 como saída do H3 em sua interface.

FAQ do Tutorial MiniMax H3

Quais são os status das tarefas do MiniMax H3, e existe um expired?

Cinco: queued, running, succeeded, failed, cancelled. Não existe status expired. Duas outras coisas expiram e são confundidas com um: a URL de download em content.url tem limite de tempo, e o registro da tarefa em si só pode ser consultado nos últimos 7 dias.

Preciso usar um callback, ou fazer polling é suficiente para o MiniMax H3?

Fazer polling é suficiente e é menos código. Use um callback quando você tiver jobs concorrentes suficientes para que um poller por job seja desnecessário. Se usar, o endpoint deve ecoar o campo challenge de volta inalterado em até 3 segundos, de forma síncrona, antes de qualquer middleware de autenticação. Um handshake com falha não produz mensagem de erro alguma, apenas silêncio permanente.

Por que minha requisição de texto-para-vídeo do MiniMax H3 dá 400 com "ratio is required and cannot be adaptive"?

Porque você está no modo apenas texto, onde não há primeiro frame para inferir o quadro. Passe um valor explícito: 21:9, 16:9, 4:3, 1:1, 3:4 ou 9:16. A mesma regra é a razão pela qual ratio parece não fazer nada em imagem-para-vídeo, onde o primeiro frame decide e qualquer ratio que você enviar é ignorado.

Quantos jobs do MiniMax H3 posso executar em paralelo?

O limite documentado é baseado em conexão: 2 tarefas simultâneas gratuitas, 15 pagas. Acima do limite, você recebe um 429 imediato, em vez de uma vaga na fila, então limite sua própria contagem em andamento. Gateways de roteamento às vezes absorvem mais, e já tive 20 jobs simultâneos todos concluídos, mas também já recebi 429 na mesma configuração em outro dia. Não construa um agendador que assuma o número mais alto.

Minha URL de vídeo do MiniMax H3 dá 404 um dia depois. O render se foi?

Não. A URL expirou, o render não. Consulte o mesmo task_id novamente e a resposta trará uma URL fresca, a qualquer momento dentro da janela de consulta de 7 dias. Após 7 dias, o registro da tarefa em si não pode mais ser consultado, e é por isso que o Passo 2 persiste o task_id antes de fazer qualquer outra coisa.

Pesquisei "hailuo ai video generator how to use" e caí em um tutorial do MiniMax H3. Estou no lugar certo?

Sim. Hailuo é o aplicativo consumidor e H3 é o nome do modelo usado pela API. Mesmo motor. Se você quer um clipe, use o caminho do playground na seção de fluxo de trabalho acima, sem código necessário. Se você quer dez variações ou um primeiro frame canalizado de outro modelo, os sete passos são para você.

Modelos recentes

Uma API para toda a IA de mídia.

Explorar Todos os Modelos