Skip to main content

Open research data

Accessibility of US municipal websites · CC BY 4.0

This is the raw data behind every figure we publish. Any number can be recomputed independently, without access to our code. The files are served directly and are not protected in any way — that is what open data means.

Download · traversal-log (3,2 МБ)Format · SCHEMA.mdResearch dataMethodology

How to cite

Maksim Galatin & AIfa (Claude, Anthropic). Municipal Website Accessibility: Automated Scan versus Keyboard Traversal. Open dataset, version of 1 September 2026. CC BY 4.0.

Licensed CC BY 4.0: use it however you like, including commercially, as long as you credit the authors.

What is in the dataset

FileContentsSize
traversal-log-2026-09-01.jsonl.gzThe main log. One line is one keyboard traversal of one page: URL, city, state, page type, how many Tab presses to the target, where the path broke and why, whether form fields carry labels, screenshot filename, verdict.3,2 МБ
95,524 lines
traversal-log-SCHEMA.mdSchema of the log: every field explained, which values are possible and how to read them.13 КБ
us-registry-cisa.jsonl.gzThe federal CISA registry as of 31 August 2026 — the source sample of US city and county domains.276 КБ
11,659 lines
measurement-dates.jsonl.gzWhen exactly each screenshot was taken. As many lines as screenshots verified on disk.853 КБ
83,212 lines
evidence-hashes-2026-09-01.txt.gzIntegrity registry: SHA-256 of every evidence file. Its own hash is timestamped into Bitcoin via OpenTimestamps.2,7 МБ
81,065 lines
evidence-hashes-2026-09-01.timestamp.jsonThe timestamp proof: which calendars accepted the hash and when.2,7 КБ
solana-anchor-status.jsonThe honest status of on-chain anchoring: what is already done in Bitcoin and where the Solana record stands.2,3 КБ
dead-domains-2026-09-01.csvRegistry domains that did not answer. Reviewed by hand; this finding is not about accessibility but about the quality of government data.30 КБ
1,499 lines
unreachable-reasons.csv.gzReasons for unreachability, tabulated: DNS, TLS, timeout, connection refused and the rest.19 КБ
905 lines
tls-certificates.jsonl.gzTLS certificate state for the traversed domains.483 КБ
8,979 lines
entity-classification.jsonl.gzEntity classification: city, county, other type.173 КБ
11,997 lines
recaptured-screenshots.jsonl.gzScreenshots re-captured later, stating which one was replaced and when. Previous versions are not deleted.14 КБ
757 lines

Change log

What changed in the dataset and why. Counts were taken by opening the files, not by reading their names. Twice the record count went DOWN — that is a correction against our own interest, not a trim, and each case is explained.

DateFileContentsChange
2026-08-30dead-domains-2026-08-30.csvFirst release of the list of domains with no DNS record — present in the federal CISA registry, yet nonexistent.
1,209 lines
2026-08-31dead-domains-2026-08-31.csvList extended after sweeping the remaining states.
1,651 lines
+442
2026-09-01dead-domains-2026-09-01.csvThe count went DOWN, and the correction is against our own interest: 152 domains we had called dead answered on re-check with a real browser trying four addresses per domain. We corrected ourselves rather than trimming the data.
1,499 lines
152
2026-09-01traversal-log-2026-09-01.jsonl.gzThe main keyboard-traversal log: 95,524 records across 11,902 domains. The sweep of the federal CISA registry is complete — all 11,659 sites covered.
95,524 lines
2026-09-01evidence-hashes-2026-09-01.txt.gzIntegrity registry: SHA-256 of every screenshot. The same day its own hash was timestamped into Bitcoin via OpenTimestamps — backdating a screenshot now means rewriting Bitcoin.
81,657 lines
2026-09-03evidence-hashes-2026-09-03.txt.gzIntegrity registry extended by 28,442 records: screenshots from repeat passes brought under proof.
110,099 lines
+28,442

Format

Files ending in .jsonl.gz are line-delimited JSON compressed with gzip: one line, one object. Any archiver decompresses them, and any program can read them line by line without loading the whole file into memory. A browser cannot display such a file, so it saves it to disk instead — that is normal behaviour for an archive, not an error.

Fields of the main log

urlURL of the page checked
город / штатcity and state of the site owner
страница_типwhich page it is: home, payment, jobs, documents, meetings, 311_request and so on
шагов_до_целиhow many Tab presses it took to reach the target; 0 means the target was not reached
где_оборвалосьthe element where the path broke
причинаin words: page did not open, target not reached in 40 presses, success in N steps
есть_метки_у_полейwhether form fields carry labels for a screen reader
контраст_окwhether text passes the contrast requirement
скриншотfilename of the screenshot taken at the moment of measurement
вердикт_человекаthe human verdict: accessible, partial barrier, barrier, unreachable and so on
что_сказал_скриптwhat the automated check said about the same page
вендор_платформыthe platform the site runs on, where it could be identified
когда_замерtime of measurement

How to be sure the data was not swapped

Every evidence file has a SHA-256; all hashes are collected into one registry, and the registry hash is timestamped into Bitcoin via OpenTimestamps — free of charge, accepted by three independent calendars. Backdating a screenshot is now impossible without rewriting Bitcoin. The verification procedure is described in evidence-hashes-README.txt.

Careful with the shares

The study reports three different shares, each with its own denominator. First: among pages the automated check called clean, 53.8 % did not reach the goal — denominator 25,966. Second: among ALL measurable pages, 74.6 % of 47,271 did not reach it. Third: of all 95,524 log records, 12.6 % reached the goal. None of the three means "X % of sites are inaccessible" — these are shares of pages, not sites.