파일 업로드
POST /api/v1/uploads — 서명된 URL을 받아 로컬 동영상 파일을 PUT으로 업로드한 뒤 업스케일합니다.
동영상이 공개 URL에 있지 않다면 먼저 업로드하세요. 업로드는 두 번의 요청으로 이루어집니다. 서명된 업로드 URL을 요청한 다음, PUT으로 파일을 스토리지에 직접 전송합니다.
POST https://videoupscaler.co/api/v1/uploads요청
| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
content_type | string | 예 | video/mp4, video/quicktime 또는 video/webm |
size | integer | 예 | 파일 크기(바이트), 최대 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 자체가 권한 역할을 합니다. |
headers | PUT 요청 시 이 헤더를 함께 보내세요. 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일 후 삭제될 수 있습니다.
오류
| 상태 | 코드 | 발생 조건 |
|---|---|---|
400 | invalid_request | 지원하지 않는 content_type, 잘못된 size, 또는 PUT이 다른 Content-Type으로 전송되었거나 중단됨 |
403 | paid_plan_required | 계정이 크레딧을 구매하거나 구독한 적이 없음 |
402 | insufficient_credits | 크레딧 잔액이 없음 |
403 | invalid_upload_token | 업로드 URL이 유효하지 않거나 만료됨(PUT) |
411 | invalid_request | PUT에 본문이나 Content-Length가 없음 |
413 | file_too_large | 파일이 100MB를 초과하거나 선언한 size보다 큼 |