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.
{
"templateId": "tmpl_invoice",
"data": {
"customer": "Northwind Ltd",
"number": "2048",
"total": "€1,240.00"
}
}Northwind Ltd · #2048
Due 30 Jun 2026
Identical in preview and production
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.
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
Try it on your next invoice
The Free plan gives you 50 documents a month, no card required.