---
title: "Request a signed upload URL"
method: POST
path: "/api/v1/uploads"
tags: ["Uploads"]
---

# Request a signed upload URL

`POST /api/v1/uploads`

## Request

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

Returns a one-time Supabase Storage signed PUT URL so the caller can upload a PDF (up to the returned max_bytes) directly, bypassing the function body limit. PUT the bytes, then call POST /api/v1/documents with pending_upload_id set to the returned id.

## Request body

- RequestUploadRequest
  - `fileName` string, required: Must end with .pdf.
  - `sizeBytes` integer, required: Up to the returned max_bytes.
  - `contentType` 'application/pdf'

## Response `200`

Signed upload created.

- SignedUpload
  - `id` string, required: Pass as pending_upload_id to POST /api/v1/documents.
  - `upload_url` string, uri, required: PUT the PDF bytes here.
  - `token` string, required: Send as Authorization: Bearer <token> on the PUT.
  - `storage_path` string, required
  - `expires_at` string, date-time, required
  - `max_bytes` integer, required

## Other responses

- `400`: Invalid request.
- `401`: Missing or invalid API key.
- `413`: PDF exceeds the accepted size.
- `415`: fileName is not a .pdf, or contentType is not application/pdf.
- `429`: Rate limit exceeded.

---

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