WCAG Scanner
Free WCAG 2.1 AA scanner for any public URL. Paste a link, get a shareable accessibility report. No account required.
WCAG Scanner
The Respira WCAG Scanner at dashboard/accessibility is a free, anonymous WCAG 2.1 AA scanner. Paste any public URL, get a structured accessibility report. No account needed for the scan itself; an account lets you save reports and rerun them.
What it does
The scanner runs a headless browser against the URL you give it, then evaluates the rendered DOM against the WCAG 2.1 AA success criteria using axe-core plus a small set of Respira-specific rules tuned for WordPress page builders.
For each issue it finds, the report shows:
- Severity — critical / serious / moderate / minor
- WCAG criterion — the specific clause (e.g. 1.4.3 Contrast (Minimum))
- Affected element — DOM selector + a snippet of the source HTML
- Why it matters — plain-language explanation of the user impact
- How to fix — actionable guidance (often a snippet of CSS or alt-text suggestion)
It does not evaluate AAA criteria, manual-only criteria (like keyboard testing of complex widgets), or browser-specific rendering. It's a coverage check, not a sign-off — sites that pass the scanner can still have accessibility issues that need human review.
Running a scan
- Open dashboard/accessibility
- Paste a URL into the input (must be publicly reachable)
- Click Scan
- Wait 5–15 seconds while the headless browser loads the page
The result page shows the issue count grouped by severity at the top, then the full issue list below. Use the filter chips to narrow by severity or WCAG criterion.
Sharing reports
Every scan gets a permanent shareable URL. Click Copy share link on the report page — the URL embeds the scan ID and renders the same report for anyone who opens it (no Respira account needed to view).
Useful for:
- Sending a client a before/after report on accessibility improvements
- Pasting in a GitHub issue when a PR needs to address an accessibility regression
- Embedding in your own internal QA dashboard
Shared reports are read-only. Only the account that ran the scan can rerun it.
Rerunning a scan
If you've fixed issues and want to re-check, click Rerun scan on any saved report. This requires a Respira account so the rerun gets attributed and stored in your scan history.
The rerun produces a fresh report with the same shareable URL pattern but a new scan ID. The dashboard's Sites audit log links to all your scan reruns for that site.
Limits
| Plan | Scans per month | Saved scans | Rerun history |
|---|---|---|---|
| Anonymous (no account) | unlimited (rate-limited per IP) | 0 (one-shot URLs only) | — |
| Lite (free) | 50 | 30 days | last 5 reruns |
| Maker / Builder / Studio | unlimited | unlimited | unlimited |
If you hit the rate limit as an anonymous user, sign up for a free Lite account — same email you'd use for the trial.
What it doesn't catch
The scanner is a useful baseline but not a complete accessibility audit. Things it can't evaluate:
- Keyboard navigation of complex JavaScript widgets — needs human testing
- Screen reader announcement order — needs a real screen reader
- Motion sensitivity for users who set
prefers-reduced-motion— partial coverage only - Cognitive load of language complexity, layout density, or task flow — entirely out of scope
- Performance issues that affect users on slow connections or older devices
Use the scanner to catch the obvious, mechanical issues (alt text, contrast, heading hierarchy, ARIA labels, form labels). Then layer on manual testing for the rest.
Scanning sites you've connected to Respira
If the URL belongs to a connected site, the report links back to the site's audit log entry. Reruns from connected sites are attributed and tracked there.
You can also run scans directly from the CLI:
respira scan accessibility https://example.com
Same scanner, same report format, callable from any terminal where the CLI is installed.
Scanning from an AI agent
The same WCAG scanner is available as MCP tools, so an agent connected to a site can scan, review, and fix accessibility issues in one conversation. Four tools cover the flow.
respira_scan_page_accessibility
Run a WCAG scan on a page. The scanner runs an axe sweep against the page's public URL: page_id is resolved to the permalink server-side before the scan. The result groups violations by severity (critical, serious, moderate, minor) with auto-fix suggestions.
| Parameter | Type | Required | Description |
|---|---|---|---|
| page_id | number | Yes | Page ID to scan. Resolved to the page's public permalink before scanning. |
| standard | string | No | WCAG standard to test against (default wcag2aa). Supported: wcag2a, wcag2aa, wcag21a, wcag21aa, wcag22aa, section508. |
| url | string | No | Explicit URL override. When set, skips the page_id lookup. Use it for staging or preview URLs that do not map to a Respira page_id. |
respira_list_accessibility_scans
List previous scans with scores and violation counts. It defaults to summary_only=true, which strips the per-node detail and the AI fix prompts from each entry. Those add up to roughly 30KB per scan and blow past the MCP response cap once you have five or more scans, so keep summary_only on for browsing and only set it to false when you genuinely need the full payload.
| Parameter | Type | Required | Description |
|---|---|---|---|
| limit | number | No | Max scans to return (default 20). |
| offset | number | No | Pagination offset (default 0). |
| summary_only | boolean | No | When true (default), omits violations[].nodes and prompts[]. |
respira_get_accessibility_scan
Get the full detail of one scan: every violation, the scores, and the AI fix prompts. Pass the scan_id, which is the UUID string from a list_accessibility_scans entry's id field. This is where you get the full payload that list_accessibility_scans leaves out in summary mode.
respira_apply_accessibility_fixes
Auto-apply fixes for a scan. Pass the scan_id, and optionally a list of rule_ids to fix a subset; omit rule_ids to fix everything that is auto-fixable. The fixes it can apply are: image-alt, color-contrast, label, heading-order, document-title, and html-lang-valid.
A typical agent flow
1. respira_scan_page_accessibility on page 42
2. respira_get_accessibility_scan for the full violation detail
3. respira_apply_accessibility_fixes for the auto-fixable rules
4. respira_scan_page_accessibility again to confirm the score improved
Anything the auto-fixer cannot handle stays in the report for manual work, the same way the dashboard scanner leaves keyboard and screen-reader issues to human testing.
Privacy
Scans against public URLs are stored in our database with the URL, the report, and (if logged in) your account ID. We do not retain page content beyond the snapshot needed to render the report. Anonymous scans are rate-limited per IP and not associated with any account.