Fast Typst PDFs from JSON.
PaperJet turns Typst templates into invoices, proposals, reports, and confirmations through a developer-first API. Send JSON, get a PDF, and use Typst features like automatic pages, outlines, tables, components, calculations, and print-ready layout.
Free 100 PDFs / month. No credit card to start. TypeScript SDK available on npm.
# Render a PDF in one HTTP call.
curl -X POST https://api.paperjet.dev/v1/render \
-H "Authorization: Bearer $PAPERJET_API_KEY" \
-H "Content-Type: application/json" \
-o invoice.pdf \
-d '{
"template_id": "invoice-v1",
"data": {
"invoice": { "number": "INV-2026-0042" },
"items": [
{ "description": "Monthly subscription", "unit_price": 29, "quantity": 1 }
]
}
}' More than text replacement.
Templates are real Typst programs, so generated PDFs can stay structured, calculated, paginated, and branded as data changes.
Automatic pages and outlines
Page numbers, document outlines, and table lists are generated by the document model.
Tables, figures, and references
Build structured tables, caption them, and reference document elements without hand-maintained labels.
Reusable components
Write functions for cards, totals, headers, footers, and branded sections once, then feed them JSON.
Logic and calculations
Use loops, conditions, variables, math, and computed totals directly in the template.
Print-focused typography
Control fonts, spacing, page margins, columns, and layout with a typesetting engine.
Accessible PDF option
Request tagged output for accessibility-oriented workflows, then validate representative documents.
Built for the documents your product sends every day.
Most PDF APIs sell HTML rendering. PaperJet focuses on structured, repeatable product documents: a template, a JSON payload, and a PDF your customer can keep.
Invoices and receipts
Render accounting-friendly PDFs from the same JSON your app already stores.
Quotes and proposals
Turn CRM or back-office data into customer-ready offers with consistent layout.
Reports and exports
Generate formatted operational reports without running Chrome workers yourself.
Certificates and confirmations
Create repeatable documents with IDs, dates, names, and line items merged at render time.
Fast API, document-native output.
Typst gives PaperJet a document layout engine instead of a browser screenshot path. The API stays simple: authenticate, send source or a stored template id, merge JSON, receive a PDF.
Direct Rust + Typst path
Compute is a Rust + axum binary that renders Typst directly. There is no browser launch, DOM capture, or print-emulation layer in the render path.
Typst document features
Pagination, page furniture, outlines, table captions, references, math, and PDF-focused typography are built into the authoring model.
Templates with data merge
Upload a Typst template once, render it from any backend with
a JSON data payload. Real branching,
loops, math. Not string replacement.
More than a render endpoint.
PaperJet includes the pieces a developer expects around PDF generation, not just a compiler hidden behind HTTP.
Fast render API
POST JSON, get a PDF back. No browser automation, no HTML screenshot pipeline to operate.
Stored templates
Upload Typst once, render it with different JSON payloads from any backend.
Inline rendering
Send one-off Typst source directly when you do not need to store a template.
Dashboard preview
Edit Typst and sample JSON side by side, then preview the PDF before wiring production calls.
SDK + OpenAPI
Use the public TypeScript SDK, raw REST, or the OpenAPI reference.
Retry-safe renders
Use Idempotency-Key on retries to replay the same successful PDF without double-rendering.
Signed webhooks
Receive render events with HMAC verification so your app can react without polling.
History and audit logs
Inspect render metadata, request IDs, API key activity, and webhook changes.
Start with a real sales proposal, not a blank editor.
Every account starts with proposal-v1:
a polished proposal template for quotes, service proposals, retainers, and customer approvals.
Swap in your logo-free brand details, line items, milestones, and call to action. The same template can render a different offer for every lead from your CRM or backend.
A cleaner alternative to running Puppeteer for every PDF.
Browser-based PDF tools are useful when you need exact HTML/CSS rendering. PaperJet is for teams that would rather use a document language and a focused render API.
Fast API surface
One authenticated POST can return the final PDF directly. Stored templates keep request bodies small for recurring documents.
Document layout, not browser screenshots
Typst gives pagination, outlines, tables, math, references, and print layout a first-class engine instead of CSS print workarounds.
No rendered-PDF archive by default
PDF bytes are streamed back to your app; render history stores metadata, not your document contents.
Retry-safe API design
Idempotency-Key support helps avoid double renders and double quota usage on client retries.
From JSON data to a polished PDF.
TypeScript SDK, OpenAPI spec, or a vanilla curl call.
Pick the integration that fits.
import { Paperjet } from "@paperjet/sdk";
import { writeFile } from "node:fs/promises";
const pj = new Paperjet({
apiKey: process.env.PAPERJET_API_KEY!,
});
const pdf = await pj.render({
template_id: "proposal-v1",
data: { /* anything JSON-shaped */ },
});
await writeFile("out.pdf", pdf); curl -X POST https://api.paperjet.dev/v1/render \
-H "Authorization: Bearer $KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"source":"= Hello #data.name","data":{"name":"World"}}' \
-o hello.pdf
# 200 OK · application/pdf · 11 KB.
# Stripe-style Idempotency-Key prevents
# double-render on retries (24 h replay). Start free, upgrade when volume grows.
Free stays hard-capped. Paid plans include higher quotas and metered overage through Stripe once you go past the included monthly volume.
Ready to try PaperJet ?
No credit card. Free 100 renders/month.
