blocked-sites-dataset: Which Websites Are Blocked, Where, Month by Month, as CSV
"Is this site blocked in Turkey?" "Which countries block Wikipedia?" "Did that ban actually happen, or is the site just down?" Questions like these come up constantly at Unblock Master, and the best public evidence to answer them comes from OONI, the Open Observatory of Network Interference. Volunteers around the world run OONI Probe, which tries to reach a list of websites and records what happens. All of it is published.
Published is not the same as easy to use, though. Getting from OONI's raw data to "what is blocked in this country right now" means learning its API, understanding four different counters, and knowing which two of them must never be added together. So we did that work once, automated it, and put the result in a public repository: blocked-sites-dataset.
Plain CSV, one row per country and domain
month,country_code,country_name,domain,measurements,confirmed,anomaly,ok,failures,confirmed_rate
2026-08,IR,Iran,www.facebook.com,5092,3804,786,296,206,0.7471
2026-08,IR,Iran,www.instagram.com,4842,3634,759,218,231,0.7505
2026-08,IR,Iran,twitter.com,4510,3205,870,183,252,0.7107
There are three kinds of files:
| Path | What it is |
|---|---|
data/latest.csv |
The most recent complete month, at a stable URL |
data/monthly/YYYY-MM.csv |
One file per month, never rewritten once complete |
data/summary.csv |
One row per country per month: totals, no domains |
The October 2026 file alone has almost 140,000 rows built from over 47 million measurements in
76 countries. It opens in a spreadsheet, and the raw GitHub link works directly in pandas, R or
curl:
import pandas as pd
df = pd.read_csv(
"https://raw.githubusercontent.com/Yuix-Networks/"
"blocked-sites-dataset/main/data/latest.csv"
)
turkey = df[(df.country_code == "TR") & (df.confirmed > 0)]
print(turkey.nlargest(20, "confirmed_rate")[["domain", "confirmed_rate"]])
Never add confirmed and anomaly
This is the most important thing in the repository, and the reason the two are separate columns instead of one "blocked" total.
confirmedmeans OONI positively identified blocking: it saw a block page, or another fingerprint that only censorship produces. A block page is hard to produce by accident.anomalymeans something looked wrong: a DNS inconsistency, a TCP reset, a TLS mismatch. That is often censorship, but just as often the site was down, a CDN returned an error, or the probe's own network was flaky.
Adding them together is the most common way censorship statistics get inflated. Across the
October 2026 file there are about seven anomalies for every confirmed block, and in some
countries the gap is an order of magnitude. Use confirmed when you need to defend a claim, and
treat anomaly as a lead to investigate, not a finding.
Honest about what it cannot tell you
The methodology document spends as much time on the limits as on the numbers, because these are the places where data like this gets misquoted:
- A missing domain is usually untested, not unblocked. The tested sites come largely from the curated Citizen Lab test lists, not from the whole web.
- Probes are volunteers, not a random sample. A country's numbers reflect the networks where people happened to run OONI Probe, sometimes a single ISP. A site blocked on one ISP and open on another gets a middling rate that describes neither.
- A confirmed block says a network interfered, not who ordered it. The United States and Germany both have hundreds of domains with confirmed blocks in the data. A block page can come from a school, workplace or ISP filter just as well as from a government decision.
- A month is a long time. A block that started mid-month shows up as a partial rate, so read the monthly files as a series.
There are thresholds to keep noise out, too: a country needs at least 1,000 measurements and one confirmed block in the month, and a domain needs at least 20 measurements there. Both are at the top of the build script, if you want different ones.
Rebuilt every month, citable by DOI
A GitHub Action runs the build on the 4th of every month and commits the new file. The script uses only Python's standard library and needs no key or account, so you can run it yourself:
python tools/build.py 2026-08 # a specific month
python tools/build.py # the last complete month
The output is deterministic for a given month, so a diff between two runs is a change in OONI's data, not in ours.
Every month is also released and archived on Zenodo with its own DOI, so a journalist or
researcher can pin a claim to the exact data it was made from. The concept DOI,
10.5281/zenodo.22769312, always points to the newest
version, and GitHub shows a Cite this repository button from the included CITATION.cff.
The licence: the data is OONI's
The numbers are OONI's measurements, and they carry OONI's data licence,
CC BY-NC-SA 4.0: attribution,
non-commercial, share-alike. What the repository adds is the aggregation and the documentation.
If you need the data for a commercial purpose, that is a conversation to have with OONI. The code
in tools/ is MIT.
If you would rather see it than download it, the Internet Censorship Tracker on Unblock Master shows the same measurements per country, with a chart and an embeddable badge.
Use it, cite it, improve it
The dataset is on GitHub: github.com/Yuix-Networks/blocked-sites-dataset. If you write about internet censorship, we hope it saves you a few days with the OONI API. Please cite OONI alongside it, since the measurements are theirs. Issues and pull requests are welcome, and a star helps other people find it.