Accessibility Statement Scanning
Accessibility Statement Scanning
Stats as of 2026-04-09 02:54 UTC — last scan: 2026-04-09
107 scan batches run
72,735 of 82,714 available pages scanned (87.9% coverage) 67,302 of 72,735 scanned pages were reachable (92.5%) 32,622 of 67,302 reachable pages have an accessibility statement (48.5%) 28,212 pages have the statement link in the footer (86.5% of pages with a statement)
📥 Machine-readable results are available as the accessibility-data.json artifact in the latest Generate Scan Progress Report workflow run.
Each country entry in the JSON file includes page-level evidence for pages with and without accessibility statements, plus a per-domain summary you can share to validate the published counts.
Hover or focus any non-zero count in the country table to preview the matching pages. If there are 20 or fewer URLs, the preview shows all of them; otherwise it shows a short sample. Full machine-readable data is available as the
accessibility-data.jsonartifact in the latest workflow run.
Accessibility Statement Scan by Country
| Country | Scanned | Available | Reachable | Has Statement | In Footer | Statement % | Scan Period |
|---|---|---|---|---|---|---|---|
| AUSTRIA | 821 | 821 | 787 | 547 | 517 | 69.5% | Mar 2026 – Apr 2026 |
| BELGIUM | 1,309 | 1,309 | 1,229 | 551 | 502 | 44.8% | Mar 2026 – Apr 2026 |
| BULGARIA | 291 | 291 | 269 | 61 | 59 | 22.7% | Mar 2026 – Apr 2026 |
| CROATIA | 233 | 233 | 231 | 85 | 61 | 36.8% | Mar 2026 – Apr 2026 |
| CZECHIA | 843 | 843 | 804 | 427 | 365 | 53.1% | Mar 2026 – Apr 2026 |
| DENMARK | 1,521 | 1,521 | 1,503 | 1,036 | 1,019 | 68.9% | Mar 2026 – Apr 2026 |
| ESTONIA | 396 | 396 | 389 | 136 | 65 | 35.0% | Mar 2026 – Apr 2026 |
| FINLAND | 180 | 180 | 172 | 111 | 104 | 64.5% | Mar 2026 – Apr 2026 |
| FRANCE | 10,007 | 10,007 | 9,425 | 3,655 | 3,516 | 38.8% | Mar 2026 – Apr 2026 |
| GERMANY | 6,555 | 6,555 | 6,479 | 4,612 | 3,872 | 71.2% | Mar 2026 – Apr 2026 |
| GREECE | 1,748 | 1,748 | 1,627 | 409 | 238 | 25.1% | Mar 2026 – Apr 2026 |
| HUNGARY | 390 | 390 | 366 | 64 | 48 | 17.5% | Mar 2026 – Apr 2026 |
| ICELAND | 139 | 139 | 135 | 15 | 7 | 11.1% | Mar 2026 – Apr 2026 |
| IRELAND | 522 | 522 | 498 | 226 | 205 | 45.4% | Mar 2026 – Apr 2026 |
| ITALY | 5,338 | 5,338 | 4,851 | 2,622 | 2,556 | 54.1% | Mar 2026 – Apr 2026 |
| LATVIA | 802 | 802 | 771 | 488 | 444 | 63.3% | Mar 2026 – Apr 2026 |
| LITHUANIA | 120 | 120 | 108 | 0 | 0 | 0.0% | Mar 2026 – Apr 2026 |
| LUXEMBOURG | 571 | 571 | 250 | 85 | 74 | 34.0% | Mar 2026 – Apr 2026 |
| MALTA | 608 | 608 | 595 | 381 | 374 | 64.0% | Mar 2026 – Apr 2026 |
| NETHERLANDS | 937 | 937 | 909 | 449 | 439 | 49.4% | Mar 2026 – Apr 2026 |
| NORWAY | 239 | 239 | 233 | 108 | 102 | 46.4% | Mar 2026 – Apr 2026 |
| POLAND | 13,875 | 14,938 | 12,866 | 5,309 | 3,369 | 41.3% | Mar 2026 – Apr 2026 |
| PORTUGAL | 3,503 | 3,503 | 2,937 | 895 | 720 | 30.5% | Mar 2026 – Apr 2026 |
| REPUBLIC_OF_CYPRUS | 24 | 24 | 24 | 0 | 0 | 0.0% | Mar 2026 – Apr 2026 |
| ROMANIA | 799 | 799 | 351 | 28 | 9 | 8.0% | Mar 2026 – Apr 2026 |
| SLOVAKIA | 434 | 434 | 414 | 192 | 177 | 46.4% | Mar 2026 – Apr 2026 |
| SLOVENIA | 200 | 200 | 190 | 100 | 74 | 52.6% | Mar 2026 – Apr 2026 |
| SPAIN | 6,069 | 6,069 | 5,374 | 2,379 | 2,083 | 44.3% | Mar 2026 – Apr 2026 |
| SWEDEN | 1,558 | 1,558 | 1,486 | 860 | 785 | 57.9% | Mar 2026 – Apr 2026 |
| SWITZERLAND | 2,117 | 2,117 | 2,082 | 980 | 978 | 47.1% | Mar 2026 – Apr 2026 |
| UNITED_KINGDOM_UK | 10,586 | 19,502 | 9,947 | 5,811 | 5,450 | 58.4% | Mar 2026 – Apr 2026 |
| Total | 72,735 | 82,714 | 67,302 | 32,622 | 28,212 | 48.5% | — |
Statement % is the percentage of reachable pages that contain at least one link to an accessibility statement.
Overview
The accessibility statement scanner checks whether each government page links to an accessibility statement as required by the EU Web Accessibility Directive (Directive 2016/2102).
Under the Directive, public-sector bodies must:
- Publish an accessibility statement describing the accessibility of their website or mobile app.
- Include a clearly labelled link to that statement on the page, ideally in the footer.
The scanner detects these links using multilingual term matching across all 24 EU official languages plus Norwegian and Icelandic.
Scans run automatically every 4 hours via GitHub Actions so that the full set of ~80,000 URLs across 31 countries can be covered gradually without overloading government servers.
What Is Checked
For each scanned page the scanner:
- Fetches the page HTML.
- Searches first inside
<footer>elements for links whose text or href matches known accessibility-statement terminology. - If not found in the footer, searches the entire page.
- Records whether a matching link was found, where it was found (footer or page body), and what text triggered the match.
Multilingual Term Matching
The glossary covers the following languages:
| Region | Languages |
|---|---|
| EU official languages | Bulgarian, Croatian, Czech, Danish, Dutch, English, Estonian, Finnish, French, German, Greek, Hungarian, Irish, Italian, Latvian, Lithuanian, Maltese, Polish, Portuguese, Romanian, Slovak, Slovenian, Spanish, Swedish |
| Allied nations | Icelandic, Norwegian |
Example recognised terms include “accessibility statement” (EN), “déclaration d’accessibilité” (FR), “Erklärung zur Barrierefreiheit” (DE), and equivalents in all supported languages.
Tier Classification
Each scanned page is assigned one of three outcomes:
| Outcome | Meaning |
|---|---|
unreachable |
Page could not be fetched (network error, timeout, 4xx/5xx) |
no_statement |
Page is reachable but no accessibility statement link was found |
has_statement |
Page contains at least one link to an accessibility statement |
Pages where the statement link was found inside a <footer> element are
additionally flagged with found_in_footer = true, since placing the link in
the footer is considered best practice.
Viewing Results
Scan Progress Report
The Scan Progress Report includes a per-country accessibility statement breakdown showing:
- Total pages scanned and reachable count
- Number of pages with a statement link
- Number of pages where the link was found in the footer
- Date range showing when each country was last scanned
GitHub Actions Artifacts
Each workflow run uploads a scan artifact containing:
data/metadata.db— the full SQLite results databaseaccessibility-scan-output.txt— the raw scan logdata/toon-seeds/countries/**_accessibility.toon— annotated TOON files
To download artifacts:
- Go to GitHub Actions → Scan Accessibility Statements
- Click on the relevant workflow run
- Scroll to the Artifacts section at the bottom of the run summary page
- Download
accessibility-scan-<run_number>to inspect the database or TOON files
Running a Scan Manually
Via GitHub Actions (recommended)
- Go to Actions → Scan Accessibility Statements
- Click Run workflow
- Optionally enter a country code (e.g.
ICELAND) or leave blank to scan all - Optionally adjust the rate limit (default: 1.0 req/sec)
Via the command line
# Scan a single country
python3 -m src.cli.scan_accessibility --country ICELAND --rate-limit 1.0
# Scan all countries (with a 110-minute runtime cap)
python3 -m src.cli.scan_accessibility --all --max-runtime 110 --rate-limit 1.0
Output Format
Annotated TOON file (*_accessibility.toon)
Each page entry gains an accessibility field:
{
"url": "https://example.gov/",
"is_root_page": true,
"accessibility": {
"is_reachable": true,
"has_statement": true,
"found_in_footer": true,
"statement_links": ["https://example.gov/accessibility"],
"matched_terms": ["accessibility statement"]
}
}
Database table (url_accessibility_results)
| Column | Type | Description |
|---|---|---|
url |
TEXT | Page URL |
country_code |
TEXT | Country identifier (e.g. ICELAND) |
scan_id |
TEXT | Unique scan run identifier |
is_reachable |
INTEGER | 1 = reachable, 0 = not reachable |
has_statement |
INTEGER | 1 = accessibility statement link found |
found_in_footer |
INTEGER | 1 = link was found inside a <footer> element |
statement_links |
TEXT | JSON list of resolved statement URLs |
matched_terms |
TEXT | JSON list of matched glossary terms |
error_message |
TEXT | Error message if fetch failed |
scanned_at |
TEXT | ISO-8601 timestamp of scan |
Countries Covered
Scans cover all 27 EU member states plus 4 allied nations:
| Region | Countries |
|---|---|
| EU member states | Austria, Belgium, Bulgaria, Croatia, Czechia, Denmark, Estonia, Finland, France, Germany, Greece, Hungary, Ireland, Italy, Latvia, Lithuania, Luxembourg, Malta, Netherlands, Poland, Portugal, Republic of Cyprus, Romania, Slovakia, Slovenia, Spain, Sweden |
| Allied nations | Iceland, Norway, Switzerland, United Kingdom |
Architecture
scan-accessibility.yml (GitHub Actions — every 4 hours)
↓
scan_accessibility.py (CLI)
↓
AccessibilityScannerJob.scan_country()
↓
AccessibilityScanner.scan_urls_batch()
↓
For each URL:
httpx.get() → HTML content
BeautifulSoup → find <footer> links, then full-page links
Match against multilingual glossary terms
↓
Classify: has_statement / found_in_footer
↓
Save to url_accessibility_results table
↓
Write *_accessibility.toon output file