アップスケールを作成

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_urlstringはい動画の公開 http(s) URL、または /uploads が返した video_url。
resolutionstringはい1080p、2k、4k のいずれか。

動画の要件

  • 形式:MP4、MOV、WebM。
  • 長さ:1080p は最大 1200 秒、2k・4k は最大 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 になります。

エラー

ステータスコード発生条件
400invalid_requestvideo_url、resolution、Idempotency-Key が指定されていないか無効
401unauthorizedAPIキーが指定されていないか無効
403paid_plan_requiredアカウントが一度もクレジットを購入しておらず、サブスクリプションも契約していない
402insufficient_credits残高が動画の料金に足りない
409idempotency_conflictIdempotency-Key が異なるパラメータで使用された
413file_too_large動画が 500MB を超えている
422video_fetch_failedvideo_url をダウンロードできなかった
422unsupported_video読み取り可能な MP4、MOV、WebM ではない、または再生時間の情報がない
422video_too_long動画が解像度ごとの上限を超えている(1080p は 1200 秒、2k・4k は 600 秒)
422video_not_foundアップロード先の video_url にファイルがない(アップロードが完了していない)
504upstream_timeoutvideo_url のダウンロードに 4 分以上かかった

エラーの形式についてはエラーを参照してください。