PDF & Office Document Accessibility Auditor - DocA11y avatar

PDF & Office Document Accessibility Auditor - DocA11y

Pricing

from $16.00 / 1,000 document auditeds

Go to Apify Store
PDF & Office Document Accessibility Auditor - DocA11y

PDF & Office Document Accessibility Auditor - DocA11y

PDF & Office document accessibility auditor: crawl a website, list every PDF, Word, PowerPoint and Excel file, run PDF/UA and WCAG 2.1 machine checks.

Pricing

from $16.00 / 1,000 document auditeds

Rating

0.0

(0)

Developer

Leon s

Leon s

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

8 days ago

Last modified

Categories

Security

Limited permissions

Share

DocA11y is a PDF and Office document accessibility auditor for whole websites. It crawls a site, lists every PDF, Word (.docx), PowerPoint (.pptx) and Excel (.xlsx) file it finds, and runs machine checks on each one: veraPDF PDF/UA-1 validation plus its own structure checks for PDFs, and accessibility checks for Office files. Every failed check is mapped to a WCAG 2.1 success criterion, with a severity and a plain-English fix hint. Documents posted after your compliance date are flagged first, and re-runs audit only new or changed files.

Published by LeonS. Support: atulhritik@hotmail.com.

Use cases

  • US state and local government web teams that must work through PDF, Word, PowerPoint and Excel files before an ADA Title II deadline. The Department of Justice's April 2026 interim final rule moved the web accessibility dates to 26 April 2027 (public entities serving 50,000 people or more) and 26 April 2028 (smaller entities and special districts), as reported in published summaries. Read the rule text and set your own date in the input.
  • Accessibility consultancies and web agencies that need a document inventory and a prioritised fix list for many client sites.
  • Organisations under the European Accessibility Act, UK public bodies and Indian government sites that want a repeatable PDF accessibility checker for their document libraries.
  • Content teams that want a scheduled check so that newly uploaded PDFs and Office files are tested the month they appear.

What you get

  • A whole-site document inventory: URL, linking pages (up to 5), size, Last-Modified, file creation and modification dates, page count, title and language.
  • PDF checks: veraPDF PDF/UA-1 machine validation plus 14 structure checks (tagged or not, scanned pages, language, title, figure alt text, table headers, headings, bookmarks, tab order, link text, form labels, font Unicode maps, encryption).
  • Office checks: 8 for Word, 6 for PowerPoint and 5 for Excel (alt text, headings, table headers, titles, language, link text, slide titles, sheet names and more).
  • A WCAG 2.1 success criterion, severity (critical, serious, moderate, minor) and fix hint for every issue.
  • A scope label (in-scope, likely-exception, review) and a priority score from 0 to 95 for each document.
  • Diff mode: documents whose ETag, Last-Modified and size, or whose content hash, did not change are not audited again.
  • Outputs: dataset views, an HTML REPORT, INVENTORY.csv (opens in Excel), a JSON OUTPUT, and optional webhook and Slack messages.

How to use

  1. Open the Actor and press Start with the prefilled input to see the output format. The prefill is a self-test: mode Audit these document URLs with five small, synthetic sample files (two PDFs, two Word files and one Excel file, some with deliberate accessibility problems) that the publisher hosts in its public repository (github.com/leons0016/ADApps, folder samples/doca11y). No third-party website is contacted. It costs one audit run fee plus five document audits.
  2. For your own site, switch Mode to Crawl a website, clear the sample links, enter your site as a Start URL (usually the home page), and set Max HTML pages and Compliance date.
  3. Open the Output tab: the Documents view, the REPORT record (top 50 documents to fix first) and INVENTORY.csv.
  4. Save the settings as a Task. Scheduling needs one finished run of the Actor first.
  5. Add a Schedule to the task, for example monthly: cron 0 3 1 * * with your time zone. New schedules start disabled, so enable it. Set the task timeout to 0 or to several hours for large sites.

Input

FieldWhat it doesDefault
modecrawl (find documents) or urls (audit only the document URLs you give)crawl (prefill urls)
startUrlsWhere the crawl starts (up to 50; 1 on the Apify free plan)none (no prefill)
documentUrlsUp to 5,000 document links for mode urlsempty (prefill: the five sample files)
useSitemapAlso read /sitemap.xml and sitemaps named in robots.txttrue
documentTypespdf, docx, pptx, xlsxall four
maxPagesHTML pages to fetch, 1 to 100,0001,000 (prefill 30)
maxDepthLink depth, 0 to 206
maxDocumentsDocuments to audit per run, 1 to 20,0002,000 (prefill 10)
includeGlobs, excludeGlobsURL patterns to follow or never fetch (* and ** match any characters)exclude **/calendar/**, **?print=*
allowedDomainsExtra hosts (a CDN) from which documents, not pages, are fetchedempty
maxDocumentSizeMbLarger files are listed, not audited, not charged. 1 to 50050
respectRobotsTxt, iAmAuthorisedrobots.txt is respected by default. Switching it off needs the permission boxtrue / false
complianceDateYYYY-MM-DD used for the scope label2027-04-26
archivePathHintsURL parts that hold archived content/archive, /archives, /minutes/20, /agenda-archive
onlyNewOrChangedAudit only new or changed documents (uses the task history)true
maxResultsPerRunStop after this many document results5,000
webhookUrl, slackWebhookUrlOptional notifications (the Slack URL is stored as a secret)empty
includePassedDocumentsAlso push items for documents with 0 failed checkstrue
stateKey, perDocumentTimeoutSecs, maxConcurrency, userAgentSuffix, debugKeepRawAdvanced optionssee the input form

Sample input:

{
"mode": "crawl",
"startUrls": [{ "url": "https://www.cityofexample.gov/" }],
"maxPages": 5000,
"maxDocuments": 2000,
"complianceDate": "2027-04-26",
"onlyNewOrChanged": true
}

Input is validated before anything is charged. A wrong value stops the run with a message and no charge.

Output

Each document is one dataset item (the Documents view). Abridged example with invented data:

{
"recordType": "document",
"url": "https://www.cityofexample.gov/files/budget-2027.pdf",
"docType": "pdf",
"status": "audited",
"title": "Budget 2027",
"language": "en-US",
"pages": 12,
"tagged": true,
"postedDate": "2027-06-01",
"postedDateSource": "file-modified",
"verapdfCompliant": false,
"failedChecks": 2,
"topIssues": ["Figures without alt text", "Tables without headers"],
"issues": [
{ "checkId": "PDF-ALT", "source": "structure", "wcag": ["1.1.1"], "level": "A", "severity": "serious", "count": 3, "pages": [2, 5],
"message": "Figure elements have no alternative text.",
"fix": "Add alternative text to each meaningful figure, or mark purely decorative images as artifacts." }
],
"scope": "in-scope",
"scopeReasons": ["posted-after-compliance-date"],
"priority": 62,
"disclaimer": "Automated checks find many but not all accessibility problems. ..."
}
  • Documents view: priority, scope, type, title, URL, failed checks, pages, posted date, tagged, language, top issues, found on.
  • Issues view: one row per issue (check ID, WCAG criterion, severity, count, message, fix hint, page numbers).
  • Run summary view: the last item of every run, with pages crawled, documents found, audited, unchanged, removed, failed downloads, in-scope count, counts per WCAG criterion and the stop reason.
  • Statuses: audited, encrypted (needs a password, so only the encryption issue is reported), unchanged, legacy-format (.doc, .ppt, .xls are listed, not audited), too-large, download-failed, not-parsable, skipped-cap.
  • Key-value store: OUTPUT (summary and top 50), REPORT (HTML), INVENTORY.csv (UTF-8 with byte-order mark) and, with debugKeepRaw, VERAPDF-<hash> records.

No document text is stored. Results contain URLs, metadata, hashes, counts, page numbers and generic messages only. Downloaded files are deleted after each audit.

How the numbers work: failedChecks is the number of distinct failed checks. The priority score is 40 for in-scope or 15 for review, plus 25 if any critical issue, plus up to 10 for serious issues (3 or more give the full 10), plus 10 if the document is linked from a start page, plus 5 for a service word such as application or permit in the URL or title, plus up to 5 for length (50 pages or more give 5). The weights add up to 95. A document with no failed checks scores 0.

Pricing

DocA11y uses Apify pay-per-event pricing. You pay only for these events:

EventWhen it is chargedPrice (Bronze)
Audit run (watch-check)Once per run, after the input is valid$0.10
HTML page crawled (page-crawled)Per HTML page fetched in crawl mode$0.0005
Document audited (document-audited)Per new or changed document audited (status audited or encrypted); one event per 100 pages started, so a 250-page PDF is 3 events$0.02
Unchanged document confirmed (document-rechecked)Per unchanged document confirmed by a HEAD request or an unchanged content hash$0.0005

Silver plan prices are 10% lower and Gold plan prices 20% lower. Apify also adds its own automatic start event ($0.00005 per GB of run memory; 2 GB by default, so $0.0001 per run), which is not included in the examples. Not charged: files that are too large, failed downloads, files that cannot be parsed, legacy formats and the run-summary item. You can set a maximum cost per run in Apify; the run stops cleanly at the limit and the next run continues where it stopped.

Monthly cost = runs x watch-check + pages x page-crawled + new or changed documents x document-audited + unchanged documents x document-rechecked.

ExampleCalculation (Bronze prices)Cost
Small town, monthly run: 1,500 pages, 30 new or changed, 400 unchanged0.10 + 0.75 + 0.60 + 0.20$1.65
County site, weekly (4.33 runs a month): 6,000 pages per run, 120 new or changed a month, 2,500 unchanged per run0.433 + 12.99 + 2.40 + 5.4125about $21.24
Agency, 20 client sites monthly: 60,000 pages, 900 new or changed, 15,000 unchanged in total2.00 + 30.00 + 18.00 + 7.50$57.50
First full audit of a county site: 6,000 pages, 2,500 documents0.10 + 3.00 + 50.00$53.10 once

Free plan: crawls at most 100 pages, audits at most 10 documents and uses 1 start URL per run. When a limit applies, the run ends successfully, the run summary says which limit was used, and the status message reads: "Free plan: crawled N pages and audited D of F documents found. Upgrade your Apify plan for full audits."

Notifications

Open the Actor's Integrations tab and add Slack, email, Google Drive, Zapier, Make, n8n or a webhook on ACTOR.RUN.SUCCEEDED, and a second one on ACTOR.RUN.FAILED. Example Slack message template:

DocA11y finished: {{resource.status}}. Open the report: https://api.apify.com/v2/key-value-stores/{{resource.defaultKeyValueStoreId}}/records/REPORT

You can also set webhookUrl (the OUTPUT JSON is posted) or slackWebhookUrl in the input.

Compliance note and limitations

Automated checks find many but not all accessibility problems. They cannot certify WCAG 2.1 AA or PDF/UA conformance. Manual review is required. Scope labels are hints based on dates and paths, not legal advice. The ADA Title II exceptions (archived web content, pre-existing documents not used to access services, third-party content, individualized documents) need human review.

  • Pages that need JavaScript to show their links are not crawled. Use the sitemap or the URL list mode.
  • No logins, forms, CAPTCHAs or password-protected areas. Password-protected PDFs are reported as encrypted.
  • The posted date is an estimate: file metadata first, then HTTP Last-Modified, then sitemap lastmod, then the date the document was first seen.
  • A document that is linked under several URLs is audited once; the other URLs are listed as aliases in INVENTORY.csv.
  • Conditional page fetches are not used, because a "not modified" answer carries no links. Unchanged pages are fetched again and charged as pages; unchanged documents are cheap.
  • Redirects that leave the audited site are not followed into results, but the request to the redirect target is made.
  • Documents are checked as downloaded; on very large files the time limit per document applies.

robots.txt: respected by default. You can switch it off only for your own site, or one you have permission to audit, with the permission box. Even then there is no login, no form submission, and at least 0.5 seconds between requests to one host. You are responsible for the crawl.

FAQ

Does DocA11y make my documents compliant? No. It reports machine-checkable problems and fix hints. It cannot certify conformance and it does not repair files.

Which PDF standard does it check? PDF/UA-1 (ISO 14289-1) through veraPDF, plus its own structure checks. PDF/UA-2 and WTPDF are planned for a later version.

What do the three scope labels mean? in-scope: posted on or after your compliance date. likely-exception: older, or on an archive path. review: older but possibly used to apply for or access a service, or the posted date is unknown.

How does a re-run stay cheap? The task remembers each document. Documents with the same ETag, or the same Last-Modified and size, or the same content hash, are confirmed unchanged and charged only the small recheck event.

How do I forget the history? Delete the named key-value store leons-doca11y-state in your account. The next run audits everything again.

Why was a document not audited? See its status: too large (raise maxDocumentSizeMb), failed download (retried next run), not parsable (corrupt or time limit), legacy format, or skipped because of the document limit.

Does it store my documents? No. Files are deleted after the audit and results contain no document text.

Can it check HTML pages? No. It audits documents. A headless-browser Actor would be needed for HTML pages.

Are there other Actors by the same publisher? See the publisher page on Apify.

Credits and licences

PDF/UA validation is done by veraPDF, used as an unmodified separate program under the Mozilla Public License 2.0 (veraPDF is dual-licensed MPL-2.0+ and GPL-3.0+). Other components: Crawlee for Python, pikepdf (MPL-2.0), pdfplumber, python-docx, python-pptx and openpyxl.

Changelog and support

See the Changelog in the Information tab. Questions and bug reports: open an issue on the Actor's Issues tab or write to atulhritik@hotmail.com. Privacy policy: https://raw.githubusercontent.com/leons0016/ADApps/main/privacy/P2-DocA11yCrawler.txt

Third-party licences and attributions: see docs/THIRD_PARTY_NOTICES.txt in the Actor source.