---
title: "Request a presigned URL to upload a file"
method: POST
path: "/v2/assets/upload"
tags: ["Assets"]
---

# Request a presigned URL to upload a file

`POST /v2/assets/upload`

Returns a presigned S3 `uploadUrl` and the final public `url`. PUT the file bytes to `uploadUrl` with the same Content-Type, then register the file as an asset via `POST /v2/assets` using `url`. Registration verifies the upload happened and enforces plan limits on the actual file size. Single uploads are capped at 5GB.

## Request body

- CreateAssetUploadDto
  - `fileName` string, required
  - `contentType` string, required
  - `size` integer, required

## Response `201`

Presigned upload URL created successfully

- AssetUploadResponseDto
  - `uploadUrl` string, uri, required
  - `url` string, uri, required
  - `expiresIn` integer, required

## Other responses

- `422` — File size exceeds the plan limit

---

[API](https://skmtc.dev/sync/apis/sync-api-v2.md) · [All operations](https://skmtc.dev/sync/apis/sync-api-v2/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/sync/sync-api-v2/revisions/595901a0ee97/schema)
