31+ templates • 7+ integrations • 99.9% target uptime

Every feature you need to
automate documents

Built for developers. Loved by teams.

From a single invoice to 10,000 batch PDFs — Typsetter handles the rendering so you can focus on your product.

Start Free — No card required → View API Docs
<500ms
Average render time
10,000
Max batch size (rows)
31+
Starter templates
99.9%
Uptime SLA

Core Features

Everything in one API

Six powerful capabilities that cover every PDF automation use case, from instant on-demand rendering to scheduled monthly reports.

Blazing Fast Rendering

Typsetter is built on Typst, a compiled typesetting engine written in Rust. Unlike HTML-to-PDF tools that spin up a headless browser, Typst compiles your template directly to a PDF binary. The result: sub-500ms renders for typical documents, with no cold-start penalty and no memory leak from browser processes. In internal benchmarks, Typsetter renders an invoice in 340ms on average. Puppeteer clocks in at 4.2s. wkhtmltopdf at 2.8s. That difference compounds at scale.

Render time benchmark — 1-page invoice PDF
Typsetter (Typst)340ms
wkhtmltopdf2,800ms
Puppeteer (headless Chrome)4,200ms
Typst Engine No headless browser Rust-powered
🎨

Visual + Code Template Editor

Design templates without writing a single line of code using the drag-and-drop visual builder. Place text blocks, images, tables, and signature fields precisely where you want them. When you need more control, switch to the integrated Typst code editor with syntax highlighting and live preview that re-renders on every keystroke. Template versioning means every save creates a snapshot you can roll back to instantly. New accounts start with access to 31 professionally designed starter templates spanning invoices, contracts, certificates, reports, and more.

Drag & Drop Builder Live Preview Syntax Highlighting Version History 31+ Templates
📦

Batch PDF Generation

Generate thousands of PDFs in a single operation. Upload a CSV file with one row per document, map column headers to template variables in a visual column-mapping UI, and submit the job. Typsetter processes up to 10,000 rows asynchronously, showing real-time progress via the dashboard or via polling the job status endpoint. When the batch completes, download a single ZIP archive containing all PDFs, or have the ZIP delivered to a webhook URL automatically. Error rows are flagged individually so you get maximum yield from every batch. CSV auto-detection handles delimiters and character encodings without configuration.

Up to 10,000 rows CSV Upload ZIP Download Progress Tracking Webhook on Complete

Scheduled Generation

Automate recurring documents with cron-based schedules you define directly in the dashboard. Set a schedule to run daily at 07:00 UTC, every Monday, on the first of each month, or any arbitrary cron expression. Timezone support means schedules fire at the right local time for your business. Each schedule is linked to a template and a data source — you can supply static JSON, a webhook that fetches live data, or a connected Google Sheet. When a schedule fires and a PDF is produced, Typsetter emails the result to configured recipients, posts to a webhook, or saves to your document history. Failed runs retry automatically with exponential backoff, and full execution logs are available for debugging.

Cron Expressions Timezone Support Email Delivery Auto-Retry Execution Logs
📋

Public Forms

Turn any template into a public-facing form with a shareable URL. End users fill out fields in a clean, branded form interface — no Typsetter account required, no API key exposed. Each form field maps directly to a template variable, with configurable validation rules (required, max length, regex, numeric range). On submission, the PDF is generated instantly and either downloaded by the user or sent to a configurable email address. Use webhook triggers to push form submissions into your own system. For monetized document generation, connect a Stripe product so users pay before the PDF is released. Forms can be embedded in any website with a single iframe snippet.

Shareable URL Embeddable iframe Instant PDF Output Stripe Payment Webhook Trigger
🔔

Webhooks & Events

Every significant action in Typsetter emits a real-time webhook event to your configured endpoint. Listen for job.completed when a PDF is ready, batch.done when a CSV batch finishes, usage.alert when you approach your plan limit, and schedule.run after a scheduled generation fires. Webhook payloads are signed with an HMAC-SHA256 signature so you can verify authenticity server-side. Failed deliveries are retried up to 5 times with exponential backoff. The event log in the dashboard preserves 30 days of event history with full request and response bodies, making debugging integrations straightforward. Multiple endpoints can be registered, each with an independent event filter.

job.completed batch.done usage.alert HMAC Verification 30-day Event Log

Technical Specs

Under the hood

Everything you need to evaluate Typsetter for production use. SLAs, limits, and output specifications.

Specification Value
Rendering engineTypst (compiled, Rust-based)
Output formatsPDF (all plans), PNG (all plans)
Template languageTypst + Tera (Jinja2-like variables)
Average render time340ms (p50), <500ms (p95) — 1-page document
Max render timeout30 seconds (configurable per request)
Max batch size10,000 rows per batch job
Max template size512KB source, unlimited embedded assets via URL
API response formatBinary PDF stream, or JSON job ID for async
API authenticationBearer token (API key) — scoped read/write keys available
Rate limitsFree: 10 req/min • Starter: 60 req/min • Pro+: 300 req/min
API uptime SLA99.9% target uptime — all paid plans
Webhook retry policyUp to 5 attempts, exponential backoff, 30-day log
Data residencyEU — Frankfurt (Hetzner)
API specificationOpenAPI 3.1 — interactive docs at /v1/docs

Why Typst

The right engine for PDF at scale

Typst is a modern typesetting language designed from the ground up to compile documents fast. It is the core reason Typsetter is 8× faster than alternatives.

Typst vs HTML/CSS (wkhtmltopdf, Puppeteer)

HTML and CSS were designed for interactive web pages, not for printed documents. Rendering engines like wkhtmltopdf and Puppeteer have to run a full browser layout engine to convert them to PDF, which is slow, memory-hungry, and produces output that shifts based on browser version. Typst knows it is generating a document from the start — pagination, hyphenation, and typography are first-class citizens. The output is byte-for-byte deterministic across runs and platforms.

Typst vs LaTeX

LaTeX has been the gold standard for academic and technical documents for decades. But it was designed in the 1980s, and the compilation model was not designed for real-time API usage. A LaTeX compile can take multiple passes (pdflatex, bibtex, pdflatex again), taking 5–30 seconds for complex documents. Typst compiles in a single pass with an incremental engine. It also has modern, readable syntax and error messages that actually tell you what went wrong — a far cry from LaTeX's famously cryptic output.

Typst vs Markdown

Markdown is easy to write but limited in styling capability. Converting Markdown to PDF (via Pandoc or other tools) requires external templates and produces inconsistent layout results. Typst supports the same lightweight authoring experience as Markdown but adds full scripting, functions, custom layouts, and precise typographic control. You can write a Typst template once and render it with unlimited data variations programmatically.

The Typsetter abstraction layer

Typsetter adds Tera templating on top of Typst. Before Typst sees your template, the Tera engine substitutes {{ variable }} placeholders with values from your JSON request body. This means you write templates once using familiar Jinja2-style syntax, and Typsetter handles secure escaping, type coercion, and rendering. The result is a safe, fast, API-friendly PDF generation pipeline that requires no knowledge of Typst internals to use.

// Example Typst template used inside Typsetter // {{ variables }} are replaced by Tera before Typst compiles #set page(paper: "a4", margin: (x: 2cm, y: 2cm)) #set text(font: "Inter", size: 11pt) #let company = "{{ company_name }}" #let invoice_no = "{{ invoice_number }}" #let total = "{{ total_amount }}" #grid(columns: (1fr, 1fr), [#text(size: 24pt, weight: "bold")[#company]], [#align(right)[Invoice \#invoice_no]] ) // ... line items table, totals, signature block

Template Library

31+ templates, 8 categories

Every template is fully customizable — change fonts, colors, logo, and layout through the editor. Use as-is or fork to build your own.

Browse All Templates →

Start generating PDFs today.
Free — no credit card required.

100 PDFs/month on the free plan. Upgrade when you're ready. Cancel anytime.

Start Free → View API Docs