---
title: "Create an upload (large files)"
method: POST
path: "/v1/uploads/"
tags: ["Documents"]
---

# Create an upload (large files)

`POST /v1/uploads/`

## Request

- Base URL: `https://api.pdfbetter.com`
- URL: `https://api.pdfbetter.com/v1/uploads/`
- Auth: HTTP bearer

Returns a presigned URL valid for 10 minutes. PUT the PDF bytes to it with the returned headers, then call Create a document with `{ "uploadId" }`. Your plan's file-size limit applies.

Idempotency-Key is ignored: the response holds a short-lived URL, so a replay would hand back an expired link. Retrying is safe — re-exporting unchanged content is free.

## Request body

- object
  - `name` string, required
  - `size` integer, required: Exact byte size of the PDF
  - `contentType` 'application/pdf'

## Response `201`

Create an upload (large files)

- Upload
  - `object` 'upload', required
  - `id` string, required
  - `url` string, required: PUT the file bytes here (exact Content-Type and Content-Length)
  - `method` 'PUT', required
  - `headers` object, required
  - `expiresAt` string, required: ISO 8601 timestamp (UTC)

## Other responses

- `400`: Invalid request (see `error.details.issues`)
- `401`: Missing or invalid API key
- `402`: Your plan doesn't include this (API access needs Business) or a monthly allowance is used up
- `403`: The API key lacks the required scope
- `404`: Not found (or not yours)
- `409`: Conflict with the current state
- `422`: Validation failed
- `429`: Rate limited — see RateLimit-* and Retry-After

---

[API](https://skmtc.dev/pdfbetter/apis/pdfbetter-api.md) · [All operations](https://skmtc.dev/pdfbetter/apis/pdfbetter-api/llms.txt) · [OpenAPI document](https://skmtc.dev/pdfbetter/apis/pdfbetter-api/revisions/6960b18754a8?raw)
