Skip to content
Wellform

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

HTML in.
A PDF that passes.

Most generators emit a page of glyphs with nothing underneath — a screen reader finds no document at all. Wellform emits a tagged PDF, and can have veraPDF — the reference implementation the standards bodies maintain — issue the verdict, so the proof does not come from us marking our own work.

100 documents a month, free · no credit card

structure tree conformant
preflight: 0 failures · veraPDF: conformant · 104 ms

2

verdicts: our preflight on every render, and veraPDF — the reference implementation — on request

~100ms

typical render, measured server-side and returned in a header

0

AI in the render path — deterministic, same input, same output

2

output families: PDF/UA for accessibility, PDF/A-3b for e-invoicing

Why now

Accessible documents stopped being optional.

Three deadlines turned a best practice into a procurement requirement. Teams generating invoices, statements or reports at volume now answer for every file they produce.

  1. in force

    European Accessibility Act

    Digital products and services sold into the EU, including the documents they generate.

  2. upcoming

    ADA Title II — larger entities

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

  3. upcoming

    ADA Title II — everyone else

    Remaining public entities, including special district governments.

We probed 52 documents on one New Jersey township's site to see what is behind those dates today: 13% carry a structure tree, none declare PDF/UA. The measurement, and what it says about who this does and does not help.

Healthcare organisations funded by HHS answer to a fourth set of dates under Section 504, which moved to May 2027 and May 2028 and are not the same as the ADA ones above. Whether any given document satisfies any of these depends on your content and your circumstances, and that is a question for your counsel. What a tool can do is check the part of the standard a machine can check — the PDF Association puts that at 87 of the Matterhorn Protocol's 136 failure conditions, with 47 more needing human judgement and 2 having no defined test at all. Wellform reports the first set and says so plainly. How we draw that line.

The difference

Tagged is not the same as conformant.

Plenty of tools emit tags. Far fewer get the details that decide whether a reader can navigate the file. Table headers are the clearest case: without /Scope, a reader knows a cell is a header but not what it heads. The whole gap, in detail.

If your pipeline prints through headless Chrome, this is the part that cannot be configured away — the print path has no document model to tag. Why Chrome cannot do it.

typical generator fails 15-003
/TH  "Region"
     (no /Scope)
/TH  "Northern"
     (no /Scope)
Announces a header, but can't 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 can't be reconciled, Wellform reports it instead of guessing — a mislabelled header is worse than an unlabelled one.

What gets checked

Every render, before it reaches you.

Tagged structure

A real structure tree with /Marked set and no suspects, not a flat page of glyphs.

Heading order

Levels that descend without skipping, so the outline assistive tech builds is the one you meant.

Table headers

/TH with a correct /Scope, recovered from the rendered document.

Figure alt text

Every figure carries a description — and if yours doesn't, we report the gap instead of inventing one.

Language & title

/Lang, a document title, and the viewer preference that makes readers announce it.

Embedded fonts

No standard-14 substitutions — every glyph the document uses travels inside it.

The API

One endpoint. No SDK required.

Post HTML, get a PDF. The verdict rides back in the response headers, so a failing document can fail your build instead of reaching 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 behind Factur-X and ZUGFeRD electronic invoices — same pipeline, different variant string.

Pricing

Priced by document, billed by month.

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

Yearly is two months free.

Free

$0 /mo

100 documents

Local and embedded assets

Start free

Starter

$29 /mo

5,000 documents a month

Remote assets enabled

Choose Starter
recommended

Growth

$99 /mo

25,000 documents a month

Remote assets enabled

Choose Growth

Scale

$299 /mo

100,000 documents a month

Remote assets enabled

Choose Scale

Platform

For invoicing, billing and school platforms rendering on behalf of their own customers. Volume pricing past 100,000 documents a month, invoiced on your terms rather than charged to a card, with the DPA signed and a named contact who is the person who wrote the renderer.

Talk about volume

Documents are counted only when one is produced. A request that fails validation is never billed. Quotas are monthly on every plan; yearly billing changes the invoice, not the allowance.

Render one and see the report.

A hundred documents every month, free — no credit card at signup, and the free tier does not expire. If the verdict says conformant, every machine-checkable rule in the PDF/UA-1 profile passed — 106 of them — and you have a dated report saying which. The checks a machine cannot make are still yours to make.

  1. Enter your email and clear the challenge. No password, no company name, no sales call.
  2. Copy the key on the next screen. It is shown once — we store a hash, so nobody here can read it back to you.
  3. POST your HTML to /v1/render and read the conformance report that comes back. Takes about a minute from here.

Identifies the account, and it is the only way back if you lose the key. One free key per address.