Templates in. PDFs out.

PDF rendering API

Beautiful documents,
at any scale

Build your template once. Generate thousands of personalized PDFs — invoices, reports, certificates — via API, no infrastructure required.

EMPLOYEE KIT
{{ company_name }}Acme Corp
EMPLOYEE
{{ employee_name }}Sarah Chen
START DATE
{{ start_date }}Jul 1, 2026
Your Business Name Goes Here

Simple by design

From template to document
in three steps

01

Design your template

Build your layout once. Add variable placeholders like {{ customer_name }} where your data should appear.

02

Call the API

POST your data as JSON. tembuilder resolves every variable and renders the document instantly.

03

Get your document

Receive a finished PDF — ready to download, store, or hand back to your users at any scale.

Built for

One template engine,
every document your product sends

Invoicing & billing

Turn every charge into a branded PDF invoice — line items, totals, tax — generated the moment it succeeds.

HR & onboarding

Welcome letters, offer letters, onboarding kits — personalized with a new hire's name, role, and start date.

Certificates & education

Course completions and certifications — one template, resolved for every learner from your data.

Reports & analytics

Turn a JSON payload into a branded report — metrics, tables, commentary — ready to send on a schedule.

Books & long-form docs

Print-ready books and manuals — mirrored inside/outside margins for binding, and pagination that holds up across hundreds of pages.

See it in action

One editor.
Code, preview, and API — in sync.

Switch between a visual structure tree and raw HTML/CSS without losing your place. Every change reflects in the live preview instantly.

Structure
Global 0/2
Page 1
Section 1
+ Add section
HTML
1<section>2  <h1>{{ customer_name }}</h1>3  <p>Total: {{ total_amount }}</p>4</section>
Live
{{ customer_name }} Acme Corp
Playground
Version 1 · published
POST /v1/pdf/render
sending request… ✓ 200 · rendered in 84ms

Visual + code, one canvas

Drag sections in the structure tree, or drop straight into HTML and CSS — both stay in sync.

Variants without duplicating

Branch a template into variants and see exactly what changed, diffed against the base.

Parameters become your API

Define the JSON schema once — tembuilder generates the contract your integrations send data against.

Test the real endpoint

Publish a version, then fire a real request from the built-in Playground with your API key. Copy the cURL and you're integrated.

Built for developers

Everything you need,
nothing you don't

Fast, server-side rendering

Templates render synchronously on the server — no queues, no cold starts. Speed scales with what you build.

Any document type

Invoices, reports, certificates, welcome letters, and more — one platform, every layout.

Variable-powered templates

Design with {{ placeholders }}. tembuilder resolves every variable against your JSON at render time.

Version history & variants

Every save is a version — branch any of them into a variant, diff it against the base, and publish only when it’s ready.

Automatic page breaks

Keep-together control on every section, so tables and rows never split awkwardly across a page.

Organized asset library

Logos, photos, and fonts live in folders and stay reusable across every template in the project.

Good to know

Questions, answered

What file format does tembuilder generate?

PDF. Build your layout in HTML and CSS, and every render comes back as a finished, downloadable PDF.

Do I need to publish before I can call the API?

Yes — the live preview always reflects your current draft as you build, but the render API (and the in-editor Playground) runs against a published version, so you always know exactly which version an integration is hitting.

How do variables actually get resolved?

Drop {{ placeholders }} anywhere in your template, define the matching JSON schema once in Parameters, and tembuilder resolves every value against the payload you POST at render time.

What happens to a table that runs past the bottom of a page?

Each section has page-break controls — keep-together and break before/after/both — so rows and tables never get split awkwardly across a page boundary.

Can I undo a change or compare versions?

Every save is a version you can go back to. You can also branch any version into a variant and diff it against the base before deciding what to publish.

Where do logos, images, and fonts live?

In a project-level asset library, organized into folders, so the same logo or font is reusable across every template in the project — not re-uploaded each time.

Start building your first template

No credit card required. Ship in minutes.

Get started free