開発者

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 はご自身のサーバーから呼び出してください。ブラウザから直接は呼び出せません。また、Web やアプリのコードに含めた APIキーはコピーされ、クレジットを消費される恐れがあります。

認証

ログインした状態でAPIキーのページからキーを作成します。キー全体が表示されるのは一度だけなので、シークレット管理サービスや環境変数に保存してください。1つのアカウントで有効なキーは最大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 など)を付け、同じキーで再試行してください。再試行すると、2本目を作成して課金する代わりに、最初の試行で作成された動画がステータス 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

画像から動画と動画編集では、先にファイルをアップロードします。アップロードは3ステップです。ここでアップロードを作成し、返された 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 の画像1枚で動画の最初のフレームを決めるか、最大10枚の reference_image で被写体やスタイルを指定します。2つの役割は併用できません。動画編集では参照画像を最大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

あなたの動画を新しい順に返します。

クエリパラメータ
limitinteger1ページあたり 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 秒の動画はその2倍です。クレジットやメンバーシップは料金ページで購入できます。

モデル説明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 の動画編集は、元動画の長さを入力と出力の2回分、より低い単価で計算します。10 秒の元動画を 720P で編集すると 38.78 クレジットです。各動画の creditCost が実際の消費量です。

メディアの要件

アップロードしたファイルは、使用するモデルのルールで検証されます。リサイズや変換は行われないため、アップロード前に準備してください。

W3.0 モデルSeedance 2.5
画像の形式JPEG、透過なしの PNG、WebP、BMPJPEG、PNG、WebP、BMP
画像のサイズ20 MB 以下30 MB 未満
画像の辺の長さ240〜8,000 px300〜6,000 px
動画の形式MP4、MOVMP4、MOV
動画のサイズ100 MB 以下200 MB 未満
動画の長さ1〜15 秒4〜30 秒
動画の辺の長さ240〜4,096 px300〜6,000 px、総画素数 409,600〜8,295,044
フレームレート16 FPS 以上24〜60 FPS
アスペクト比長辺と短辺の比が 8:1 まで幅 ÷ 高さが 0.4〜2.5

制限と保存

  • 1つのアカウントで同時に生成できる動画は最大 20 本です。それを超えると、どれかが完了するまで 429 ACTIVE_GENERATION_LIMIT が返ります。
  • 完全なコンテンツ安全審査が必要なプロンプトは、アカウントごとに1分あたり30回、1時間あたり200回までです。超えると動画の作成で 429 PROMPT_MODERATION_RATE_LIMITED が返ります。
  • 3時間経っても生成が終わらない動画は GENERATION_TIMED_OUT で失敗します。失敗した動画のクレジットは必ず返還されます。
  • アップロード URL は 15 分で期限切れになり、アップロードしたファイルは 7 日後に削除されます。
  • アカウントがメンバーシップを持つ間、またはクレジットを購入した後に作成した動画は永久に保存されます。それ以外の動画は動画プロバイダー側に保存され、期限切れになる場合があるため、完了後すぐにダウンロードしてください。
  • プロンプトは最大 20,000 文字、画像は1本の動画につき最大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過去1日以内にプロバイダーが同じプロンプトとメディアを拒否しました。先に変更してください。
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コンテンツの安全審査が利用できません。しばらくして再試行してください。