Sora 2 影片生成 API
使用 OpenAI Sora 2 模型生成影片的 API,支援文字生成影片和圖片生成影片模式。
線上體驗: https://nanophoto.ai/sora-2
| 方法 | 路徑 | 說明 |
|---|
| POST | /api/sora-2/generate | 生成影片 |
| POST | /api/sora-2/check-status | 查詢任務狀態 |
Authorization: Bearer YOUR_API_KEY
| 模型 | 時長 | 點數 |
|---|
sora2 | 10s | 4 |
sora2 | 15s | 8 |
sora2-pro-standard (720p) | 10s | 60 |
sora2-pro-standard (720p) | 15s | 100 |
sora2-pro-high (1080p) | 10s | 120 |
sora2-pro-high (1080p) | 15s | 240 |
POST /api/sora-2/generate
| Header | 值 |
|---|
Content-Type | application/json |
Authorization | Bearer YOUR_API_KEY |
| 參數 | 類型 | 必填 | 說明 |
|---|
prompt | string | 是 | 影片生成提示詞 |
mode | string | 是 | textToVideo(文字生成影片)或 imageToVideo(圖片生成影片) |
modelTier | string | 否 | sora2(預設)、sora2-pro-standard 或 sora2-pro-high |
aspectRatio | string | 否 | portrait(直式,預設)或 landscape(橫式) |
videoDuration | string | 否 | 10 或 15(秒) |
imageUrls | string[] | 條件必填 | 圖片生成影片模式的圖片公開 URL |
API 呼叫圖片生成影片模式僅接受 imageUrls(公開 URL),不支援 Base64 圖片上傳。
curl -X POST "https://nanophoto.ai/api/sora-2/generate" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-raw '{
"prompt": "一隻金毛犬在日落時分的海灘上奔跑,電影級光影",
"mode": "textToVideo",
"modelTier": "sora2",
"aspectRatio": "landscape",
"videoDuration": "10"
}'
curl -X POST "https://nanophoto.ai/api/sora-2/generate" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-raw '{
"prompt": "畫中的人物動起來,並朗讀詩詞",
"mode": "imageToVideo",
"modelTier": "sora2",
"aspectRatio": "landscape",
"videoDuration": "10",
"imageUrls": ["https://static.nanophoto.ai/demo/nano-banana-pro.webp"]
}'
async function generateVideo() {
// 第一步:提交生成任務
const response = await fetch("https://nanophoto.ai/api/sora-2/generate", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer YOUR_API_KEY",
},
body: JSON.stringify({
prompt: "一隻金毛犬在日落時分的海灘上奔跑",
mode: "textToVideo",
modelTier: "sora2",
aspectRatio: "landscape",
videoDuration: "10",
}),
});
const data = await response.json();
if (!data.success) {
console.error("生成失敗:", data.error);
return;
}
// 第二步:輪詢任務狀態
const taskId = data.taskId;
while (true) {
await new Promise((resolve) => setTimeout(resolve, 5000)); // 等待 5 秒
const statusRes = await fetch(
"https://nanophoto.ai/api/sora-2/check-status",
{
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer YOUR_API_KEY",
},
body: JSON.stringify({ taskId }),
}
);
const status = await statusRes.json();
if (status.status === "completed") {
console.log("影片網址:", status.videoUrl);
return;
}
if (status.status === "failed") {
console.error("生成失敗:", status.error);
return;
}
console.log("處理中...", status.progress);
}
}
generateVideo();
{
"success": true,
"status": "processing",
"taskId": "task_abc123",
"message": "Video generation in progress"
}
收到 status: "processing" 時,請每隔 5-10 秒輪詢 check-status 介面。
{
"error": "Insufficient credits",
"errorCode": "INSUFFICIENT_CREDITS",
"requiredCredits": 4
}
POST /api/sora-2/check-status
| Header | 值 |
|---|
Content-Type | application/json |
Authorization | Bearer YOUR_API_KEY |
| 參數 | 類型 | 必填 | 說明 |
|---|
taskId | string | 是 | 生成介面回傳的任務 ID |
curl -X POST "https://nanophoto.ai/api/sora-2/check-status" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-raw '{"taskId": "task_abc123"}'
{
"success": true,
"status": "processing",
"progress": "generating",
"message": "Video generation generating",
"taskId": "task_abc123"
}
{
"success": true,
"status": "completed",
"videoUrl": "https://video.nanophoto.ai/sora/...",
"taskId": "task_abc123",
"generationTime": 120,
"creditsUsed": 4
}
{
"success": false,
"status": "failed",
"error": "Video generation failed",
"errorCode": "GENERATION_FAILED",
"taskId": "task_abc123"
}
- 每 5-10 秒 輪詢一次
/api/sora-2/check-status
- 典型生成時間:
sora2 約 1-3 分鐘,Pro 模型約 3-8 分鐘
- 生成失敗時點數會自動退還
| errorCode | HTTP 狀態碼 | 說明 |
|---|
LOGIN_REQUIRED | 401 | 需要認證 |
API_KEY_RATE_LIMIT_EXCEEDED | 429 | 超出頻率限制(100 次/小時) |
INSUFFICIENT_CREDITS | 402 | 點數不足 |
PROMPT_REQUIRED | 400 | 缺少提示詞 |
IMAGE_REQUIRED | 400 | 圖片生成影片模式需要圖片 |
IMAGE_URLS_REQUIRED | 400 | API 呼叫需要 imageUrls(不支援 base64) |
GENERATION_FAILED | 500 | 影片生成失敗 |
TASK_ID_REQUIRED | 400 | 缺少任務 ID |
TASK_NOT_FOUND | 404 | 任務不存在或無權存取 |
INTERNAL_ERROR | 500 | 內部伺服器錯誤 |