アップスケールを作成
POST /api/v1/upscale — 動画に対してクレジットを差し引き、1080p・2K・4K へのアップスケールを開始します。
POST https://videoupscaler.co/api/v1/upscaleアップスケールを開始し、新しいタスクを返します。ジョブの開始前に動画をダウンロードし、ファイルから実際の長さを読み取って、それに応じたクレジットを差し引きます。動画の長さをこちらから送信する必要はありません。
リクエスト
ヘッダー
| ヘッダー | 必須 | 説明 |
|---|---|---|
Authorization | はい | Bearer <your API key> |
Content-Type | はい | application/json |
Idempotency-Key | 推奨 | 1〜255 文字の印字可能な ASCII 文字列。同じキーで再試行しても二重に課金されることはありません。冪等性を参照してください。 |
ボディ
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
video_url | string | はい | 動画の公開 http(s) URL、または /uploads が返した video_url。 |
resolution | string | はい | 1080p、2k、4k のいずれか。 |
動画の要件
- 形式:MP4、MOV、WebM。
- 長さ:最大 600 秒。
- サイズ:リモートの
video_urlは最大 500MB、/uploads 経由は最大 100MB。 video_urlのサーバーは、通常のGETに対してファイル本体とContent-Lengthヘッダーを返す必要があります。S3、R2、Google Cloud Storage の署名付きリンクは利用できます。YouTube や Google ドライブのプレビューなどの共有ページは利用できません。- 総再生時間を持たないフラグメント化 MP4 ファイルは受け付けられません。事前に通常の MP4 に再エンコードしてください。
- WebM ファイルはヘッダーに再生時間が記録されている必要があります。ブラウザで録画したファイル(MediaRecorder)には含まれないことが多いため、先に再エンコードしてください。
例
curl https://videoupscaler.co/api/v1/upscale \
-H "Authorization: Bearer $VIDEOUPSCALER_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: order-1234" \
-d '{"video_url": "https://example.com/clip.mp4", "resolution": "2k"}'const res = await fetch('https://videoupscaler.co/api/v1/upscale', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.VIDEOUPSCALER_API_KEY}`,
'Content-Type': 'application/json',
'Idempotency-Key': 'order-1234',
},
body: JSON.stringify({ video_url: 'https://example.com/clip.mp4', resolution: '2k' }),
});
if (!res.ok) throw new Error((await res.json()).error.message);
const task = await res.json();res = requests.post(
"https://videoupscaler.co/api/v1/upscale",
headers={
"Authorization": f"Bearer {os.environ['VIDEOUPSCALER_API_KEY']}",
"Idempotency-Key": "order-1234",
},
json={"video_url": "https://example.com/clip.mp4", "resolution": "2k"},
timeout=300,
)
res.raise_for_status()
task = res.json()レスポンス
201 Created とともにタスクが返されます。
{
"id": "0b6f3c1e-8a52-5d1e-9c43-3f1d2e7a9b10",
"status": "processing",
"resolution": "2k",
"video_url": "https://example.com/clip.mp4",
"duration_seconds": 12.4,
"processed_seconds": 12.4,
"credits_charged": 26,
"watermark": false,
"output_url": null,
"thumbnail_url": null,
"error": null,
"created_at": "2026-09-30T08:00:00.000Z",
"updated_at": "2026-09-30T08:00:02.000Z"
}その後、タスクが completed になるまでタスクをポーリングしてください。
このリクエストはレスポンスを返す前に動画をダウンロードするため、大きなリモートファイルでは時間がかかることがあります。タイムアウトは最大 5 分を見込んで設定してください。
冪等性
すべてのリクエストに Idempotency-Key を付けて送信し、タイムアウトやネットワークエラー後に再試行する際は同じキーを再利用してください。
- 同じキーで
video_urlとresolutionも同じ場合は、元のタスクが200 OKで返されます。再度課金されることはありません。 - 同じキーで
video_urlまたはresolutionが異なる場合は、409 idempotency_conflictが返されます。 - このヘッダーがない場合、リクエストのたびに新しいタスクが作成され、課金されます。
課金
料金は、動画の長さ(秒単位で切り上げ)に解像度ごとのレートを掛けた値です。クレジットと料金を参照してください。12.4 秒の動画を 2K で処理すると、13 × 2 = 26 クレジットになります。
ジョブが失敗した場合、クレジットは自動的に返還され、タスクは failed になります。
エラー
| ステータス | コード | 発生条件 |
|---|---|---|
400 | invalid_request | video_url、resolution、Idempotency-Key が指定されていないか無効 |
401 | unauthorized | APIキーが指定されていないか無効 |
403 | paid_plan_required | アカウントが一度もクレジットを購入しておらず、サブスクリプションも契約していない |
402 | insufficient_credits | 残高が動画の料金に足りない |
409 | idempotency_conflict | Idempotency-Key が異なるパラメータで使用された |
413 | file_too_large | 動画が 500MB を超えている |
422 | video_fetch_failed | video_url をダウンロードできなかった |
422 | unsupported_video | 読み取り可能な MP4、MOV、WebM ではない、または再生時間の情報がない |
422 | video_too_long | 動画が 600 秒を超えている |
422 | video_not_found | アップロード先の video_url にファイルがない(アップロードが完了していない) |
504 | upstream_timeout | video_url のダウンロードに 4 分以上かかった |
エラーの形式についてはエラーを参照してください。