USGS Earthquake Scraper: Global Seismic Events
Pricing
from $0.37 / 1,000 earthquake scrapeds
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
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
6 days ago
Last modified
Categories
Share

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 field | Meaning |
|---|---|
eventId | USGS event ID, e.g. us6000ti8i, stable, use it to de-duplicate |
magnitude, magType | Magnitude and the scale it was measured on (mww, ml, mb …) |
place | Human-readable location, e.g. 40 km SW of Sarangani, Philippines |
time, updated | Origin time and last revision, as ISO 8601 UTC |
longitude, latitude, depth | Epicentre and hypocentre depth in km |
tsunami | true when the event sits in a tsunami-notification region |
alert | PAGER impact alert, green, yellow, orange, red, or null |
felt, cdi | Number of "Did You Feel It?" reports and the resulting community intensity |
mmi | Maximum estimated Modified Mercalli intensity from ShakeMap |
significance | USGS significance score (0-1000) blending magnitude, felt reports and impact |
url | USGS event page |
scrapedAt | Run 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 set | What runs | Reach |
|---|---|---|
Nothing, or just feed | The pre-baked summary feed, one static GeoJSON file | Last hour → last month |
fromDate and/or toDate | The full USGS catalogue (fdsnws/event/1/query), paged | Back 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_houron a schedule and fire a webhook whenalertgoes 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_hourwith depth and magnitude. - Newsroom monitoring.
feltandcditell 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
| Field | Type | Default | Notes |
|---|---|---|---|
feed | string | all_day | One of the 20 USGS summary feeds, named <magnitude>_<window>. Ignored when a date window is set. |
minMagnitude | string | - | Magnitude floor, e.g. "4.5". A text field because Apify input schemas have no decimal type; it is parsed as a number. |
boundingBox | object | - | { minLatitude, maxLatitude, minLongitude, maxLongitude }. Any subset works, omitted edges are unbounded. |
fromDate | string | - | YYYY-MM-DD or ISO 8601. Switches the run to the full catalogue. |
toDate | string | - | YYYY-MM-DD or ISO 8601. Also switches to the catalogue. Defaults to now. |
maxResults | integer | 0 | Cap 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
timeandupdatedas epoch milliseconds; both are emitted as ISO 8601 UTC strings so they sort and join correctly everywhere. tsunamiis a boolean. The source uses0/1. Note it means "in a tsunami-notification zone", not "a tsunami occurred".- Catalogue paging is discovered, not declared.
fdsnwsreturns no total count, so pages of 20,000 are requested until a short page comes back. A page that fails is recorded inRUN_SUMMARY.failuresand 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.