---
title: "Mint a paid upload ticket (device-signed)"
method: POST
path: "/api/v2/jobs/upload-ticket"
tags: ["v2 Jobs"]
---

# Mint a paid upload ticket (device-signed)

`POST /api/v2/jobs/upload-ticket`

## Request

- Base URL: `https://pdf2md.dev`
- URL: `https://pdf2md.dev/api/v2/jobs/upload-ticket`
- Auth: HTTP bearer

EP-048. Device-signed (ES256). A linked, paid device mints a one-time, short-TTL ticket bound server-side to {device, account, tier, byte cap}, then streams a tier-sized file to POST /api/v2/jobs/upload. This lets the web app and the extension upload files larger than the free/v1 10 MB limit, which the body-hashed v1 /jobs cannot stream. Returns eligible=false (200) for an anonymous/unlinked device or a tier at or below the free limit, so the client stays on v1 /jobs.

## Response `200`

Ticket (eligible=true) or not eligible (eligible=false)

- V2UploadTicket: EP-048: response of device-signed POST /api/v2/jobs/upload-ticket.
  - `eligible` boolean, required: true when a paid ticket was minted; false when the device is anonymous/unlinked or at/below the free limit (client uses v1 /jobs)
  - `ticket` string: one-time ticket for the Upload-Ticket header (present only when eligible)
  - `max_file_size_bytes` integer, required: the byte cap enforced by the upload (tier limit when eligible, else the free limit)
  - `tier` string, required: the account's tier (or 'anonymous' when unlinked)
  - `expires_in_sec` integer: ticket TTL in seconds (present only when eligible)

## Other responses

- `401`: Missing/invalid API key or session
- `429`: Rate limit exceeded

---

[API](https://skmtc.dev/pdf2md/apis/pdf-to-markdown-api-facade.md) · [All operations](https://skmtc.dev/pdf2md/apis/pdf-to-markdown-api-facade/llms.txt) · [OpenAPI document](https://skmtc.dev/pdf2md/apis/pdf-to-markdown-api-facade/revisions/4636782fb8b6?raw)
