업스케일 생성

POST /api/v1/upscale — 동영상에 대한 크레딧을 차감하고 1080p, 2K 또는 4K로 업스케일을 시작합니다. 최대 600초 길이의 MP4, MOV, WebM 파일을 지원하며, 길이는 서버가 파일에서 직접 읽어 과금합니다.

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

업스케일을 시작하고 새 작업을 반환합니다. 작업이 시작되기 전에 동영상을 다운로드하고, 파일에서 실제 길이를 읽어 그에 해당하는 크레딧을 차감합니다. 길이를 직접 보낼 필요는 없습니다.

요청

헤더

헤더필수설명
Authorization예Bearer <your API key>
Content-Type예application/json
Idempotency-Key권장출력 가능한 ASCII 문자 1–255자로 된 임의의 문자열. 같은 키로 재시도하면 절대 두 번 차감되지 않습니다. 멱등성을 참고하세요.

본문

필드타입필수설명
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 Drive 미리보기 같은 공유 페이지는 사용할 수 없습니다.
  • 전체 길이 정보가 없는 조각화된(fragmented) 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_conflict해당 Idempotency-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분을 초과함

오류 형식은 오류를 참고하세요.