Cloudflare Radar API — free, documented API with endpoints specifically for application-layer (L7) and network-layer (L3/4) attacks, plus metadata like confidence levels. Licensed CC BY-NC 4.0. Cloudflare Docs+2Cloudflare Docs+2
Digital Attack Map (Jigsaw + NETSCOUT/Arbor) — public site showing daily top DDoS flows (historical + “today” view). Data is a sample of ATLAS observations; API access is not formally documented, so treat it as a reference/embedded widget rather than a backend feed. Digital Attack Map+1NETSCOUT
CAIDA / UCSD Network Telescope — research-grade backscatter datasets (historic, application needed). Great for offline analysis and papers; not ideal for “live” dashboards. CAIDA Resource Catalog+1Impact Cyber Trust
For a production, continuously updating map, start with Cloudflare Radar’s API and optionally link out to Digital Attack Map for context.
Create an API token (Account → Radar →
Read). Requests hit
https://api.cloudflare.com/client/v4/radar/.... Cloudflare
Docs
Pull L7 (HTTP) attack aggregates
Top target locations (last 1h/24h):
GET /radar/attacks/layer7/top/locations/target?dateRange=1h&limit=200&format=json
Top origin→target pairs (for drawing arcs):
GET /radar/attacks/layer7/top/attacks?dateRange=1h&limit=200&format=json
L7 time series by technique/product (for trends):
GET /radar/attacks/layer7/timeseries_groups/mitigation_product?...
Cloudflare
Docs
Pull L3/4 (network-layer) attack aggregates (protocol splits, datacenter-attributed):
/radar/attacks/layer3/...
(see docs page). Note: location = CF datacenter, due to IP spoofing at
L3/4. Cloudflare
DocsAuth header:
Authorization: Bearer <API_TOKEN>
Formats: format=json (default) or
format=csv (nice for Pandas). Cloudflare
Docs
Minimum model for a globe/choropleth + arcs:
Tables (or JSON schemas)
countries — alpha2, name,
lat, lon (centroids).
attack_snapshot — ts,
layer (L7/L3), metric (e.g., share_percent or
requests_per_s), origin_alpha2, target_alpha2,
value, confidence.
Transform steps
Normalize fields
value as a percentage and store
meta.normalization so you don’t mislabel it as absolute
counts. Cloudflare
DocsConfidence filtering
meta.confidenceInfo.level < 5. This is explicitly
provided by Radar. Cloudflare
DocsAttribution caveats
Smoothing & freshness
Country geometry join
alpha2 codes from Radar with your centroid list to
place bubbles/arcs.Licensing
Optional enrichments
Split by attack product/technique (e.g., DDoS vs. WAF blocks) for legends. Cloudflare Docs
Show L7 vs L3/4 tabs (different semantics). Cloudflare Docs
Frontend stack (fast path)
Map: Mapbox GL JS or Leaflet +
deck.gl. Deck.gl’s ArcLayer is perfect for
origin→target ribbons; a second layer (Scatter/Column)
for per-country intensity.
Basemap: OpenStreetMap tiles (no cost) or Mapbox (nice styles).
UI: React + Vite/Next.js. Tabs: Global, By Layer (L7/L3), Top Pairs, Trends. Controls: time window, layer, metric.
Hosting: Vercel/Netlify (static + API routes) or a small Node/Express on a VPS.
Dashboard alternative
Backend
For simplicity, run a cron (GitHub Actions or a tiny server) that:
Calls Radar endpoints (JSON/CSV).
Writes compact snapshot JSON (e.g.,
latest.json and
history/2025-08-13T15.json).
Invalidates CDN cache.
If you expect growth, use PostgreSQL + PostGIS or TimescaleDB for time windows & aggregates.
Visual encodings
Choropleth or bubbles on targets (where victims are billed).
Arcs for top origin→target flows.
Color split for L7 vs L3/4 or by protocol (TCP/UDP/ICMP) for network layer views. Cloudflare Docs
Tooltips: country names, share %, time window, confidence note.
(Replace API_TOKEN)
Top L7 targets (last 24h) for choropleth/bubbles