---
title: "Upload a content file"
method: POST
path: "/content_uploads"
tags: ["Upload"]
---

# Upload a content file

`POST /content_uploads`

Accepts a multipart file upload, detects its type, optionally converts/resizes it, stores it in S3, and creates (or replaces) a content record. Processing runs asynchronously by default; pass `?wait=true` to block until done.

## Query parameters

- `wait` boolean

## Headers

- `Authorization` string, required
- `REQUEST-ID` string

## Response `201`

Upload accepted (or completed when `wait=true`). When `wait=false` returns a Process object. When `wait=true` returns an array of content objects.

- union
  - Process — Process tracking record returned immediately when `wait=false`.
    - `id` string — MongoDB ObjectID of the process.
    - `account_id` string
    - `name` string
    - `content_type` string
    - `upload_state` 'upload' | 'replace'
    - `folder_id` string
    - `content_id` string
    - `hash` string — MD5 hash of the uploaded file.
    - `hidden` boolean
    - `canva` boolean
    - `prompt_id` string
    - `created_at` string, date-time
    - `updated_at` string, date-time
  - ContentResult[]
    - `mime_type` string
    - `name` string
    - `description` string — EXIF/ffmetadata description extracted from the file.
    - `public_url` string, uri
    - `thumb_public_url` string, uri
    - `content_s3_key` string
    - `content_s3_keys` string[] — Present for multi-slide content (e.g. PDF converted to images).
    - `public_urls` string[] — Present for multi-slide content.
    - `meta` Meta
      - `Key` string — S3 object key.
      - `LastModified` string
      - `ETag` string
      - `Size` integer — File size in bytes.
    - `metas` Meta[] — Present for multi-slide content.
      - `Key` string — S3 object key.
      - `LastModified` string
      - `ETag` string
      - `Size` integer — File size in bytes.
    - `width` integer
    - `height` integer
    - `slides` boolean — True if the content was split into multiple slides (e.g. multi-page PDF).
    - `transcoded` boolean — True if a video was transcoded to MP4.
    - `transcoded_at` string, date-time
    - `length` number, float — Video duration in seconds.
    - `filesync_id` string
    - `prompt_id` string

## Other responses

- `400` — Bad request — malformed form data, or image exceeds the 20 MB size limit.
- `401` — Missing or invalid authentication token.
- `402` — Video uploads require a plan upgrade.
- `403` — Authenticated user lacks the required media upload permission.
- `415` — Unsupported file type detected from magic bytes / extension.
- `500` — Internal server error during upload processing.

---

[API](https://skmtc.dev/telemetrytv/apis/user-api.md) · [All operations](https://skmtc.dev/telemetrytv/apis/user-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/telemetrytv/user-api/revisions/057a0b968aea/schema)
