Design your letter, statement, or invoice once. Merge each record into its own tagged, PDF/UA-1 compliant document — through the REST API, a batch call, or straight from a Google Sheet. No Word. No Acrobat. No remediation pass.
Early access · or see how a merge works
Word template, merge, export to PDF: the default workflow for twenty years. The letters look right. Whether a screen reader can use them is another matter — and checking every one isn't realistic.
Word merges every record into one long document; one PDF per recipient takes macros or add-ins. Exported tags depend on how the template was authored, so merged output often needs fixing in Acrobat before it meets PDF/UA. And it runs on a desktop — Microsoft doesn't support unattended, server-side Office automation.
The template defines the structure once — headings, tables, lists, reading order, language, alt text. Every merged document is generated with that structure already in place, on a server, from your data. The 50,000th letter is as accessible as the first.
No field codes, no bookmarks, no hidden formatting. If you can make an HTTP request — or open a spreadsheet — you can run the merge.
Build the document in the visual designer and bind fields with {{customer.name}}-style bindings. Repeating sections expand for line items; visibility rules show or hide paragraphs per recipient.
POST the template ID and one record — JSON or XML — and the response body is the PDF. Strict mode rejects a record with missing fields instead of printing a blank; a dry run checks the data without rendering.
Send up to 500 records per batch call, one document each, with file names built from your data. Documents render in the background; poll the jobs and download. Or skip code entirely with the Google Sheets menu.
# One record → one PDF (the response body is the file) curl https://api.pdfua.io/api/v1/documents/generate \ -H "X-API-Key: $PDFUA_KEY" \ -H "Content-Type: application/json" \ -d '{ "template_id": "486bc24d-…", "data": { "customer": { "name": "Marie Tremblay" }, "policy": { "number": "AC-2026-00443", "renewal_date": "2026-11-01" } } }' -o renewal.pdf # A list → one PDF per record (asynchronous) curl https://api.pdfua.io/api/v1/documents/generate-batch \ -H "X-API-Key: $PDFUA_KEY" \ -H "Content-Type: application/json" \ -d '{ "template_id": "486bc24d-…", "data": [ { … }, { … }, { … } ], "filename_template": "{{policy.number}}_{{index}}" }' # ← 201 { "documents": [ { "document_id", "job_id", … } ] }
No proprietary connectors to buy. The API takes plain JSON or XML; everything else is a thin layer on top of it.
Any system that can make an HTTP request: your CRM, core system, data warehouse job, or a script. Systems that only speak XML post it as-is, under documented conversion rules.
JSON · XML · X-API-KeyA PDFUA menu in your spreadsheet generates one accessible PDF per row and saves them to Google Drive, optionally as one zip. The closest thing to a classic mail merge — without Word.
One PDF per row · DriveBuild the template's data model from a JSON, CSV, or XML sample so every binding is checked while you design — then send the real records at run time.
JSON · CSV · XML samplesE-commerce: working examples show Shopify and WooCommerce orders turned into accessible invoices through the same API.
Benefit decisions, renewal notices, compliance letters, welcome packages — each addressed, dated, and tagged, in English or French.
Government · Insurance · HealthcareAccount, benefit, and loyalty statements with tables that grow with each recipient's rows and split cleanly across pages.
Banking · Insurance · UtilitiesOne per order or per customer, with line-item tables and totals — from your order system or a nightly export.
Retail · Utilities · ServicesCompletion certificates and credentials that every recipient can read — including screen reader users.
Education · Training · HRAcroForm fields — text, checkboxes, dropdowns, radio groups, signatures — pre-filled from the record, with labels and tab order tagged like the rest of the document.
Government · Healthcare · FinanceTurn on PDF/A-2a and the same merge produces documents that are both accessible and fit for long-term records retention.
PDF/A-2a · Records retention| Word mail merge → PDF | PDFUA.io | |
|---|---|---|
| One PDF per recipient | Needs macros or add-ins | Built in — one document per record |
| PDF/UA-1 tagging | Depends on authoring; often fixed by hand in Acrobat | Generated with every document |
| Runs unattended on a server | Not supported by Microsoft | REST API, batch, async jobs |
| Missing data | Prints a blank | Strict mode rejects the record |
| Data sources | Excel, Access, Outlook contacts | JSON, XML, Google Sheets |
| Archival (PDF/A) | Separate export option | PDF/A-2a opt-in, same call |
Not directly. The designer uses its own template format — that is what lets every element map to a known PDF structure. Recreating a typical letter or invoice in the designer is usually quick, and templates are plain JSON you can export and keep in source control.
A JSON object per document — nested objects and arrays of line items are fine —
or the equivalent XML document. Bindings like {{customer.name}} point
into it. You don't reshape your data for us.
By default generation is strict: a record with unresolved bindings is rejected with the list of missing fields, instead of producing a letter with a blank where the name should be. Mark a field optional with a default when a blank is fine, or use a dry run to check a whole file of records before sending anything.
A batch call takes up to 500 records and returns one job per document; send several batches for larger runs. Plans are sized by pages generated per month, from 1,500 to 1,000,000 — see pricing.
Yes. The document language is set on the template and can be overridden on any span, so screen readers switch pronunciation correctly — a bilingual notice is one template. The designer itself is available in English and French.
The data you send is used for that document only. Single documents are generated in memory and returned in the response. Batch and async jobs encrypt their input (AES-256-GCM) and delete it once the PDF is generated, and the generated PDFs expire after a short, configurable time — 30 minutes by default. For data that must never leave your network, run it on your own servers.
Join the early access list. We're onboarding a small number of organizations before general availability — priority goes to teams with active compliance deadlines.
No spam. No sales calls unless you ask for one.
You're on the list. Three quick questions help us prioritise your access:
What's your industry?
How many pages do you generate per month?
What's your compliance timeline?
You're on the list.
We'll be in touch shortly.