動画生成 API
API キーで Veo 3.1 のテキストから動画・画像から動画のタスクを作成し、画像と同じ /api/status エンドポイントで結果を取得します。
認証
すべてのリクエストで API キーを Bearer トークンとして送信してください。タスクの作成とステータス確認には同じキーを使います。キーはダッシュボードの API Keys ページで作成できます。
Authorization: Bearer YOUR_API_KEYモデルとクレジット
model フィールドには下表のいずれかの値を指定してください。それ以外の値は HTTP 400 で拒否され、クレジットは消費されません。
| model の値 | モデル | テキストから動画(クレジット) | 画像から動画(クレジット) |
|---|---|---|---|
veo3_fast | Veo 3.1 Fast(デフォルト) | 25 | 35 |
veo3 | Veo 3.1 Quality | 180 | 180 |
veo3-fast は veo3_fast の別名として使えます。model を省略すると veo3_fast になります。image_urls に URL が 1 つ以上ある場合は画像から動画の料金になります。
動画タスクの作成
リクエストを検証し、クレジットを消費して task_id を返します。動画は非同期で生成されます。/api/status をポーリングするか、callback_url を指定して結果を受け取ってください。
生成する動画のテキスト説明。
veo3_fast(別名 veo3-fast)または veo3。それ以外の値は HTTP 400 を返します。 デフォルト値 veo3_fast.
画像から動画に使う公開画像 URL。1 枚の場合はその画像を中心に動画が作られ、2 枚の場合は最初と最後のフレームになります。キャメルケースの imageUrls も別名として使えます。両方を送った場合は image_urls が優先されます。
16:9、9:16、Auto のいずれか。Auto はアップロード画像に合わせて動画をトリミングします。 デフォルト値 16:9.
true の場合、生成前にプロンプトを英語に翻訳します。 デフォルト値 true.
動画に追加する透かしテキスト。
タスク終了時に最終結果を POST で受け取る公開 URL。
サポートされていないフィールド
duration、resolution、単数形の image_url はこの API には含まれず、無視されます。動画の長さはモデルが決めます。画像は image_urls 配列で送ってください。
curl -X POST "https://nanobnana.com/api/video/generate" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"prompt": "The camera slowly pushes in as the city lights turn on at dusk",
"model": "veo3_fast",
"image_urls": ["https://example.com/first-frame.jpg"],
"aspect_ratio": "16:9"
}'{
"code": 200,
"message": "success",
"data": {
"task_id": "veo24223f74e4f445ec9c4403b532cc328fbksv"
}
}タスクステータスの確認
動画タスクの ID は veo で始まり bksv で終わります。/api/status は自動で判別し、タスク完了時に動画 URL を返します。
POST /api/video/generate が返した task_id。
task_id が veo…bksv 形式でない場合に veo3 を指定すると、動画タスクとして照会します。
curl "https://nanobnana.com/api/status?task_id=veo24223f74e4f445ec9c4403b532cc328fbksv" \
-H "Authorization: Bearer YOUR_API_KEY"{
"code": 200,
"message": "success",
"data": {
"task_id": "veo24223f74e4f445ec9c4403b532cc328fbksv",
"request": {
"prompt": "The camera slowly pushes in as the city lights turn on at dusk",
"model": "veo3_fast",
"image_urls": [
"https://example.com/first-frame.jpg"
],
"aspect_ratio": "16:9"
},
"response": null,
"status": "IN_PROGRESS",
"status_code": 3,
"status_text": "IN_PROGRESS",
"consumed_credits": 35,
"created_at": "2026-10-04 17:05:12",
"model": "veo3"
},
"model": "veo3"
}ステータスの値
IN_PROGRESS·status_code: 3— 動画はまだ生成中です。ポーリングを続けてください。COMPLETED·status_code: 1— 動画が完成しました。response に動画 URL が入ります。FAILED·status_code: 2— 生成に失敗しました。error_message に理由が入り、クレジットは自動で返金されます。
課金と返金
- クレジットはタスク作成時、生成開始前に消費されます。
- 作成リクエストが HTTP 200 を返さなかった場合、タスクは作成されず、消費したクレジットはすぐに返金されます。返金されたクレジット数はレスポンスに記載されます。
- 作成済みのタスクが最終的に FAILED になった場合、クレジットは自動で返金され、ステータスレスポンスの consumed_credits は 0 になります。
ポーリングの例
動画生成には通常数分かかります。status_code が 3 の間は 10 秒ごとに照会し、1 または 2 になったら停止してください。
async function waitForVideo(taskId) {
while (true) {
const res = await fetch(`https://nanobnana.com/api/status?task_id=${taskId}`, {
headers: { Authorization: 'Bearer YOUR_API_KEY' }
});
const payload = await res.json();
if (!res.ok) throw new Error(payload.message);
const task = payload.data;
if (task.status_code === 1) return task.response[0];
if (task.status_code === 2) throw new Error(task.error_message || 'Video generation failed');
await new Promise((resolve) => setTimeout(resolve, 10000));
}
}コールバック
callback_url を指定すると、タスクの完了時または失敗時に、次の JSON を含む POST リクエストを送信します。URL はインターネットから到達できる必要があります。
{
"code": 200,
"message": "success",
"data": {
"request": {
"prompt": "The camera slowly pushes in as the city lights turn on at dusk",
"model": "veo3_fast",
"image_urls": [
"https://example.com/first-frame.jpg"
],
"aspect_ratio": "16:9"
},
"response": [
"https://example.com/generated-video.mp4"
],
"status": "COMPLETED",
"created_at": "2026-10-04 17:05:12"
}
}よくあるエラー
{
"code": 400,
"message": "prompt is required",
"data": null
}