Voidly Atlas publishes 14 forecast endpoints, 8 classifier endpoints, and a live SSE feed. That's the right shape for an API, but it's the wrong shape for a journalist on a deadline or an AI lab assistant pulling a morning brief. They need one URL that answers "what changed in the last 24h?"

Shipped today (2026-05-21): GET /v1/atlas/digest — a flat, pre-rendered sidecar JSON aggregating eight signals. And GET /v1/atlas/digest.html — the same content rendered as an email-client-friendly HTML table (no external CSS, no JavaScript, works in Gmail / Outlook / Apple Mail). Both are built once per day at 04:30 UTC by scripts/build-atlas-digest.py and served straight off disk.

The eight sections

  1. New incidents (24h) — total count, confirmed-only count, and the top 3 by severity (IODA disruptions excluded from the top-3 because they aren't citable censorship).
  2. Forecast movers (24h) — countries whose 7-day shutdown probability shifted by more than 10 percentage points. Sourced from /v1/sentinel/movers.
  3. DBSCAN anomalies — second-opinion shape-anomaly detection across 12 standardized OONI features per country-day. Surfaces days the labeled classifier never saw.
  4. Multi-country blocked domains — domains currently blocked in ≥3 countries, ranked by the existing importance_score = n_countries × log(1 + n_blocked_obs) × avg_confidence formula.
  5. Lead/lag triggers — countries currently above the 0.5 forecast threshold and tracked by the contagion-chain v1 model.
  6. Active-learning queue top-3 — highest-impact pending label requests. Click the candidate_id to send corroboration via /v1/sentinel/report_miss.
  7. Cross-source agreement (24h) — the two-or-more-source agreement rate and confirmed-corroboration rate over the latest window.
  8. Model health — any model whose changelog caveat reports >15pp drift in the last 24h. Today's count is surfaced inline.

Why a sidecar and not inline compute?

The old /v1/atlas/digest recomputed every section on every request — eight SQL queries, three internal HTTP calls, ~400ms p95. That pattern would never have survived a HackerNews front page or a newsletter blast. Shipping the digest as a flat sidecar JSON (~10 KB on disk) means the request is one file read, one Cache-Control: public, max-age=1800, and the gateway caches it at the edge. The legacy inline computation is kept as _atlas_digest_legacy_inline() — a fallback if the sidecar is ever missing.

SNAPSHOT, not real-time — the honest caveat

This is the once-a-day round-up. Anyone who needs sub-minute updates should subscribe to the SSE feed at /v1/incidents/stream instead. Every digest payload includes a snapshot_caveat field that says exactly this, and both the JSON and HTML render the warning prominently.

Use it from your stack

License: CC-BY-4.0. Citation: "Voidly Atlas Daily Digest (sidecar v2), built 04:30 UTC."