メインコンテンツへスキップ
POST
Text-to-video: submit a generation task from text prompt
右側のインタラクティブな Playground はライブデバッグをサポートしています。Authorization に API Key を入力し(形式 Bearer sk-xxx)、prompt を入力して、model / seconds / metadata.resolution を選び、送信してください。Default グループが使えます — 専用のグループ切り替えは不要です。
範囲: このページは「テキストのみから動画を生成」を扱います — input_reference も application/json body もありません。参照画像から生成するには、Image-to-Video エンドポイント を使用してください(同じエンドポイント + input_reference アップロード)。
⚠️ よくある落とし穴 3 つ
  1. length フィールドの名前は seconds です(duration ではありません)かつ string である必要があります "4" / "6" / "8"。これを duration と名付けると静かに無視されるため、length はデフォルトの 4 秒にフォールバックします(「8 秒を送ったのに 4 秒になった」罠です);数値を渡すと parse_request_failed: cannot unmarshal number into Go struct field ... duration of type string で失敗します
  2. generateAudio は渡さないでください — 上流は INVALID_ARGUMENT を返します。音声の意図(ambient、dialogue、BGM)は prompt に埋め込んでください
  3. 1080p / 4k では、seconds は "8" にする必要があります — "4" / "6" は上流側で拒否されます
3 ステップの非同期フロー — このページは Step 1(submit)のみを扱います
  • Step 1(このページ): POST /v1/videos → task_id + status: "queued" を返します
  • Step 2: GET /v1/videos/{task_id} を status: "completed" までポーリングします
  • Step 3: MP4 をダウンロードするために GET /v1/videos/{task_id}/content します
POST submit 自体は 1 秒未満で完了し、生成完了まで待機しません。全体のフローは下の Python サンプルに示しています。

コードサンプル

Python (OpenAI SDK · low-level client.post)

Python (requests)

cURL

Node.js (native fetch)

Browser JavaScript

すでに task_id をお持ちですか?コピー&ペーストで使える2つの cURL コマンド

すでに task_id をお持ちの場合(タスク送信時に返却されたもの、またはコンソールログで確認できるもの)、以下の2つのプレースホルダーを置き換えて実行するだけです:
  • sk-your-api-key → お客様の APIYI キー
  • task_xxxxxxxxxxxxxxxx → お客様のタスク ID

1. タスクステータスの確認

JSON レスポンスに status: "completed" と表示されたらダウンロード可能です。in_progress と表示されている場合は、数秒待ってから再度確認してください。

2. 動画のダウンロード(output.mp4 として保存)

/content エンドポイントには Authorization ヘッダーが必要です。ブラウザのアドレスバーで URL を直接開くと 401 が返されます。-f --retry 7 --retry-delay 4 --retry-all-errors は、status が completed に切り替わった直後の 400(最大約20秒間)に対応します。-f がない場合、curl は 400 を成功として扱い、エラー JSON を output.mp4 に書き込んでしまいます。--retry-all-errors がない場合、--retry は 400 を一切リトライしません(curl 7.71 以上が必要です)。

パラメータ参照

generateAudio フィールドは渡さないでください!Veo 3.1 は標準で音声対応しており、このパラメータを渡すと INVALID_ARGUMENT が返されます。音声を制御するには、意図を prompt に書き込んでください: "waves, distant seabirds, low wind sounds"。
パラメータの優先順位:
  • 長さ: metadata.durationSeconds > seconds > 8(seconds を送信してください。duration は認識されません)
  • 解像度: metadata.resolution > size > 720p
  • アスペクト比: 明示的な metadata.aspectRatio > サイズから推定されたもの > 16:9

レスポンス形式

ステップ 1 - 送信直後

ステップ 2 - ポーリングレスポンス(進行中)

ステップ 2 - ポーリングレスポンス(完了)

⚠️ レスポンスフィールドの注意点
  • タスクIDは id から取得してください:送信レスポンスには task_id(同じ値)が含まれる場合もありますが、ポーリングレスポンスには id しか含まれません。安全なパターンは resp.get("task_id") or resp["id"] です(上記のサンプルではすでに実装されています)。
  • 信頼できる情報源として /content 経由でダウンロードしてください:GET /v1/videos/{task_id}/content は MP4 バイナリストリームを返します(認証ヘッダーが必要)。すべてのタスクで動作します。完了したレスポンスには video_url(認証不要の直リンク)と expires_at(約24時間後)が含まれる場合もありますが、すべてのタスクで保証されているわけではなく、一時的なプレビューにのみ適しています。フロントエンドから /content を直接呼び出すことはできません — サーバー側でダウンロードし、独自の OSS / CDN に再ホストしてください。
  • progress は粒度が粗く、いくつかの固定ステップ間でのみ変化します。パーセンテージバーには使用しないでください。
  • status: "failed" には通常、理由(コンテンツ審査、パラメータエラー、または生成されたファイルを取得できなかったなど)を伴う error.message が含まれます。失敗したタスクは課金されず、請求が発生していた場合は自動的に返金されます。prompt を調整して再試行してください。
  • status が completed に切り替わった直後、/content が一時的に 400 を返すことがあります。4秒後に再試行してください(上記のコードサンプルにはすべてこれが組み込まれています)。
このエンドポイントは非同期タスクのエントリーです。課金はタスクが completed に達した時点で発生し、モデル名ごとにリクエスト単位で課金されます(fast $0.3 / standard $1.2、料金 を参照)。POST 送信、ポーリング、およびダウンロード自体は課金されません。また、失敗したタスクも課金されません。

承認

Authorization
string
header
必須

API Key from APIYI console (Default group + Pay-per-request or Pay-as-you-go Priority Token; pure Pay-as-you-go not supported)

ボディ

application/json
model
enum<string>
デフォルト:veo-3.1-fast-generate-preview
必須

Model ID (per-request billing, duration / resolution do not affect price):

  • veo-3.1-fast-generate-preview — $0.3/request, top pick for iteration / batch generation
  • veo-3.1-generate-preview — $1.2/request, for final delivery / 4K scenarios
利用可能なオプション:
veo-3.1-fast-generate-preview,
veo-3.1-generate-preview
prompt
string
必須

Video generation prompt; describe in detail: scene + subject + action + camera + lighting + style.

Audio intent also goes in the prompt (e.g. "waves, distant seabirds, low wind sounds"). Do not pass generateAudio — upstream rejects with INVALID_ARGUMENT.

例:

"A coastal lighthouse at dusk, slow push-in, waves lapping the rocks, distant seabirds, cinematic lighting, steady camera"

seconds
enum<string>
デフォルト:8

Video length. The field name is seconds (not duration), a string enum (not number):

  • "4" — 4 sec, 720p only
  • "6" — 6 sec, 720p only
  • "8" — 8 sec (default), required at 1080p / 4k

Sending duration instead is silently ignored → length falls back to the default 4 sec (720p returns no error but only outputs 4 sec; 1080p/4k errors with ... but got 4). Passing a number (8) returns parse_request_failed: cannot unmarshal number into Go struct field ... duration of type string.

利用可能なオプション:
4,
6,
8
size
enum<string>
デフォルト:1280x720

Output pixel dimensions; lower precedence than metadata.resolution:

  • 1280x720 / 720x1280 — 720p (default)
  • 1920x1080 / 1080x1920 — 1080p (seconds must be "8")
  • 3840x2160 / 2160x3840 — 4k (seconds must be "8", 4–6× slower render)
利用可能なオプション:
1280x720,
720x1280,
1920x1080,
1080x1920,
3840x2160,
2160x3840
metadata
object

Wrapper for fine-grained generation parameters. Higher precedence than the top-level size etc.:

  • Duration resolution order: metadata.durationSeconds > seconds > 8 (send seconds; duration is not recognized)
  • Resolution resolution order: metadata.resolution > size > 720p

レスポンス

Task submitted; returns task_id and queued status

id
string

Task ID (matches task_id; downstream should standardize on task_id)

例:

"task_xxxxxxxxxxxxxxxx"

task_id
string

Task ID for subsequent polling and download

例:

"task_xxxxxxxxxxxxxxxx"

object
string

Object type, fixed to video

例:

"video"

model
string

Model ID used for this task

例:

"veo-3.1-fast-generate-preview"

status
enum<string>

Task status:

  • queued — submitted, awaiting processing
  • in_progress — generating
  • completed — done, downloadable (/v1/videos/{task_id}/content)
  • failed — failed (not billed), retry possible
利用可能なオプション:
queued,
in_progress,
completed,
failed
例:

"queued"

progress
integer

Generation progress (coarse-grained, jumps only between 0 / 50 / 100, do not use for percentage bars)

例:

0

created_at
integer

Task creation Unix timestamp (seconds)

例:

1775025000

completed_at
integer

Task completion Unix timestamp (seconds); only present for completed status

例:

1775025090