minimax/h3-max/text-to-videoDa 38 crediti per una clip di 5 secondi· Crea video

MiniMax H3 Max è la variante che MiniMax descrive come versione a generazione rapida di H3, pubblicata come endpoint text-to-video, image-to-video (con fotogramma finale facoltativo) e video-extend. Le clip durano da 5 a 15 secondi in 480p o 768p, e ambiente, foley e musica nascono insieme all'immagine invece di essere aggiunti dopo.

Lo chiami con il nome di modello minimax/h3-max/text-to-video su POST /jobs/createTask, da 38 crediti per una clip di 5 secondi (0,38 USD). I nuovi account ricevono 30 crediti gratuiti per provarlo prima nel Playground.

  • Crea video
  • Da immagine a video
  • Allunga video
  • Fino a 768p
  • Clip da 5 a 15 s
  • Fotogramma iniziale e finale
  • 6 formati
Nome del modellominimax/h3-max/text-to-video
EndpointPOST https://api.popnow.ai/api/v1/jobs/createTask
# 1. Create the task. Keep the Idempotency-Key if you retry after a network error.
export IDEMPOTENCY_KEY="$(uuidgen)"
curl -X POST https://api.popnow.ai/api/v1/jobs/createTask \
  -H "Authorization: Bearer $POPNOW_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $IDEMPOTENCY_KEY" \
  -d '{
  "model": "minimax/h3-max/text-to-video",
  "input": {
    "prompt": "A slow aerial shot drifting over a misty pine forest at sunrise",
    "aspect_ratio": "1:1",
    "duration_seconds": 8,
    "resolution": "768p"
  }
}'

# 2. Copy data.taskId from the response, then poll until state is succeeded, failed, canceled or expired.
TASK_ID="TASK_ID_FROM_RESPONSE"
curl "https://api.popnow.ai/api/v1/jobs/recordInfo?taskId=$TASK_ID" \
  -H "Authorization: Bearer $POPNOW_API_KEY"

L’input è costruito dallo schema qui sotto, quindi supera la verifica così com’è. Sostituisci prompt e link con i tuoi.

Prezzo

OpzioneCrediti al secondo≈ USD
resolution 480p7,50,075 USD
resolution 768p120,12 USD

1 credito = 0,01 $ · Tutte le opzioni e i prezzi: GET /models/minimax/h3-max/text-to-video

Ogni attività è arrotondata per eccesso ai crediti interi, quindi un'esecuzione al livello più basso costa 38 crediti per una clip di 5 secondi (0,38 USD).

Limiti

Durata della clip
5–15 s
Risoluzioni
480p · 768p
Proporzioni
21:9 · 16:9 · 4:3 · 1:1 · 3:4 · 9:16
Lunghezza del prompt (caratteri)
7,000

Parametri

Questi campi vengono dallo stesso schema con cui verifichiamo ogni richiesta. I campi non elencati vengono rifiutati.

  • promptstringObbligatorio

    Describe the subject, action, camera, and mood of the shot.

    Intervallo
    1 – 7000 chars
  • aspect_ratiostringFacoltativo

    La forma dell'inquadratura: larga, quadrata o verticale.

    Predefinito
    "1:1"
    Valori ammessi
    "21:9""16:9""4:3""1:1""3:4""9:16"
  • duration_secondsintegerFacoltativoCambia il prezzo

    Quanto dura la clip. Si paga al secondo.

    Predefinito
    8
    Intervallo
    5 – 15
  • resolutionstringFacoltativoCambia il prezzo

    Dimensione dell'output. Più grande è più nitido e costa di più.

    Predefinito
    "768p"
    Valori ammessi
    "480p""768p"
  • enable_prompt_expansionbooleanFacoltativoCambia il prezzo

    Lascia che il modello arricchisca un prompt breve.

    Predefinito
    false
JSON Schema grezzo
{
  "type": "object",
  "required": [
    "prompt"
  ],
  "properties": {
    "prompt": {
      "type": "string",
      "maxLength": 7000,
      "minLength": 1,
      "description": "Describe the subject, action, camera, and mood of the shot."
    },
    "resolution": {
      "enum": [
        "480p",
        "768p"
      ],
      "type": "string",
      "default": "768p",
      "description": "Output resolution."
    },
    "aspect_ratio": {
      "enum": [
        "21:9",
        "16:9",
        "4:3",
        "1:1",
        "3:4",
        "9:16"
      ],
      "type": "string",
      "default": "1:1",
      "description": "Output aspect ratio."
    },
    "duration_seconds": {
      "type": "integer",
      "default": 8,
      "maximum": 15,
      "minimum": 5,
      "description": "Requested output length in seconds, from 5 to 15."
    },
    "enable_prompt_expansion": {
      "type": "boolean",
      "default": false,
      "description": "Expand the prompt into a fuller description before generating. Requests with it on add a flat per-request prompt-expansion fee."
    }
  },
  "additionalProperties": false
}

Un risultato reale di MiniMax H3 Max

PromptCast: one man and one woman. Close on a snow-covered platform: she presses her palm flat against the carriage window from outside and he presses his to the same spot from inside, her breath fogging the glass between them, her coat open at the throat. The train starts to pull away and their hands slide apart. Ultra-wide 21:9, cinematic, heavy film grain, snow white against warm carriage light.
La stessa richiesta tramite API
{
  "model": "minimax/h3-max/text-to-video",
  "input": {
    "prompt": "Cast: one man and one woman. Close on a snow-covered platform: she presses her palm flat against the carriage window from outside and he presses his to the same spot from inside, her breath fogging the glass between them, her coat open at the throat. The train starts to pull away and their hands slide apart. Ultra-wide 21:9, cinematic, heavy film grain, snow white against warm carriage light.",
    "aspect_ratio": "21:9",
    "duration_seconds": 8,
    "resolution": "768p"
  }
}

Risposte, polling e callback

Tutti i modelli funzionano allo stesso modo: crei un task, poi lo interroghi o aspetti la callback.

Prima il prezzo

cURL
curl -X POST https://api.popnow.ai/api/v1/jobs/quote \
  -H "Authorization: Bearer $POPNOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "model": "minimax/h3-max/text-to-video",
  "input": {
    "prompt": "A slow aerial shot drifting over a misty pine forest at sunrise",
    "aspect_ratio": "1:1",
    "duration_seconds": 8,
    "resolution": "768p"
  }
}'

Stesso corpo di createTask. Restituisce l’addebito previsto e quello massimo possibile, senza eseguire nulla.

Accettata

HTTP
HTTP/1.1 202 Accepted

{
  "code": 200,
  "msg": "success",
  "data": {
    "taskId": "task_01k3m8x9q2z4v7n5p6r8s0t1w3",
    "state": "queued"
  },
  "request_id": "req_example_create"
}

HTTP 202 significa che il task è stato accettato e i crediti sono riservati, non ancora addebitati. L’addebito finale non supera mai la riserva.

Controlla lo stato

cURL
curl "https://api.popnow.ai/api/v1/jobs/recordInfo?taskId=$TASK_ID" \
  -H "Authorization: Bearer $POPNOW_API_KEY"

Controlla ogni pochi secondi allungando via via l’intervallo e fermati quando state è succeeded, failed, canceled o expired.

Task completato

JSON
{
  "code": 200,
  "msg": "success",
  "data": {
    "taskId": "task_01k3m8x9q2z4v7n5p6r8s0t1w3",
    "model": "minimax/h3-max/text-to-video",
    "state": "succeeded",
    "output": {
      "assets": [
        {
          "url": "https://cdn.popnow.ai/tasks/task_01k3m8x9q2z4v7n5p6r8s0t1w3/output.mp4?signature=FROM_RESPONSE",
          "expiresAt": "2026-10-17T12:20:00Z",
          "mime": "video/mp4",
          "width": 1280,
          "height": 720,
          "durationSeconds": 5
        }
      ]
    },
    "settled": true
  },
  "request_id": "req_example_record"
}

Scarica dall’url prima di expiresAt. Ti serve un link nuovo più tardi? Chiedilo con POST /common/download-url.

Verifica una callback

Node.js
import { createHash, createHmac, timingSafeEqual } from "node:crypto";
import express from "express";

const app = express();
// express.raw keeps the exact bytes that were signed; express.json would not match.
app.post("/hooks/popnow", express.raw({ type: "application/json" }), (req, res) => {
  const timestamp = req.header("X-Webhook-Timestamp");
  const signature = req.header("X-Webhook-Signature") ?? "";
  const body = JSON.parse(req.body.toString("utf8"));
  const taskId = body.data?.taskId ?? body.task_id;
  const digest = createHash("sha256").update(req.body).digest("hex");
  const expected = createHmac("sha256", process.env.POPNOW_WEBHOOK_SECRET)
    .update(`${taskId}.${timestamp}.${digest}`)
    .digest("base64");
  const ok = expected.length === signature.length && timingSafeEqual(Buffer.from(expected), Buffer.from(signature));
  // Check the signature first, then reject anything older than five minutes.
  if (!ok || Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) return res.status(401).end();
  res.status(200).end(); // answer fast, then fetch the task and store its files
});

Con callBackUrl impostata ti inviamo il task completato. Verifica la firma sul corpo grezzo prima di fidarti.

Invia un file locale

cURL
curl -X POST https://api.popnow.ai/api/v1/common/upload-url \
  -H "Authorization: Bearer $POPNOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"contentType": "image/png", "bytes": 482113}'

# PUT the file bytes to data.uploadUrl with every header in data.headers, then commit it:
curl -X POST https://api.popnow.ai/api/v1/files/$FILE_ID/commit \
  -H "Authorization: Bearer $POPNOW_API_KEY"
# The commit returns a popnow://f/... reference. Put it in any image, video or
# audio field of the task input instead of a public https URL.

I link https pubblici funzionano così come sono. I file locali passano prima da upload-url e commit.