---
title: "Create a demo-video upload URL"
method: POST
path: "/content/uploads"
tags: ["Content"]
---

# Create a demo-video upload URL

`POST /content/uploads`

## Request

- Base URL: `https://app.getprolifik.com/api/v1`
- URL: `https://app.getprolifik.com/api/v1/content/uploads`
- Auth: HTTP bearer

For the talking-head (Video Hook & Demo) format. PUT the video bytes to uploadUrl with the returned contentType as the Content-Type header (it is signed), then pass key to POST /content/jobs as demoVideoKey (or hookVideoKey). The file is checked when the job is created: mp4, mov or webm, at most 100 MB, a demo at most 60 s and a hook at most 15 s; a rejected upload is deleted. The render replaces the recording's own audio with a library music track (assetFilters.audioMood; none = silent).

## Request body

- CreateContentUpload
  - `contentType` 'video/mp4' | 'video/quicktime' | 'video/webm', required

## Response `201`

Presigned PUT URL (valid 30 minutes), the owned video key, the contentType to send, and maxBytes

- object

## Other responses

- `400`: Request failed
- `401`: Request failed
- `402`: Payment required. error.code is subscription_required (the plan does not include this feature, or the key's account no longer has a plan: API keys are paid-only, so every write from a key whose account has none is refused; see error.upgradeUrl), insufficient_credits (the AI-credit balance is short; see error.needed, error.balance, error.upgradeUrl), or quota_exceeded (a plan quota such as monthly videos or clip minutes).
- `403`: Request failed
- `429`: Request failed

---

[API](https://skmtc.dev/getprolifik/apis/prolifik-public-api.md) · [All operations](https://skmtc.dev/getprolifik/apis/prolifik-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/getprolifik/apis/prolifik-public-api/revisions/301e79c5763c?raw)
