/ writing / data

USGS earthquakes, minus the nested GeoJSON

2026-08-18 · cynix · 3 min read

The USGS ComCat / FDSN feed is the canonical source for global seismic activity — real-time, no API key, generous. The catch is the envelope: every quake is a GeoJSON Feature where the useful bits are split between geometry.coordinates (longitude, latitude, depth — in that order, easy to swap) and a properties object that holds magnitude, place, time, and a dozen flags. Joining those by hand is a fine way to spend a Tuesday you will not get back.

USGS Earthquakes — GeoJSON Extractor flattens each feature into one row. Bounding box, radius around a point, or a country preset:

// box around Japan
{ "mode": "bounding_box", "minLatitude": 30, "maxLatitude": 46,
  "minLongitude": 129, "maxLongitude": 146, "minMagnitude": 4.5 }

// radius around a point
{ "mode": "radius", "latitude": 35.68, "longitude": 139.69, "radiusKm": 300, "minMagnitude": 3 }

// or a country preset
{ "mode": "country_hint", "countryHint": "japan", "minMagnitude": 4.5 }

Each record: id, title, magnitude, place, time, latitude, longitude, depth_km, tsunami, alert, sig, url — plus the rest of the properties. Flat, typed, one row per quake.

Why flatten it at all

The GeoJSON is correct but it is not query-friendly. A flat table drops straight into a dashboard, a map, or an alert pipeline. Schedule it every five minutes over a region of interest, diff the ids against the last run, and you have a near-real-time seismic monitor with zero glue code. The tsunami and alert columns are your filter for "wake someone up."

Robust by default

Nulls in the source (a missing cdi, an absent mmi) are normalized to empty strings so the dataset schema stays clean, and every value is string-typed to match Apify's column model. A run that finds nothing returns zero rows, not an error.

Try it: USGS Earthquakes on Apify — real-time quakes, no key, agent-friendly.