---
title: "Complete a staged media upload"
method: POST
path: "/media/upload-intents/{intentId}/complete"
tags: ["Media"]
---

# Complete a staged media upload

`POST /media/upload-intents/{intentId}/complete`

## Request

- Base URL: `https://api.cavuno.com/v1`
- URL: `https://api.cavuno.com/v1/media/upload-intents/{intentId}/complete`
- Auth: HTTP bearer

Verifies the staged object against the intent using storage-owned byte length and MIME metadata, processes it through the normal media pipeline, and returns the resulting media object.

## Path parameters

- `intentId` string, required

## Request body

- MediaUploadIntentComplete
  - `stagingStorageId` string, required: The storageId returned after POSTing the raw file to the intent uploadUrl.

## Response `201`

Upload completed.

- MediaUpload
  - `id` string, required: Unique identifier for the object. Use this value as the `{id}` path parameter for `GET /v1/media/{id}`.
  - `object` 'media_upload', required: String representing the object's type. Objects of the same type share the same value.
  - `url` string, nullable, required: URL where the file can be downloaded. Permanent for files served from the assets domain; a signed URL for legacy files. Always set on the upload response; may be `null` on retrieval if the underlying blob has been deleted.
  - `urlExpiresAt` string, nullable, required: Time at which the signed `url` expires (ISO 8601 datetime), or `null` when the `url` is permanent and never expires.
  - `mimeType` string, required: MIME type of the uploaded file.
  - `sizeBytes` number, required: Size of the uploaded file, in bytes.
  - `purpose` 'board_logo' | 'board_hero' | 'account_avatar' | 'company_logo' | 'blog_image', required: Resource type the file was uploaded for.

## Other responses

- `400`: The staged byte length or MIME type does not match the intent.
- `403`: The caller lacks permission for this purpose.
- `404`: The intent or staged object was not found.
- `409`: The intent is already being completed.
- `413`: The staged file exceeds the purpose limit.
- `415`: The staged MIME type is unsupported.
- `429`: Too many uploads.

## Changes

- **2026-10-19** `c34152c38176`: 7 info
  - added the optional property `error/upgrade` to the response with the `400` status
  - added the optional property `error/upgrade` to the response with the `403` status
  - added the optional property `error/upgrade` to the response with the `404` status
  - added the optional property `error/upgrade` to the response with the `409` status
  - …3 more

[Operation history](https://skmtc.dev/cavuno/apis/cavuno-v1-rest-api/changes/media/upload-intents/:intentId/complete/post.md)

---

[API](https://skmtc.dev/cavuno/apis/cavuno-v1-rest-api.md) · [All operations](https://skmtc.dev/cavuno/apis/cavuno-v1-rest-api/llms.txt) · [OpenAPI document](https://skmtc.dev/cavuno/apis/cavuno-v1-rest-api/revisions/d5974dabff14?raw)
