OpenAI 動画形式
POST /v1/videos と GET /v1/videos/{task_id} は、動画生成タスクの作成と動画生成タスクの取得で説明した同じ非同期タスク API の OpenAI 動画方言です。送信本文は同じフィールドを使い、違いはレスポンスです。送信レスポンスも GET も、タスクレコードではなく OpenAI video オブジェクトを返します。Sora モデルはこの形式を使い、OpenAI SDK の動画クライアントもこの形式を期待します。
エンドポイント
Section titled “エンドポイント”| メソッド | パス | 用途 |
|---|---|---|
POST | /v1/videos | 生成タスクを送信する |
GET | /v1/videos/{task_id} | タスクを OpenAI video オブジェクトとして読む |
GET | /v1/videos/{task_id}/content | 完成した動画のバイト列をダウンロードする |
POST | /v1/videos/{video_id}/remix | 既存の動画から派生したタスクを作成する |
curl https://api.routeapi.ai/v1/videos \ -H "Authorization: Bearer $ROUTEAPI_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "sora-2", "prompt": "A calico cat playing a piano on stage", "size": "1280x720", "seconds": "4" }'リクエストフィールドは動画生成タスクの作成に記載のものです。model、prompt、seconds / duration、size、input_reference、images、metadata。input_reference は参照画像に対応したモデルが読みます。multipart/form-data も受け付けるため、ファイルを直接アップロードできます:
curl https://api.routeapi.ai/v1/videos \ -H "Authorization: Bearer $ROUTEAPI_KEY" \ -F "model=sora-2" \ -F "prompt=A calico cat playing a piano on stage" \ -F "size=1280x720" \ -F "seconds=4" \ -F "input_reference=@cat.jpg"送信レスポンス
Section titled “送信レスポンス”{ "id": "task_G2RdWGt4t1nck5fYqTjwREKJo8Ze4RAV", "task_id": "task_G2RdWGt4t1nck5fYqTjwREKJo8Ze4RAV", "object": "video", "model": "sora-2", "status": "queued", "progress": 0, "created_at": 1792048458}id が RouteAPI のタスク ID です。task_id は互換用のエイリアスで、将来のレスポンスでは省略される可能性があるため id を読んでください。以降のポーリングとダウンロードには必ずこの id を使ってください。保存された上流ペイロード内に現れる ID は、ポーリングやダウンロードに使う値ではありません。
送信レスポンスには、適用された課金倍率を含む X-New-Api-Other-Ratios ヘッダーも付きます。例えば Sora リクエストでは {"seconds":5,"size":1} です。
video オブジェクトを取得する
Section titled “video オブジェクトを取得する”GET /v1/videos/{task_id}curl https://api.routeapi.ai/v1/videos/task_G2RdWGt4t1nck5fYqTjwREKJo8Ze4RAV \ -H "Authorization: Bearer $ROUTEAPI_KEY"{ "id": "task_G2RdWGt4t1nck5fYqTjwREKJo8Ze4RAV", "task_id": "task_G2RdWGt4t1nck5fYqTjwREKJo8Ze4RAV", "object": "video", "model": "seedance-2.0", "status": "completed", "progress": 100, "created_at": 1792048458, "completed_at": 1792048569, "metadata": { "url": "https://...mp4" }}| フィールド | 説明 |
|---|---|
id | RouteAPI のタスク ID |
object | 常に "video" |
model | タスクを実行したモデル |
status | queued、in_progress、completed、failed のいずれか |
progress | 0〜100 の整数 |
created_at / completed_at | Unix 秒。アダプタによっては completed_at をその行の最終更新時刻で埋めるため、完了判定は status で行い、このフィールドに依存しないでください |
expires_at、size、seconds、remixed_from_video_id | プロバイダが返した場合のみ現れます |
metadata.url | video オブジェクトで URL を報告するプロバイダ向けの動画 URL。プロバイダに関係なくバイト列が必要な場合は /v1/videos/{task_id}/content を使用してください |
error.code / error.message | タスクが失敗したときに設定されます。例:Seedance では expired や cancelled |
上流ペイロード自体のフィールド(expires_at や size など)は、プロバイダが返した場合にのみ現れます。上のセットが RouteAPI がマッピングを保証するものです。Gemini と Vertex のチャネルでは、このオブジェクトを構築する前にタスクのステータスがプロバイダから更新されます。
タスクは API Key のユーザーにスコープされます。別のアカウントに属する id は、タスクレコードのエンドポイントと同様に task_not_exist として報告されます。
コンテンツをダウンロードする
Section titled “コンテンツをダウンロードする”GET /v1/videos/{task_id}/content動画のバイト列を RouteAPI 経由で返します。レスポンスには Cache-Control: public, max-age=86400 と上流の Content-Type が付きます。このルートは API Key またはコンソールセッションを受け付け、呼び出し元が所有するタスクのみを提供します。エラーコードと curl の例は動画をダウンロードするを参照してください。
POST /v1/videos/{video_id}/remix既存の動画から新しいタスクを作成します。RouteAPI は あなたの タスクの中から video_id を探し、そこからモデルを導出し、結果の互換性を保つために元の動画を生成したチャネルにリクエストを固定します。
curl https://api.routeapi.ai/v1/videos/task_G2RdWGt4t1nck5fYqTjwREKJo8Ze4RAV/remix \ -H "Authorization: Bearer $ROUTEAPI_KEY" \ -H "Content-Type: application/json" \ -d '{ "prompt": "The same cat, now wearing a tiny hat" }'リミックスは Sora ファミリー(sora-2、sora-2-pro)で意味を持ちます。リクエストは上流自身のリミックスエンドポイントに転送され、prompt が必須です。他のプラットフォームでもリクエストは受け付けられ、モデルとチャネルは元のタスクから解決され、そのモデルのアダプタによってタスクが構築されます。ただし上流がリミックス指示を受け取ることはないため、新しいタスクは通常の生成であり、video_id の派生ではありません。
アダプタが元タスクの課金倍率を記録している場合、リミックスはそれを引き継ぐため、新しいタスクは既定値ではなく元タスクと同じ価格で計算されます。
Sora モデルはこのエンドポイント群を直接使います。重要なパラメータは size と seconds です。
| モデル | 使用できるサイズ |
|---|---|
sora-2 | 720x1280、1280x720 |
sora-2-pro | 720x1280、1280x720、1792x1024、1024x1792 |
- 未対応のサイズは、何も予約される前に
400とコードinvalid_sizeを返します。 - 既定値は
720x1280と 4 秒です。 seconds(またはduration)は他の動画モデルと同じように検証されます。負の値と 3600 を超える値は400 invalid_secondsで拒否されます。input_referenceは参照画像として転送されます。JSON でも multipart でも送信できます。- 課金は
secondsとsizeから計算されます。1792x1024または1024x1792の出力は、秒単位の料金に加えてサイズ倍率(1.666667)が掛かります。適用された倍率はX-New-Api-Other-Ratiosで返されます。 - このファミリーは Remix に対応しています。
可用性と価格はアカウントごとに異なります。モデルが GET /v1/models に現れることを確認し、モデル詳細ページを確認してください。
ルーティング後はタスクのエラー形式が適用されます:
| ステータス | コード | 意味 |
|---|---|---|
| 400 | invalid_request | prompt の欠落・空白、本文の形式誤り、またはフィールドの型誤り |
| 400 | invalid_seconds | duration / seconds が負、または 3600 を超える |
| 400 | invalid_size | モデルが受け付けないサイズ(例:未対応の Sora サイズ) |
| 400 | task_not_exist | remix の video_id が不明、または別アカウントのもの |
| 400 | task_source_unavailable | 元タスクのチャネルが削除・無効、またはアダプタが見つからない |
| 400 | asset_remix_conflict | アセットを使わないタスクの remix で asset:// 素材を参照しようとした |
| 429 | — | 上流のキャパシティが枯渇。メッセージは一般的な再試行案内に置き換えられます |
| 500 | build_request_failed、do_request_failed | タスクを変換できない、または上流への接続に失敗した |
| 500 | convert_to_openai_video_failed | 保存されたタスクデータを video オブジェクトに変換できなかった |
| 501 | not_implemented | OpenAI 動画変換を持たないアダプタのプラットフォームで GET /v1/videos/{task_id} を呼び出した |
| 任意 | fail_to_fetch_task | 上流が送信に対して非 200 を返した。HTTP ステータスは上流のものです |
ルーティング前に拒否されたリクエストは、代わりに標準の {"error": {"message": ..., "type": "error", "code": ...}} 本文を使用します。
次のステップ
Section titled “次のステップ”- 動画生成タスクの作成 — 共通のリクエスト形式と送信段階のエラー。
- 動画生成タスクの取得 — タスクレコード方言、ステータス、コンテンツのダウンロードエンドポイント。
- Seedance、Hailuo、Wan — モデル固有のパラメータ。