lightricks/ltx-2.3-lora/image-to-video18크레딧부터 / 5초 영상· 이미지로 영상 만들기

LTX-2.3 LoRA는 Lightricks의 220억 파라미터 오픈 오디오·비디오 모델을 텍스트→동영상과 이미지→동영상에서 요청당 직접 만든 LoRA 파일 최대 3개와 함께 돌립니다. 클립은 480p, 720p, 1080p에서 5~20초이며 스테레오 사운드트랙이 따라붙습니다. LoRA는 Hugging Face 파일 링크나 Civitai 다운로드 링크로 불러오고, 아무것도 필터링하지 않습니다.

POST /jobs/createTask에서 모델 이름을 lightricks/ltx-2.3-lora/image-to-video(으)로 지정하면 호출할 수 있습니다. 18크레딧/ 5초 영상부터(US$0.18). 새 계정에는 30크레딧이 지급되니 Playground에서 먼저 무료로 써 보세요.

  • 동영상 만들기
  • 이미지로 영상 만들기
  • 최대 1080p
  • 5–20초
  • 내 LoRA 불러오기
모델 이름lightricks/ltx-2.3-lora/image-to-video
엔드포인트POST 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": "lightricks/ltx-2.3-lora/image-to-video",
  "input": {
    "prompt": "A slow aerial shot drifting over a misty pine forest at sunrise",
    "image_url": "https://media.popnow.ai/influencer/examples/marco.webp",
    "resolution": "720p",
    "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은 아래 스키마로 만들었기 때문에 그대로 검증을 통과합니다. 프롬프트와 링크만 내 것으로 바꾸세요.

가격

옵션크레딧 /초≈ USD
resolution 480p3.6US$0.036
resolution 720p5.4US$0.054
resolution 1080p7.2US$0.072

1크레딧 = $0.01 · 모든 옵션과 가격: GET /models/lightricks/ltx-2.3-lora/image-to-video

제한

영상 길이
5–20 s
해상도
480p · 720p · 1080p

파라미터

이 필드들은 모든 요청을 검사할 때 쓰는 것과 같은 스키마에서 나옵니다. 목록에 없는 필드는 거부됩니다.

  • promptstring필수

    Describe what happens after the opening frame: the action, the camera and the sound. Put LoRA trigger words first.

    범위
    1 – … chars
  • image_urlstring필수

    출발점이 되는 이미지.

    범위
    image/jpeg, image/png, image/webp, image/gif
  • resolutionstring선택가격이 달라짐

    출력 크기. 클수록 선명하고 가격도 올라갑니다.

    기본값
    "720p"
    허용 값
    "480p""720p""1080p"
  • duration_secondsinteger선택가격이 달라짐

    클립 길이. 초 단위로 요금이 붙습니다.

    기본값
    5
    범위
    5 – 20
  • lorasarray<object>선택

    내 LoRA 파일을 불러와 스타일이나 캐릭터를 고정합니다.

    기본값
    []
    범위
    0 – 3 items
    내부 필드
    • loras[].pathstring필수

      Direct URL of a LoRA weights file (a Hugging Face file link or a Civitai download link).

      범위
      1 – … chars · application/octet-stream
    • loras[].scalenumber필수

      Weight strength from zero to four.

      기본값
      1
      범위
      0 – 4
  • seedinteger선택

    같은 숫자를 쓰면 같은 결과를 다시 얻을 수 있습니다.

    범위
    0 – 2147483647
원본 JSON 스키마
{
  "additionalProperties": false,
  "properties": {
    "duration_seconds": {
      "default": 5,
      "description": "Requested output length in whole seconds, from 5 to 20.",
      "maximum": 20,
      "minimum": 5,
      "type": "integer"
    },
    "image_url": {
      "contentMediaType": [
        "image/jpeg",
        "image/png",
        "image/webp",
        "image/gif"
      ],
      "description": "Opening frame. The clip starts from this image and keeps its aspect ratio.",
      "format": "uri",
      "type": "string"
    },
    "loras": {
      "default": [],
      "description": "Up to three LoRA weight files trained for LTX-2.3, each with its own strength. Files over 2 GiB are rejected.",
      "items": {
        "additionalProperties": false,
        "properties": {
          "path": {
            "contentMediaType": [
              "application/octet-stream"
            ],
            "description": "Direct URL of a LoRA weights file (a Hugging Face file link or a Civitai download link).",
            "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 after the opening frame: the action, the camera and the sound. Put LoRA trigger words first.",
      "minLength": 1,
      "type": "string"
    },
    "resolution": {
      "default": "720p",
      "description": "Output resolution.",
      "enum": [
        "480p",
        "720p",
        "1080p"
      ],
      "type": "string"
    },
    "seed": {
      "description": "Random seed for controlled comparisons, not a frame-identical guarantee.",
      "maximum": 2147483647,
      "minimum": 0,
      "type": "integer"
    }
  },
  "required": [
    "prompt",
    "image_url"
  ],
  "type": "object"
}

LTX-2.3 LoRA로 만든 실제 결과

프롬프트Claymation diorama style, handcrafted stop-motion animation: the man lying on the planetarium floor turns into a sculpted clay figure as the projected eclipse slides across him; he stretches, smiles up into the lens and reaches one hand toward the camera while tiny clay stars drift down around him. Overhead camera slowly rotates. Silver and navy clay, visible fingerprints. Audio: a gentle chime, soft clay squeak.
같은 내용의 API 요청
{
  "model": "lightricks/ltx-2.3-lora/image-to-video",
  "input": {
    "prompt": "Claymation diorama style, handcrafted stop-motion animation: the man lying on the planetarium floor turns into a sculpted clay figure as the projected eclipse slides across him; he stretches, smiles up into the lens and reaches one hand toward the camera while tiny clay stars drift down around him. Overhead camera slowly rotates. Silver and navy clay, visible fingerprints. Audio: a gentle chime, soft clay squeak.",
    "image_url": "https://media.popnow.ai/influencer/examples/marco.webp",
    "resolution": "720p",
    "duration_seconds": 5,
    "seed": 4214
  }
}

이 예시는 업로드한 파일에서 시작했습니다. 예시 링크 자리에 내 파일 링크를 넣으세요.

응답, 폴링, 콜백

모든 모델은 같은 방식으로 동작합니다. 작업을 만들고, 폴링하거나 콜백을 기다리세요.

먼저 견적 받기

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": "lightricks/ltx-2.3-lora/image-to-video",
  "input": {
    "prompt": "A slow aerial shot drifting over a misty pine forest at sunrise",
    "image_url": "https://media.popnow.ai/influencer/examples/marco.webp",
    "resolution": "720p",
    "duration_seconds": 5
  }
}'

본문은 createTask와 같습니다. 예상 청구액과 최대 청구액을 돌려주며, 아무것도 실행하지 않습니다.

접수됨

HTTP
HTTP/1.1 202 Accepted

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

HTTP 202는 작업이 접수되었고 크레딧이 보류만 되었을 뿐 아직 차감되지 않았다는 뜻입니다. 최종 청구액은 보류액을 넘지 않습니다.

상태 확인

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

간격을 조금씩 늘리며 몇 초마다 확인하고, state가 succeeded, failed, canceled, expired 중 하나가 되면 멈추세요.

완료된 작업

JSON
{
  "code": 200,
  "msg": "success",
  "data": {
    "taskId": "task_01k3m8x9q2z4v7n5p6r8s0t1w3",
    "model": "lightricks/ltx-2.3-lora/image-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"
}

expiresAt 전에 url에서 내려받으세요. 나중에 새 링크가 필요하면 POST /common/download-url을 호출하세요.

콜백 검증하기

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

callBackUrl을 설정하면 완료된 작업을 보내 드립니다. 믿기 전에 원본 요청 본문으로 서명을 확인하세요.

로컬 파일 보내기

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.

공개 https 링크는 그대로 쓸 수 있습니다. 로컬 파일은 먼저 upload-url과 commit을 거칩니다.