Wellform

PDF/UA-1  ·  PDF/A-3b  ·  HTTP API

HTML in. A PDF that passes.

Most PDF generators emit a page of glyphs with no structure underneath. A screen reader finds nothing to read. Wellform emits a tagged PDF — headings, lists, tables, alt text, reading order — and attaches a conformance report to every document, so you can prove it rather than hope.

100 documents free · no card

structure tree conformant
/StructTreeRoot
└─ /Document  /Lang (en-US)
   ├─ /H1     "Quarterly accessibility report"
   ├─ /P      "Figures cover the period…"
   ├─ /Figure /Alt "Uptake by region, 2024–26"
   └─ /Table
      ├─ /TR
      │  ├─ /TH  /Scope /Column  "Region"
      │  └─ /TH  /Scope /Column  "Documents"
      └─ /TR
         ├─ /TH  /Scope /Row     "Northern"
         └─ /TD              "18,402"

37 checkpoints evaluated · 0 failures

Why now

Accessible documents stopped being optional.

Three deadlines turned a best practice into a procurement requirement. Teams that generate invoices, statements, reports or policy documents at volume now have to answer for every file they produce.

European Accessibility Act

In force. Covers digital products and services sold into the EU, including the documents they generate.

ADA Title II — larger public entities

US state and local government bodies serving populations of 50,000 or more.

ADA Title II — remaining public entities

Everyone else, including special district governments.

The difference

Tagged is not the same as conformant.

Plenty of tools emit tags. Far fewer get the details that decide whether a screen reader can actually navigate the file. Table headers are the clearest example: without /Scope, a reader knows a cell is a header but not what it heads — so it cannot tell you that 18,402 belongs to Northern.

typical generator fails 15-003
/TH  "Region"
   (no /Scope)
/TH  "Northern"
   (no /Scope)

Reader announces a header,
but cannot associate it
with any data cell.
wellform passes
/TH  /Scope /Column
    "Region"
/TH  /Scope /Row
    "Northern"

"Region: Northern,
Documents: 18,402"
— read as a sentence.

Scopes are recovered from the rendered document rather than the source markup, so a header hidden by CSS or a header row repeating across a page break is still labelled correctly. Where the two cannot be reconciled, Wellform reports it instead of guessing — a mislabelled header is worse than an unlabelled one.

The API

One endpoint. No SDK required.

Post HTML, get a PDF. The conformance verdict rides back in the response headers, so a failing document can fail your build rather than reach a customer.

request
curl https://api.wellform.dev/v1/render.pdf   -H "Authorization: Bearer wf_live_…"   -H "Content-Type: application/json"   -d '{
    "html": "<h1>Report</h1>…",
    "variant": "pdf/ua-1"
  }'   --output report.pdf
response headers
X-Wellform-Conformant: true
X-Wellform-Failures:   0
X-Wellform-Warnings:   1
X-Wellform-Render-Ms:  104
X-Wellform-Remaining:  4873

# Ask for JSON instead and you get
# the full checkpoint report, each
# finding named by its Matterhorn
# Protocol number.

Also emits PDF/A-3b, the container format behind Factur-X and ZUGFeRD electronic invoices — the same pipeline, a different variant string.

Pricing

Priced by document, billed by month.

No per-seat pricing, no annual commitment, no call with anyone. Start on the free tier and upgrade from the dashboard when you outgrow it.

Free
$0 /mo
100 documents
Local and embedded assets
Starter
$29 /mo
5,000 documents
Remote assets enabled
Growth
$99 /mo
25,000 documents
Remote assets enabled
Scale
$299 /mo
100,000 documents
Remote assets enabled

Documents are counted only when one is produced. A request that fails validation is never billed.