Fast HTTP API · Typst 0.14.2 · no headless Chrome

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.

curl
# 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 }
    ]
  }
}'
Typst capabilities

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.

One API call
PDF response
Rust + Typst
direct render path
No Chrome
lower moving parts
Free
100 PDFs / month

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.

Product surface

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.

Templates

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.

proposal-v1.pdf scroll · 2 pages
Proposal PDF page 1 previewProposal PDF page 2 preview
Why PaperJet

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.

TypeScript / Node @paperjet/sdk
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);
Anything that speaks HTTP REST
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.

€0 — 100 PDFs / mo
€9 — 1 000 PDFs / mo
€29 — 10 000 PDFs / mo
€99 — 50 000 PDFs / mo
Full pricing →

Ready to try PaperJet ?

No credit card. Free 100 renders/month.