---
title: "Upload a source video"
method: POST
path: "/personas/sources/upload"
tags: ["Personas"]
---

# Upload a source video

`POST /personas/sources/upload`

## Request

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

Starts the upload of the video whose person will be swapped for a persona. Returns a `media_id` and a presigned PUT URL: PUT the raw bytes to `upload_url` with the same `Content-Type`, then call `POST /personas/sources/upload/complete`.

MP4 or MOV only, within `video_limits` of `GET /personas/catalog`. The video goes to the workspace library and counts toward its storage. A video already in the library needs no upload: use its id as `media_id`.

## Request body

- object
  - `file_name` string, required: Original file name; its extension must be `.mp4` or `.mov`.
  - `file_size` number, required: Size of the file in bytes.
  - `content_type` string: MIME type, `video/mp4` or `video/quicktime`. Must match the bytes you PUT.

## Response `200`

Response for status 200

- object
  - `media_id` string, required: Pass it to the complete call, then to `GET /personas/swap/quote` and `POST /personas/{id}/videos`.
  - `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)
