Seedance 2.5 är nu live — Först på Atlas Cloud

Din MiniMax H3 Poll Loop avslutas aldrig. Här är handledningen som faktiskt slutförs.

En MiniMax H3-handledning med hela asynkrona loopen: create-anropet, en poll-loop som hanterar alla fem verkliga statusar, 3-sekunders callback-utmaningen, och de två sakerna som tyst löper ut.

Din första POST kom tillbaka på tio sekunder med en task_id. Såg ut som en vinst.

Sedan hände ingenting på sex minuter. Du hade kopierat while status != "Success" från någon handledning och loopen bara snurrade, eftersom den här slutpunkten inte längre returnerar ordet Success. Så du bytte till en webhook. Inte en enda push kom fram, och ingenting berättade varför. Nästa morgon gick du tillbaka för gårdagens rendering och länken gav 404.

De där fyra sakerna verkar orelaterade. Ingen av dem är modellens fel. Alla fyra är det asynkrona kontraktet, som nästan ingen skriver ner. Här är hela kontraktet, plus en riktig tvåbilds kortfilm som kom ut i andra änden.

Viktiga slutsatser

  • Tre slutpunkter, en loop: create returnerar en task_id och lägger på, du pollar, du laddar ner. Allt svårt händer efter anropet till create.
  • De fem verkliga statusarna är queued, running, succeeded, failed, cancelled. Det finns ingen expired-status, oavsett vad ett blogginlägg sagt.
  • Två saker löper ut, och ingen av dem är en status: nedladdnings-URL:en är tidsbegränsad, och själva uppgiftsposten är bara sökbar i 7 dagar.
  • Om du använder en callback skickar MiniMax först en verifieringsförfrågan med ett challenge-fält och du måste echoa det oförändrat inom 3 sekunder. Misslyckas du får du inget felmeddelande, bara tystnad för alltid.
  • För text-only-generering krävs ratio och kan inte vara adaptive. För image-to-video bestämmer första bilden formatet, och eventuell ratio du skickar ignoreras.

Den färdiga saken först

Hela utbytet av denna handledning: två MiniMax H3-bilder i 2K, sammanfogade, 14,6 sekunder. Bild A är image-to-video från en genererad första bild, bild B är text-to-video. Sätt på ljudet. Ljudet är inte ett soundtrack som lagts ovanpå, H3 renderade kugghjulen, regnet och den viskade repliken som en del av samma generation.

Tre API-anrop gjorde det. En bildmodell för första bilden, två H3-slutpunkter för bilderna, en ffmpeg-rad för att sammanfoga dem. Koden nedan är koden som skapade det.

Varför de flesta MiniMax H3-handledningar går sönder på andra förfrågan

Nästan varje guide för denna modell slutar vid create-anropet. Det är den enkla halvan. Create-anropet validerar din payload, ger dig en task_id och kopplar från, och sedan är du ensam med ett jobb som tar minuter och en uppsättning regler som ingen tryckt.

Felen är tråkigt repetitiva. Jag stötte på fem av dessa sex på en eftermiddag.

SymptomVad du serEgentlig orsakLösning
Poll-loopen avslutas aldrigTerminalen skriver ut för evigt, jobbet var klart för länge sedanDitt avslutningsvillkor jämför med v1-ord som Success / Fail. V2-frågeslutpunkten returnerar lowercase succeeded / failedMatcha mot v2-enumen, och höj undantag för alla statusar du inte känner igen
Omedelbar 400 på text-to-videoFörfrågan avvisas innan någon rendering startarratio saknas eller är satt till adaptive, vilket text-only-läget vägrarSkicka en explicit ratio som 16:9
Din ratio ignoreras tystUtmatningsbilden är inte vad du bad omImage-to-video hämtar bildformatet från den första bilden, så ratio är en no-op därBeskär eller generera första bilden i det format du vill ha
Webhook utlöses aldrig, inget felmeddelandeNoll pushar, rena loggar, inget klagomål från API:tVerifieringshandskakningen misslyckades. MiniMax skickade en challenge och din slutpunkt ekade inte tillbaka den oförändrad inom 3 sekunderSvara på challenge synkront, före all auth- eller kö-mellanprogramvara
Gårdagens URL ger 404Nedladdningslänken död, renderingen verkar bortaNedladdnings-URL:en är tidsbegränsad. Renderingen är okejFråga samma task_id igen för en ny URL, inom 7-dagarsfönstret
Slumpmässiga 429:or under belastningVissa inskickningar avvisas, ingen köSamtidighetsgränsen är hård, och det är en hård gräns, inte en vänteköBegränsa dina egna aktiva förfrågningar och försök igen med inskickningen, inte renderingen

Första raden är den som äter hela kvällar, och det är värt att vara exakt. MiniMaxs äldre video-API rapporterade framsteg med versaler i familjen Preparing / Queueing / Processing / Success / Fail. V2-frågeslutpunkten som används av H3 returnerar queued, running, succeeded, failed, cancelled (MiniMax API-referens, augusti 2026). Många tredjepartsåterförsäljares dokumentation trycker fortfarande den gamla uppsättningen, eller blandar båda på en sida. Om du ärvt en loop från en sådan kan den inte avslutas, eftersom strängen den väntar på aldrig skickas.

MiniMax H3-handledningens arbetsflöde: Tre slutpunkter, fem statusar, en loop

H3 släpptes 2026-07-31 som en omni-modal video-modell: text, bild, video och ljud lever alla i samma kontextfönster, utdata upp till 15 sekunder i 2K med inbyggt stereoljud (MarkTechPost, augusti 2026). För API:t innebär det en create-slutpunkt med en content-array, och vad du lägger i arrayen avgör vilket läge du är i.

LägeVad som går i contentrole på bildobjektetVad ratio görAnvänd för
Text-to-videoett textobjektingenKrävs, och adaptive avvisasBilder utan källbild, full kontroll över formatet
Image-to-videotextobjekt plus bildobjektfirst_frame (eventuellt även last_frame)Ignoreras, första bilden avgörAnimera en stillbild du redan har art-directat
Reference-to-videotextobjekt plus referensobjektreference_image (även reference_video, reference_audio)Krävs, samma som text-onlyBehålla en karaktär eller en röst över bilder

Och den del din kod faktiskt måste hantera. Fem statusar, fem olika grenar.

StatusVad det betyderVad din kod gör
queuedAccepterad, väntar på en platsFortsätt polla, backa av
runningRenderarFortsätt polla, backa av
succeededKlart, content.url är ifylldLadda ner omedelbart, i denna iteration
failedRenderingen misslyckadesLäs felmeddelandet, logga det, försök inte blind-retry samma payload
cancelledJobbet avbrötsAvsluta loopen, behandla som terminal
anything elseFinns inte i enumenHöj undantag. En ny status som du tyst behandlar som "fortsätt vänta" är felet från tabellen ovan

Det finns ingen expired-status. Det ordet kopplas ofta till detta API och tillhör två andra saker: nedladdnings-URL:en, som är tidsbegränsad och kan förnyas, och uppgiftsposten, som bara är sökbar under de senaste 7 dagarna. Båda täcks i steg 4.

En siffra till innan koden. Samtidighet för videogenerering på H3 begränsas av anslutningsantal, inte förfrågningar per minut: 2 samtidiga uppgifter på gratissnivån, 15 när du betalar (MiniMax Rate Limits, augusti 2026). Över gränsen får du en 429 omedelbart. Inget köas åt dig. Jag har också tryckt 20 samtidiga H3-jobb genom en routing-gateway och fått alla 20 att landa, och jag har fått en 429 på samma setup en annan dag, så behandla alla siffror över den dokumenterade gränsen som väder, inte som en konstant.

Direkt eller via gateway

De tre stegen är desamma oavsett, men strängarna skiljer sig, och det spelar roll när du felsöker klockan 01:00.

MiniMax direktUnified gateway (Atlas Cloud)
SkickaPOST /v2/video_generationPOST /api/v1/model/generateVideo
PollaGET /v2/query/video_generation/{task_id}GET /api/v1/model/prediction/{id}
Statusordqueued / running / succeeded / failed / cancelledcompleted vid succé, failed vid misslyckande
Push-notiserCallback-URL med 3-sekunders challenge-handskakningPolla prediction-id
Samtidighet2 gratis, 15 betald, hård 429Inte publicerad som per-modell-begränsning, mäts bredare i praktiken
Första-bilds-bildmodell på samma nyckelNej, separat kontoJa, GPT Image 2 och H3 bakom en nyckel
H3-prisPublicerat per upplösningsnivåPer sekund utdata, nivåindelat efter upplösning, priset visas på Kör-knappen innan du skickar

Anledningen till att jag körde denna handledningskedja på en gateway är enbart näst sista raden: första bilden kommer från en OpenAI-bildmodell och de två bilderna kommer från MiniMax, och jag ville inte ha två leverantörer, två nycklar och två faktureringssidor för en 14-sekundersfilm. Om du redan är inne på MiniMaxs plattform, stanna där, loopen nedan fungerar oförändrad förutom sökvägarna och statusorden.

Hailuo AI Video Generator: Hur du använder det innan du skriver någon kod

Om du hamnat här för att du söker efter hur man använder Hailuo AI video generator, är du på rätt plats och du behöver inte någon av koden ännu. Hailuo är MiniMaxs konsumentapp och H3 är modellnamnet som API:t använder. Samma motor, olika dörr.

Tre minuter, ingen terminal:

  1. Öppna en modellsida, till exempel MiniMax H3 image-to-video. Lekplatsen är den högra panelen på sidan.
  2. Släpp in en första-bildsbild, eller växla till text-to-video-sidan och skriv bara en prompt. Ställ in upplösning och varaktighet. Säg högt vad du vill höra, inte bara vad du vill se: H3 genererar ljudet i samma pass, så "regn som tickar på glas, små servoklick" är en verklig instruktion, inte dekoration.
  3. Tryck på Kör. Knappen visar exakt avgiften för de inställningar du valt innan du genomför. Vänta, ladda ner.

Det är hela den kodfria vägen, och för enstående klipp är det genuint det snabbare alternativet. I samma ögonblick som du vill ha tio varianter, eller en första bild genererad av en annan modell och matad direkt in, kom tillbaka till koden. Det är vad resten av detta handlar om.

MiniMax H3-handledningen: Skapa, Polla, Ladda ner, Upprepa

Ett exempel går igenom alla sju stegen: en urmakare reparerar en liten mässingsfågel, viskar en replik till den, och fågeln flyger ut ur verkstaden. Två bilder. Bild A är image-to-video så att interiören är art-directad. Bild B är text-to-video eftersom det inte finns någon källbild för himlen.

Steg 1: Generera första bilden med GPT Image 2

Image-to-video ignorerar ratio, så första bilden är där du bestämmer formatet för bild A. Generera den i 16:9 och på högsta kvalitetsnivå, eftersom H3 kommer att ärva varje brist i den och sedan lägga till rörelseoskärpa ovanpå.

Modell: openai/gpt-image-2/text-to-image. Inställningar: kvalitet high, 2048x1152, 16:9, PNG.

text
1A cluttered clockmaker's workshop at dusk, warm tungsten lamp over a scarred oak
2bench. An old repairman in a leather apron leans close to a small brass mechanical
3bird resting in his cupped hands, its wing plates half-open, tiny gears visible.
4Rain streaks the mullioned window behind him; a coal stove glows amber at frame
5left. Shallow depth of field, 35mm, volumetric dust in the lamp beam, deep amber
6and teal palette, photoreal, no text.
7

AI image generator interface displaying a text prompt and generated output

GPT Image 2-lekplats på Atlas Cloud med denna handlednings första-bilds-prompt och den renderade urmakarens verkstad i utmatningspanelen

GPT Image 2 på Atlas Cloud, kvalitet hög vid 2048x1152. Kör-knappen visar exakt avgiften för de inställningar du valt, $0,1745 för denna, innan du genomför.

Behåll den returnerade URL:en. Steg 2 matar den direkt till H3, ingen nedladdningsrunda behövs.

Steg 2: Skapa MiniMax H3-uppgiften och håll fast vid task_id

Create-anropet gör två saker och slutar sedan bry sig om dig: det validerar payloaden och returnerar en task_id. En 400 här är din payload, inte ett övergående fel, så lägg den inte bakom en retry-loop. Varje annan typ av problem dyker upp senare, under polling.

Den enda vanan som sparar riktiga pengar: spara task_id innan du gör något annat. Uppgifter är bara sökbara i 7 dagar, och om din process dör med id:t i minnet har du betalat för en rendering du inte längre kan nå.

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        # din payload är fel. att försöka igen gör bara samma fel.
14        raise ValueError(f"avvisad: {r.text}")
15    r.raise_for_status()
16    task_id = r.json()["task_id"]
17    with open("tasks.jsonl", "a") as f:                 # spara INNAN något annat
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    "The old repairman's hands steady the brass bird. Its glass eyes flicker alight, "
24    "wing plates click open one by one. He leans in and whispers, close to the mic, "
25    ""Let's see if you still remember the sky." Slow 50mm push-in, lamp light raking "
26    "across the brass, rain ticking on the window, coal stove crackling, tiny servo "
27    "clicks under his voice. Warm amber key, teal window fill. No on-screen text."
28)
29
30shot_a = create_task({
31    "model": "MiniMax-H3",
32    "resolution": "2K",
33    "duration": 8,
34    # ingen "ratio" här medvetet: image-to-video tar formatet från första bilden
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("shot A task:", shot_a)
42

Här är exakt den prompten och första bilden som körs som ett jobb, så du kan se hur ett friskt inskick ser ut från andra sidan:

Screenshot of an AI video generator interface with input and output

MiniMax H3 image-to-video-lekplats på Atlas Cloud med verkstadens första bild laddad och det renderade klippet i utmatningspanelen

MiniMax H3 image-to-video: första bilden laddad till vänster, färdigt 2K-klipp i OUTPUT till höger. Notera att Aspect Ratio-fältet är låst till adaptive, och $1,12-priset för 2K i 8 sekunder.

Steg 3: Polla den, och hantera alla fem MiniMax H3-statusar

Detta är loopen som alla får fel, så det är värt att skriva ut fullständigt. Fyra regler: backa av istället för att banka, begränsa den totala väntetiden, behandla succeeded som "ladda ner nu", och höj undantag för alla statusar som inte finns i enumen.

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 är aktiv NU
16        if status in TERMINAL_BAD:
17            raise RuntimeError(f"{status}: {json.dumps(r.json())[:400]}")
18        if status not in IN_FLIGHT:
19            # en status som enumen inte har. fortsätt INTE till "fortsätt vänta".
20            raise RuntimeError(f"okänd status {status!r} -- läs ändringsloggen")
21
22        print(f"  {status} ... nästa kontroll om {delay:.0f}s")
23        time.sleep(delay)
24        delay = min(delay * 1.5, 15.0)                    # 3s -> 15s tak
25    raise TimeoutError(f"{task_id} fortfarande inte terminal efter {timeout_s}s")
26

Tre saker i den är avsiktliga:

status not in IN_FLIGHT höjer undantag istället för att fortsätta. Om MiniMax lägger till en sjätte status nästa kvartal vill du ha en hög krasch, inte en loop som väntar på ett ord som aldrig kommer. Denna enda rad är skillnaden mellan den trasiga handledningen och den här.

failed gör ingen retry. En misslyckad rendering betyder oftast att prompten triggade ett filter eller att payloaden hade en dålig kombination, och att skicka exakt samma payload igen ger dig samma misslyckande till fullt pris. Logga body, titta på den, och bestäm sedan.

Backoff startar vid 3 sekunder och landar på 15. H3 i 2K tar minuter, inte sekunder. Att polla en gång i sekunden bränner bara din rate limit på frågeslutpunkten.

Steg 4: Ladda ner innan URL:en löper ut

I samma ögonblick som succeeded landar, strömma filen till disk. URL:en i content.url är uttryckligen en tidsbegränsad länk: "Ladda ner eller lagra den omgående; fråga igen för att få en ny URL efter att den löpt ut" (MiniMax API-referens, augusti 2026). Det är inte en CDN-sökväg du kan lägga i din databas och glömma bort.

Den andra halvan är de goda nyheterna, och det är svaret på 404:an du fick nästa morgon. Renderingen är inte borta. Fråga samma task_id igen så får du en ny URL, i upp till 7 dagar efter skapandet.

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    """Död länk? Renderingen är okej. Fråga igen, inom 7-dagarsfönstret."""
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

Vad som kommer tillbaka för bild A, bredvid stillbilden den startade från:

Side by side comparison of a craftsman examining a mechanical bird

Sida vid sida: den genererade första bilden till vänster, en bild från det färdiga MiniMax H3-klippet till höger, som visar fågelns vingplattor öppnade och ögonen tända

Vänster: GPT Image 2-bilden från steg 1, exakt som skickad. Höger: en bild tagen från 2K-klippet H3 returnerade. Samma scen, samma ljus, vingplattorna och ögonen är det som rörde sig.

Steg 5: Bild B med MiniMax H3 text-to-video, där ratio är obligatorisk

Ingen källbild för himlen, så bild B är text-only. Det vänder ratio-regeln från "ignorerad" till "krävs": för en text-only-prompt är ratio obligatorisk och kan inte vara adaptive (MiniMax API-referens, augusti 2026). Utelämna den eller skicka adaptive så får du en omedelbar 400, innan någon rendering börjar.

Modell: minimax/h3/text-to-video. Inställningar: 2K, duration 6, ratio 16:9.

text
1The brass bird bursts through a half-open workshop skylight into a rain-washed
2evening sky, wings beating in a whir of gears, droplets spraying off the metal
3feathers as it climbs past wet slate rooftops toward a break of gold cloud.
4Camera cranes up behind it, 24mm, backlit rim from the low sun. Sound: wing
5servos whirring, wind rising, distant church bell, rain fading out. No text.
6
python
1shot_b = create_task({
2    "model": "MiniMax-H3",
3    "resolution": "2K",
4    "duration": 6,
5    "ratio": "16:9",          # krävs här. utelämna den eller skicka "adaptive" -> 400
6    "content": [{"type": "text", "text": SHOT_B_PROMPT}],
7})
8download(poll(shot_b)["content"]["url"], "shot-b.mp4")
9

Screenshot of an AI video generator interface showing input and output

MiniMax H3 text-to-video-lekplats på Atlas Cloud med fågelns flykt-prompt och det färdiga klippet i utmatningspanelen

MiniMax H3 text-to-video med bild B:s prompt och Aspect Ratio satt explicit till 16:9. Denna körning använde sidans standard 8 sekunder istället för 6 i payloaden ovan.

Steg 6: Hoppa över polling med en callback, och echoa challenge inom 3 sekunder

Om du hellre blir tillsagd än frågar, skicka callback_url på create-anropet. Det finns exakt en hake, den är dokumenterad i en enda parentes i API-referensen, och det är det vanligaste sättet som självhostade callbacks misslyckas.

Innan MiniMax pushar något till dig skickar det en verifieringsförfrågan som innehåller ett challenge-fält, och "du måste returnera challenge oförändrat inom 3 sekunder för att slutföra verifieringen" (MiniMax API-referens, augusti 2026). Missa det och det finns inget fel någonstans. Dina create-anrop fortsätter att lyckas, dina renderingar fortsätter att slutföras, och du får helt enkelt aldrig en push. Ingenting i någon logg säger varför.

Tolv rader FastAPI, och ordningen inuti dem är hela poängen:

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:                 # verifieringshandskakning, svara FÖRST
9        return {"challenge": body["challenge"]}   # oförändrat, synkront, ingen auth-grind
10    task_id = body.get("task_id")
11    status  = body.get("status")
12    enqueue(task_id, status)                # riktig notis: lämna över, returnera snabbt
13    return {"ok": True}
14

Misstagen som dödar den, i ordning efter hur ofta jag sett dem:

  • Challenge-förfrågan går genom din auth-mellanprogramvara och får en 401 eller en omdirigering. Verifiering är oautentiserad per definition. Vitlista sökvägen.
  • Hanteraren pushar challenge till en kö och svarar asynkront. För sent. Det svaret måste finnas i svarskroppen för den förfrågan.
  • Värdet serialiseras om, trimmas eller slås in. Echoa det byte för byte.
  • Du testar via en tunnel mot en serverlös utvecklingsserver, och cold starten ensam är över 3 sekunder. Värm upp den först, eller verifiera mot en process som redan kör.

Polling är helt okej, förresten. Om du har en handfull jobb i timmen är loopen i steg 3 mindre kod och mindre att gå sönder. Callbacken lönar sig när du har många jobb och inte vill ha en poller per jobb.

Steg 7: Sammanfoga de två bilderna till en film

Båda bilderna kom tillbaka som 2560x1440 h264 i 24 fps med AAC stereoljud i 32 kHz. Samma behållare, samma allt, så detta är en stream-kopia snarare än en omkodning. Ingen kvalitetsförlust, ingen väntan.

En liten överraskning värd att förvänta sig: att be om 6 sekunder gav mig en 6,58 sekunders fil. Varaktigheter kommer tillbaka nära vad du bad om, inte exakt till bildrutan, så de två bilderna summerar till 14,62 sekunder istället för en ren 14.

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

Den utmatningen är videon överst i denna artikel. Om -c copy klagar har dina två bilder olika upplösningar eller bildhastigheter, vilket på H3 betyder att du ändrade resolution mellan anropen. Matcha dem, eller släpp -c copy och acceptera en omkodning.

MiniMax H3-handledningens variationer värda att stjäla

Fem saker värda att prova när loopen ovan fungerar, i grov ordning efter hur mycket pengar de sparar dig.

Första utkast i 768P, färdigställ i 2K. Båda nivåerna är samma modell, och 768P kostar cirka 29% mindre per sekund. Rendera dina kandidater korta och billiga, titta på dem, kör sedan endast vinnaren på nytt i 2K med samma prompt. Det är här de flesta besparingarna i en bildlista finns. Vilken nivå du faktiskt behöver för leverans är en egen diskussion, och jag tog upp den i 768P vs 2K.

Varaktighet är varje heltal från 4 till 15. Inte en uppsättning förinställningar. Om handlingen landar på 7 sekunder, be om 7 och sluta betala för 8.

Första bild plus sista bild. Skicka ett andra bildobjekt med role: "last_frame" så kommer H3 att bygga övergången mellan dem. Användbart för överlämningar mellan bilder du redan art-directat.

Reference-to-video för kontinuitet. role: "reference_image" behåller en karaktär över bilder istället för att slumpa om deras ansikte varje generation. Det finns en matchande reference_audio-roll med ett 2 till 15 sekunders fönster för referensklippet, vilket är hur du behåller en röst konsekvent. Se reference-to-video.

Vertikal talande huvud. ratio: "9:16" med en dialogreplik i prompten är den mest volymrika användningen av denna modell just nu, eftersom ljudet kommer ur samma pass och läpparna matchar utan ett separat läppsynksteg.

Prompt-hantverk är en separat färdighet från async-rörledningen, och om dina bilder är tekniskt rena men visuellt platta, är problemet uppströms från denna artikel. Börja med H3-promptguiden.

Vad denna MiniMax H3-handledning kostade att köra

Verkliga radobjekt från körningen som producerade filmen överst, prissatta av Kör-knappen och verifierade 2026-08-12. H3 debiterar per sekund utdata och priset är nivåindelat efter upplösning: 2K-jobben prissattes till $1,12 för 8 sekunder, vilket är $0,14 per sekund, och katalogens startpris på $0,10 är 768P-nivån. Alla tre H3-slutpunkter är till fullt pris just nu, ingen rabatt tillämpad.

StegModellInställningarAvgift
Första bildGPT Image 2 text-to-imagekvalitet hög, 2048x1152$0,1745
Bild AH3 image-to-video2K, 8s$1,12
Bild BH3 text-to-video2K, 16:9, 6s$0,84
Levererad film14,6s, två bilder, 2560x1440, stereoljud$2,13
Skärmbildskörningar för denna artikelH3 i2v + t2v2K, 8s var$2,24

Värt att notera att samma två bilder i utkast i 768P skulle ha kostat $0,80 och $0,60 istället för $1,12 och $0,84, cirka 29% rabatt, för material du absolut kan bedöma en tagning på.

Två faktureringsdetaljer som är lätta att lära sig den dyra vägen. En förfrågan som avvisas vid inskickning kostar ingenting, så en 400 på en saknad ratio är gratis. En förfrågan som renderar något oanvändbart är inte gratis: om jobbet når succeeded debiteras du, även om utmatningen inte är vad du ville ha. Det är det verkliga argumentet för att göra utkast i 768P.

Priser per sekund, jämförelsen mellan 768P och 2K, och hur avgiften beter sig över varaktigheter bryts ner ordentligt i MiniMax H3 API-prissättning, en följeslagare till denna artikel. Denna handlar om koden, den om räkningen.

Attribuering och territorium innan du lanserar

Två saker att kolla innan detta går offentligt. MiniMaxs API-villkor inkluderar en villkorad försvarsförpliktelse som täcker patent- och upphovsrättsanspråk mot API-utdata, och den förpliktelsen omfattar inte varumärke eller likhet, så en igenkännbar logotyp eller en verklig person i din prompt är fortfarande ditt problem. Separat bär H3:s öppna viktlicens en klausul om uteslutna territorier, och den klausulen styr de nedladdade vikterna och deras utdata, inte det värdbaserade API:t, vars villkor namnger en tjänstregion i USA du kan välja. Läs det kontrakt du faktiskt skrev på. Och märk H3-utdata som H3-utdata i ditt gränssnitt.

MiniMax H3-handledning FAQ

Vilka är MiniMax H3-uppgiftsstatusarna, och finns det en expired?

Fem: queued, running, succeeded, failed, cancelled. Det finns ingen expired-status. Två andra saker löper ut och förväxlas med en: nedladdnings-URL:en i content.url är tidsbegränsad, och själva uppgiftsposten är bara sökbar under de senaste 7 dagarna.

Måste jag använda en callback, eller är polling okej för MiniMax H3?

Polling är okej och är mindre kod. Använd en callback när du har tillräckligt många samtidiga jobb så att en poller per jobb är dumt. Om du gör det måste slutpunkten echoa challenge-fältet oförändrat inom 3 sekunder, synkront, före eventuell auth-mellanprogramvara. En misslyckad handskakning ger inget felmeddelande alls, bara permanent tystnad.

Varför får min MiniMax H3 text-to-video-förfrågan 400 med "ratio is required and cannot be adaptive"?

För att du är i text-only-läget, där det inte finns någon första bild att härleda formatet från. Skicka ett explicit värde: 21:9, 16:9, 4:3, 1:1, 3:4 eller 9:16. Samma regel är varför ratio ser ut att inte göra något i image-to-video, där den första bilden bestämmer och eventuell ratio du skickar ignoreras.

Hur många MiniMax H3-jobb kan jag köra parallellt?

Den dokumenterade gränsen är anslutningsbaserad: 2 samtidiga uppgifter gratis, 15 betald. Över gränsen får du en omedelbar 429 snarare än en köplats, så begränsa dina egna aktiva förfrågningar. Routande gateways absorberar ibland mer, och jag har haft 20 samtidiga jobb som alla slutförts, men jag har också fått 429 på samma setup en annan dag. Bygg inte en schemaläggare som antar det högre antalet.

Min MiniMax H3-video-URL ger 404 en dag senare. Är renderingen borta?

Nej. URL:en löpte ut, renderingen inte. Fråga samma task_id igen och svaret ger en ny URL, när som helst inom 7-dagarsfrågefönstret. Efter 7 dagar är själva uppgiftsposten inte längre sökbar, vilket är varför steg 2 sparar task_id innan du gör något annat.

Jag sökte på "hailuo ai video generator how to use" och hamnade på en MiniMax H3-handledning. Är jag på rätt plats?

Ja. Hailuo är konsumentappen och H3 är modellnamnet som API:t använder. Samma motor. Om du vill ha ett klipp, använd lekplatsvägen i arbetsflödesavsnittet ovan, ingen kod krävs. Om du vill ha tio varianter eller en första bild pipad från en annan modell, är de sju stegen för dig.

Senaste modellerna

Ett API för all media-AI.

Utforska alla modeller