NezhaGateNezhaGate
wan3.0-video-prime

Wan 3.0 Prime · API

POST https://nezhagate.com/v1/videos/generations

Wan 3.0 Prime: Wan 3.0과 기능은 같고 생성이 더 빠르며, 초 단위로 과금됩니다. 텍스트-투-비디오, 첫 프레임, 첫·마지막 프레임, 다중 이미지 참조, 참조 영상 편집을 엔드포인트 하나에서 쓸 수 있고, 2~30초, 480P / 720P / 1080P를 지원합니다. 비동기 작업이며 실패하면 과금되지 않습니다.

플레이그라운드에서 사용해 보기 →

빠른 시작

세 단계면 됩니다: 작업 제출 → 결과 조회 → 영상 링크 받기. YOUR_API_KEY를 내 키로 바꾸면 아래 명령을 그대로 실행할 수 있습니다.

1단계 · 제출(작업 ID를 바로 돌려줍니다, HTTP 202)

curl
curl https://nezhagate.com/v1/videos/generations \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "wan3.0-video-prime", "prompt": "벚나무 아래에서 떨어지는 꽃잎을 쫓는 시바견, 화창한 햇살, 슬로 모션", "duration": 5, "resolution": "720P", "size": "16:9"}'

응답(HTTP 202)

JSON
{
  "id": "img_5c2e8f1a9b3d7e6f0a4c8b2d",
  "object": "video.generation.job",
  "status": "queued",
  "created": 1791281400,
  "model": "wan3.0-video-prime"
}

2단계 · status가 succeeded 또는 failed가 될 때까지 5~10초마다 조회

curl
curl https://nezhagate.com/v1/videos/jobs/img_5c2e8f1a9b3d7e6f0a4c8b2d \
  -H "Authorization: Bearer YOUR_API_KEY"

성공했을 때의 응답

JSON
{
  "id": "img_5c2e8f1a9b3d7e6f0a4c8b2d",
  "object": "video.generation.job",
  "status": "succeeded",
  "created": 1791281400,
  "model": "wan3.0-video-prime",
  "data": [
    {"url": "https://img.nezhagate.com/i/8c1f0e5d2b7a49e3a6d0c4f1b9e2a7d5.mp4"}
  ],
  "usage": {"clips": 1, "model": "wan3.0-video-prime"}
}

3단계 · data[0].url이 결과 영상(MP4)입니다. 15일 동안 보관되므로 더 오래 쓰려면 내 저장소에 내려받아 두세요.

전체 예제(Python: 제출 → 대기 → 로컬에 저장)

Python
import time
import requests

BASE = "https://nezhagate.com/v1"
HEADERS = {"Authorization": "Bearer YOUR_API_KEY"}

# 1. 제출
job = requests.post(f"{BASE}/videos/generations", headers=HEADERS, json={
    "model": "wan3.0-video-prime",
    "prompt": "벚나무 아래에서 떨어지는 꽃잎을 쫓는 시바견, 화창한 햇살, 슬로 모션",
    "duration": 5,
    "resolution": "720P",
    "size": "16:9",
}).json()
if "error" in job:
    raise SystemExit(job["error"]["message"])

# 2. 10초마다 조회, 최대 1시간까지 대기
deadline = time.time() + 3600
while job["status"] not in ("succeeded", "failed") and time.time() < deadline:
    time.sleep(10)
    job = requests.get(f"{BASE}/videos/jobs/{job['id']}", headers=HEADERS).json()

# 3. 영상 내려받기
if job["status"] == "succeeded":
    url = job["data"][0]["url"]
    with open("wan3.0-video-prime.mp4", "wb") as f:
        f.write(requests.get(url).content)
    print("saved", url)
elif job["status"] == "failed":
    print("failed:", job["error"]["code"], job["error"]["message"])
else:
    print("still", job["status"], job["id"])

대기 중일 때는 조회 결과에 queue_position(앞에 있는 작업 수)과 eta_seconds(예상 대기 시간)도 함께 옵니다. 프로그램에 정해 둔 대기 시간을 넘겨도 다시 제출하지 마세요. 작업은 그대로 남아 있으니 나중에 같은 작업 ID로 이어서 조회하면 됩니다.

인증

Header
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json

콘솔에서 API 키를 만들면 시작할 수 있습니다.

사양 한눈에 보기

길이2–30초
해상도480P / 720P / 1080P
화면 비율16:9 / 9:16 / 1:1 / 4:3 / 3:4 / adaptive
참조 이미지최대 10장 · 1장은 첫 프레임, 2장은 첫·마지막 프레임도 가능, 그 이상은 참조
참조 영상최대 5개, 합계 15초 이내
참조 오디오최대 5개
소리모델이 결정, 켜고 끄는 옵션 없음(audio: false는 거절됨)
프롬프트 길이최대 5,000바이트(UTF-8, 한자 약 1,666자)
과금 방식초 단위: 초당 단가 × (결과 영상 초 수 + 참조 영상 초 수)

요청 파라미터

POST /v1/videos/generations의 요청 본문(JSON):

파라미터타입필수설명
modelstring예모델 ID: wan3.0-video-prime.
promptstring예영상의 내용(화면, 카메라 움직임, 동작)을 설명합니다. 최대 5,000바이트입니다(UTF-8 기준, 한자 1자가 3바이트이므로 약 1,666자).
durationinteger아니오결과 영상의 길이(초): 2~30 사이의 정수이며, 생략하면 2입니다. seconds로 써도 됩니다. 참조 영상이 있으면 결과 영상 초 수와 참조 영상 초 수를 합쳐 30을 넘을 수 없습니다.
resolutionstring아니오해상도: 480P / 720P / 1080P 중 하나이며, 생략하면 720P입니다. P를 붙여 주세요(720처럼 P가 없으면 거절됩니다).
sizestring아니오화면 비율: 16:9 / 9:16 / 1:1 / 4:3 / 3:4 중 하나이며, 생략하면 16:9입니다. 첫 프레임이 있으면 adaptive를 보내 영상이 첫 프레임 이미지의 비율을 따르게 할 수 있습니다. aspect_ratio로 써도 됩니다.
imagesarray아니오참조 이미지, 최대 10장. 1장은 첫 프레임이 되고, 2장은 기본적으로 참조로 쓰이며 image_role: first_frame을 넣으면 첫·마지막 프레임이 됩니다. 3장 이상은 참조로 쓰입니다. 프롬프트에서는 @Image1처럼 지칭하세요. 한 장뿐이면 image에 넣어도 됩니다. 사람 얼굴 심사 제한: 실제 사람의 얼굴이 포함된 참조 소재는 피하세요. 사실적인 얼굴도 감지될 수 있습니다. FaceDetectionSuspect는 실제 사람 얼굴이 의심된다는 뜻입니다. DataInspectionFailed는 입력 소재가 콘텐츠 심사를 통과하지 못했다는 뜻이며 서비스 중단을 의미하지 않습니다. 같은 입력을 반복하지 말고 참조 소재를 교체한 후 다시 제출하세요. 오탐이 의심되면 지원팀에 문의하세요. 실패한 작업은 과금되지 않습니다.
image_rolestring아니오이미지 사용 방식: first_frame(첫 프레임 또는 첫·마지막 프레임, 최대 2장) 또는 reference(참조). 생략하면 1장은 첫 프레임, 2장 이상은 참조로 쓰이며, 참조 영상이 있으면 reference만 쓸 수 있습니다.
video_referencesarray아니오참조 영상, 최대 5개. 각각 {"url": "...", "duration": 5} 형식으로 쓰며, duration은 그 영상의 길이(초, 1~15)로 반드시 넣어야 합니다. 합계 15초 이내이며, 참조 영상 초 수와 결과 영상 초 수를 합쳐 30을 넘을 수 없습니다. 참조 영상의 초 수도 과금됩니다. 링크는 파일 자체를 바로 내려받을 수 있어야 합니다. YouTube, Bilibili, TikTok, 클라우드 드라이브 공유 페이지 같은 웹 페이지 링크는 제출 시 400으로 거부됩니다.
audio_referencearray아니오참조 오디오, 최대 5개. 공개 http(s) URL만 받으며, 참조 이미지나 참조 영상과 함께 보내야 합니다. 과금되지 않습니다. 링크는 파일 자체를 바로 내려받을 수 있어야 합니다. YouTube, Bilibili, TikTok, 클라우드 드라이브 공유 페이지 같은 웹 페이지 링크는 제출 시 400으로 거부됩니다.
audioboolean아니오소리는 모델이 결정하며 켜고 끄는 옵션이 없습니다. false를 보내면 거절되므로(400) 생략하세요.
prompt_extendboolean아니오모델이 프롬프트를 자동으로 확장해도 되는지 여부. 생략하면 모델이 결정합니다.
callback_urlstring아니오작업이 끝나면 결과를 보낼 주소. 아래 웹훅 부분을 보세요.
ninteger아니오작업 하나는 영상 1개를 만들므로 넣지 않아도 됩니다. 1보다 큰 값을 넣어도 영상은 1개만 나오지만, 제출할 때 n개 분의 크레딧이 예약되고 초과분은 작업이 끝날 때 돌아옵니다.

그 밖의 필드(seed, negative_prompt, fps, watermark 등)는 전달되지 않으며 가격에도 영향을 주지 않습니다. 결과는 항상 MP4이며 url로 돌려줍니다.

가격

초 단위로 과금합니다: 비용 = 선택한 해상도의 초당 단가 × (결과 영상 초 수 + 모든 참조 영상의 초 수). 참조 이미지와 참조 오디오는 무료입니다. 제출할 때 예약되고, 실패하면 전액 환불됩니다. 1크레딧 = $0.005.

해상도초당 크레딧초당 가격(USD)5초 영상 1개
480P 아직 미개방10.8$0.054$0.27
720P 아직 미개방22.4$0.112$0.56
1080P 아직 미개방40$0.20$1.00

480P / 720P / 1080P 등급은 아직 열리지 않아 제출하면 400으로 거절됩니다. 열리면 이 표가 자동으로 갱신됩니다.

참조 소재

  • 엔드포인트 하나에서 파라미터로 모드를 고릅니다. 이미지가 없으면 텍스트-투-비디오, 1장이면 첫 프레임, 2장에 image_role: first_frame을 넣으면 첫·마지막 프레임(1번째 이미지가 첫 프레임, 2번째가 마지막 프레임)입니다. 넣지 않으면 2장 이상은 모두 참조이며 최대 10장입니다.
  • 참조 영상은 최대 5개(합계 15초, 각각 duration 필수)이며, 그 영상을 새롭게 바꾸거나 이어서 만드는 데 쓰입니다. 참조 영상이 있으면 이미지는 참조로만 쓸 수 있고 첫·마지막 프레임으로는 쓸 수 없습니다. 참조 오디오는 최대 5개이며 공개 URL만 받습니다.
  • 첫 프레임이 있을 때 size: adaptive를 보내면 영상이 첫 프레임 이미지의 비율을 따릅니다. 사람 얼굴 심사 제한: 실제 사람의 얼굴이 포함된 참조 소재는 피하세요. 사실적인 얼굴도 감지될 수 있습니다. FaceDetectionSuspect는 실제 사람 얼굴이 의심된다는 뜻입니다. DataInspectionFailed는 입력 소재가 콘텐츠 심사를 통과하지 못했다는 뜻이며 서비스 중단을 의미하지 않습니다. 같은 입력을 반복하지 말고 참조 소재를 교체한 후 다시 제출하세요. 오탐이 의심되면 지원팀에 문의하세요. 실패한 작업은 과금되지 않습니다.
  • 이미지는 각각 공개 이미지 URL, data: URI, base64 중 하나로 보낼 수 있으며 한 장당 16MB 이하입니다. 여러 장은 images에 배열로 넣으세요. 제출할 때 당사가 이미지를 먼저 저장한 뒤 작업을 대기열에 넣습니다. 읽을 수 없는 이미지가 있으면 400으로 거절되고 message에 몇 번째 이미지인지 적혀 있으며, 과금되지 않습니다.
  • 당사가 저장한 참조 소재는 7일, 결과 영상은 15일 동안 보관됩니다.

첫·마지막 프레임: 두 이미지 사이의 전환 만들기

curl
curl https://nezhagate.com/v1/videos/generations \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "wan3.0-video-prime", "prompt": "새벽에서 해 질 녘으로 바뀌는 하늘, 흘러가는 구름, 점점 따뜻해지는 빛", "images": ["https://example.com/first.png", "https://example.com/last.png"], "image_role": "first_frame", "duration": 5, "resolution": "720P", "size": "adaptive"}'

image_role: first_frame은 두 이미지를 첫 프레임과 마지막 프레임으로 쓰게 하고, size: adaptive는 영상이 첫 프레임 이미지의 비율을 따르게 합니다. image_role을 넣지 않으면 두 이미지는 참조로 쓰입니다.

작업 상태와 응답 필드

GET /v1/videos/jobs/{id}는 아래 상태를 돌려줍니다. 각 필드의 설명은 비동기 작업에 있습니다. 5~10초마다 조회하거나, 아래의 웹훅으로 결과를 받으세요. 조회는 무료이며, 같은 계정의 어느 키로든 조회할 수 있습니다.

상태의미
queued대기 중. queue_position(앞에 있는 작업 수)과 eta_seconds(예상 대기 시간)가 함께 옵니다.
processing생성 중.
succeeded완료. 결과는 data[0].url, 과금 내역은 usage에 있습니다.
failed실패. 사유는 error에 있고, 예약된 크레딧은 전액 환불됩니다.
  • processing이 queued로 돌아갈 때가 있습니다. 예를 들어 모든 회선이 가득 찼을 때, 완성된 영상을 다시 가져오는 중일 때, 서비스가 재시작된 뒤입니다. 어떤 회선이 작업을 끝내지 못하면 게이트웨이가 다음 회선으로 넘겨 다시 만들 수 있습니다. 회선을 몇 번 거치든 작업 하나에 한 번만 과금됩니다.
  • 한 계정은 최대 50개 작업을 동시에 생성하며, 그보다 많은 작업은 제출 순서대로 대기합니다. 15분이 지나도 시작되지 않은 작업은 자동으로 실패 처리되고 전액 환불됩니다. 작업 기록은 3일, 영상 링크는 15일 동안 보관됩니다.

생성 시간

보통 1~3분 걸리며, 표준 Wan 3.0보다 빠릅니다.

오류와 환불

제출 단계의 오류는 HTTP 4xx / 5xx로 바로 돌아오며, 작업은 만들어지지 않고 과금되지 않습니다. 작업이 접수된 뒤의 실패는 작업 조회 결과로 알려 주며, 예약된 크레딧은 전액 환불됩니다. 전체 코드는 오류 코드에 있습니다.

제출할 때 돌아오는 오류

HTTPcode원인조치
400invalid_request파라미터가 올바르지 않습니다. 길이, 해상도, 화면 비율 또는 참조 소재 수가 이 모델의 허용 범위를 벗어났거나, 프롬프트가 너무 길거나, 참조 이미지나 참조 영상을 읽을 수 없거나, 항상 소리가 포함되는 모델에 audio: false를 보낸 경우 등입니다. 구체적인 원인은 message에 적혀 있습니다.message에 적힌 대로 고친 뒤 다시 제출하세요.
400invalid_callback_urlcallback_url이 공개된 http(s) 주소가 아니거나 2000자를 넘습니다.인터넷에서 접근할 수 있는 주소를 쓰세요.
400model_not_found모델 ID의 철자가 틀렸거나, model이 없거나, 이 엔드포인트에서 쓸 수 없는 모델입니다(예: 이미지 엔드포인트에 채팅 모델을 지정한 경우).GET /v1/models 또는 API 레퍼런스에 있는 모델 ID를 쓰세요.
401invalid_api_key키가 없거나, 삭제되었거나, 비활성화되었습니다. 계정이 비활성화된 경우에도 나옵니다.콘솔의 「API Keys」 페이지에서 이 키를 확인하세요.
402insufficient_quota이 요청의 크레딧을 예약하기에 잔액이 부족합니다. 게이트웨이는 요청에 들 수 있는 최대 비용을 먼저 예약하므로, 동시 호출이 몰릴 때도 이 오류가 날 수 있습니다.동시 호출이 몰린 경우라면 몇 초 기다린 뒤 다시 시도하고, 그렇지 않으면 충전하세요.
429rate_limit_exceeded이 키에 설정한 분당 요청 수를 넘었습니다(최근 60초 기준). Retry-After 헤더는 붙지 않습니다.몇 초 기다린 뒤 다시 시도하거나, 콘솔에서 이 키의 한도를 올리세요.
503model_maintenance모델이 점검 중이라 요청을 받지 않습니다. 점검 중에는 다른 모델이 대신 답변하지도 않습니다.점검이 끝나면 다시 시도하세요. 진행 상황은 서비스 상태에서 볼 수 있습니다.
503service_unavailable참조 소재 저장 실패처럼 당사 측에서 일시적인 오류가 났습니다. 작업은 만들어지지 않았고 과금되지도 않았습니다.잠시 후 다시 시도하세요.

작업 실패(status가 failed)

code언제 나오나요조치
content_policyWan Standard 및 Prime: 입력 소재가 심사를 통과하지 못했습니다. error.reason은 FaceDetectionSuspect(실제 사람 얼굴 의심) 또는 DataInspectionFailed(입력 콘텐츠 심사 실패)입니다. error.message에 원인과 조정 방법이 표시됩니다. 실패한 작업은 과금되지 않습니다.프롬프트를 고쳐 쓰거나 참조 소재를 바꾼 뒤 다시 제출하세요. 같은 입력은 다시 거부됩니다.
invalid_request모델 제공사가 요청을 거부했습니다. 파라미터나 참조 소재를 쓸 수 없거나, 콘텐츠가 심사를 통과하지 못한 경우입니다. 이유는 message에 적혀 있습니다.message에 적힌 대로 파라미터를 조정한 뒤 다시 제출하세요.
upstream_error그 밖의 실패: 모든 회선을 시도했지만 실패했거나, 15분 동안 기다려도 시작되지 않았거나, 업스트림이 이유 없이 거부한 경우 등입니다. 구체적인 내용은 message에 있습니다.다시 제출하면 대개 성공합니다.

message의 문구가 아니라 code로 판단하세요. 모르는 code가 오거나 code가 없으면 upstream_error로 처리하면 됩니다. 다시 제출하면 대개 성공합니다. 실패한 작업은 모두 전액 환불됩니다.

조회 대신 웹훅으로 받기

제출할 때 callback_url을 넣으면 작업이 끝나는 즉시(성공이든 실패든) 게이트웨이가 조회 엔드포인트와 똑같은 결과를 그 URL로 보냅니다. 서명이 포함되며, 전송에 실패하면 자동으로 재시도합니다. 콘솔의 「설정 → 웹훅」에서 계정 전체에 쓸 주소를 지정할 수도 있습니다. 웹훅 문서 →

curl · callback_url
curl https://nezhagate.com/v1/videos/generations \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "wan3.0-video-prime", "prompt": "벚나무 아래에서 떨어지는 꽃잎을 쫓는 시바견, 화창한 햇살, 슬로 모션", "duration": 5, "resolution": "720P", "size": "16:9", "callback_url": "https://your-domain.com/webhook"}'