Document generation API

What you preview is what we render

Design a template once. Send JSON, get back the exact document your users expect. And when a render fails, the log says why.

No credit card. 50 free documents every month.

POST /v1/generate
{
  "templateId": "tmpl_invoice",
  "data": {
    "customer": "Northwind Ltd",
    "number": "2048",
    "total": "€1,240.00"
  }
}
INVOICE✓ Paid

Northwind Ltd · #2048
Due 30 Jun 2026

Design retainer€800.00
Hosting × 4€440.00
Total€1,240.00
201 invoice-2048.pdf312 ms · x-generation-id: gen_8f2a3c

Identical in preview and production

Preview matches production
Failed calls never charged
SSRF-protected rendering
Keys stored hashed

Product

What's in the box

The endpoint, and the tooling around it. PDF output today. Images and HTML email are next on the roadmap.

Live preview

See your template render exactly as it will in production, as you type.

Handlebars templating

Familiar mustache syntax with autocomplete and inline validation.

Versioning and rollback

Publish immutable versions and roll back to any one in a single click.

Detailed logs

Every call is recorded with a readable reason it succeeded or failed.

API keys

Create, list and revoke keys. Each key is shown once and stored hashed.

Usage dashboard

Usage, success rate, and the errors that keep coming back.

Workflow

Template to production in four steps

Minutes, not an afternoon.

1 · Create

Write an HTML template with Handlebars placeholders.

2 · Test

Feed it sample data and see the real rendering instantly.

3 · Connect

Call the API from your application with your key.

4 · Monitor

Watch usage, successes and failures on one dashboard.

Debugging

Know exactly what failed

Every call is logged with the reason it failed: a missing variable, a blocked image, a timeout. You're never left staring at a blank 500, and a failed call never consumes your quota.

invoice-2048.pdf312ms
receipt-7741.pdf204ms
contract-v3422

Missing required variable: signatory.name

Security

Safe to point production at

Six behaviors of the engine itself. They run on every call, on every plan.

SSRF-protected rendering

External images, fonts and stylesheets are screened: we resolve DNS and require a public address before fetching.

Fail-fast timeouts

Ten seconds per resource, thirty per render. A slow or missing asset fails with an error that names the URL.

Hashed, revocable keys

Keys are shown once and stored as a SHA-256 hash. Revoke instantly, effective on the next request.

Escaped by default

Template values are HTML-escaped unless you explicitly opt out, so data cannot inject markup.

Opt-in payload logging

Request payloads are stored only if you opt in per template. Off by default.

Failed calls are free

A failed generation is logged for debugging but never consumes your monthly quota.

Quickstart

Your first document in about a minute

One endpoint, bearer auth, a PDF back.

import { writeFile } from "node:fs/promises";
import { PdfGlyph } from "pdfglyph";

const client = new PdfGlyph({
  apiKey: "YOUR_API_KEY",
  baseUrl: "https://api.example.com",
});

const { pdf } = await client.generate({
  templateId: "tmpl_invoice",
  data: {
    "customer": "Northwind Ltd",
    "number": "2048",
    "total": "€1,240.00"
  },
});

// pdf is a Uint8Array — write it to a file, return it, or stream it.
await writeFile("document.pdf", pdf);

Pricing

Same product on every plan

Plans set your monthly volume. You pay for documents generated, and a failed call never counts.

Free

€0

50 docs / mo

Starter

€15

1,000 docs / mo

Most popular

Pro

€49

5,000 docs / mo

Scale

€149

25,000 docs / mo

Pixel-identical output Readable error logs REST API and keys

Try it on your next invoice

The Free plan gives you 50 documents a month, no card required.