概要
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 が返ります。
curl https://wan3.video/api/v1/account \
-H "Authorization: Bearer $WAN3_API_KEY"クイックスタート
1. プロンプトから 5 秒の 720P 動画を作成します。レスポンスは新しい動画で、status は processing です。
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 秒ごとに動画をポーリングします。
curl https://wan3.video/api/v1/videos/VIDEO_ID \
-H "Authorization: Bearer $WAN3_API_KEY"3. MP4 をダウンロードします。URL はファイルストレージへリダイレクトされる場合があるので、リダイレクトに従ってください。
curl -L -o video.mp4 https://wan3.video/api/v1/videos/VIDEO_ID/content \
-H "Authorization: Bearer $WAN3_API_KEY"同じ流れを 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 | パラメータが不足しているか無効です。メッセージに該当するパラメータが示されます。 |
401 | APIキーがない、無効、または無効化済みです。 |
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 が返ります。クレジット不足など、動画が作成される前に最初の試行が拒否された場合は、同じキーで再試行するともう一度実行されます。
アカウントを取得
/account
アカウントのクレジット残高、メンバーシップ、現在生成中の動画数と同時生成の上限を返します。
{
"data": {
"credits": 128.5,
"membership": {
"active": true,
"plan": "pro",
"expiresAt": "2026-11-06T08:00:00.000Z"
},
"activeGenerations": 2,
"maxActiveGenerations": 20
},
"error": null
}アップロードを作成
/uploads
画像から動画と動画編集では、先にファイルをアップロードします。アップロードは3ステップです。ここでアップロードを作成し、返された uploadUrl にファイルを PUT して、アップロードを完了します。動画を作成するときに、アップロードの key を渡してください。アップロードしたファイルはアカウントに属し、7日後に削除されます。
| filename | ファイル名(1〜255 文字)。保存するファイルの名前にのみ使用します。 |
|---|---|
| contentType | image/jpeg、image/png、image/webp、image/bmp、video/mp4、video/quicktime のいずれか。 |
| bytes | ファイルサイズ(バイト)。 |
| model | ファイルを使用するモデル。doubao-seedance-2.5 を指定すると Seedance 2.5 のメディアルールで、それ以外の値または未指定の場合は W3.0 のルールで検証します。 |
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
}'{
"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キーを送らないでください。
curl -X PUT "$UPLOAD_URL" \
-H "Content-Type: image/png" \
--upload-file first-frame.pngアップロードを完了
/uploads/complete
アップロードされたファイルをモデルのメディアの要件に照らして検証し、動画の場合は長さを返します。動画の作成時にもファイルは再度検証されるため、この手順は省略できますが、動画を作成する前に問題のあるファイルを見つけられます。ファイルのリサイズや変換は行われないため、要件を満たすメディアを送信してください。
| key | アップロード作成時に返された key。 |
|---|---|
| contentType | アップロード作成時に指定したコンテンツタイプ。 |
| bytes | アップロード作成時に指定したサイズ。 |
| model | ファイルを使用するモデル。doubao-seedance-2.5 を指定すると Seedance 2.5 のメディアルールで、それ以外の値または未指定の場合は W3.0 のルールで検証します。 |
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 が返ります。
動画を作成
/videos
動画の生成を開始し、クレジットを消費します。生成に失敗した場合、クレジットは自動的に返還されます。プロンプトは先にコンテンツの安全審査を受け、拒否されたプロンプトにはクレジットはかかりません。
| prompt | 動画に表示したい内容(最大 20,000 文字)。 |
|---|---|
| model | 既定値は w3.0-video です。モデルとクレジットを参照してください。 |
| mode | text-to-video、image-to-video、video-edit のいずれか。省略した場合、videoKey があれば video-edit、images があれば image-to-video、それ以外は text-to-video になります。 |
| resolution | モデルが対応する解像度。既定値は 720P(Pro モデルは 1080P)です。720P を超える解像度には有効なメンバーシップが必要です。 |
| duration | 出力の長さ(秒)。既定値は 5 です。W3.0 モデルは 2〜30 秒、Seedance 2.5 は 4〜30 秒に対応します。W3.0 の動画編集は、元動画と合わせて 30 秒以内です。Seedance 2.5 の動画編集は元動画と同じ長さになるため、duration は省略してください。 |
| aspectRatio | 16:9, 9:16, 1:1, 4:3, 3:4。既定値は 16:9 です。W3.0 の動画編集は、指定しなければ元動画の比率を保ちます。Seedance 2.5 は、最初のフレームを指定した動画と動画編集で比率を自動で決めます。 |
| seed | 0〜2147483647。同じ入力で同じシードを使うと、似た結果になります。省略するとランダムです。 |
| images | アップロード済みの画像を { "key", "role" } の形式で指定します。画像から動画では、それぞれに役割を持つ画像を 1〜10 枚送ります。first_frame の画像1枚で動画の最初のフレームを決めるか、最大10枚の reference_image で被写体やスタイルを指定します。2つの役割は併用できません。動画編集では参照画像を最大10枚送れ、役割は省略できます。 |
| videoKey | 動画編集に使うアップロード済みの元動画。 |
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 です。エラーコードを参照してください。
動画オブジェクト
| id | 動画の ID。 |
|---|---|
| status | processing、completed、failed のいずれか。 |
| model, mode, prompt | リクエストした内容。 |
| resolution | 出力の解像度。 |
| duration | 出力の長さ(秒)。 |
| aspectRatio | 出力の比率。最初のフレームに合わせる場合は adaptive、動画編集で元動画の比率を保つ場合は source です。 |
| seed | 使用したシード。 |
| creditCost | 消費したクレジット。失敗した動画のクレジットは返還されます。 |
| videoUrl | 完了後はダウンロード URL(APIキーが必要)、それ以外は null です。 |
| error | 失敗した動画では { "code", "message" } で、code は GENERATION_FAILED、GENERATION_TIMED_OUT、PROVIDER_REQUEST_REJECTED のいずれかです。 |
| createdAt, updatedAt | ISO 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
}動画を取得
/videos/{id}
動画オブジェクトを返します。生成中の動画については、プロバイダーに最新の進捗も問い合わせます。ポーリングの間隔は 5 秒以上にしてください。
動画の一覧
/videos
あなたの動画を新しい順に返します。
| limit | 1ページあたり 1〜100 本。既定値は 20 です。 |
|---|---|
| status | processing、completed、failed の動画のみを返します。 |
| cursor | 前のページの nextCursor。次のページを取得するときに使います。 |
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 です。
動画をダウンロード
/videos/{id}/content
完了した動画を MP4 ファイルとして返します。アーカイブ済みの動画はファイルストレージへの 307 リダイレクトで応答するため、リダイレクトに従ってください。ファイルの URL 自体にキーは不要です。Range リクエストに対応しています。完了していない動画では 409 VIDEO_NOT_READY が返ります。
動画を削除
/videos/{id}
完了した動画と保存されたファイルを完全に削除します。生成中または失敗した動画は削除できず、409 VIDEO_NOT_DELETABLE が返ります。
{
"data": { "id": "video_1759737600000_4f2a9c1e", "deleted": true },
"error": null
}モデルとクレジット
動画のクレジットは長さと解像度に比例します。表は 5 秒の動画に必要なクレジットで、10 秒の動画はその2倍です。クレジットやメンバーシップは料金ページで購入できます。
| モデル | 説明 | 5秒の動画に必要なクレジット | メンバーシップ |
|---|---|---|---|
w3.0-video | W3.0 | 480P: 2.5 · 720P: 5 · 1080P: 10 | 1080P で必要 |
w3.0-video-prime | W3.0(高速生成) | 480P: 3.5 · 720P: 7 · 1080P: 14 | 1080P で必要 |
w3.0-video-pro | W3.0 Pro(超解像) | 1080P: 10 · 2K: 10 · 4K: 12.5 | 必要 |
w3.0-video-prime-pro | W3.0 Pro(高速生成) | 1080P: 14 · 2K: 14 · 4K: 17.5 | 必要 |
doubao-seedance-2.5 | Seedance 2.5 | 480P: 6.47 · 720P: 14.55 · 1080P: 25.92 | 1080P で必要 |
W3.0 の動画編集は、指定した長さの新しい動画と同じクレジットです。Seedance 2.5 の動画編集は、元動画の長さを入力と出力の2回分、より低い単価で計算します。10 秒の元動画を 720P で編集すると 38.78 クレジットです。各動画の creditCost が実際の消費量です。
メディアの要件
アップロードしたファイルは、使用するモデルのルールで検証されます。リサイズや変換は行われないため、アップロード前に準備してください。
| W3.0 モデル | Seedance 2.5 | |
|---|---|---|
| 画像の形式 | JPEG、透過なしの PNG、WebP、BMP | JPEG、PNG、WebP、BMP |
| 画像のサイズ | 20 MB 以下 | 30 MB 未満 |
| 画像の辺の長さ | 240〜8,000 px | 300〜6,000 px |
| 動画の形式 | MP4、MOV | MP4、MOV |
| 動画のサイズ | 100 MB 以下 | 200 MB 未満 |
| 動画の長さ | 1〜15 秒 | 4〜30 秒 |
| 動画の辺の長さ | 240〜4,096 px | 300〜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_JSON | 400 | 本文が JSON オブジェクトではありません。 |
INVALID_REQUEST | 400 | パラメータが不足しているか無効です。メッセージに該当するパラメータが示されます。 |
INVALID_CURSOR | 400 | cursor が前のページの nextCursor ではありません。 |
UPLOAD_INVALID | 400 | アップロードが存在しない、宣言と異なる、またはメディアルールに違反しています。 |
UNAUTHORIZED | 401 | APIキーがない、無効、または無効化済みです。 |
INSUFFICIENT_CREDITS | 402 | クレジットが不足しています。requiredCredits と availableCredits に数量が示されます。 |
ACCOUNT_BANNED | 403 | アカウントが停止されています。 |
MEMBERSHIP_REQUIRED | 403 | Pro モデルと 720P を超える解像度には有効なメンバーシップが必要です。 |
VIDEO_NOT_FOUND | 404 | このアカウントにはこの ID の動画がありません。 |
IDEMPOTENCY_KEY_REUSED | 409 | このキーの動画は削除されています。新しい Idempotency-Key を使ってください。 |
VIDEO_NOT_READY | 409 | 動画はまだ完了していません。 |
VIDEO_NOT_DELETABLE | 409 | 削除できるのは完了した動画だけです。 |
IDEMPOTENCY_KEY_MISMATCH | 422 | この Idempotency-Key は別のパラメータで使用済みです。 |
NSFW_PROMPT | 422 | プロンプトがコンテンツの安全審査を通過しませんでした。クレジットは消費されていません。 |
PROVIDER_REQUEST_REJECTED | 422 | 過去1日以内にプロバイダーが同じプロンプトとメディアを拒否しました。先に変更してください。 |
ACTIVE_GENERATION_LIMIT | 429 | 生成中の動画が多すぎます。上限は activeLimit に示されます。 |
PROMPT_MODERATION_RATE_LIMITED | 429 | 安全審査の回数が多すぎます。1分ほどお待ちください。 |
REGION_UNAVAILABLE | 451 | お住まいの地域ではこのサービスを利用できません。 |
INTERNAL_ERROR | 500 | 予期しないエラーです。サポートに X-Request-Id をお伝えください。 |
PROVIDER_ERROR | 502 | 動画プロバイダーでエラーが発生しました。しばらくして再試行してください。 |
VIDEO_UNAVAILABLE | 502 | 動画ファイルを取得できませんでした。少し待って再試行してください。 |
SERVICE_UNAVAILABLE | 503 | サービスが一時的に利用できません。しばらくして再試行してください。 |
PROMPT_MODERATION_UNAVAILABLE | 503 | コンテンツの安全審査が利用できません。しばらくして再試行してください。 |