---
title: "Start a chunked upload"
description: "POST https://api.markitdown.ai/v1/uploads — Start a chunked upload. Authenticate with x-api-key."
url: https://markitdown.ai/docs/api/create-upload
updated: 2026-09-26
source: markitdown.ai
---

# Start a chunked upload

> POST https://api.markitdown.ai/v1/uploads — Start a chunked upload. Authenticate with x-api-key.

## Endpoint

**POST** `/v1/uploads` — Start a chunked upload

Gets a file past Cloudflare's request-body limit (100 MB) by uploading directly to R2 in parts. Unrelated to OCR/parsing — use for a file over 100 MB but within the caller's plan file-size limit; a smaller file can still use multipart `file` on the convert call itself.

## Request body

`application/json` — object (required).

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `bytes` | integer | yes |  |
| `name` | string | yes |  |

## Example request

**curl**

```bash
curl -X POST https://api.markitdown.ai/v1/uploads \
  -H "x-api-key: $MARKITDOWN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "bytes": 1, "name": "report.pdf" }'
```

## Responses

- `201` Upload created — one presigned UploadPart URL per part.
- `403` Subscription required (`application/problem+json`) — `Problem`
- `413` Upload too large (`application/problem+json`) — `Problem`
- `415` Upload type unsupported (`application/problem+json`) — `Problem`
- `503` Conversion unavailable (`application/problem+json`) — `Problem`

## Errors

- [Error codes](/docs/errors) — every `error` code with its status, meaning and whether to retry

## Related

- [API reference](https://markitdown.ai/docs/api)
- [Error codes](https://markitdown.ai/docs/errors)
- [Introduction](https://markitdown.ai/docs)
- [Document Conversion APIs](https://markitdown.ai/developers)
