개발자

Wan 3.0 API

Wan 3.0 작업 공간과 같은 모델, 크레딧, 제한으로 직접 만든 소프트웨어에서 동영상을 생성하세요.

기본 URLhttps://wan3.video/api/v1

이 페이지의 내용

개요

Wan 3.0 API는 작업 공간과 같은 모델, 크레딧, 제한으로 동영상을 생성합니다. 모든 요청은 사용자 계정으로 실행되어 크레딧을 사용하고 멤버십 조건을 따르며, 생성된 동영상은 기록에도 표시됩니다.

API는 HTTPS 기반 REST이며 본문은 JSON입니다. 아래의 모든 URL은 https://wan3.video/api/v1 기준 상대 경로입니다. 동영상은 비동기로 생성됩니다. 동영상을 만든 뒤 status가 completed 또는 failed가 될 때까지 폴링하고 다운로드하세요. 생성에는 보통 몇 분이 걸립니다. API로 만든 동영상은 완료 알림 이메일을 보내지 않습니다.

API는 직접 운영하는 서버에서 호출하세요. 브라우저에서는 직접 호출할 수 없으며, 웹이나 앱 코드에 넣은 API 키는 복사되어 크레딧이 사용될 수 있습니다.

인증

로그인한 상태에서 API 키 페이지에서 키를 만드세요. 전체 키는 한 번만 표시되므로 비밀 관리 서비스나 환경 변수에 보관하세요. 계정당 활성 키는 최대 10개이며, 유출이 의심되면 즉시 그 페이지에서 폐기하세요.

모든 요청에 키를 Bearer 토큰으로 보내세요. 키가 없거나 유효하지 않거나 폐기된 경우 401 UNAUTHORIZED가 반환됩니다.

Shell
curl https://wan3.video/api/v1/account \
  -H "Authorization: Bearer $WAN3_API_KEY"

빠른 시작

1. 프롬프트로 5초 길이의 720P 동영상을 만듭니다. 응답은 새 동영상이며 status는 processing입니다.

Shell
curl https://wan3.video/api/v1/videos \
  -H "Authorization: Bearer $WAN3_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "model": "w3.0-video",
    "prompt": "A paper boat drifting down a rain-soaked street at dusk, cinematic lighting",
    "resolution": "720P",
    "duration": 5,
    "aspectRatio": "16:9"
  }'

2. 완료되거나 실패할 때까지 10–15초마다 동영상을 폴링합니다.

Shell
curl https://wan3.video/api/v1/videos/VIDEO_ID \
  -H "Authorization: Bearer $WAN3_API_KEY"

3. MP4를 다운로드합니다. URL이 파일 저장소로 리디렉션될 수 있으니 리디렉션을 따라가세요.

Shell
curl -L -o video.mp4 https://wan3.video/api/v1/videos/VIDEO_ID/content \
  -H "Authorization: Bearer $WAN3_API_KEY"

같은 흐름을 Python으로 작성하면 다음과 같습니다.

Python
import os
import time
import uuid

import requests

API = "https://wan3.video/api/v1"
KEY = os.environ["WAN3_API_KEY"]


def api(method, path, headers=None, **kwargs):
    response = requests.request(
        method,
        f"{API}{path}",
        headers={"Authorization": f"Bearer {KEY}", **(headers or {})},
        timeout=60,
        **kwargs,
    )
    body = response.json()
    if body["error"]:
        raise RuntimeError(f"{body['error']['code']}: {body['error']['message']}")
    return body["data"]


video = api(
    "POST",
    "/videos",
    headers={"Idempotency-Key": str(uuid.uuid4())},
    json={
        "model": "w3.0-video",
        "prompt": "A paper boat drifting down a rain-soaked street at dusk",
        "resolution": "720P",
        "duration": 5,
    },
)

while video["status"] == "processing":
    time.sleep(10)
    video = api("GET", f"/videos/{video['id']}")

if video["status"] == "failed":
    raise RuntimeError(video["error"]["message"])

download = requests.get(
    video["videoUrl"], headers={"Authorization": f"Bearer {KEY}"}, timeout=300
)
download.raise_for_status()
with open(f"{video['id']}.mp4", "wb") as file:
    file.write(download.content)

응답과 오류

모든 JSON 응답은 같은 형식을 사용합니다. 성공하면 { "data": …, "error": null }, 실패하면 { "data": null, "error": { "code", "message" } }입니다. 분기 처리는 변하지 않는 error.code로 하세요. message는 사람이 읽기 위한 것이며 바뀔 수 있습니다. 일부 오류에는 동영상에 필요한 크레딧 같은 필드가 추가됩니다.

모든 응답에는 X-Request-Id 헤더도 포함됩니다. 요청에 대해 지원팀에 문의할 때 이 값을 알려 주세요.

오류 응답
HTTP/1.1 402 Payment Required
X-Request-Id: 3f1c9a52-6a0e-4c55-9d7e-0f6f1d2b8c41

{
  "data": null,
  "error": {
    "code": "INSUFFICIENT_CREDITS",
    "message": "Not enough credits for this generation",
    "requiredCredits": 10,
    "availableCredits": 3.5
  }
}
상태 코드의미
200, 201요청이 성공했습니다. 201은 리소스가 생성되었다는 뜻입니다.
400매개변수가 없거나 유효하지 않습니다. 메시지에 해당 매개변수가 표시됩니다.
401API 키가 없거나 유효하지 않거나 폐기되었습니다.
402계정의 크레딧이 부족합니다.
403멤버십이 없는 등의 이유로 계정이 이 작업을 할 수 없습니다.
404동영상이 없거나 다른 계정의 동영상입니다.
409동영상의 현재 상태에서는 이 요청을 처리할 수 없습니다.
422콘텐츠 안전 검토 등으로 요청이 거부되었습니다.
429생성 중인 동영상이 너무 많거나 안전 검토 횟수가 너무 많습니다.
451현재 지역에서는 이 서비스를 이용할 수 없습니다.
5xx일시적인 오류입니다. 나중에 다시 시도하세요. 실패한 동영상의 크레딧은 환불됩니다.

멱등 요청

네트워크 오류가 나면 동영상이 만들어졌는지 확신할 수 없을 때가 있습니다. POST /videos에 Idempotency-Key 헤더(예: UUID)를 보내고 같은 키로 다시 시도하세요. 재시도하면 두 번째 동영상을 만들고 크레딧을 다시 사용하는 대신, 첫 시도에서 만든 동영상이 상태 코드 200과 Idempotent-Replayed: true 헤더와 함께 반환됩니다.

키는 공백 없는 출력 가능한 ASCII 문자 1–255자이며 계정 안에서만 유효합니다. 새 동영상마다 새 키를 사용하세요. 같은 키를 다른 매개변수와 함께 쓰면 422 IDEMPOTENCY_KEY_MISMATCH가 반환됩니다. 크레딧 부족처럼 동영상이 만들어지기 전에 첫 시도가 거부된 경우에는 같은 키로 다시 시도하면 다시 실행됩니다.

계정 조회

GET/account

계정의 크레딧 잔액, 멤버십, 현재 생성 중인 동영상 수와 동시 생성 한도를 반환합니다.

응답
{
  "data": {
    "credits": 128.5,
    "membership": {
      "active": true,
      "plan": "pro",
      "expiresAt": "2026-11-06T08:00:00.000Z"
    },
    "activeGenerations": 2,
    "maxActiveGenerations": 20
  },
  "error": null
}

업로드 만들기

POST/uploads

이미지로 동영상 만들기와 동영상 편집에는 먼저 업로드한 파일이 필요합니다. 업로드는 세 단계입니다. 여기서 업로드를 만들고, 반환된 uploadUrl에 파일을 PUT한 다음, 업로드를 완료하세요. 동영상을 만들 때 업로드의 key를 전달합니다. 업로드한 파일은 계정에 속하며 7일 후 삭제됩니다.

본문 매개변수
filenamestring · 필수파일 이름(1–255자). 저장되는 파일의 이름을 정하는 데만 사용됩니다.
contentTypestring · 필수image/jpeg, image/png, image/webp, image/bmp, video/mp4, video/quicktime 중 하나.
bytesinteger · 필수파일 크기(바이트).
modelstring파일을 사용할 모델. doubao-seedance-2.5를 보내면 Seedance 2.5 미디어 규칙으로, 다른 값을 보내거나 생략하면 W3.0 규칙으로 검사합니다.
Shell
curl https://wan3.video/api/v1/uploads \
  -H "Authorization: Bearer $WAN3_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "filename": "first-frame.png",
    "contentType": "image/png",
    "bytes": 1048576
  }'
응답 · 201 Created
{
  "data": {
    "key": "temp/5f0c…/2026-10-06/7d1e…-first-frame.png",
    "uploadUrl": "https://…r2.cloudflarestorage.com/…",
    "uploadMethod": "PUT",
    "uploadHeaders": { "Content-Type": "image/png" },
    "uploadExpiresAt": "2026-10-06T08:15:00.000Z",
    "expiresAt": "2026-10-13T08:00:00.000Z"
  },
  "error": null
}

이어서 15분 안에, 안내된 메서드와 헤더로 파일 내용을 uploadUrl에 보내세요. 이 URL에는 API 키를 보내지 마세요.

Shell
curl -X PUT "$UPLOAD_URL" \
  -H "Content-Type: image/png" \
  --upload-file first-frame.png

업로드 완료

POST/uploads/complete

업로드한 파일을 모델의 미디어 요구 사항에 맞춰 검사하고, 동영상이면 길이를 반환합니다. 동영상을 만들 때 파일을 다시 검사하므로 이 단계는 생략할 수 있지만, 동영상을 만들기 전에 문제가 있는 파일을 찾아 줍니다. 파일 크기 조정이나 변환은 하지 않으니 요구 사항을 이미 충족하는 미디어를 보내세요.

본문 매개변수
keystring · 필수업로드를 만들 때 반환된 key.
contentTypestring · 필수업로드를 만들 때 지정한 콘텐츠 유형.
bytesinteger · 필수업로드를 만들 때 지정한 크기.
modelstring파일을 사용할 모델. doubao-seedance-2.5를 보내면 Seedance 2.5 미디어 규칙으로, 다른 값을 보내거나 생략하면 W3.0 규칙으로 검사합니다.
Shell
curl https://wan3.video/api/v1/uploads/complete \
  -H "Authorization: Bearer $WAN3_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "key": "temp/5f0c…/2026-10-06/7d1e…-first-frame.png",
    "contentType": "image/png",
    "bytes": 1048576
  }'
응답
{
  "data": {
    "key": "temp/5f0c…/2026-10-06/7d1e…-first-frame.png",
    "contentType": "image/png",
    "bytes": 1048576,
    "expiresAt": "2026-10-13T08:00:00.000Z"
  },
  "error": null
}

동영상은 durationSeconds도 반환합니다. 파일이 없거나, 선언한 유형이나 크기와 다르거나, 미디어 규칙을 어기면 이유와 함께 400 UPLOAD_INVALID가 반환됩니다.

동영상 만들기

POST/videos

동영상 생성을 시작하고 크레딧을 사용합니다. 생성에 실패하면 크레딧은 자동으로 환불됩니다. 프롬프트는 먼저 콘텐츠 안전 검토를 거치며, 거부된 프롬프트에는 크레딧이 들지 않습니다.

본문 매개변수
promptstring · 필수동영상에 담을 내용(최대 20,000자).
modelstring기본값은 w3.0-video입니다. 모델과 크레딧을 참고하세요.
modestringtext-to-video, image-to-video, video-edit 중 하나. 생략하면 videoKey가 있을 때 video-edit, images가 있을 때 image-to-video, 그 밖에는 text-to-video입니다.
resolutionstring모델이 지원하는 해상도. 기본값은 720P이며 Pro 모델은 1080P입니다. 720P보다 높은 해상도에는 활성 멤버십이 필요합니다.
durationinteger출력 길이(초). 기본값은 5입니다. W3.0 모델은 2–30초, Seedance 2.5는 4–30초를 생성합니다. W3.0 동영상 편집은 원본 동영상과 합쳐 30초 이내여야 합니다. Seedance 2.5 동영상 편집은 원본과 같은 길이가 되므로 duration을 생략하세요.
aspectRatiostring16:9, 9:16, 1:1, 4:3, 3:4. 기본값은 16:9입니다. W3.0 동영상 편집은 지정하지 않으면 원본 비율을 유지합니다. Seedance 2.5는 첫 프레임을 지정한 동영상과 동영상 편집에서 비율을 직접 정합니다.
seedinteger0–2147483647. 같은 입력에 같은 시드를 쓰면 비슷한 결과가 나옵니다. 생략하면 무작위입니다.
imagesarray업로드한 이미지를 { "key", "role" } 형식으로 보냅니다. 이미지로 동영상을 만들 때는 각각 역할이 있는 이미지 1–10장을 보내세요. first_frame 이미지 한 장으로 동영상의 첫 프레임을 정하거나, reference_image 이미지 최대 10장으로 피사체와 스타일을 안내합니다. 두 역할은 함께 쓸 수 없습니다. 동영상 편집에서는 참고 이미지를 최대 10장 보낼 수 있으며 역할은 생략할 수 있습니다.
videoKeystring동영상 편집에 쓸, 업로드한 원본 동영상.
이미지로 동영상 만들기
curl https://wan3.video/api/v1/videos \
  -H "Authorization: Bearer $WAN3_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 8b0f6f5e-0c55-4a2b-9a7d-3f1e2d4c5b6a" \
  -d '{
    "model": "w3.0-video",
    "prompt": "The camera slowly pushes in as she turns toward the window",
    "images": [
      { "key": "temp/5f0c…/first-frame.png", "role": "first_frame" }
    ],
    "duration": 5
  }'
동영상 편집 요청 본문
{
  "model": "w3.0-video",
  "prompt": "Turn the street into a snowy winter night",
  "videoKey": "temp/5f0c…/source.mp4",
  "images": [{ "key": "temp/5f0c…/style.jpg" }],
  "duration": 5
}

201과 새 동영상 객체가 반환되며 status는 processing입니다. 자주 발생하는 거부는 402 INSUFFICIENT_CREDITS, 403 MEMBERSHIP_REQUIRED, 422 NSFW_PROMPT, 429 ACTIVE_GENERATION_LIMIT입니다. 오류 코드를 참고하세요.

동영상 객체

필드
idstring동영상 ID.
statusstringprocessing, completed, failed 중 하나.
model, mode, promptstring요청한 내용.
resolutionstring출력 해상도.
durationinteger출력 길이(초).
aspectRatiostring출력 비율. 첫 프레임을 따르면 adaptive, 동영상 편집에서 원본 비율을 유지하면 source입니다.
seedinteger | null사용한 시드.
creditCostnumber | null사용한 크레딧. 실패한 동영상의 크레딧은 환불됩니다.
videoUrlstring | null완료되면 다운로드 URL이며 API 키가 필요합니다. 그 전에는 null입니다.
errorobject | null실패한 동영상은 { "code", "message" }이며 code는 GENERATION_FAILED, GENERATION_TIMED_OUT, PROVIDER_REQUEST_REJECTED 중 하나입니다.
createdAt, updatedAtstringISO 8601 타임스탬프.
예시
{
  "data": {
    "id": "video_1759737600000_4f2a9c1e",
    "status": "completed",
    "model": "w3.0-video",
    "mode": "image-to-video",
    "prompt": "The camera slowly pushes in as she turns toward the window",
    "resolution": "720P",
    "duration": 5,
    "aspectRatio": "16:9",
    "seed": 1844673015,
    "creditCost": 5,
    "videoUrl": "https://wan3.video/api/v1/videos/video_1759737600000_4f2a9c1e/content",
    "error": null,
    "createdAt": "2026-10-06T08:00:00.000Z",
    "updatedAt": "2026-10-06T08:02:41.000Z"
  },
  "error": null
}

동영상 조회

GET/videos/{id}

동영상 객체를 반환합니다. 아직 생성 중인 동영상이면 제공업체에 최신 진행 상황도 확인합니다. 폴링 간격은 5초 이상으로 하세요.

동영상 목록

GET/videos

사용자의 동영상을 최신순으로 반환합니다.

쿼리 매개변수
limitinteger페이지당 1–100개. 기본값은 20입니다.
statusstringprocessing, completed, failed 상태의 동영상만 반환합니다.
cursorstring이전 페이지의 nextCursor. 다음 페이지를 가져올 때 사용합니다.
Shell
curl "https://wan3.video/api/v1/videos?limit=20&status=completed" \
  -H "Authorization: Bearer $WAN3_API_KEY"
응답
{
  "data": {
    "videos": [ { "id": "video_…", "status": "completed", … } ],
    "nextCursor": "video_1759737600000_4f2a9c1e"
  },
  "error": null
}

마지막 페이지에서는 nextCursor가 null입니다.

동영상 다운로드

GET/videos/{id}/content

완료된 동영상을 MP4 파일로 반환합니다. 보관된 동영상은 파일 저장소로 307 리디렉션되므로 리디렉션을 따라가세요. 파일 URL 자체에는 키가 필요하지 않습니다. Range 요청을 지원합니다. 아직 완료되지 않은 동영상은 409 VIDEO_NOT_READY를 반환합니다.

동영상 삭제

DELETE/videos/{id}

완료된 동영상과 저장된 파일을 영구 삭제합니다. 생성 중이거나 실패한 동영상은 삭제할 수 없으며 409 VIDEO_NOT_DELETABLE이 반환됩니다.

응답
{
  "data": { "id": "video_1759737600000_4f2a9c1e", "deleted": true },
  "error": null
}

모델과 크레딧

동영상 크레딧은 길이와 해상도에 비례합니다. 표는 5초 동영상에 필요한 크레딧이며, 10초 동영상은 두 배입니다. 크레딧이나 멤버십은 요금 페이지에서 구매할 수 있습니다.

모델설명5초 동영상에 필요한 크레딧멤버십
w3.0-videoW3.0480P: 2.5 · 720P: 5 · 1080P: 101080P에 필요
w3.0-video-primeW3.0, 더 빠른 생성480P: 3.5 · 720P: 7 · 1080P: 141080P에 필요
w3.0-video-proW3.0 Pro, 초해상도1080P: 10 · 2K: 10 · 4K: 12.5필요
w3.0-video-prime-proW3.0 Pro, 더 빠른 생성1080P: 14 · 2K: 14 · 4K: 17.5필요
doubao-seedance-2.5Seedance 2.5480P: 6.47 · 720P: 14.55 · 1080P: 25.921080P에 필요

W3.0 동영상 편집은 요청한 길이의 새 동영상과 같은 크레딧이 듭니다. Seedance 2.5 동영상 편집은 원본 동영상 길이를 입력과 출력으로 두 번, 더 낮은 단가로 계산합니다. 10초 원본을 720P로 편집하면 38.78 크레딧입니다. 각 동영상의 creditCost가 실제 사용량입니다.

미디어 요구 사항

업로드한 파일은 사용할 모델의 규칙으로 검사합니다. 크기 조정이나 변환은 하지 않으니 업로드 전에 준비하세요.

W3.0 모델Seedance 2.5
이미지 형식JPEG, 투명도 없는 PNG, WebP, BMPJPEG, PNG, WebP, BMP
이미지 크기20MB 이하30MB 미만
이미지 변 길이240–8,000px300–6,000px
동영상 형식MP4, MOVMP4, MOV
동영상 크기100MB 이하200MB 미만
동영상 길이1–15초4–30초
동영상 변 길이240–4,096px300–6,000px, 전체 409,600–8,295,044픽셀
프레임 속도16FPS 이상24–60FPS
화면비긴 변과 짧은 변의 비율 8:1 이하너비 ÷ 높이 0.4–2.5

제한과 보관

  • 계정당 동시에 최대 20개의 동영상을 생성할 수 있습니다. 초과하면 하나가 끝날 때까지 429 ACTIVE_GENERATION_LIMIT이 반환됩니다.
  • 전체 콘텐츠 안전 검토가 필요한 프롬프트는 계정당 분당 30회, 시간당 200회로 제한됩니다. 초과하면 동영상을 만들 때 429 PROMPT_MODERATION_RATE_LIMITED가 반환됩니다.
  • 3시간이 지나도 생성이 끝나지 않은 동영상은 GENERATION_TIMED_OUT으로 실패합니다. 실패한 동영상의 크레딧은 항상 환불됩니다.
  • 업로드 URL은 15분 후 만료되며, 업로드한 파일은 7일 후 삭제됩니다.
  • 계정에 멤버십이 있는 동안, 또는 크레딧을 구매한 이후에 만든 동영상은 영구 보관됩니다. 그 밖의 동영상은 동영상 제공업체에 보관되며 만료될 수 있으니 완료 후 바로 다운로드하세요.
  • 프롬프트는 최대 20,000자이며 동영상당 이미지는 최대 10장입니다.

오류 코드

코드상태 코드의미
INVALID_JSON400본문이 JSON 객체가 아닙니다.
INVALID_REQUEST400매개변수가 없거나 유효하지 않습니다. 메시지에 해당 매개변수가 표시됩니다.
INVALID_CURSOR400cursor가 이전 페이지의 nextCursor가 아닙니다.
UPLOAD_INVALID400업로드가 없거나, 선언한 내용과 다르거나, 미디어 규칙을 어겼습니다.
UNAUTHORIZED401API 키가 없거나 유효하지 않거나 폐기되었습니다.
INSUFFICIENT_CREDITS402크레딧이 부족합니다. requiredCredits와 availableCredits에 수량이 표시됩니다.
ACCOUNT_BANNED403계정이 정지되었습니다.
MEMBERSHIP_REQUIRED403Pro 모델과 720P보다 높은 해상도에는 활성 멤버십이 필요합니다.
VIDEO_NOT_FOUND404이 계정에는 해당 ID의 동영상이 없습니다.
IDEMPOTENCY_KEY_REUSED409이 키의 동영상은 삭제되었습니다. 새 Idempotency-Key를 사용하세요.
VIDEO_NOT_READY409동영상이 아직 완료되지 않았습니다.
VIDEO_NOT_DELETABLE409완료된 동영상만 삭제할 수 있습니다.
IDEMPOTENCY_KEY_MISMATCH422이 Idempotency-Key는 다른 매개변수로 이미 사용되었습니다.
NSFW_PROMPT422프롬프트가 콘텐츠 안전 검토를 통과하지 못했습니다. 크레딧은 사용되지 않았습니다.
PROVIDER_REQUEST_REJECTED422지난 하루 안에 제공업체가 같은 프롬프트와 미디어를 거부했습니다. 먼저 수정하세요.
ACTIVE_GENERATION_LIMIT429생성 중인 동영상이 너무 많습니다. 한도는 activeLimit에 표시됩니다.
PROMPT_MODERATION_RATE_LIMITED429안전 검토 횟수가 너무 많습니다. 1분 정도 기다리세요.
REGION_UNAVAILABLE451현재 지역에서는 이 서비스를 이용할 수 없습니다.
INTERNAL_ERROR500예상치 못한 오류입니다. 지원팀에 X-Request-Id를 알려 주세요.
PROVIDER_ERROR502동영상 제공업체에서 오류가 발생했습니다. 나중에 다시 시도하세요.
VIDEO_UNAVAILABLE502동영상 파일을 가져올 수 없습니다. 잠시 후 다시 시도하세요.
SERVICE_UNAVAILABLE503서비스를 일시적으로 이용할 수 없습니다. 나중에 다시 시도하세요.
PROMPT_MODERATION_UNAVAILABLE503콘텐츠 안전 검토를 이용할 수 없습니다. 나중에 다시 시도하세요.