PopNowAPI
Odbierz klucz API

od MiniMax

Zmień światło, pogodę lub styl klipu; ludzie i ruch zostają

minimax/h3-edit/video-edit
  • Do 768p
  • Klipy 3–15 s
  • Z dźwiękiem
  • Do 9 obrazów referencyjnych
  • Proporcje obrazu: 7
  • Edytuj wideo

Wywołujesz go nazwą modelu minimax/h3-edit/video-edit w POST /jobs/createTask, od 0,15 USD.

Nazwa modeluminimax/h3-edit/video-edit
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-edit/video-edit",
  "input": {
    "prompt": "A slow aerial shot drifting over a misty pine forest at sunrise",
    "video_url": "https://media.popnow.ai/effects/flower-bloom-1abd6efb.mp4",
    "resolution": "768p",
    "duration_seconds": 5
  }
}'

# 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"

input jest zbudowany ze schematu poniżej, więc przechodzi walidację bez zmian. Zamień prompt i linki na własne.

Cena

OpcjaUSD za sekundę
resolution 480p0,03 USD
resolution 540p0,045 USD
resolution 768p0,066 USD

Rozliczenie w USD · Wszystkie opcje i ceny: GET /models/minimax/h3-edit/video-edit

Limity

Długość klipu
3–15 s
Rozdzielczości
480p · 540p · 768p
Proporcje obrazu
16:9 · 9:16 · 1:1 · 4:3 · 3:4 · 21:9 · 9:21
Audio referencyjne
3
Obrazy referencyjne
9
Długość promptu (znaki)
5,000
Najdłuższy klip wejściowy
15 s

Parametry

Te pola pochodzą z tego samego schematu, którym sprawdzamy każde żądanie. Pola spoza listy są odrzucane.

  • promptstringWymagane

    The change to make: lighting, weather, style, setting or specific elements. Name references as <Picture 1> or <Audio 1>.

    Zakres
    3 – 5000 chars
  • video_urlstringWymaganeZmienia cenę

    Klip do obróbki.

    Zakres
    video/mp4, video/webm, video/quicktime, video/x-m4v
  • reference_image_urlsarray<string>OpcjonalneZmienia cenę

    Obrazy osób, ubrań lub miejsc, które wynik ma zachować.

    Zakres
    1 – 9 items · image/jpeg, image/png, image/webp, image/gif
  • reference_audio_urlsarray<string>OpcjonalneZmienia cenę

    Dźwięk do dopasowania: głos, muzyka lub rytm.

    Zakres
    1 – 3 items · audio/mpeg, audio/wav, audio/mp4, audio/aac +3
  • aspect_ratiostringOpcjonalne

    Kształt kadru: szeroki, kwadratowy albo pionowy.

    Dozwolone wartości
    "16:9""9:16""1:1""4:3""3:4""21:9""9:21"
  • resolutionstringOpcjonalneZmienia cenę

    Rozmiar wyniku. Większy jest ostrzejszy i droższy.

    Domyślnie
    "768p"
    Dozwolone wartości
    "480p""540p""768p"
  • duration_secondsintegerOpcjonalneZmienia cenę

    Długość klipu. Płacisz za każdą sekundę.

    Domyślnie
    5
    Zakres
    3 – 15
  • generate_audiobooleanOpcjonalne

    Dodaje dźwięk pasujący do obrazu: głosy, tło i efekty.

    Domyślnie
    true
  • seedintegerOpcjonalne

    Ta sama liczba daje powtarzalny wynik.

    Zakres
    0 – 2147483647
Surowy JSON Schema
{
  "additionalProperties": false,
  "properties": {
    "aspect_ratio": {
      "description": "Output aspect ratio. Leave it out to keep the source clip's shape.",
      "enum": [
        "16:9",
        "9:16",
        "1:1",
        "4:3",
        "3:4",
        "21:9",
        "9:21"
      ],
      "type": "string"
    },
    "duration_seconds": {
      "default": 5,
      "description": "Length of the edited clip in whole seconds, 3 to 15. Set it to your source clip's length to edit the whole clip.",
      "maximum": 15,
      "minimum": 3,
      "type": "integer"
    },
    "generate_audio": {
      "default": true,
      "description": "On: H3 generates a new soundtrack for the edit. Off: the source clip's own audio is kept.",
      "type": "boolean"
    },
    "prompt": {
      "description": "The change to make: lighting, weather, style, setting or specific elements. Name references as <Picture 1> or <Audio 1>.",
      "maxLength": 5000,
      "minLength": 3,
      "type": "string"
    },
    "reference_audio_urls": {
      "items": {
        "contentMediaType": [
          "audio/mpeg",
          "audio/wav",
          "audio/mp4",
          "audio/aac",
          "audio/ogg",
          "audio/opus",
          "audio/flac"
        ],
        "format": "uri",
        "type": "string"
      },
      "maxItems": 3,
      "minItems": 1,
      "type": "array"
    },
    "reference_image_urls": {
      "description": "Optional reference images, up to nine, named <Picture 1> to <Picture 9> in the prompt. Each one adds a per-reference charge.",
      "items": {
        "contentMediaType": [
          "image/jpeg",
          "image/png",
          "image/webp",
          "image/gif"
        ],
        "format": "uri",
        "type": "string"
      },
      "maxItems": 9,
      "minItems": 1,
      "type": "array"
    },
    "resolution": {
      "default": "768p",
      "description": "Output resolution. 768p is H3's own canvas; 480p and 540p are lower-cost, quicker tiers.",
      "enum": [
        "480p",
        "540p",
        "768p"
      ],
      "type": "string"
    },
    "seed": {
      "description": "Random seed for controlled comparisons.",
      "maximum": 2147483647,
      "minimum": 0,
      "type": "integer"
    },
    "video_url": {
      "contentMediaType": [
        "video/mp4",
        "video/webm",
        "video/quicktime",
        "video/x-m4v"
      ],
      "format": "uri",
      "type": "string"
    }
  },
  "required": [
    "video_url",
    "prompt"
  ],
  "type": "object"
}

Prawdziwy wynik z MiniMax H3 Edit

PromptMake it a snowy winter night: heavy snow falling, frost on the ground, warm street lamps glowing and breath visible in the cold air. Keep the person, the outfit and the motion the same.
To samo żądanie przez API
{
  "model": "minimax/h3-edit/video-edit",
  "input": {
    "prompt": "Make it a snowy winter night: heavy snow falling, frost on the ground, warm street lamps glowing and breath visible in the cold air. Keep the person, the outfit and the motion the same.",
    "video_url": "https://media.popnow.ai/effects/flower-bloom-1abd6efb.mp4",
    "resolution": "768p",
    "duration_seconds": 5,
    "generate_audio": false
  }
}

Ten wynik powstał z przesłanego pliku: wstaw własny link w miejsce przykładowego.

Odpowiedzi, odpytywanie i callbacki

Wszystkie modele działają tak samo: utwórz zadanie, a potem odpytuj je albo poczekaj na callback.

Najpierw cena

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-edit/video-edit",
  "input": {
    "prompt": "A slow aerial shot drifting over a misty pine forest at sunrise",
    "video_url": "https://media.popnow.ai/effects/flower-bloom-1abd6efb.mp4",
    "resolution": "768p",
    "duration_seconds": 5
  }
}'

Przed uruchomieniem wyślij tę samą treść żądania do POST /jobs/quote, aby zobaczyć szacowaną i maksymalną opłatę w USD. Wycena nie uruchamia zadania ani nie obciąża salda.

Przyjęte

HTTP
HTTP/1.1 202 Accepted

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

HTTP 202 oznacza przyjęcie zadania: maksymalna kwota w USD pozostaje zarezerwowana do rozliczenia. Po przyjęciu zadania rezerwujemy maksymalną kwotę wyceny na saldzie API. Po zakończeniu naliczamy opłatę za rzeczywiste użycie, nie wyższą niż rezerwacja, i zwalniamy resztę. Jeśli zadanie się nie powiedzie, rezerwacja zostaje zwolniona.

Sprawdź status

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

Odpytuj co kilka sekund, stopniowo wydłużając odstęp, i przestań, gdy state ma wartość succeeded, failed, canceled lub expired.

Gotowe zadanie

JSON
{
  "code": 200,
  "msg": "success",
  "data": {
    "taskId": "task_01k3m8x9q2z4v7n5p6r8s0t1w3",
    "model": "minimax/h3-edit/video-edit",
    "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"
}

Pobierz plik z url przed expiresAt. Potrzebujesz później nowego linku? Poproś o niego przez POST /common/download-url.

Weryfikacja callbacku

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
});

Gdy ustawisz callBackUrl, wyślemy ci gotowe zadanie. Zanim mu zaufasz, sprawdź podpis na surowym ciele żądania.

Wysyłanie pliku lokalnego

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.

Publiczne linki https działają bez zmian. Pliki lokalne przechodzą najpierw przez upload-url i commit.