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_idoch 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 ingenexpired-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
ratiooch kan inte varaadaptive. För image-to-video bestämmer första bilden formatet, och eventuellratiodu 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.
| Symptom | Vad du ser | Egentlig orsak | Lösning |
|---|---|---|---|
| Poll-loopen avslutas aldrig | Terminalen skriver ut för evigt, jobbet var klart för länge sedan | Ditt avslutningsvillkor jämför med v1-ord som Success / Fail. V2-frågeslutpunkten returnerar lowercase succeeded / failed | Matcha mot v2-enumen, och höj undantag för alla statusar du inte känner igen |
| Omedelbar 400 på text-to-video | Förfrågan avvisas innan någon rendering startar | ratio saknas eller är satt till adaptive, vilket text-only-läget vägrar | Skicka en explicit ratio som 16:9 |
| Din ratio ignoreras tyst | Utmatningsbilden är inte vad du bad om | Image-to-video hämtar bildformatet från den första bilden, så ratio är en no-op där | Beskär eller generera första bilden i det format du vill ha |
| Webhook utlöses aldrig, inget felmeddelande | Noll pushar, rena loggar, inget klagomål från API:t | Verifieringshandskakningen misslyckades. MiniMax skickade en challenge och din slutpunkt ekade inte tillbaka den oförändrad inom 3 sekunder | Svara på challenge synkront, före all auth- eller kö-mellanprogramvara |
| Gårdagens URL ger 404 | Nedladdningslänken död, renderingen verkar borta | Nedladdnings-URL:en är tidsbegränsad. Renderingen är okej | Fråga samma task_id igen för en ny URL, inom 7-dagarsfönstret |
| Slumpmässiga 429:or under belastning | Vissa 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äge | Vad som går i content | role på bildobjektet | Vad ratio gör | Använd för |
|---|---|---|---|---|
| Text-to-video | ett textobjekt | ingen | Krävs, och adaptive avvisas | Bilder utan källbild, full kontroll över formatet |
| Image-to-video | textobjekt plus bildobjekt | first_frame (eventuellt även last_frame) | Ignoreras, första bilden avgör | Animera en stillbild du redan har art-directat |
| Reference-to-video | textobjekt plus referensobjekt | reference_image (även reference_video, reference_audio) | Krävs, samma som text-only | Behålla en karaktär eller en röst över bilder |
Och den del din kod faktiskt måste hantera. Fem statusar, fem olika grenar.
| Status | Vad det betyder | Vad din kod gör |
|---|---|---|
| queued | Accepterad, väntar på en plats | Fortsätt polla, backa av |
| running | Renderar | Fortsätt polla, backa av |
| succeeded | Klart, content.url är ifylld | Ladda ner omedelbart, i denna iteration |
| failed | Renderingen misslyckades | Läs felmeddelandet, logga det, försök inte blind-retry samma payload |
| cancelled | Jobbet avbröts | Avsluta loopen, behandla som terminal |
| anything else | Finns inte i enumen | Hö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 direkt | Unified gateway (Atlas Cloud) | |
|---|---|---|
| Skicka | POST /v2/video_generation | POST /api/v1/model/generateVideo |
| Polla | GET /v2/query/video_generation/{task_id} | GET /api/v1/model/prediction/{id} |
| Statusord | queued / running / succeeded / failed / cancelled | completed vid succé, failed vid misslyckande |
| Push-notiser | Callback-URL med 3-sekunders challenge-handskakning | Polla prediction-id |
| Samtidighet | 2 gratis, 15 betald, hård 429 | Inte publicerad som per-modell-begränsning, mäts bredare i praktiken |
| Första-bilds-bildmodell på samma nyckel | Nej, separat konto | Ja, GPT Image 2 och H3 bakom en nyckel |
| H3-pris | Publicerat 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:
- Öppna en modellsida, till exempel MiniMax H3 image-to-video. Lekplatsen är den högra panelen på sidan.
- 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.
- 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.
text1A 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

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å.
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 # 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:

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.
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 ä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.
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 """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:

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.
text1The 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
python1shot_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

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:
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: # 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.
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
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.
| Steg | Modell | Inställningar | Avgift |
|---|---|---|---|
| Första bild | GPT Image 2 text-to-image | kvalitet hög, 2048x1152 | $0,1745 |
| Bild A | H3 image-to-video | 2K, 8s | $1,12 |
| Bild B | H3 text-to-video | 2K, 16:9, 6s | $0,84 |
| Levererad film | 14,6s, två bilder, 2560x1440, stereoljud | $2,13 | |
| Skärmbildskörningar för denna artikel | H3 i2v + t2v | 2K, 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.






