---
title: "Upload a creator image or video"
method: POST
path: "/v1/partners/{partnerId}/creators/{externalCreatorId}/media"
tags: ["Creator publishing"]
---

# Upload a creator image or video

`POST /v1/partners/{partnerId}/creators/{externalCreatorId}/media`

## Request

- Base URL: `https://comet-api.example.invalid`
- URL: `https://comet-api.example.invalid/v1/partners/{partnerId}/creators/{externalCreatorId}/media`
- Auth: API key in header `x-api-key`

Requires page:edit and configured media. JSON proxy upload: JPEG/PNG/WebP <=5 MiB; MP4/WebM <=20 MiB decoded. Only this route permits 28 MiB JSON. Preserve original key and bytes after unknown outcomes. UPLOAD_IN_PROGRESS means retry the same command after the active lease (60 seconds image / 150 seconds video). Current authority is checked again before finalization and replay. Cancellation cannot guarantee rollback of provider upload.

## Path parameters

- `partnerId` string, required
- `externalCreatorId` string, required

## Headers

- `x-grant-generation` string, required
- `Idempotency-Key` string, required

## Request body

- MediaUpload
  - `schemaVersion` 1, required
  - `fileName` string, required: Nonblank filename, at most 180 Unicode code points; no path separators or control characters.
  - `mimeType` 'image/jpeg' | 'image/png' | 'image/webp' | 'video/mp4' | 'video/webm', required
  - `dataBase64` string, byte, required: Canonical base64, no data: prefix. Server checks canonical padding bits, decoded size and MIME/container match. 5 MiB images / 20 MiB videos; HTTP JSON body ceiling 28 MiB.

## Response `201`

Successful operation. POST operations use HTTP 201, including idempotent retries.

- MediaUploaded
  - `schemaVersion` 1, required
  - `asset` MediaAsset, required
    - `id` string, required
    - `publicId` string, required
    - `url` string, uri, required
    - `thumbnailUrl` string, uri, required
    - `fileName` string, required: Nonblank filename, at most 180 Unicode code points; no path separators or control characters.
    - `mimeType` 'image/jpeg' | 'image/png' | 'image/webp' | 'video/mp4' | 'video/webm', required
    - `width` integer, required
    - `height` integer, required
    - `bytes` integer, required
    - `createdAt` string, date-time, required

## Other responses

- `400`: INVALID_INPUT or UNSUPPORTED_SECTION.
- `401`: UNAUTHENTICATED: missing or invalid app credential, or unsupported Authorization header.
- `403`: Current grant, creator or realm authority does not allow this operation.
- `404`: Scoped resource is absent or unavailable.
- `409`: VERSION_CONFLICT, PREVIEW_CONFLICT, IDEMPOTENCY_CONFLICT, BINDING_CONFLICT or UPLOAD_IN_PROGRESS (retry the same media command after its active lease).
- `413`: Request exceeds the route limit: 256 KiB normally, 28 MiB JSON for POST media; decoded media limit is 5 MiB for images and 20 MiB for videos. Ingress parser failures may use a different envelope.
- `422`: CONTENT_NOT_READY: visible content is not ready for publication.
- `503`: FEATURE_DISABLED, AUTHORITY_UNAVAILABLE or MEDIA_UNAVAILABLE (unconfigured media or provider failure).

---

[API](https://skmtc.dev/comet/apis/comet-creator-publishing-api.md) - [All operations](https://skmtc.dev/comet/apis/comet-creator-publishing-api/llms.txt) - [OpenAPI document](https://skmtc.dev/comet/apis/comet-creator-publishing-api/revisions/04f959b645f0?raw)
