# Gemini Omni 1.2 Flash — /videos/generations

Gemini Omni 1.2 Flash は Google が 2026 年 11 月に公開した動画の生成・編集モデルです。`POST /v1/videos/generations` で非同期ジョブを送ります。画像なしならテキストから動画、画像 1 枚は最初のフレーム、2 枚で最初と最後のフレーム、参照画像 1〜3 枚、または 1〜15 秒の動画を渡すとその動画を編集します。720P / 1080P / 4K、16:9 または 9:16、音声付きで目に見える透かしはありません。秒単位課金で、編集は元動画の秒数で課金します。

**エンドポイント:** `POST https://kovapi.com/v1/videos/generations`

## クイックスタート

3 ステップで動きます：タスクを送信 → 結果を照会 → 動画のリンクを受け取る。YOUR_API_KEY をご自身のキーに置き換えれば、下のコマンドはそのまま実行できます。

**ステップ 1 · タスクを送信（すぐにタスク ID が返ります。HTTP 202）**

```
curl https://kovapi.com/v1/videos/generations \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "gemini-omni-1.2-flash", "prompt": "雨の夜のネオン街を紙の船が流れていき、黄色いレインコートの子どもが笑いながら追いかける", "duration": 10, "resolution": "720P", "size": "16:9"}'
```

レスポンス（HTTP 202）

```
{
  "id": "img_5c2e8f1a9b3d7e6f0a4c8b2d",
  "object": "video.generation.job",
  "status": "queued",
  "created": 1791281400,
  "model": "gemini-omni-1.2-flash"
}
```

**ステップ 2 · `status` が `succeeded` か `failed` になるまで、5〜10 秒ごとに照会**

```
curl https://kovapi.com/v1/videos/jobs/img_5c2e8f1a9b3d7e6f0a4c8b2d \
  -H "Authorization: Bearer YOUR_API_KEY"
```

成功時のレスポンス

```
{
  "id": "img_5c2e8f1a9b3d7e6f0a4c8b2d",
  "object": "video.generation.job",
  "status": "succeeded",
  "created": 1791281400,
  "model": "gemini-omni-1.2-flash",
  "data": [
    {"url": "https://img.kovapi.com/i/8c1f0e5d2b7a49e3a6d0c4f1b9e2a7d5.mp4"}
  ],
  "usage": {"clips": 1, "model": "gemini-omni-1.2-flash"}
}
```

**ステップ 3 · `data[0].url` が動画（MP4）のリンクです。保存期間は 7 日間なので、長く使う場合はご自身のストレージにダウンロードしてください。**

**完全なサンプル（Python：送信 → 待機 → ローカルに保存）**

```
import time
import requests

BASE = "https://kovapi.com/v1"
HEADERS = {"Authorization": "Bearer YOUR_API_KEY"}

# 1. タスクを送信
job = requests.post(f"{BASE}/videos/generations", headers=HEADERS, json={
    "model": "gemini-omni-1.2-flash",
    "prompt": "雨の夜のネオン街を紙の船が流れていき、黄色いレインコートの子どもが笑いながら追いかける",
    "duration": 10,
    "resolution": "720P",
    "size": "16:9",
}).json()
if "error" in job:
    raise SystemExit(job["error"]["message"])

# 2. 10 秒ごとに照会（最長 1 時間）
deadline = time.time() + 3600
while job["status"] not in ("succeeded", "failed") and time.time() < deadline:
    time.sleep(10)
    job = requests.get(f"{BASE}/videos/jobs/{job['id']}", headers=HEADERS).json()

# 3. 動画をダウンロード
if job["status"] == "succeeded":
    url = job["data"][0]["url"]
    with open("gemini-omni-1.2-flash.mp4", "wb") as f:
        f.write(requests.get(url).content)
    print("saved", url)
elif job["status"] == "failed":
    print("failed:", job["error"]["code"], job["error"]["message"])
else:
    print("still", job["status"], job["id"])
```

順番待ちの間は、照会結果に `queue_position`（前に並んでいるタスクの数）と `eta_seconds`（予想待ち時間）も含まれます。設定した待ち時間の上限を過ぎても、再送信はしないでください。タスクは残っているので、しばらくしてから同じタスク ID で照会を続けてください。

## 認証
```
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
```

## 仕様早見表

| 長さ | 3〜15 秒（1 秒単位、既定 10 秒）· フレーム指定は 3〜10 秒 · 編集は元動画の長さ（1〜15 秒） |
| --- | --- |
| 解像度 | 720P / 1080P / 4K |
| 比率 | 16:9 / 9:16 |
| 参照画像 | 最初のフレーム 1 枚 · 最初と最後 2 枚 · 参照 1〜3 枚 · 編集時の参照は最大 5 枚 |
| 動画編集 | 動画編集: 元動画 1 本、1〜15 秒、mp4 / mov、50MB まで · 元動画の秒数で課金 |
| 参照音声 | 非対応 |
| 音声 | 常に音声付き（セリフ・音楽・効果音はプロンプトに書きます）。オフにはできません（`audio: false` は拒否） |
| プロンプトの長さ | 最大 20,000 文字（中国語も英語も文字数で数えます） |
| 課金方法 | 秒単位: 選んだ解像度の 1 秒あたりの単価 × 長さ（編集は元動画の秒数） |

## リクエストパラメータ

`POST /v1/videos/generations` のリクエスト本文（JSON）：

| パラメータ | 種別 | 必須 | 説明 |
| --- | --- | --- | --- |
| model | string | はい | モデル ID：`gemini-omni-1.2-flash`。 |
| prompt | string | はい | 動画の内容・カメラ・動き・音の説明。最大 20,000 文字（中国語も英語も文字数で数えます）。複数の参照画像は @Image1 / @Image2 で指定できます。編集では変更内容を書きます（例:「夜にして、ほかはそのまま」）。negative_prompt には対応していないため、避けたい内容はプロンプトに直接書いてください。 |
| duration | integer | いいえ | 長さ: 3〜15 秒の整数（既定 10）。`seconds` とも書けます。フレーム指定モードは 3〜10 秒。動画編集では指定不要で、出力は元動画の長さになります。秒単位課金（下の「料金」を参照）。 |
| resolution | string | いいえ | 解像度: 720P（既定）/ 1080P / 4K（1080P と 4K は公式のアップスケール。4K の縦は 2160×3840）。720p・1080p・4k・2160p も使えます。360P には対応していません。 |
| size | string | いいえ | 画面比率: 16:9（既定）/ 9:16。aspect_ratio とも書けます。それ以外の比率は拒否されます。動画編集で省略した場合は元動画の向きに合わせます。 |
| images | array | いいえ | 複数の画像（1 枚 16MB まで）。2〜3 枚は既定で参照画像（最大 3 枚）、image_role=first_frame なら 2 枚で最初と最後のフレーム、動画編集では参照画像を最大 5 枚。image_urls と image_with_roles（[{"url": ..., "role": "first_frame" \| "last_frame" \| "reference"}]）も使えます。上限を超えると切り詰めずに拒否します。 画像 1 枚（公開 URL、data: URI または base64）。既定では最初のフレーム（3〜10 秒）、image_role=reference なら参照画像になります。first_frame_image と last_frame_image も使えます。 |
| image_role | string | いいえ | `first_frame`（最初のフレーム / 最初と最後、3〜10 秒）または `reference`（参照 1〜3 枚）。省略時は 1 枚なら最初のフレーム、2〜3 枚なら参照です。ほかの一般的な書き方 `first_frame_image`、`last_frame_image`、`image_urls`、`image_with_roles`、`omni_reference_task_type` も使えます。 |
| video_urls | array | いいえ | 動画編集: 1〜15 秒の動画を 1 本（mp4 / mov、50MB まで。公開リンク、data:video/mp4;base64,...、または Playground でアップロードしたリンク）。video_url / video_references とも書けます。出力は元動画の長さで、元動画の秒数で課金します。最後の整数秒を超える部分は切り捨てます（4.5 秒は 4 秒として編集・課金）。フレーム指定とは併用できず、続きの生成（extend）には対応していません。 |
| audio | boolean | いいえ | このモデルは常に音声を生成します（セリフ・音楽・効果音はプロンプトに書きます）。このパラメータは省略できます（false は拒否されます）。 |
| callback_url | string | いいえ | タスク終了時に結果を送る先。下の Webhook の項目をご覧ください。 |
| n | integer | いいえ | 1 つのタスクで生成される動画は 1 本なので、指定する必要はありません。1 より大きい値を指定しても生成されるのは 1 本ですが、送信時に n 本分の料金が確保され、余分な分はタスク終了時に戻ります。 |

そのほかのフィールド（`seed`、`negative_prompt`、`fps`、`watermark` など）はモデルに渡されず、料金にも影響しません。結果は常に MP4 で、`url` として返ります。

## 料金

秒単位課金: 料金 = 選んだ解像度の 1 秒あたりの単価 × 長さ。動画編集は元動画の秒数で課金します（最後の整数秒を超える部分は切り捨て、課金しません）。参照画像は無料です。この金額を送信時に仮押さえし、成功時に同じ金額で確定、失敗時は全額返金します。1 クレジット = $0.005。

| 解像度 | クレジット / 秒 | USD / 秒 | 10 秒の動画 1 本 | 8 秒の元動画を編集 |
| --- | --- | --- | --- | --- |
| 720P | 7 | $0.035 | $0.35 | $0.28 |
| 1080P | 10 | $0.05 | $0.50 | $0.40 |
| 4K | 20 | $0.10 | $1.00 | $0.80 |

## 参照素材

- **最初のフレーム / 最初と最後のフレーム**: `image` に 1 枚で最初のフレーム、`images` に 2 枚と `image_role: first_frame` で最初と最後のフレームです。最長 10 秒。画像の縦横は `size` に合わせてください。

- **参照画像**: `images` に 1〜3 枚と `image_role: reference`（2〜3 枚なら省略しても参照）。画像の人物・物体・背景がフレームとしてではなく動画に登場します。プロンプトでは @Image1 / @Image2 で指定できます。

- **動画編集**: `video_urls` に 1〜15 秒の動画を 1 本渡し、プロンプトで変更内容を書きます（例:「月明かりの夜にして、ほかはそのまま」）。参照画像は最大 5 枚まで一緒に渡せます（「人物を @Image1 の人に差し替えて」など）。送信時に元動画をダウンロードして長さを測り、読み取れない・1 秒未満・15 秒超の場合は 400 を返し、課金しません。

- まだ対応していないもの: 360P、続きの生成（extend）、参照動画 / 参照音声の入力、negative_prompt（避けたい内容はプロンプトに直接書いてください）。

- 画像はそれぞれ、公開されている画像の URL、`data:` URI、base64 のいずれかで、1 枚 16MB までです。複数枚は配列にして `images` で渡します。当サイトで画像を保存してから、タスクを順番待ちに入れます。読み込めない画像があると 400 で拒否され、どの画像かが `message` に示されます。この場合は課金されません。

- 当サイトで保存した参照素材と生成結果は、どちらも 7 日間保存されます。

**動画編集: 場面を変え、参照画像の人物に差し替える**

```
curl https://kovapi.com/v1/videos/generations \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "gemini-omni-1.2-flash", "prompt": "月明かりの夜にして、中央の人物を @Image1 の人に差し替え、ほかはそのまま", "video_urls": ["https://example.com/clip-8s.mp4"], "images": ["https://example.com/person.png"], "resolution": "720P"}'
```

出力は元動画の長さになります。元動画が 8 秒なら 8 秒分を課金し、参照画像は無料です。

## タスクの状態と返却フィールド

`GET /v1/videos/jobs/{id}` は次のステータスを返します。各フィールドの説明は [非同期タスク](https://docs.kovapi.com/ja/guide/async-jobs#fields) をご覧ください。5〜10 秒ごとに照会するか、下の Webhook で結果を受け取ってください。ポーリングは無料で、同じアカウントのキーならどれでもこのタスクを照会できます。

| ステータス | 意味 |
| --- | --- |
| queued | 順番待ち。`queue_position`（前にあるタスク数）と `eta_seconds`（予想待ち時間）が付きます。 |
| processing | 生成中。 |
| succeeded | 完了。結果は `data[0].url`、課金の内訳は `usage` にあります。 |
| failed | 失敗。理由は `error` にあり、予約したクレジットは全額返金されます。 |

- `processing` が `queued` に戻ることがあります。たとえば、混み合っているとき、完成した動画を取得し直しているとき、サービスの再起動後などです。タスクを完了できなかった場合、ゲートウェイが自動で生成し直すことがあります。何回再試行しても、課金は 1 タスクにつき 1 回だけです。

- 1 つのアカウントで同時に生成できるタスクは 50 件までで、それ以上は送信順に順番待ちになります。15 分たっても始まらないタスクは失敗となり、全額返金されます。タスクの記録は 3 日間、動画のリンクは 7 日間保存されます。

## 生成にかかる時間

当社のテストでは 720P の 3〜6 秒で約 1 分、1080P の 13 秒で約 2.5 分、4K で約 3 分、編集で約 1.5 分でした。混雑時はさらにかかり、最長 20 分待って超えた場合は全額返金します。

## エラーと返金

送信時のエラーはすぐに HTTP 4xx / 5xx で返り、タスクは作成されず、課金もされません。受け付け後の失敗は照会エンドポイントで報告され、確保額は全額返金されます。すべてのコードは [エラーコード](https://docs.kovapi.com/ja/guide/errors) に載っています。

### 送信時に返るエラー

| HTTP | code | 原因 | 対処 |
| --- | --- | --- | --- |
| 400 | invalid_request | パラメータが不正です。たとえば、長さ・解像度・比率・参照素材の数がこのモデルの範囲外、プロンプトが長すぎる、参照画像や参照動画を読み込めない、常に音声が付くモデルに `audio: false` を指定した、などです。どれに当たるかは `message` に書かれています。 | `message` の内容に沿って直してから、もう一度送信してください。 |
| 400 | invalid_source_video | 元動画を受け付けられませんでした。長さを読み取れない、1 秒未満または 15 秒超、あるいはファイルが壊れています。 | 再生できる 1〜15 秒の mp4 / mov に替えて送信してください。今回は課金していません。 |
| 400 | invalid_callback_url | `callback_url` が公開された http(s) のアドレスではないか、2000 文字を超えています。 | インターネットからアクセスできるアドレスを使ってください。 |
| 400 | model_not_found | モデル ID のつづりが違う・`model` がない・そのモデルをこのエンドポイントでは使えない（たとえば対話モデルで画像のエンドポイントを呼び出した）のいずれかです。 | `GET /v1/models` または [API リファレンス](https://docs.kovapi.com/ja/api) にあるモデル ID を使ってください。 |
| 401 | invalid_api_key | キーが存在しない・削除された・無効化されているか、アカウントが停止されています。 | コンソールの「API Keys」ページでキーを確認してください。 |
| 402 | insufficient_quota | このリクエストの分を確保するだけの残高がありません。ゲートウェイはまずリクエストにかかりうる最大の費用を確保するため、同時に多くの呼び出しを送ったときにも起こることがあります。 | 一度に多くの呼び出しを送った直後なら、数秒待って再試行してください。そうでなければチャージしてください。 |
| 429 | rate_limit_exceeded | このキーに設定した 1 分あたりのリクエスト数の上限を超えました（直近 60 秒で数えます）。`Retry-After` ヘッダーは付きません。 | 数秒待ってから再試行するか、コンソールでこのキーの上限を引き上げてください。 |
| 503 | model_maintenance | モデルのメンテナンス中で、リクエストを受け付けていません。その間、別のモデルが代わりに回答することもありません。 | メンテナンスが終わってから再試行してください。状況は [サービス状態](https://kovapi.com/ja/status) で確認できます。 |
| 503 | service_unavailable | 当サイト側の一時的なエラーです（参照素材の保存に失敗した場合など）。タスクは作成されておらず、課金もされていません。 | しばらくしてから再試行してください。 |

### 失敗したタスク（`status` が `failed`）

| code | 発生する場面 | 対処 |
| --- | --- | --- |
| content_policy | プロンプトまたは参照画像が、モデル提供元のコンテンツ審査を通りませんでした。 | プロンプトを書き直すか参照素材を差し替えてから、もう一度送信してください。同じ内容のままでは再び拒否されます。 |
| invalid_request | モデル提供元がこの組み合わせ（たとえばモードと解像度の組み合わせ）を受け付けません。理由は `message` に書かれています。 | `message` の内容に沿ってパラメータを調整し、もう一度送信してください。 |
| wait_timeout | 動画：120 分以内に結果が出なかったためタイムアウトとし、クレジットを全額返還しました。後から生成が完了した場合は無料でお渡しします。 | もう一度送信してください。 |
| upstream_error | その他の失敗：自動で再試行しても失敗した、順番待ちが 15 分を過ぎても始まらなかった、上流が理由を示さずに拒否した、などです。具体的な状況は `message` に書かれています。 | たいていは再送信すれば成功します。 |

判定は `message` の文面ではなく `code` で行ってください。知らない `code` の場合（または `code` がない場合）は `upstream_error` として扱ってください。たいていは再送信すれば成功します。失敗したタスクはすべて全額返金されます。

## ポーリングの代わりに Webhook を使う

送信時に `callback_url` を付けると、タスクが終わった時点で（成功・失敗とも）、照会エンドポイントが返すものとまったく同じ内容をゲートウェイがその URL へ送ります。署名付きで、届かなかった場合は自動で再試行します。コンソールの「設定 → Webhook」で、アカウント全体の送信先を設定することもできます。 [Webhook のドキュメント →](https://docs.kovapi.com/ja/webhooks)

```
curl https://kovapi.com/v1/videos/generations \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "gemini-omni-1.2-flash", "prompt": "雨の夜のネオン街を紙の船が流れていき、黄色いレインコートの子どもが笑いながら追いかける", "duration": 10, "resolution": "720P", "size": "16:9", "callback_url": "https://your-domain.com/webhook"}'
```
