sora-2, sora-2-pro, sora-2-2025-10-06, sora-2-2025-12-08, and sora-2-pro-2025-10-06. See the deprecations page for details.概要
Sora は、OpenAI が生成メディアの最前線を切り開く最新の動画モデルです。自然言語や画像から、細部まで豊かに描かれた、動きのある音声付きクリップを作成できます。長年にわたるマルチモーダル拡散の研究を基盤とし、多様な視覚データで学習した Sora は、3D 空間、動き、シーンの連続性に対する深い理解をテキストからの動画生成に活かします。
Videos API は、これらの機能を初めて開発者に提供し、プログラムによる動画の作成、延長、編集、管理を可能にします。
次のような用途に利用できます。
- プロンプトから新しい動画を作成
- 参照画像を使って生成内容を指定
- 複数の生成でキャラクターのアセットを再利用し、見た目の一貫性を向上
- 動画の延長機能で、完成したクリップの続きを生成
- 既存の動画の特定の部分を変更
- 完成した動画と関連アセットをダウンロード
- Batch API を通じて、オフライン処理用の大量のレンダリングジョブをキューに送信
モデル
第 2 世代の Sora モデルには、それぞれ異なるユースケースに適した 2 つのバリエーションがあります。
Sora 2
sora-2 は、 速度と柔軟性を重視して設計されています。トーン、構成、映像スタイルを試す探索段階で、完璧な再現性よりも素早いフィードバックが必要な場合に最適です。
良質な結果を素早く生成できるため、短いサイクルでの試行錯誤、コンセプトの検討、ラフカットの作成に適しています。ソーシャルメディア向けコンテンツやプロトタイプなど、極めて高い再現性よりも完成までの時間が重要な場面では、sora-2 で十分以上の結果が得られることが多くあります。
Sora 2 Pro
sora-2-pro は、より高品質な結果を生成します。 本格的な制作に使える品質の出力が必要な場合に適しています。
sora-2-pro はレンダリングに時間がかかり、利用コストも高くなりますが、より洗練された安定した結果を生成します。高解像度の映画のような映像、マーケティング用の素材など、視覚的な精度が重要な場面に最適です。
1920x1080 または 1080x1920 の 1080p 出力が必要な場合は、sora-2-pro を使用してください。
sora-2 と sora-2-pro は、どちらも 16 秒と 20 秒の動画生成に対応しています。
動画の生成
動画生成は 非同期 で処理されます。
-
POST /videosエンドポイントを呼び出すと、API はジョブのidと初期のstatusを含むジョブオブジェクトを返します。 -
ステータスが完了に変わるまで
GET /videos/{video_id}エンドポイントをポーリングできます。また、より効率的な方法として、Webhook(後述の Webhook のセクションを参照)を使い、ジョブの終了時に自動で通知を受け取ることもできます。 -
ジョブが
completed状態になると、GET /videos/{video_id}/contentで最終的な MP4 ファイルを取得できます。
レンダリングジョブの開始
まず、テキストプロンプトと必須パラメーターを指定して POST /videos を呼び出します。プロンプトでは被写体、カメラ、照明、動きなどの映像表現を定義し、size や seconds などのパラメーターで動画の解像度と長さを制御します。
import OpenAI from "openai";
const openai = new OpenAI();
let video = await openai.videos.create({
model: "sora-2",
prompt: "A video of the words 'Thank you' in sparkling letters",
});
console.log("Video generation started: ", video);レスポンスは、一意の ID と、queued や in_progress などの初期ステータスを含む JSON オブジェクトです。これは、レンダリングジョブが開始されたことを意味します。
{
"id": "video_68d7512d07848190b3e45da0ecbebcde004da08e1e0678d5",
"object": "video",
"created_at": 1758941485,
"status": "queued",
"model": "sora-2-pro",
"progress": 0,
"seconds": "8",
"size": "1280x720"
}
サイズと長さの選択
制作要件を満たす最小の形式を選びます。
- プロンプト、動き、構図を繰り返し調整する際は、短いクリップを使います。
- より長い展開や、より充実したシーンや広告が必要な場合は、最大
20秒の動画を生成します。 1920x1080または1080x1920の高解像度で書き出すには、sora-2-proを使います。
長尺の動画や 1080p のジョブは、短い 720p や 480p のレンダリングよりも完了までに大幅に時間がかかる場合があります。ユーザー向けのフローでは、待ち時間が長くなることを見込んで設計してください。
ガードレールと制限
API では、コンテンツに次の制限が適用されます。
- 18 歳未満の視聴者に適したコンテンツのみ(この制限を解除する設定は今後提供予定)
- 著作権で保護されたキャラクターや音楽は拒否されます。
- 著名人を含め、実在の人物は生成できません。
- 人間の容姿を描いたキャラクターのアップロードは、デフォルトでブロックされます。
- 現在、人間の顔を含む入力画像は拒否されます。
生成の失敗を避けるため、プロンプト、参照画像、文字起こしがこれらのルールに従っていることを確認してください。
効果的なプロンプト
最良の結果を得るには、 ショットの種類、被写体、動作、場面設定、照明を記述します。次に例を示します。
- 「芝生の公園で赤い凧を揚げる子どもを捉えたワイドショット。ゴールデンアワーの陽光が差し、カメラがゆっくりと上方向にパンします。」
- 「木製のテーブルに置かれた、湯気の立つコーヒーカップのクローズアップ。ブラインド越しに朝の光が差し込み、浅い被写界深度で柔らかくぼかします。」
ここまで具体的に記述すると、モデルが不要な細部を付け加えることなく、一貫した結果を生成しやすくなります。さらに高度なプロンプトの手法については、Sora 2 専用のプロンプトガイドを参照してください。
進捗の確認
動画生成には時間がかかります。モデル、API の負荷、解像度によっては、 1 回のレンダリングに数分かかる場合があります。
進捗を効率よく管理するには、API をポーリングして最新のステータスを取得するか、Webhook で通知を受け取ります。
ステータスエンドポイントのポーリング
作成時の呼び出しで返された ID を使って、GET /videos/{video_id} を呼び出します。レスポンスには、ジョブの現在のステータス、進捗率(取得できる場合)、エラー情報が含まれます。
主な状態は queued、in_progress、completed、failed です。適切な間隔(たとえば 10~20 秒ごと)でポーリングし、必要に応じて指数バックオフを使いながら、ジョブがまだ進行中であることをユーザーに伝えます。
import OpenAI from "openai";
import { setTimeout as sleep } from "node:timers/promises";
const openai = new OpenAI();
async function main() {
let video = await openai.videos.create({
model: "sora-2",
prompt: "A video of the words 'Thank you' in sparkling letters",
});
while (video.status === "queued" || video.status === "in_progress") {
await sleep(2000);
video = await openai.videos.retrieve(video.id);
}
if (video.status === "completed") {
console.log("Video successfully completed: ", video);
} else {
console.log("Video creation failed. Status: ", video.status);
}
}
main();レスポンスの例:
{
"id": "video_68d7512d07848190b3e45da0ecbebcde004da08e1e0678d5",
"object": "video",
"created_at": 1758941485,
"status": "in_progress",
"model": "sora-2-pro",
"progress": 33,
"seconds": "8",
"size": "1280x720"
}
Webhook による通知
GET でジョブのステータスを繰り返しポーリングする代わりに、Webhook を登録すると、動画生成の完了時や失敗時に自動で通知を受け取れます。
Webhook は Webhook 設定ページで設定できます。ジョブが終了すると、API は video.completed または video.failed のいずれかのイベントを発行します。各イベントには、そのイベントを発生させたジョブの ID が含まれます。
Webhook ペイロードの例:
{
"id": "evt_abc123",
"object": "event",
"created_at": 1758941485,
"type": "video.completed", // or "video.failed"
"data": {
"id": "video_abc123"
}
}
結果の取得
MP4 のダウンロード
ジョブのステータスが completed になったら、GET /videos/{video_id}/content で MP4 を取得します。このエンドポイントは動画のバイナリデータをストリーミングし、標準のコンテンツヘッダーを返すため、ファイルをディスクに直接保存することも、パイプでクラウドストレージに転送することもできます。
import { writeFileSync } from "node:fs";
import OpenAI from "openai";
const openai = new OpenAI();
let video = await openai.videos.create({
model: "sora-2",
prompt: "A video of the words 'Thank you' in sparkling letters",
});
console.log("Video generation started: ", video);
let progress = video.progress ?? 0;
while (video.status === "in_progress" || video.status === "queued") {
video = await openai.videos.retrieve(video.id);
progress = video.progress ?? 0;
// Display progress bar
const barLength = 30;
const filledLength = Math.floor((progress / 100) * barLength);
// Simple ASCII progress visualization for terminal output
const bar = "=".repeat(filledLength) + "-".repeat(barLength - filledLength);
const statusText = video.status === "queued" ? "Queued" : "Processing";
process.stdout.write(`${statusText}: [${bar}] ${progress.toFixed(1)}%`);
await new Promise((resolve) => setTimeout(resolve, 2000));
}
// Clear the progress line and show completion
process.stdout.write("\n");
if (video.status === "failed") {
throw new Error("Video generation failed");
}
console.log("Video generation completed: ", video);
console.log("Downloading video content...");
const content = await openai.videos.downloadContent(video.id);
const body = content.arrayBuffer();
const buffer = Buffer.from(await body);
writeFileSync("video.mp4", buffer);
console.log("Wrote video.mp4");これで、再生、編集、配布に使える最終的な動画ファイルが手に入りました。ダウンロード URL の有効期限は、生成後最大 1 時間です。長期保存が必要な場合は、速やかに独自のストレージシステムにファイルをコピーしてください。
関連アセットのダウンロード
完成した動画ごとに、 サムネイル と スプライトシートもダウンロードできます。これらは軽量なアセットで、プレビュー、シークバー、カタログ表示に役立ちます。ダウンロードするものは variant クエリパラメーターで指定します。デフォルトは MP4 用の variant=video です。
# Download a thumbnail
curl -L "https://api.openai.com/v1/videos/video_abc123/content?variant=thumbnail" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
--output thumbnail.webp
# Download a spritesheet
curl -L "https://api.openai.com/v1/videos/video_abc123/content?variant=spritesheet" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
--output spritesheet.jpg参照画像の使用
入力画像を使って生成内容を誘導できます。この画像は、 動画の最初のフレームとして使われます。出力動画でブランドアセット、キャラクター、特定の環境の見た目を維持したい場合に便利です。
リクエストの種類に応じて、input_reference の形式を選びます。
multipart/form-dataリクエストでは、input_referenceにアップロードする画像を指定します。- バッチを含む
application/jsonリクエストでは、input_referenceに JSON オブジェクトを指定します。JSON 形式では、file_idまたはimage_urlを指定できます。
画像の解像度は、生成する動画の解像度(size)と一致する必要があります。
対応するファイル形式は、image/jpeg、image/png、image/webp です。
curl -X POST "https://api.openai.com/v1/videos" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: multipart/form-data" \
-F prompt="She turns around and smiles, then slowly walks out of the frame." \
-F model="sora-2-pro" \
-F size="1280x720" \
-F seconds="8" \
-F input_reference="@sample_720p.jpeg;type=image/jpeg"| OpenAI GPT Image で生成した入力画像 | Sora 2 で生成した動画(GIF に変換済み) |
|---|---|
この画像をダウンロード | プロンプト: 「彼女は振り返って微笑み、その後ゆっくりと歩いてフレームの外へ出ていきます。」 |
この画像をダウンロード | プロンプト: 「冷蔵庫のドアが開きます。中から、かわいくてぽっちゃりした紫色のモンスターが出てきます。」 |
キャラクターによる一貫性の維持
キャラクター機能では、人間以外の被写体をアップロードし、複数回の生成で繰り返し参照できます。動物、マスコット、物体の基本的な外見、スタイル、画面上の存在感を複数のショットで維持したい場合に便利です。
現在、キャラクターのアップロードに最も適しているのは、2~4 秒の短いクリップで、
アスペクト比が 16:9 または 9:16、解像度が 720p~1080p のものです。キャラクターの元動画は、
生成する動画のアスペクト比と一致していると、最良の結果が得られます。アスペクト比が異なると、
キャラクターが引き伸ばされたり、歪んだりすることがあります。1 本の動画には、
最大 2 体のキャラクターを含められます。
キャラクターは input_reference とは異なります。参照画像は、
1 回の生成における冒頭のフレームを決めるために使います。一方、キャラクターアセットは、
その後の動画リクエストでも繰り返し使えます。
短い MP4 クリップを POST /v1/videos/characters にアップロードしてキャラクターを作成し、動画の作成時に、返されたキャラクター ID を characters 配列に含めます。
人間の外見を描いたキャラクターのアップロードは、デフォルトでブロックされます。 人間の外見を扱う機能の利用条件については、 担当のアカウントマネージャーにご連絡いただくか、営業チームに お問い合わせください。
curl -X POST "https://api.openai.com/v1/videos/characters" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: multipart/form-data" \
-F "video=@character.mp4;type=video/mp4" \
-F "name=Mossy"プロンプトにはキャラクター名をそのまま記載してください。キャラクター ID を渡すだけでは、ショット内でキャラクターの特徴を確実に維持できません。
キャラクターは input_reference と組み合わせて使用できます。
延長機能はキャラクターに対応していません。
curl -X POST "https://api.openai.com/v1/videos" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "sora-2",
"prompt": "A cinematic tracking shot of Mossy, a moss-covered teapot mascot, weaving through a lantern-lit market at dusk.",
"size": "1280x720",
"seconds": "8",
"characters": [
{ "id": "char_123" }
]
}'完成した動画の延長
動画の延長機能では、完成した既存の動画の続きを生成し、元の動画とつなぎ合わせた新しい動画を作成できます。POST /v1/videos/extensions の video フィールドに元の動画を指定し、シーンをどのように続けるかを説明するプロンプトを追加すると、API が元のクリップ全体をコンテキストとして次の部分を生成します。
動き、カメラの向き、シーンの連続性を維持したい場合は、延長機能を使用してください。新たに生成する動画の最初のフレームだけを指定したい場合は、代わりに input_reference を使用してください。
1 回の延長で最大 20 秒を追加できます。
1 本の動画は最大 6 回まで延長でき、合計の長さは最大 120 秒です。
現在、延長機能で指定できるのは元の動画とプロンプトのみです。
キャラクターや参照画像には対応していません。
curl -X POST "https://api.openai.com/v1/videos/extensions" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"video": {
"id": "video_abc123"
},
"prompt": "Continue the scene as the camera rises over the rooftops and reveals the sunrise.",
"seconds": "8"
}'既存の動画の編集
編集機能では、すべてを最初から生成し直すことなく、既存の動画の特定の部分を調整できます。プロンプトと video の参照を指定して POST /v1/videos/edits にリクエストを送信すると、元の構造、連続性、構図を再利用しながら変更が適用されます。変更内容を 1 つに絞り、明確に指定すると、最良の結果が得られます。編集範囲を小さく限定することで、元の映像をより忠実に保ち、映像の乱れが生じるリスクを減らせるためです。
以前は remix エンドポイントを使用して生成動画を編集できましたが、このエンドポイントは非推奨となる予定です。新しい連携には edits エンドポイントを使用してください。
video フィールドには、動画 ID またはアップロードした動画を指定できます。
動画 ID を渡すと、API が元の動画からモデルを判別します。
アップロードした動画の編集は、利用条件を満たすお客様のみご利用いただけます。 このワークフローが必要な場合は、担当のアカウントマネージャーにご連絡いただくか、営業チームに お問い合わせください。
curl -X POST "https://api.openai.com/v1/videos/edits" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"video": {
"id": "video_abc123"
},
"prompt": "Shift the color palette to teal, sand, and rust, with a warm backlight."
}'既存の生成動画を編集する代わりに新しい動画をアップロードする場合は、
リクエストで model を明示的に設定してください。
curl -X POST "https://api.openai.com/v1/videos/edits" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: multipart/form-data" \
-F "video=@source.mp4;type=video/mp4" \
-F "model=sora-2-pro" \
-F "prompt=Shift the color palette to teal, sand, and rust, with a warm backlight."編集機能は、うまくできている部分を残しながら改善できるため、試行錯誤を重ねる際に特に役立ちます。1 回の編集を明確な 1 つの調整に絞ることで、映像のスタイル、被写体の一貫性、カメラのフレーミングを維持しながら、雰囲気、配色、演出のバリエーションを試せます。小さく確実な調整を積み重ねることで、完成度の高い映像シーケンスをはるかに作りやすくなります。
| 元の動画 | 編集後の生成動画 |
|---|---|
![]() | プロンプト: 「モンスターの色をオレンジに変えてください。」 |
![]() | プロンプト: 「すぐ後に 2 匹目のモンスターが出てきます。」 |
Batch API による動画ジョブの実行
オフライン処理、レビューパイプライン、スタジオのワークフローなどで、多数の動画レンダリングをキューに登録する必要がある場合は、Batch API を使用してください。バッチ入力ファイルの各行には、POST /v1/videos に送信するものと同じ JSON リクエストボディを使用するため、ショットリストやスケジュール済みのレンダリングキューに適しています。
バッチで動画を生成する際は、次の点に注意してください。
- 現在、バッチが対応しているのは
POST /v1/videosのみです。 - バッチリクエストでは、マルチパートではなく JSON を使用する必要があります。
- アセットは事前にアップロードし、JSON リクエストボディから参照してください。
- バッチで画像を参照して動画を生成するには、
input_referenceを使用してください。JSON リクエストでは、file_idまたはimage_urlを含むオブジェクトとしてinput_referenceを渡します。 - バッチでは、動画の参照入力を含め、マルチパートによる
input_referenceのアップロードには対応していません。 - バッチで生成した動画は、バッチ完了後、最大
24時間ダウンロードできます。
{"custom_id":"shot-001","method":"POST","url":"/v1/videos","body":{"model":"sora-2-pro","prompt":"Slow dolly shot through a miniature paper city at blue hour, soft fog, practical window lights flickering on.","size":"1920x1080","seconds":"20"}}
{"custom_id":"shot-002","method":"POST","url":"/v1/videos","body":{"model":"sora-2-pro","prompt":"Portrait close-up of a red panda chef plating noodles in a stainless-steel kitchen, shallow depth of field.","size":"1080x1920","seconds":"16"}}
バッチが completed に達した時点で、出力に含まれる動画ジョブはすでに completed、failed、expired などの終端状態に達しています。バッチの結果を内部のショット ID、編集キュー、アセットパイプラインに対応付けられるよう、一貫した custom_id の値を使用してください。その後、返された動画 ID を使用して完成したアセットをダウンロードします。
ライブラリの管理
動画の一覧を取得するには、GET /videos を使用してください。このエンドポイントでは、ページネーションと並べ替えのためのクエリパラメーターを任意で指定できます。
curl "https://api.openai.com/v1/videos?limit=20&after=video_123&order=asc" \
-H "Authorization: Bearer $OPENAI_API_KEY" | jq .不要になった動画を OpenAI のストレージから削除するには、DELETE /videos/{video_id} を使用してください。
curl -X DELETE "https://api.openai.com/v1/videos/REPLACE_WITH_YOUR_VIDEO_ID" \
-H "Authorization: Bearer $OPENAI_API_KEY" | jq .












プロンプト: 「彼女は振り返って微笑み、その後ゆっくりと歩いてフレームの外へ出ていきます。」
プロンプト: 「冷蔵庫のドアが開きます。中から、かわいくてぽっちゃりした紫色のモンスターが出てきます。」
プロンプト: 「モンスターの色をオレンジに変えてください。」
プロンプト: 「すぐ後に 2 匹目のモンスターが出てきます。」