---
title: "Reserve an upload (clip a local file)"
method: POST
path: "/uploads"
---

# Reserve an upload (clip a local file)

`POST /uploads`

## Request

- Base URL: `https://katto.tech/api/v1`
- URL: `https://katto.tech/api/v1/uploads`
- Auth: HTTP bearer

Step 1 of clipping a local file. Reserves a job and returns a presigned R2 PUT url. PUT the file bytes to `upload_url` with the given Content-Type, then call POST /v1/uploads/{job_id}/complete. No quota is charged until the complete step. Requires write scope.

## Request body

- object
  - `filename` string, required
  - `content_type` 'video/mp4' | 'video/quicktime' | 'video/webm' | 'video/x-matroska', required
  - `size` integer, required: File size in bytes. Cap: 3 GB Free, 5 GB Solo and Creator.

## Response `201`

Upload reserved

- object
  - `job_id` string, uuid
  - `upload_url` string, uri: Presigned R2 PUT url (2h expiry).
  - `method` string
  - `headers` object: Headers to send with the PUT (Content-Type).
  - `expires_in` integer
  - `complete_url` string, uri

## Other responses

- `400`: Error
- `401`: Error
- `403`: Error
- `429`: Error

---

[API](https://skmtc.dev/katto/apis/katto-api.md) · [All operations](https://skmtc.dev/katto/apis/katto-api/llms.txt) · [OpenAPI document](https://skmtc.dev/katto/apis/katto-api/revisions/f2ae2d85e51d?raw)
