minimax/h3-singularity-lora/video-extendOd 47 kredytów za klip 5-sekundowy· Wydłuż wideo

Kontynuuj klip z MiniMax H3 Singularity LoRA: ostatnia klatka twojego wideo otwiera nowy fragment od 3 do 15 sekund, a w odpowiedzi dostajesz jeden plik z oryginałem i kontynuacją, w 480p, 540p, 768p albo 1080p.

Wywołujesz go nazwą modelu minimax/h3-singularity-lora/video-extend w POST /jobs/createTask, od 47 kredytów za klip 5-sekundowy (0,47 USD). Nowe konta dostają 30 darmowych kredytów, więc możesz najpierw przetestować go w Playgroundzie.

  • Obraz w wideo
  • Wideo z referencji
  • Wydłuż wideo
  • Do 1080p
  • Klipy 3–15 s
  • Pierwsza i ostatnia klatka
  • Do 9 obrazów referencyjnych
  • Proporcje obrazu: 7
  • Własne LoRA
Nazwa modeluminimax/h3-singularity-lora/video-extend
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-singularity-lora/video-extend",
  "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": "480p",
    "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

OpcjaKredyty za sekundę≈ USD
resolution 480p9,380,094 USD
resolution 540p14,060,14 USD
resolution 768p18,750,19 USD
resolution 1080p37,50,38 USD

1 kredyt = 0,01 USD · Wszystkie opcje i ceny: GET /models/minimax/h3-singularity-lora/video-extend

Każde zadanie jest zaokrąglane w górę do pełnych kredytów, więc jedno uruchomienie na najniższym poziomie kosztuje 47 kredytów za klip 5-sekundowy (0,47 USD).

Limity

Długość klipu
3–15 s
Rozdzielczości
480p · 540p · 768p · 1080p
Długość promptu (znaki)
7,000
Najdłuższy klip wejściowy
60 s

Parametry

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

  • promptstringWymagane

    Describe what happens next: the action that follows, the camera move and the sound.

    Zakres
    1 – 7000 chars
  • video_urlstringWymagane

    Klip do obróbki.

    Zakres
    1 – … chars · video/mp4, video/webm, video/quicktime
  • last_image_urlstringOpcjonalne

    Opcjonalna ostatnia klatka, żeby klip skończył się dokładnie tam, gdzie chcesz.

    Zakres
    image/jpeg, image/png, image/webp, image/gif
  • resolutionstringOpcjonalneZmienia cenę

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

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

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

    Domyślnie
    5
    Zakres
    3 – 15
  • lorasarray<object>Opcjonalne

    Wczytaj własne pliki LoRA, by utrwalić styl lub postać.

    Domyślnie
    []
    Zakres
    0 – 3 items
    Pola wewnętrzne
    • loras[].pathstringWymagane

      Direct URL of a LoRA weights file.

      Zakres
      1 – … chars · application/octet-stream
    • loras[].scalenumberWymagane

      Weight strength from zero to four.

      Domyślnie
      1
      Zakres
      0 – 4
  • seedintegerOpcjonalne

    Ta sama liczba daje powtarzalny wynik.

    Zakres
    0 – 2147483647
Surowy JSON Schema
{
  "additionalProperties": false,
  "properties": {
    "duration_seconds": {
      "default": 5,
      "description": "Length of the new segment in whole seconds, from 3 to 15. The source clip is added on top and is not billed.",
      "maximum": 15,
      "minimum": 3,
      "type": "integer"
    },
    "last_image_url": {
      "contentMediaType": [
        "image/jpeg",
        "image/png",
        "image/webp",
        "image/gif"
      ],
      "description": "Optional target end frame: the new segment comes to rest on this picture.",
      "format": "uri",
      "type": "string"
    },
    "loras": {
      "default": [],
      "description": "Up to three LoRA weight files trained for MiniMax H3, each with its own strength, applied to the new segment. Reuse the ones used for the source clip to keep the style consistent.",
      "items": {
        "additionalProperties": false,
        "properties": {
          "path": {
            "contentMediaType": [
              "application/octet-stream"
            ],
            "description": "Direct URL of a LoRA weights file.",
            "format": "uri",
            "minLength": 1,
            "type": "string"
          },
          "scale": {
            "default": 1,
            "description": "Weight strength from zero to four.",
            "maximum": 4,
            "minimum": 0,
            "type": "number"
          }
        },
        "required": [
          "path",
          "scale"
        ],
        "type": "object"
      },
      "maxItems": 3,
      "type": "array"
    },
    "prompt": {
      "description": "Describe what happens next: the action that follows, the camera move and the sound.",
      "maxLength": 7000,
      "minLength": 1,
      "type": "string"
    },
    "resolution": {
      "default": "480p",
      "description": "Resolution of the new segment. Match your source clip; it sets how sharp the new part is generated.",
      "enum": [
        "480p",
        "540p",
        "768p",
        "1080p"
      ],
      "type": "string"
    },
    "seed": {
      "description": "Random seed for controlled comparisons.",
      "maximum": 2147483647,
      "minimum": 0,
      "type": "integer"
    },
    "video_url": {
      "contentMediaType": [
        "video/mp4",
        "video/webm",
        "video/quicktime"
      ],
      "description": "The clip to continue: MP4, MOV or WebM, up to 60 seconds. Its last frame opens the new segment, and the result is your clip with the new segment joined on.",
      "format": "uri",
      "minLength": 1,
      "type": "string"
    }
  },
  "required": [
    "prompt",
    "video_url"
  ],
  "type": "object"
}

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-singularity-lora/video-extend",
  "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": "480p",
    "duration_seconds": 5
  }
}'

To samo ciało co createTask. Zwraca przewidywaną i maksymalną możliwą opłatę, niczego nie uruchamiając.

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, że zadanie przyjęto, a kredyty są zarezerwowane, jeszcze nie pobrane. Ostateczna opłata nigdy nie przekroczy rezerwacji.

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-singularity-lora/video-extend",
    "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.