A magnitude 6.0 earthquake within 50km of a refinery is a 30-second decision: shut down the unit, or trust the seismic isolation kicks in. Operations teams who wait for the National Hurricane Center-equivalent of a seismic warning are already two minutes behind the event.
There is no central authority that pushes earthquake alerts the way NHC pushes hurricanes. The signal is split across four government agencies, each with its own API, latency profile and severity scale. Merging them is the entire job.
This post lays out the practical earthquake monitoring stack — what to plug in, what to ignore, how to tune for your geography.
The four feeds worth wiring
USGS (United States Geological Survey)
The gold standard for the Americas + global coverage. Publishes every M2.5+ event worldwide via a public GeoJSON API:
https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/significant_hour.geojson
https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_hour.geojson
No key required. Refresh every 30 seconds is reasonable. Median publication latency: 30-90 seconds after the event.
The USGS earthquake API also publishes PAGER (Prompt Assessment of Global Earthquakes for Response) — population exposure + estimated fatality bands. PAGER is the single most useful enrichment for converting "this earthquake happened" into "this earthquake matters."
EMSC (European-Mediterranean Seismological Centre)
Better coverage for Europe + Middle East + North Africa than USGS alone. Real-time feed via FDSN:
https://www.seismicportal.eu/fdsnws/event/1/query?format=json&starttime=...
Slightly faster than USGS for European events (often 15-30s ahead).
JMA (Japan Meteorological Agency)
Required for any operation in Japan. Their EEW (Earthquake Early Warning) system can publish warnings seconds before shaking arrives, leveraging the P-wave detection lead time. Public API is in Japanese; English wrapper available via the P2P quake project.
GeoNet (New Zealand)
Required for NZ + Pacific operations. Same publication pattern as USGS, JSON feed:
https://api.geonet.org.nz/quake?MMI=3
What you actually want from the merged feed
Raw seismic data has four key fields per event:
- Magnitude (Richter / Moment) — 0 to 10 scale, log
- Depth (km below surface) — shallow = more destructive
- Location (lat/lon)
- Population exposure (PAGER) — the only field that consistently distinguishes "M4.0 under nobody" from "M4.0 under a city"
Wire all four into a 0–100 severity score:
sev = (mag - 2) * 15 # base score from magnitude
+ max(0, 30 - depth) * 0.5 # depth boost: shallow events score higher
+ pop_exposure_boost(pop) # log-scaled population factor
+ recent_aftershock_boost # additional weight when nearby quakes
# happened in last 24h
Clamp to 0-100. The exact coefficients matter less than the principle: depth + population win over raw magnitude.
Latency budget
End-to-end "earthquake happens → alert in your Slack" has five hops:
- Sensor network detects → 1-5 seconds
- USGS / EMSC processes + publishes → 30-90 seconds
- Your poll loop fetches → +0-30 seconds (depends on poll interval)
- Dispatcher matches against your zones → under 1 second
- Slack webhook delivers → 1-3 seconds
Total: 30-130 seconds in the median case. For shake-warning operations (rapid shutdown, mass-transit train slow-down) that's not fast enough — you need direct EEW feeds (JMA or USGS ShakeAlert via Wired ALEXIS).
For operational awareness (deciding whether to send a team into a damaged area, whether to expect supply-chain impact), 30-130 seconds is plenty.
Geofencing strategy for seismic zones
Three patterns that work for seismic alerts:
Single-asset radius: 50km circle around each refinery / wellhead / substation. Set severity threshold to ≥60. Catches every event that physically threatens the asset.
Regional polygon: Country or fault-zone polygon for headline awareness. Set severity threshold to ≥80. Catches the M7+ events that move markets and trigger insurance claims.
Aftershock corridors: Around active fault zones (San Andreas, Anatolian, Sumatra-Andaman), define long polygons. Set lower severity threshold (≥40) so you catch the aftershock sequence even when individual events are small.
Practical false-positive reductions
Three tunings that cut noise:
-
Filter by depth: events deeper than 100km are usually felt but rarely destructive. Boost the severity penalty for depth or skip entirely.
-
Dedupe on USGS event_id: USGS publishes initial detection, then refines magnitude over the following 5-10 minutes as more stations report. Don't fire on every revision — dedupe on the event ID.
-
Suppress aftershock storms: after an M7+ within 200km of your zone, expect 10-50 aftershocks in 24 hours. Auto-bump the severity threshold for that zone for 24 hours so you only see M5+ aftershocks.
Free starter stack
If you're standing up earthquake monitoring this week:
- Wire USGS
summary/all_hour.geojson— poll every 30 seconds, no key - Wire EMSC FDSN
event/1/queryfor European coverage - Define 50km circle zones around your top 20 assets
- Set severity threshold to 60 per zone
- Slack channel
#ops-quakes, route via incoming webhook - Set up a daily cron to read PAGER fatality estimates and post a summary
Augur's USGS + EMSC ingest wraps all of the above with severity scoring, geofencing, dedupe and explainer auto-generation. The data is public; the pipeline is the work.
When EEW (sub-second) matters
Operations that need actual early warning — rapid-shutdown valves, transit slowdowns, hospital-MRI machines — need a direct EEW feed, not an OSINT poll. Three providers:
- USGS ShakeAlert — US west coast, partner-only API access
- JMA EEW — Japan, public API
- Sensorvy / Early Warning Labs — commercial wrappers around the above
Costs jump from $0 to $$$$ once you cross from "operational awareness" into "actionable shake-warning." For most teams the operational-awareness tier is what they actually need.
What this looks like in production
European LNG operator: 9 polygon zones around terminals + USGS + EMSC ingest + severity ≥60 → catches every regionally-significant quake within 60 seconds. Two false positives per month, both M5+ deep events at >300km depth.
Japanese auto OEM: JMA EEW direct feed → P2P bridge → MQTT broker on factory floor. Sub-second slow-down of conveyor lines on confirmed shake warning. ~$50k/year implementation, paid back the first time a magnitude 6 hit.
Plug, tune, ship.