エンドポイント
動画(非同期ジョブ)
Veo 3.1、Sora 2 Pro、Kling、Runway などの動画を非同期ジョブで生成します。POST /videos でジョブを作成し、状態をポーリングして結果をダウンロードする流れと、残高チェック、課金、エラーを説明します。動画モデルには Pro 以上のプランが必要です。
プレイグラウンドで試すVeo 3.1、Sora 2 Pro、Kling、Seedance、Runway、Wan、Hailuo などで動画を生成します。動画の生成には数十秒から数分かかるため、非同期ジョブとして実行されます。ジョブを作成し、ステータスをポーリングして、結果をダウンロードします。
| ステップ | リクエスト |
|---|---|
| 1. 作成 | POST /api/v1/videos |
| 2. ポーリング | GET /api/v1/videos/{id} |
| 3. ダウンロード | GET /api/v1/videos/{id}/content?index=0 |
ジョブを作成する
POST https://api14.com/api/v1/videos
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
model | string | はい | 動画モデルの ID。例: google/veo-3.1-fast。 |
prompt | string | はい | 動画で起こる内容。 |
duration | number | いいえ | 秒数での長さ。デフォルトは、モデルが対応する最初の長さ。 |
resolution | string | いいえ | 例: 720p、1080p。モデルが対応している必要があります。 |
aspect_ratio | string | いいえ | 例: 16:9、9:16。 |
generate_audio | boolean | いいえ | 対応するモデルで、サウンドトラックを生成します(デフォルトは true)。 |
image | string | いいえ | 最初のフレームを URL または data: URI で指定します(画像から動画)。 |
モデルごとに対応する長さ、解像度、アスペクト比は、GET /videos/models(公開)またはモデルのページで確認できます。
残高チェック
ジョブを送信する前に、ゲートウェイは長さ × 指定した解像度(および音声オプション)の 1 秒あたりの価格で料金を見積もります。残高が見積もりを下回っている場合、リクエストは 402 insufficient_balance で失敗し、何も開始されません。
レスポンス
{
"id": "vid_01JABCDEF",
"status": "queued",
"polling_url": "/api/v1/videos/vid_01JABCDEF"
}
ジョブをポーリングする
GET https://api14.com/api/v1/videos/{id}
{
"id": "vid_01JABCDEF",
"status": "completed",
"generation_id": "gen-1791100000-abc",
"unsigned_urls": ["/api/v1/videos/vid_01JABCDEF/content?index=0"],
"usage": { "cost": 1.2 }
}
status | 意味 |
|---|---|
queued | プロバイダーの処理待ち。 |
in_progress | レンダリング中。 |
completed | 完了。unsigned_urls に出力が一覧表示されます。 |
failed, cancelled, expired | 出力なしで終了しました。error を参照してください。課金されません。 |
5〜10 秒ごとにポーリングしてください。ジョブを読み取れるのは作成したアカウントのみで、それ以外の ID は 404 not_found を返します。
結果をダウンロードする
GET https://api14.com/api/v1/videos/{id}/content?index=0
API キーを使って、動画のバイト(通常は video/mp4)を返します。出力 URL は常にゲートウェイを指し、上流のプロバイダーを指すことはありません。ファイルの準備ができていない、または期限切れの場合は content_unavailable が返ります。
例
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api14.com/api/v1",
apiKey: process.env.API14_API_KEY,
});
// Video generation is asynchronous: submit, then poll until completed.
let job = await client.post("/videos", { body: {
"model": "google/veo-3.1-fast",
"prompt": "A drone shot over turquoise ocean waves at sunrise",
"duration": 8,
"resolution": "720p",
"aspect_ratio": "16:9"
} });
while (!["completed", "failed"].includes(job.status)) {
await new Promise((r) => setTimeout(r, 5000));
job = await client.get(`/videos/${job.id}`);
}
console.log(job.status, job.unsigned_urls);
課金
ジョブが completed に達した時点で、プロバイダーの実際のコストで1 回だけ課金されます。失敗、キャンセル、期限切れのジョブは無料です。ジョブはバックグラウンドでも完了するため、ポーリングしなかったジョブも精算され、Usage に表示されます。
エラー
| ステータス | コード | 発生条件 |
|---|---|---|
| 402 | insufficient_balance | 残高がジョブの見積もり料金を下回っている。 |
| 403 | plan_required | プランに動画モデルが含まれていない。 |
| 404 | model_not_found / not_found | モデルが不明、またはジョブ ID が自分のものではない。 |
| 502 | upstream_unavailable | ステータスを読み取れなかった。再試行してください。 |
エラーを参照してください。