Open research data
Accessibility of US municipal websites · CC BY-NC 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.
How to cite
Maksim Galatin & AIfa (Claude, Gemini, Grok). Municipal Website Accessibility: Automated Scan versus Keyboard Traversal. Open dataset, version of 1 September 2026. CC BY-NC 4.0.
Licensed CC BY-NC 4.0: free for non-commercial use (research, teaching, journalism) with credit to the authors; any commercial use only under a paid licence (contact@codeofdigitaleternity.com).
What is in the dataset
| File | Contents | Size |
|---|---|---|
| traversal-log-v5-2026-10-02.jsonl.gz | The main log, version 2 (instrument v5, 1–2 October 2026). One line is one page: the traversal's original verdict, the category under options A and B, the measurement layer, the focus path. The 33.5 % figure is computed from it. | 12.0 MB 95,216 lines |
| traversal-log-v5-SCHEMA.md | Field description for version 2: categories, how verdicts map to categories, how to recompute the figure, what was masked before publication. | 7.7 KB |
| traversal-log-2026-09-01.jsonl.gz | The 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 MB 95,524 lines |
| traversal-log-2026-09-01-corrected-2026-10-16.jsonl.gz | A corrected copy of the main version 1 log (16 October 2026). It differs from the original in exactly 4,019 lines: the verdict is recomputed from the recorded reason, the previous one is kept in the field вердикт_до_16_10_2026, the rule in the field исправлено_16_10_2026. SHA-256 1b1ee13764ba58aa64bc3ac6c5034ef5c2de159cb06d4c59410ac2e6dcae3be0. | 3.2 MB 95,524 lines |
| cookie-banner-holds-focus-v21-2026-10-16.csv | 19 pages on 5 domains where a cookie consent banner holds the keyboard focus for all 60 steps until it is answered. We never answer a banner — that would be consent given on someone else’s behalf — so this is a limit of our instrument, not a barrier of the site. Without these pages the version 2.1 headline figure is 24.56 % instead of 24.62 %. | 3.3 KB 19 lines |
| traversal-log-SCHEMA.md | Schema of the log: every field explained, which values are possible and how to read them. | 15 KB |
| us-government-axe-audit.jsonl.gz | Audit of US government sites with the axe-core 4.x engine: 85,497 page checks with violations broken down by severity, rule and page type. E-mail addresses that ended up inside CSS selectors together with mailto links are hidden. | 4.1 MB 85,497 lines |
| us-government-axe-audit-corrected-2026-10-17.jsonl.gz | A corrected copy of the axe audit (17 October 2026). It differs from the original in exactly the 2,005 records that had hit our 8-second limit: 792 are replaced by the re-measurement with a 20-second limit, 1,213 keep their earlier result and gain the field перемер_16_10_2026. The other 83,492 lines are byte-for-byte identical to the original. | 4.3 MB 85,497 lines |
| us-organizations-registry.jsonl.gz | US organisations registry: 289,420 records across all 51 territories — schools, hospitals, government bodies, retail and services. This is the list of objects the traversal ran over. ⚖️ SEPARATE LICENCE: ODbL 1.0, not CC BY-NC 4.0 — the registry is derived from OpenStreetMap (visible in the osm_id field), © OpenStreetMap contributors. Before publishing, 210,730 phone numbers and 20,859 e-mail addresses were removed. | 16.0 MB 289,420 lines |
| us-registry-cisa.jsonl.gz | The federal CISA registry as of 31 August 2026 — the source sample of US city and county domains. | 276 KB 11,659 lines |
| measurement-dates.jsonl.gz | When exactly each screenshot was taken. As many lines as screenshots verified on disk. | 853 KB 83,212 lines |
| evidence-hashes-2026-09-01.txt.gz | Integrity registry: SHA-256 of every evidence file. Its own hash is timestamped into Bitcoin via OpenTimestamps. | 2.7 MB 81,065 lines |
| evidence-hashes-2026-09-01.timestamp.json | The timestamp proof: which calendars accepted the hash and when. | 2.7 KB |
| solana-anchor-status.json | The honest status of on-chain anchoring: what is already done in Bitcoin and where the Solana record stands. | 2.3 KB |
| dead-domains-2026-09-01.csv | Registry domains that did not answer. Reviewed by hand; this finding is not about accessibility but about the quality of government data. | 30 KB 1,499 lines |
| unreachable-reasons.csv.gz | Reasons for unreachability, tabulated: DNS, TLS, timeout, connection refused and the rest. | 19 KB 905 lines |
| tls-certificates.jsonl.gz | TLS certificate state for the traversed domains. | 483 KB 8,979 lines |
| entity-classification.jsonl.gz | Entity classification: city, county, other type. | 173 KB 11,997 lines |
| recaptured-screenshots.jsonl.gz | Screenshots re-captured later, stating which one was replaced and when. Previous versions are not deleted. | 14 KB 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.
| Date | File | Contents | Change |
|---|---|---|---|
| 2026-09-10 | us-organizations-registry.jsonl.gz | Dataset returned to distribution under the CORRECT licence. The organisations registry is derived from OpenStreetMap — visible in the osm_id field of every record — and OpenStreetMap is licensed under ODbL 1.0, which requires a derivative database to be distributed under ODbL as well. We had published it under CC BY 4.0, and that was wrong. On the morning of 10 September the dataset was withdrawn; by the evening that decision was corrected: withdrawal was unnecessary, it was enough to put ODbL 1.0 on THIS file. That is what has now been done — the other datasets stayed under CC BY 4.0 at the time; since 5 October 2026 they are under CC BY-NC 4.0 (commercial use only under a paid licence). The list of organisations comes from OpenStreetMap, © OpenStreetMap contributors. | — |
| 2026-08-30 | dead-domains-2026-08-30.csv | First release of the list of domains with no DNS record — present in the federal CISA registry, yet nonexistent. | 1,209 lines |
| 2026-08-31 | dead-domains-2026-08-31.csv | List extended after sweeping the remaining states. | 1,651 lines +442 |
| 2026-09-01 | dead-domains-2026-09-01.csv | The 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-01 | traversal-log-2026-09-01.jsonl.gz | The 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-01 | evidence-hashes-2026-09-01.txt.gz | Integrity 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-03 | evidence-hashes-2026-09-03.txt.gz | Integrity registry extended by 28,442 records: screenshots from repeat passes brought under proof. | 110,099 lines +28,442 |
| 2026-09-09 | us-organizations-registry.jsonl.gz | New dataset. US organisations registry: 289,420 records across all 51 territories — schools, hospitals, retail and services, with website address, coordinates and sector group. It was collected as the sample for the next traversal stage and until today sat unpublished. Phone numbers (210,730) and e-mail addresses (20,859) were deliberately removed from the published copy: they take no part in accessibility measurement, and five thousand of those addresses were personal mailboxes on gmail and the like. A further 15 addresses were cleared out of the website field — in the source OpenStreetMap data someone had entered an e-mail there instead of a page address. | 289,420 lines |
| 2026-09-09 | us-government-axe-audit.jsonl.gz | New dataset. Audit of US government sites with the axe-core 4.x engine: 85,497 page checks, with violations broken down by severity, by specific rule and by page type. This is a separate measurement and must not be added to the municipal traversal: there a human presses Tab, here an automated engine runs, and the methods differ. E-mail addresses that ended up inside CSS selectors together with mailto links are hidden — the selector still shows where the violation is. | 85,497 lines |
| 2026-10-02 | traversal-log-v5-2026-10-02.jsonl.gz | Version 2 of the main log: 95,216 lines across 11,902 domains, re-measured with the new v5 instrument (1–2 October 2026). Barrier among measured pages: 33.5 % (8,448 of 25,252); 33.9 % if an almost invisible focus ring counts as a barrier. Version 1 stays unchanged: the two versions cannot be compared figure for figure because the instrument changed — details on /research/data. E-mail addresses and phone numbers of officials in focus-path texts are masked. | 95,216 lines |
| 2026-10-16 | traversal-log-2026-09-01-corrected-2026-10-16.jsonl.gz | A corrected copy of the version 1 log; the original stays next to it, unchanged. In 4,019 records the verdict said the traversal could not be performed, while the recorded reason says it was. The verdict is recomputed by the same rule the engine applied in all other 15,053 such records: 1,703 become "accessible", 2,316 "partial barrier". Every corrected line keeps its previous verdict; the other 91,505 lines match the original byte for byte. | 95,524 lines −0 |
| 2026-10-17 | us-government-axe-audit-corrected-2026-10-17.jsonl.gz | A corrected copy of the US government axe audit; the original stays next to it, unchanged. 2,005 records had hit our own 8-second page-load limit and were listed as "did not open". All of them were re-measured on 16–17 October with a 20-second limit and the same axe 4.13.0. Only 792 records are replaced — those where the page now opened and was checked; an earlier "checked" is never replaced by a failure today. The other 1,213 re-measured records are kept as they were, with the re-measurement noted. Totals: "checked" 40,536 → 41,328, "did not open" 40,661 → 39,869. | 85,497 lines −0 |
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
| url | URL 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. Version 2 of the dataset (2 October 2026, instrument v5) counts differently: pages without the function are not counted as barriers, and the barrier among measured pages is 33.5 % (8,448 of 25,252). Details and the comparison of versions are on /research/data.