ファイルをアップロード

POST /api/v1/uploads — 署名付き URL を取得してローカルの動画ファイル(MP4・MOV・WebM、最大 100MB)を PUT でアップロードし、返された video_url を /upscale に渡してアップスケールします。署名付き URL の有効期限は 1 時間です。

動画が公開 URL にない場合は、先にアップロードしてください。アップロードは 2 つのリクエストで行います。まず署名付きアップロード URL を取得し、次に PUT でファイルをストレージへ直接送信します。

POST https://videoupscaler.co/api/v1/uploads

リクエスト

フィールド型必須説明
content_typestringはいvideo/mp4、video/quicktime、video/webm のいずれか
sizeintegerはいファイルサイズ(バイト)。最大 100MB(104857600)

100MB を超えるファイルは、ご自身でホスティングし、その URL を /upscale に渡してください(最大 500MB)。

レスポンス

201 Created:

{
  "upload_url": "https://api.videoupscaler.co/uploads/eyJrZXki…",
  "method": "PUT",
  "headers": { "Content-Type": "video/mp4" },
  "video_url": "https://storage.videoupscaler.co/videos/api/5f0c…mp4",
  "max_bytes": 7340032,
  "expires_at": "2026-09-30T09:00:00.000Z"
}
フィールド説明
upload_urlファイルを PUT する送信先。Authorization ヘッダーは不要です。URL 自体がアクセス許可を兼ねています。
headersPUT の際にこれらのヘッダーを送信してください。Content-Type は申告した値と一致している必要があります。
video_urlアップロード完了後、この値を /upscale に渡します。
max_bytesファイルが申告した size より大きい場合、アップロードは拒否されます。
expires_atアップロード URL の有効期間は 1 時間です。

完全な例

FILE=clip.mp4
SIZE=$(wc -c < "$FILE" | tr -d ' ')

# 1. Get an upload URL
UPLOAD=$(curl -s https://videoupscaler.co/api/v1/uploads \
  -H "Authorization: Bearer $VIDEOUPSCALER_API_KEY" \
  -H "Content-Type: application/json" \
  -d "{\"content_type\": \"video/mp4\", \"size\": $SIZE}")

# 2. Upload the file
curl -X PUT "$(echo "$UPLOAD" | jq -r .upload_url)" \
  -H "Content-Type: video/mp4" \
  --data-binary @"$FILE"

# 3. Upscale it
curl https://videoupscaler.co/api/v1/upscale \
  -H "Authorization: Bearer $VIDEOUPSCALER_API_KEY" \
  -H "Content-Type: application/json" \
  -d "{\"video_url\": \"$(echo "$UPLOAD" | jq -r .video_url)\", \"resolution\": \"1080p\"}"
import { readFile } from 'node:fs/promises';

const api = 'https://videoupscaler.co/api/v1';
const auth = { Authorization: `Bearer ${process.env.VIDEOUPSCALER_API_KEY}` };
const file = await readFile('clip.mp4');

// 1. Get an upload URL
const upload = await fetch(`${api}/uploads`, {
  method: 'POST',
  headers: { ...auth, 'Content-Type': 'application/json' },
  body: JSON.stringify({ content_type: 'video/mp4', size: file.length }),
}).then((r) => r.json());

// 2. Upload the file
await fetch(upload.upload_url, { method: 'PUT', headers: upload.headers, body: file });

// 3. Upscale it
const task = await fetch(`${api}/upscale`, {
  method: 'POST',
  headers: { ...auth, 'Content-Type': 'application/json' },
  body: JSON.stringify({ video_url: upload.video_url, resolution: '1080p' }),
}).then((r) => r.json());
import os, requests

api = "https://videoupscaler.co/api/v1"
auth = {"Authorization": f"Bearer {os.environ['VIDEOUPSCALER_API_KEY']}"}
path = "clip.mp4"

# 1. Get an upload URL
upload = requests.post(f"{api}/uploads", headers=auth,
                       json={"content_type": "video/mp4", "size": os.path.getsize(path)}).json()

# 2. Upload the file
with open(path, "rb") as f:
    requests.put(upload["upload_url"], headers=upload["headers"], data=f).raise_for_status()

# 3. Upscale it
task = requests.post(f"{api}/upscale", headers=auth,
                     json={"video_url": upload["video_url"], "resolution": "1080p"}).json()

PUT が成功すると、200 とともに {"video_url": "…"} が返されます。

注意事項

  • アップロード URL の取得は無料ですが、1 クレジット以上の残高が必要です。
  • アップロードされたファイルは処理のためだけに保持され、7 日後に削除される場合があります。

エラー

ステータスコード発生条件
400invalid_requestサポートされていない content_type、無効な size、または PUT で異なる Content-Type が送信された、もしくは中断された
403paid_plan_requiredアカウントが一度もクレジットを購入しておらず、サブスクリプションも契約していない
402insufficient_creditsクレジット残高がない
403invalid_upload_tokenアップロード URL が無効、または有効期限切れ(PUT)
411invalid_requestPUT にボディまたは Content-Length がない
413file_too_largeファイルが 100MB を超えている、または申告した size より大きい