Voidly Atlas observes shutdowns from the network side: an IODA ASN flip, an OONI test-list anomaly, a 99% telemetry drop on a probe pair. That view is precise, but it’s also one-sided. Governments often publish — or fail to publish — a parallel narrative on their own ministry websites: “scheduled maintenance,” “regulatory action,” “security threat,” “spam attack.” This finding ships v1 of a curated government-statement scraper that turns that parallel narrative into structured, time-stamped, cross-referenceable evidence.

Why this matters

A statement near a confirmed shutdown is journalist-grade signal that a standalone statement (or a standalone shutdown) is not. If the Ministry of ICT tweets “routine maintenance” four hours before an IODA-confirmed outage, that’s a public warning the ministry doesn’t want to call a warning. If a regulator publishes a retroactive “spam attack” press release twenty-four hours after the network restores, that’s a cover story we should record alongside the network truth. Either way the pairing — not the standalone item — is what reporters cite.

Sources configured (v1)

We curate seven sources covering the highest-impact censorship regulators in the world. Each entry below documents the URL we poll plus an honest note on what we expect to retrieve:

Methodology (one tick of the cron)

  1. Fetch — one requests.get per source, 20s timeout, real Chrome User-Agent, TLS verify on by default (off only when we’ve documented a broken chain). We do not use a headless browser; we do not bypass logins, paywalls, or robots.txt.
  2. Parse — BeautifulSoup on the response. Each source declares a curated CSS selector for items, with an href-substring fallback for the cases where the CSS selector misses (Tailwind / hashed class names). For Turkey-BTK we additionally strip the embedded 21MAY2026-style date prefix from the anchor text and store it as the canonical published_at.
  3. Keyword filter — per-language vocabulary (en, ru, fa, ar, tr, bn, zh) of shutdown / block / limit / filter terms plus broader regulator language (“elektronik haberleşme,” “tebliğ,” “yönetmelik,” etc.). Short ambiguous English tokens (ban, VPN, DNS) use word-boundary regexes so “ban” does not match “Bangladesh.” Items that match zero keywords are dropped (we already caught a false-positive class with this filter and document the fix).
  4. Entity extraction — one regex sweep for bare domains and ASNs, plus the language-aware keyword hit list. A small block-list rejects analytics chrome (schema.org, w3.org).
  5. PersistINSERT OR IGNORE into government_statements keyed on sha1(country | ministry | url | title) so re-fetching is safe. Statement text is stored in the original language; we explicitly do not translate.

Correlation pass

A second script, correlate-statements-to-shutdowns.py, runs 30 min after each scrape. For every statement it queries incidents in the same country whose first_seen is within ±72h of the statement’s published_at (falling back to fetched_at when the source did not expose a date). Each (statement, incident) pair gets a transparent confidence score:

Delta-hours is signed: “warning” for >+3h (statement before incident), “retroactive” for <−3h (statement after), “simultaneous” otherwise. Output is a single JSON sidecar at /opt/voidly-ai/ml-deploy/government_statement_correlations_v1.json that the API serves verbatim.

First-run results (2026-05-21)

Best-example correlation

Highest-confidence pair on first run: BTK Turkey, 30 NIS 2026 — a draft regulation about electronic device identity registration (“Elektronik Kimlik Bilgisini Haiz Cihazların Kayıt Altına Alınmasına Dair Yönetmelik”) was published ≈48h after a critical IODA-confirmed Internet connectivity disruption in Turkey on 2026-04-28. Confidence score 0.545, sign “retroactive,” type_weight 0.5 because the incident is classed disruption, not confirmed censorship. The pair is real, the timing is real, and the type-weight discount keeps the score out of the high-confidence tier — exactly what we want from a transparent, journalist-defensible index.

Endpoints (live, public)

Honest caveats