HTML to PDF in curl
One POST, a PDF back. No headless browser to install, no Chromium to keep patched, no fonts to install on the box — the render happens on a warm browser that is already running.
Render HTML to a PDF
curl -X POST https://api.pdfcraft.dev/v1/render \
-H "Authorization: Bearer $PDFCRAFT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"html": "<h1>Invoice 1042</h1>",
"options": { "printBackground": true, "margin": { "top": "20mm" } }
}' \
--output invoice.pdfRead a PDF back as JSON
The same key works for extraction. Send a PDF, name the fields you want by the label printed on the page, and get them back with the raw text, a coerced value, a confidence and a bounding box.
curl -X POST https://api.pdfcraft.dev/v1/extract \
-H "Authorization: Bearer $PDFCRAFT_API_KEY" \
-H "Content-Type: application/json" \
-d "$(jq -n --arg f "$(base64 -w0 statement.pdf)" \
'{file: $f, schema: {account_number: "string", closing_balance: "currency"}}')" \
| jq '.fields, .tables[0].header'What bites in curl
- `--output` rather than a shell redirect, so curl can still write its own errors to the terminal instead of into your PDF.
- Add `-i` when something is wrong: `Retry-After` and `X-Renders-Remaining` are headers, and the body alone will not tell you when to try again.
- `base64 -w0` on GNU coreutils — without `-w0` it wraps at 76 columns. macOS `base64` does not wrap and does not accept `-w0`.
Errors are one shape
Every failure is {"error":{"code","message","docs_url"}} with a stable code, so you can switch on error.code rather than parsing prose. The two worth handling explicitly are rate_limited — honour Retry-After — and render_failed, which means your HTML broke rather than ours did.
The same thing in another language
- HTML to PDF in Node.js
- HTML to PDF in Python
- HTML to PDF in Go
- HTML to PDF in PHP
- HTML to PDF in Ruby
- HTML to PDF in Java
- HTML to PDF in C#
- HTML to PDF in Rust
- HTML to PDF in Deno
- HTML to PDF in Bun
- HTML to PDF in TypeScript
Or try it with no code at all in the playground. A free key is 100 renders a month.