---
title: "Start an upload"
method: POST
path: "/transcriptions/upload"
tags: ["Transcriptions"]
---

# Start an upload

`POST /transcriptions/upload`

## Request

- Base URL: `https://api.cut.pro/api/v1`
- URL: `https://api.cut.pro/api/v1/transcriptions/upload`
- Auth: API key in header `X-Api-Key`

Returns the generated `media_id` plus a presigned PUT URL. Upload the raw bytes to `upload_url` with the same `Content-Type` you declared here, then call `POST /transcriptions` with the `media_id` to start the job.

Both video and audio files are accepted, so an audio-only podcast never has to be wrapped in a video container. The ceiling is the smaller of your plan's upload limit and the storage quota you still have free; `FILE_TOO_LARGE` reports the effective ceiling in `max_size` and `STORAGE_LIMIT_EXCEEDED` means the quota is full.

## Request body

- object
  - `file_name` string, required: Original file name. The extension decides whether this is treated as audio or video.
  - `file_size` number, required: Size of the file in bytes.
  - `content_type` string: MIME type. Defaults to `audio/mpeg` or `video/mp4`, and must match the bytes you PUT.

## Response `200`

Response for status 200

- object
  - `media_id` string, required: Generated media ID. Pass it to `POST /transcriptions`.
  - `kind` 'video' | 'audio', required
  - `upload_url` string, required: Presigned PUT URL. Upload the raw bytes here.
  - `expires_in` number, required: Seconds until `upload_url` expires.

## Other responses

- `400`: Response for status 400
- `406`: Response for status 406
- `500`: Response for status 500

---

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