veraPDF as an API: PDF/UA checks for 10 credits

veraPDF REST, hosted behind one API key. A PDF/UA or WTPDF check costs 10 credits, a PDF/A check 2. Your veraPDF REST client works by changing its base URL.

Last updated

PDF/UA or WTPDF check 10 credits
PDF/A check 2 credits
Profiles PDF/UA-1, PDF/UA-2; WTPDF 1.0 Accessibility and Reuse; PDF/A-1a, 1b, 2a, 2b, 2u, 3a, 3b, 3u, 4, 4e and 4f, or auto
Limits One PDF of up to 25 MB per call; a check runs at most 50 seconds
Report veraPDF's own report, as JSON, XML or HTML

A PDF/UA check costs 10 credits. veraPDF checks the PDF against PDF/UA-1 or PDF/UA-2, the ISO standard for accessible PDF, and returns its full report: whether the file is compliant, and every rule it fails with the objects that fail it. A PDF/A check costs 2 credits, and a WTPDF check 10.

The API is veraPDF REST's own. A client written for veraPDF REST keeps its paths and its report parser; it changes the base URL to https://api.pagespool.com/v1/verapdf and sends an API key.

What veraPDF checks

veraPDF is the open-source PDF validator of a consortium led by the Open Preservation Foundation and the PDF Association. It checks:

  • PDF/UA-1 and PDF/UA-2 (ISO 14289), for accessibility: tags and structure, alternative text on figures, fonts, language and metadata;
  • WTPDF 1.0, Accessibility and Reuse;
  • PDF/A, the ISO standard for archiving: parts 1, 2 and 3 at levels a, b and u (part 1 has no u), and part 4 with e and f. The profile auto checks against the part the file declares in its metadata, and against PDF/A-1b when it declares none.

veraPDF checks the rules a machine can check. A passed PDF/UA check does not mean the alternative text or the reading order make sense; that still needs a person.

Prices and limits

Call Credits
POST /v1/verapdf/api/validate/ua1, ua2, wt1a, wt1r 10
POST /v1/verapdf/api/validate/auto, 1a … 4f 2
GET /v1/verapdf/api/profiles, profiles/{id}, info free

A call that fails costs nothing. Each call takes one PDF of up to 25 MB, sent as multipart field file. A check runs at most 50 seconds; a longer one is stopped with a 504. Every account gets free credits each day and each month, and the plans are on the pricing page.

Hosting veraPDF yourself, or calling it here

veraPDF REST is a Java server. Hosting it yourself means a JVM with about 1 GB of memory per instance, kept running and updated. It has no authentication of its own, so it needs a gateway with TLS and keys in front before anything outside your network may call it. A cold JVM also takes tens of seconds for its first checks after each start, so it needs warming up before it takes traffic.

Here, it is one API key and the same API. veraPDF runs warm, a check is billed only when it succeeds, and the same key and credit balance work for the other engines on this site.

Quickstart with curl

Check a PDF against PDF/UA-1 and print the verdict:

curl -sS -H "X-API-Key: $API_KEY" -H "Accept: application/json" \
  -F file=@document.pdf \
  https://api.pagespool.com/v1/verapdf/api/validate/ua1 \
  | jq '.report.jobs[0].validationResult[0].compliant'

Accept picks the report's format: application/xml for XML, text/html for HTML, JSON for anything else. The failed rules are in .report.jobs[0].validationResult[0].details.ruleSummaries. A PDF/A check is the same call with a PDF/A profile, such as validate/2b.

Your veraPDF REST client, unchanged

Point the client at https://api.pagespool.com/v1/verapdf where it had veraPDF REST's root, such as http://localhost:8080. The paths stay the same:

  • POST /api/validate/{profile} with the PDF as multipart field file;
  • GET /api/profiles, GET /api/profiles/{id} (ids lists the profile ids);
  • GET /api/info.

A client that takes only a base URL carries the key in it: https://x:YOUR_API_KEY@ followed by the API host and /v1/verapdf. Four things differ from a server of your own: a request without Accept gets JSON, where veraPDF REST answers HTML; /api/info leaves out the server's own address and host name; POST /api/validate/url/{profile} and /api/sha1 are not offered; and a file that is not a PDF is refused with a 422 before it is checked.

Your API key, three ways

Send the key in whichever form your client supports:

  • the header X-API-Key: YOUR_API_KEY;
  • the header Authorization: Bearer YOUR_API_KEY;
  • HTTP Basic auth with the key as the password and any user name, which is what an HTTP client sends for a URL with the key in it, https://x:YOUR_API_KEY@….

Never put the key in a path or a query string: those end up in logs. A call without a valid key gets a 401.

Free tools and MCP

Try a check in the browser, without an account: the PDF accessibility checker (PDF/UA) and the PDF/A validator, for PDFs of up to 4 MB.

AI agents reach veraPDF through its MCP server at https://api.pagespool.com/mcp/verapdf/. It has two tools: check_pdf_accessibility (PDF/UA, 10 credits) and validate_pdfa (2 credits), each returning the verdict and the failed rules. Connect has the setup for each client.

Trademarks

veraPDF is a trademark of its owner; pagespool is not affiliated.

FAQ

Can I keep my veraPDF REST client?
Yes. Change its base URL to /v1/verapdf on the API host and send your API key. The paths, the profile ids, the multipart field file and the report stay as veraPDF REST has them.
What does a check cost?
A PDF/UA or WTPDF check costs 10 credits, a PDF/A check 2. Reading the profiles and the server info is free, and a call that fails costs nothing.
Does a passed PDF/UA check mean the PDF is accessible?
It means the PDF passes every rule veraPDF can check by machine. Whether the alternative text and the reading order make sense still needs a person.
Is my PDF stored?
No. The PDF is held only while veraPDF checks it, and is not kept afterwards.