USGS Earthquake Scraper: Global Seismic Events avatar

USGS Earthquake Scraper: Global Seismic Events

Pricing

from $0.37 / 1,000 earthquake scrapeds

Go to Apify Store
USGS Earthquake Scraper: Global Seismic Events

USGS Earthquake Scraper: Global Seismic Events

Scrape USGS earthquake data: magnitude, depth, coordinates, place, tsunami flag, felt reports and alert level. Filter by magnitude, region and time window.

Pricing

from $0.37 / 1,000 earthquake scrapeds

Rating

0.0

(0)

Developer

Arman Hossain

Arman Hossain

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

6 days ago

Last modified

Share

USGS Earthquake Scraper: Every earthquake worldwide as one row, magnitude, depth, epicentre, tsunami flag, felt reports and PAGER alert

USGS Earthquake Scraper exports global seismic events from the United States Geological Survey, magnitude, depth, epicentre, place name, tsunami flag, community felt reports, ShakeMap intensity and PAGER alert level.

It reads USGS's public GeoJSON directly: no proxy setup, no browser, no credentials to manage. The summary feeds are small, which makes this one of the cheapest things you can put on a five-minute schedule.

Agent skill: SKILL.md

https://api.apify.com/v2/key-value-stores/t7YoTxpZEJOWvw4Ug/records/usgs-earthquakes-scraper.md

What you get

Output fieldMeaning
eventIdUSGS event ID, e.g. us6000ti8i, stable, use it to de-duplicate
magnitude, magTypeMagnitude and the scale it was measured on (mww, ml, mb …)
placeHuman-readable location, e.g. 40 km SW of Sarangani, Philippines
time, updatedOrigin time and last revision, as ISO 8601 UTC
longitude, latitude, depthEpicentre and hypocentre depth in km
tsunamitrue when the event sits in a tsunami-notification region
alertPAGER impact alert, green, yellow, orange, red, or null
felt, cdiNumber of "Did You Feel It?" reports and the resulting community intensity
mmiMaximum estimated Modified Mercalli intensity from ShakeMap
significanceUSGS significance score (0-1000) blending magnitude, felt reports and impact
urlUSGS event page
scrapedAtRun timestamp

A RUN_SUMMARY record in the key-value store holds per-run counts, the filters used, and any request that failed.

Two modes, chosen automatically

You setWhat runsReach
Nothing, or just feedThe pre-baked summary feed, one static GeoJSON fileLast hour → last month
fromDate and/or toDateThe full USGS catalogue (fdsnws/event/1/query), pagedBack to 1900

Summary feeds are static files with no query parameters, so minMagnitude and boundingBox are applied locally in feed mode and server-side in catalogue mode. Either way the output is identical.

Common use cases

  • Disaster-response triggers. Watch significant_hour on a schedule and fire a webhook when alert goes orange or red.
  • Insurance catastrophe modelling. Pull decades of M5+ events inside a bounding box and score exposure.
  • Public safety dashboards. A live map fed by all_hour with depth and magnitude.
  • Newsroom monitoring. felt and cdi tell you which quakes people actually noticed, not just which were large.
  • Research and teaching. Reproducible regional seismicity extracts with a stable schema.

Quick start

Everything that happened in the last day:

{
"feed": "all_day"
}

Notable quakes of the past month:

{
"feed": "significant_month"
}

Every M5+ event around Japan in July 2026, from the full catalogue:

{
"fromDate": "2026-07-01",
"toDate": "2026-08-01",
"minMagnitude": "5",
"boundingBox": {
"minLatitude": 30,
"maxLatitude": 45,
"minLongitude": 125,
"maxLongitude": 150
}
}

Cheap five-minute watch loop:

{
"feed": "all_hour",
"minMagnitude": "2.5",
"maxResults": 200
}

Input

FieldTypeDefaultNotes
feedstringall_dayOne of the 20 USGS summary feeds, named <magnitude>_<window>. Ignored when a date window is set.
minMagnitudestring-Magnitude floor, e.g. "4.5". A text field because Apify input schemas have no decimal type; it is parsed as a number.
boundingBoxobject-{ minLatitude, maxLatitude, minLongitude, maxLongitude }. Any subset works, omitted edges are unbounded.
fromDatestring-YYYY-MM-DD or ISO 8601. Switches the run to the full catalogue.
toDatestring-YYYY-MM-DD or ISO 8601. Also switches to the catalogue. Defaults to now.
maxResultsinteger0Cap on total events saved. 0 = no limit. Catalogue paging stops the moment it is reached.

feed and the date window are mutually exclusive in effect: if you set a date, the feed is not read at all.

Output example

{
"eventId": "us6000ti8i",
"magnitude": 6.3,
"magType": "mww",
"place": "south of the Kermadec Islands",
"time": "2026-08-05T11:43:27.317Z",
"updated": "2026-08-06T11:51:38.507Z",
"longitude": 179.4727,
"latitude": -33.8063,
"depth": 226.084,
"tsunami": false,
"alert": "green",
"felt": 14,
"cdi": 3.1,
"mmi": 3.316,
"significance": 615,
"url": "https://earthquake.usgs.gov/earthquakes/eventpage/us6000ti8i",
"scrapedAt": "2026-08-06T12:00:00.000Z"
}

API example

curl -X POST "https://api.apify.com/v2/acts/arman-bd~usgs-earthquakes-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"feed": "significant_month",
"minMagnitude": "5"
}'

JavaScript example

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('arman-bd/usgs-earthquakes-scraper').call({
fromDate: '2026-07-01',
toDate: '2026-08-01',
minMagnitude: '5',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const q of items) console.log(`M${q.magnitude} ${q.place}, ${q.time}`);

Notes

  • A misspelled feed is caught properly. USGS serves unknown summary files as HTTP 200 with the plain-text body 404 File Not Found, so the status code alone is not enough. This Actor validates the feed name up front and still parses defensively.
  • Timestamps are converted. USGS reports time and updated as epoch milliseconds; both are emitted as ISO 8601 UTC strings so they sort and join correctly everywhere.
  • tsunami is a boolean. The source uses 0/1. Note it means "in a tsunami-notification zone", not "a tsunami occurred".
  • Catalogue paging is discovered, not declared. fdsnws returns no total count, so pages of 20,000 are requested until a short page comes back. A page that fails is recorded in RUN_SUMMARY.failures and everything already collected is kept.
  • Transient errors are retried. 429, 5xx and network errors get four attempts with exponential backoff (0.5 s → 1 s → 2 s). A malformed query fails immediately rather than burning retries.
  • Public data only. No authentication, no personal data, no access-control bypass.

FAQ

Do I need a proxy? No. Proxy configuration is not required to run this Actor.

Do I need an account on the source? No, and there is no credentials to manage.

What happens if a request fails? It is reported in RUN_SUMMARY.failures and the run continues with whatever it already has. The Actor only errors out if every request failed.

Can I schedule it? Yes, it is designed for scheduled runs, and all_hour at a five-minute cadence is a normal pattern.

How do I get only new events? De-duplicate on eventId. Note that updated changes as USGS revises a solution, so re-running will legitimately return revised copies of events you have already seen.

How far back can I go? The summary feeds cover the last month. Set fromDate to reach the full catalogue, which goes back to 1900.

What is significance? A USGS score from 0 to 1000 combining magnitude, felt reports and estimated impact. Events above 600 are what "significant" feeds select on.

Why is alert sometimes null? PAGER only runs on larger events. Small quakes have no alert level, and that is not an error.

Can I integrate it with something else? Yes, Apify API, client libraries, webhooks, scheduled runs, dataset exports (JSON/CSV/Excel) or MCP. Output is structured JSON.