---
title: "Convert to PDF, synchronously"
method: POST
path: "/quickjob"
tags: ["Convert"]
---

# Convert to PDF, synchronously

`POST /quickjob`

## Request

- Base URL: `https://api.podpdf.com`
- URL: `https://api.podpdf.com/quickjob`
- Auth: API key in header `X-API-Key`

Up to 25 pages, returned within 30 seconds. Send `store: true` for JSON with a signed
download link (valid 1 hour); omit it to get the PDF bytes in the response body.

Larger or slower documents time out with `408 QUICKJOB_TIMEOUT` — use `/longjob`.

## Request body

- QuickJobRequest
  - `input_type` 'html' | 'markdown' | 'url', required
  - `html` string: Required when `input_type` is `html`.
  - `markdown` string: Required when `input_type` is `markdown`.
  - `url` string, uri: Required when `input_type` is `url`. HTTPS only, public hosts only, 10 second timeout, 5 MB limit. Relative assets on the page are not resolved.
  - `options` PdfOptions: Rendering options. `width`/`height` need `format: null`, which otherwise wins.
    - `format` 'A3' | 'A4' | 'A5' | 'Legal' | 'Letter' | 'Tabloid' | 'null', nullable
    - `margin` object
      - `top` string
      - `right` string
      - `bottom` string
      - `left` string
    - `printBackground` boolean
    - `scale` number
    - `landscape` boolean
    - `preferCSSPageSize` boolean
    - `width` string
    - `height` string
    - `pageRanges` string
    - `displayHeaderFooter` boolean
    - `headerTemplate` string
    - `footerTemplate` string
  - `store` boolean: Return JSON with a signed link instead of the PDF bytes.
  - `pdf_standard` 'pdf/ua-1' | 'pdf/ua-2': **Alpha.** Make an accessible, tagged PDF that conforms to PDF/UA-1 (ISO 14289-1, PDF 1.7) or PDF/UA-2 (ISO 14289-2, PDF 2.0). For `input_type` `html` and `markdown` and for template renders; other inputs return 400. Leave it out for an ordinary PDF. PodPDF adds what the file itself needs (tags, language, title, metadata, link descriptions, artifacts for page furniture) and checks the result with veraPDF. What depends on your HTML stays yours: alt text on images, headings in order, header cells in tables. The check's verdict comes back in `X-PDF-Conformance` (or `conformance` in JSON). Built-in templates pass both standards.
  - `title` string: **Alpha.** With `pdf_standard`: the document title, shown by PDF readers. Defaults to the page's `<title>`, then its first heading. Ignored without `pdf_standard`.
  - `lang` string: **Alpha.** With `pdf_standard`: the document language as a language tag. Defaults to the page's `<html lang>`, then `en`. Ignored without `pdf_standard`.

## Response `200`

The PDF, or JSON when `store` is true

- StoredPdf
  - `job_id` string
  - `pages` integer
  - `truncated` boolean
  - `download_url` string, uri, nullable: Signed link, valid one hour. Null when the upload failed.
  - `download_url_expires_at` string, date-time, nullable
  - `pdf_standard` 'pdf/ua-1' | 'pdf/ua-2': **Alpha.** Make an accessible, tagged PDF that conforms to PDF/UA-1 (ISO 14289-1, PDF 1.7) or PDF/UA-2 (ISO 14289-2, PDF 2.0). For `input_type` `html` and `markdown` and for template renders; other inputs return 400. Leave it out for an ordinary PDF. PodPDF adds what the file itself needs (tags, language, title, metadata, link descriptions, artifacts for page furniture) and checks the result with veraPDF. What depends on your HTML stays yours: alt text on images, headings in order, header cells in tables. The check's verdict comes back in `X-PDF-Conformance` (or `conformance` in JSON). Built-in templates pass both standards.
  - `pdf_standard_stability` 'alpha': **Alpha.** Present with `pdf_standard`.
  - `conformance` Conformance: **Alpha.** veraPDF's verdict on a `pdf_standard` render. Present only when the request set `pdf_standard`.
    - `status` 'pass' | 'fail' | 'unavailable'
    - `validator` string, nullable
    - `failed_rules` object[]
      - `rule` string: Clause and test number in the standard.
      - `specification` string
      - `description` string
      - `failed_checks` integer

## Other responses

- `400`: The request was invalid
- `401`: Missing or invalid API key
- `402`: `UPGRADE_REQUIRED` — the account has no plan yet
- `403`: `INSUFFICIENT_CREDITS`, `CONVERSION_TYPE_NOT_ENABLED`, `PDF_TOOLS_NOT_ENABLED`, `RATE_LIMIT_EXCEEDED` or `ACCOUNT_NOT_FOUND`. Note that a plan's rate limit is a 403, not a 429.
- `408`: Rendering took longer than 30 seconds; use `/longjob`
- `413`: The request body is over the limit
- `422`: The values did not validate; `error.details` says which
- `429`: Platform throttling, shared across accounts. Back off and retry with jitter.
- `500`: Rendering or the service failed

## Changes

- **2026-10-20** `84eb21f3ee27`: 6 info
  - added the new optional request property `lang`
  - added the new optional request property `pdf_standard`
  - added the new optional request property `title`
  - added the optional property `conformance` to the response with the `200` status
  - …2 more

[Operation history](https://skmtc.dev/podpdf/apis/podpdf-api/changes/quickjob/post.md)

---

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