USGS Earthquakes: Search Quakes by Magnitude, Area and Date
Pricing
from $0.70 / 1,000 earthquake records
USGS Earthquakes: Search Quakes by Magnitude, Area and Date
One row per earthquake from the official USGS catalog: time, place, magnitude, depth, coordinates, PAGER alert, tsunami flag, felt reports and the event page. Filter by magnitude, time window, named region, radius, depth, alert level or event type; look events up by USGS id. UTC times.
Pricing
from $0.70 / 1,000 earthquake records
Rating
0.0
(0)
Developer
Samat Makatov
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Every earthquake the U.S. Geological Survey publishes, as one dataset row: origin time and last revision in UTC, place, magnitude and magnitude type, depth, coordinates, PAGER alert level, tsunami flag, significance score, public felt reports, reported and instrumental shaking, kind of event, review status and the event page. Search a rolling window or a fixed period, filter by magnitude, depth, named region, radius around a point, alert level, felt reports or kind of event — or hand over USGS event ids and get one row each. The source is the public, keyless event web service of the USGS Earthquake Hazards Program over the ANSS catalog: no API key, no account, no browser, no proxy.
Use cases
- A newsroom's earthquake desk: the magnitude 4.5 and above events of the last seven days worldwide, newest first, with felt reports and the PAGER alert, ready for a table or a map.
- Insurance and facility risk: everything that shook within 300 km of a plant, a pipeline or a building site, each row carrying its
distanceKmfrom the point you gave — the "how close was it" answer without a GIS step. - A region watch on a schedule: set
region(or a radius) withonlyNewand a schedule; each run writes only the quakes that appeared since the last one. AddtrackRevisionsto get an event again when USGS revises its magnitude or depth. - Catastrophe and humanitarian teams: the short PAGER list — only the few dozen events a year USGS gives an alert level, with its estimated-impact fields (
alert,mmi,cdi,significance). - Claims and local reporting by what people felt: filter on
minFeltReportsinstead of magnitude and you get the events a city noticed, whatever the number on the scale said. - Agents and pipelines resolving an identifier: a link or an alert mail gives you
us6000u18k; put up to 100 such ids ineventIdsand every one comes back as a row (unknown ids asfound: false). - Research and back-testing: a fixed
startTime/endTimewindow with a depth or magnitude band, up to 2 000 rows a run.
Input
Every field is optional. With an empty input the run returns the magnitude 2.5 and above earthquakes of the last week, newest first.
| Field | Type | Default | Allowed values / notes |
|---|---|---|---|
sinceHours | integer | 168 | 1–8760. Rolling window on the origin time, UTC. Ignored when startTime is set. |
startTime | string | empty | YYYY-MM-DD or a full timestamp (2026-10-09T18:00:00), read as UTC. Earliest origin time, inclusive. |
endTime | string | empty | Same format. Latest origin time; empty means now. Used together with startTime — on its own it is ignored and the run says so. |
eventIds | string[] | empty | Up to 100 USGS event ids (us6000u18k). When set, every filter below is ignored. An id the catalog does not know gets one row with found: false. |
minMagnitude | number | empty (prefill 2.5) | −2 to 10. Empty means every magnitude. |
maxMagnitude | number | empty | −2 to 10. Combined with minMagnitude as a range. |
minDepthKm | number | empty | −100 to 1000. Depth of the hypocentre in km; negative above sea level. |
maxDepthKm | number | empty | −100 to 1000. |
eventTypes | string[] | empty | Forgiving free text, OR-combined. Case, spaces and underscores are ignored, aliases are accepted, anything else is refused with the closest values named. Values: Kinds of event. |
reviewStatus | string | all | Strict dropdown: all, reviewed, automatic. An off-list value is refused by the platform before the run starts, with the allowed values named. |
region | string[] | empty | Forgiving free text, OR-combined: 34 named areas, each a bounding box. Case, spaces, diacritics and aliases accepted; anything else refused with a suggestion. List: Named regions. |
latitude | number | empty | −90 to 90. Centre point of a circle; needs longitude. Every row then carries distanceKm. |
longitude | number | empty | −180 to 180. Needs latitude. |
radiusKm | number | empty | 1–20000. Radius around the centre point. Without it the point narrows nothing and only adds distanceKm; without latitude/longitude it is ignored. |
minLatitude | number | empty | −90 to 90. Rectangle search: all four edges are needed. Ignored when region is set. |
maxLatitude | number | empty | −90 to 90. |
minLongitude | number | empty | −360 to 360. For a box across the date line raise the east edge past 180 (e.g. 170 to 190). |
maxLongitude | number | empty | −360 to 360. |
minAlertLevel | string | empty | Strict dropdown: green, yellow, orange, red. Keeps only events with a PAGER alert at or above that level. An off-list value is refused by the platform before the run. |
onlyTsunamiFlagged | boolean | false | Keep only events the catalog marks with a tsunami message. |
minFeltReports | integer | empty | 1–200000. Minimum Did You Feel It responses. |
minSignificance | integer | empty | 0–5000. Minimum sig score. |
onlyNew | boolean | false | Remember the event ids this run writes and skip them next time (per actor or task). Made for schedules. |
trackRevisions | boolean | false | Only with onlyNew: remember the event together with its revision time, so a revised event comes through again as a new row (and is charged again). |
sortBy | string | time | Strict dropdown: time (newest first), time-asc, magnitude (largest first), magnitude-asc. Decides what a small maxItems keeps. |
maxItems | integer | 50 | 1–2000. Hard cap on the rows a run writes, and so on what it costs. |
fields | string[] | all | Keep only these columns, in this order. eventId, time, place, url, fetchedAt and found are always kept — they come first, unless you name one of them here, which puts it exactly where you put it. Names that are not columns are listed in the run's status instead of being dropped in silence. Column names: Output. |
Reference
Named regions
Each region is a rectangle in decimal degrees (south / north / west / east), checked against the catalog on 2026-10-09. A rectangle always reaches a little past the border it is named after, so a quake just across the line is included — use latitude/longitude/radiusKm or your own four edges when you need an exact area.
| Region | South | North | West | East | Also accepted |
|---|---|---|---|---|---|
| California | 32.0 | 42.5 | −125.0 | −114.0 | ca, calif |
| Southern California | 32.0 | 36.0 | −121.0 | −114.0 | socal, s california |
| Pacific Northwest | 41.0 | 49.5 | −125.5 | −116.0 | pnw, cascadia |
| Alaska | 51.0 | 72.0 | −170.0 | −129.0 | ak |
| Hawaii | 18.5 | 22.5 | −161.0 | −154.5 | hi, big island |
| Yellowstone | 43.5 | 45.2 | −111.5 | −109.7 | yellowstone caldera |
| Oklahoma | 33.6 | 37.1 | −103.1 | −94.4 | ok |
| Puerto Rico | 17.0 | 19.5 | −68.0 | −64.5 | pr |
| Mexico | 14.0 | 33.0 | −118.5 | −86.0 | mx |
| Central America | 7.0 | 18.5 | −93.0 | −77.0 | |
| Panama | 7.0 | 9.8 | −83.1 | −77.1 | |
| Caribbean | 9.0 | 23.0 | −88.0 | −58.0 | antilles |
| Chile | −56.0 | −17.0 | −76.0 | −66.0 | |
| Peru | −18.5 | 0.0 | −82.0 | −68.5 | |
| Japan | 24.0 | 46.0 | 128.0 | 146.5 | jp, japan islands, nippon |
| Taiwan | 21.5 | 25.5 | 119.5 | 122.5 | tw |
| Philippines | 4.5 | 21.0 | 116.0 | 127.0 | ph |
| Indonesia | −11.0 | 6.5 | 95.0 | 141.0 | id, java, sumatra |
| Papua New Guinea | −11.5 | −1.0 | 140.0 | 156.0 | png |
| New Zealand | −48.0 | −33.0 | 165.0 | 179.5 | nz, aotearoa |
| China | 18.0 | 54.0 | 73.0 | 135.0 | cn |
| India | 6.0 | 36.0 | 68.0 | 97.5 | in |
| Nepal | 26.3 | 30.5 | 80.0 | 88.3 | np |
| Himalaya | 26.0 | 36.0 | 73.0 | 97.0 | himalayas |
| Kazakhstan | 40.5 | 55.5 | 46.5 | 87.5 | kz, qazaqstan |
| Central Asia | 35.0 | 45.0 | 55.0 | 80.0 | tien shan, pamir |
| Kyrgyzstan | 39.0 | 43.4 | 69.0 | 80.3 | kg, kyrgyz republic, kirgizia |
| Caucasus | 38.0 | 45.0 | 38.0 | 50.0 | caucasia |
| Iran | 25.0 | 40.0 | 44.0 | 63.5 | ir |
| Turkey | 35.5 | 42.5 | 25.5 | 45.0 | tr, türkiye, turkiye, anatolia |
| Greece | 34.0 | 42.0 | 19.0 | 29.5 | gr, aegean |
| Italy | 36.5 | 47.2 | 6.5 | 18.6 | it, italia |
| Mediterranean | 30.0 | 46.0 | −6.0 | 36.0 | med |
| Iceland | 62.5 | 67.5 | −25.5 | −13.0 | is |
region is free text, so the platform cannot pre-check it: the run resolves what you typed. California, california, CALIFORNIA, Turkiye and türkiye all work. Anything else ends the run at once with the closest names named ("Unknown region "Californa" (did you mean "California"?)"), never with a wider search than you asked for.
Kinds of event
The catalog is not only earthquakes: mining districts produce quarry blasts, glaciers produce ice quakes. Leave eventTypes empty for everything, or name the kinds you want. The catalog spells several of them two ways (quarry blast and quarry_blast); the run sends every spelling it knows for the kind you picked, so you get them all either way.
earthquake (aliases eq, quake) · quarry blast (quarry, blast) · mining explosion · explosion · chemical explosion · nuclear explosion (nuclear test) · industrial explosion · accidental explosion · experimental explosion · collapse · mine collapse · building collapse · rock burst · landslide · rockslide (rock slide) · debris avalanche · snow avalanche (avalanche) · ice quake (icequake, cryoseism) · volcanic eruption (eruption) · volcanic explosion · sonic boom (sonicboom) · acoustic noise · meteorite (meteor, bolide) · induced or triggered event (induced) · train crash · other event (other) · not reported
PAGER alert levels
PAGER is the USGS estimate of how bad an event was for people, computed from the shaking and the exposed population: green no significant losses expected, yellow local impact, orange a regional disaster, red a national one. Only a few dozen events a year get any alert at all, so minAlertLevel is the short list of quakes that hurt somebody. minAlertLevel: "yellow" keeps yellow, orange and red.
Review status
automatic is the solution a computer published within minutes of the event; reviewed is the record after a seismologist checked it, which can move the epicentre and change the magnitude by a few tenths. reviewStatus: "all" (the default) gives both, and every row carries its own status.
Magnitude types
magnitudeType says which scale the number comes from: mww and mw* moment magnitude (the standard for large events), mb body wave, ms_20 surface wave, ml/md local and duration magnitudes used for small regional quakes, mi/mwp rapid estimates, uk/Unknown where the contributing network did not say. Magnitudes from different scales are close but not identical, which is one reason a fresh event's number keeps moving.
Shaking: MMI and CDI
Both are Modified Mercalli intensities, 1 to 10+. mmi is what ShakeMap computes from instruments and models for the worst-shaken place; cdi is the strongest intensity the public reported through Did You Feel It. Either can be missing, and they often differ.
Examples
This week's significant earthquakes worldwide (M4.5+)
{ "sinceHours": 168, "minMagnitude": 4.5, "maxItems": 15 }
Everything within 300 km of central Tokyo in the last 90 days, with the distance per row
{ "latitude": 35.68, "longitude": 139.69, "radiusKm": 300, "sinceHours": 2160, "minMagnitude": 3.5, "maxItems": 15 }
California over the last 30 days, largest first, four columns only
{ "region": ["California"], "sinceHours": 720, "minMagnitude": 2.5, "sortBy": "magnitude", "fields": ["magnitude", "place", "depthKm", "time"], "maxItems": 15 }
The quakes people reported feeling, whatever their magnitude
{ "minFeltReports": 50, "sinceHours": 4320, "maxItems": 10 }
The PAGER alert list of 2026, biggest first
{ "startTime": "2026-01-01", "minAlertLevel": "yellow", "sortBy": "magnitude", "maxItems": 10 }
Three USGS event ids, resolved to rows
{ "eventIds": ["us6000u18k", "ci38457511", "official20110311054624120_30"] }
A scheduled watch on Kazakhstan and Central Asia that only reports what is new
{ "region": ["Kazakhstan", "Central Asia"], "sinceHours": 24, "onlyNew": true, "trackRevisions": true, "maxItems": 100 }
Output
One row per event. A real row from the cloud run Z5tKlj689yVfZ9rZa (an eventIds lookup of the M7.7 Panama earthquake of 9 October 2026):
{"eventId": "us6000u18k","time": "2026-10-09T17:56:06.036Z","place": "12 km WSW of Pitaloza Arriba, Panama","url": "https://earthquake.usgs.gov/earthquakes/eventpage/us6000u18k","fetchedAt": "2026-10-09T20:54:45.331Z","found": true,"updatedAt": "2026-10-09T20:49:31.001Z","magnitude": 7.7,"magnitudeType": "mww","title": "M 7.7 - 12 km WSW of Pitaloza Arriba, Panama","latitude": 7.5868,"longitude": -80.769,"depthKm": 12.647,"distanceKm": null,"alert": "red","tsunamiFlag": false,"significance": 2483,"feltReports": 568,"cdi": 8.5,"mmi": 8.714,"eventType": "earthquake","status": "reviewed","network": "us","detailUrl": "https://earthquake.usgs.gov/fdsnws/event/1/query?eventid=us6000u18k&format=geojson"}
| Field | Type | Meaning |
|---|---|---|
eventId | string | The catalog's id, the last part of an event page link. Always present. |
found | boolean | True for an event read from the catalog, false only on the marker row of an unknown eventIds value. Always present. |
time | string | Origin time, ISO 8601 UTC. Null only on a found: false row. |
updatedAt | string | When the catalog last changed the record, UTC. |
magnitude | number | Size on the scale in magnitudeType. Null for a few entries without one. |
magnitudeType | string | mww, mb, ml, … — see Magnitude types. |
place | string | The catalog's own description of the epicentre's location. |
title | string | Magnitude and place in one line, as USGS writes it. |
latitude, longitude | number | Epicentre in decimal degrees (north/east positive). |
depthKm | number | Depth below the surface in km; can be slightly negative. |
distanceKm | number | Great-circle km from the latitude/longitude in the input to the epicentre. Null when the run had no centre point. |
alert | string | PAGER level green/yellow/orange/red; null for the vast majority of events. |
tsunamiFlag | boolean | True when a tsunami message was issued for the event. |
significance | number | USGS sig score from magnitude, shaking, felt reports and impact. |
feltReports | number | Did You Feel It responses so far; null where nobody reported. |
cdi | number | Strongest shaking the public reported (MMI scale); null without felt reports. |
mmi | number | Strongest shaking ShakeMap estimates; null without a ShakeMap. |
eventType | string | earthquake or one of the other kinds. |
status | string | reviewed or automatic. |
network | string | Contributing seismic network code (us, ci, ak, …). |
url | string | The USGS event page. Always present. |
detailUrl | string | Event web service link returning this one event with all its products. |
fetchedAt | string | When the run read the catalog, UTC. Always present. |
Dataset views: Earthquakes (time, magnitude, place, depth, coordinates, alert, tsunami, felt reports, kind, link), Shaking and impact (alert, MMI, CDI, felt reports, significance, tsunami, solution, fetched), Epicentres (ids, coordinates, depth, distance, magnitude type, revision time, found).
A run also writes a SUMMARY record to its key-value store: what was searched, how many events matched the filters, how many rows were written, which ids were unknown, how many requests were made and why the run stopped.
Use it from code / agents
curl -X POST "https://api.apify.com/v2/acts/yadroo~usgs-earthquakes/run-sync-get-dataset-items?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"sinceHours":168,"minMagnitude":4.5,"maxItems":15}'
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('yadroo/usgs-earthquakes').call({latitude: 35.68, longitude: 139.69, radiusKm: 300, sinceHours: 2160, minMagnitude: 3.5, maxItems: 15,});const { items } = await client.dataset(run.defaultDatasetId).listItems();
from apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("yadroo/usgs-earthquakes").call(run_input={"eventIds": ["us6000u18k", "ci38457511"], "fields": ["magnitude", "place", "alert", "mmi"]})items = client.dataset(run["defaultDatasetId"]).list_items().items
MCP: add https://mcp.apify.com to Claude, Cursor or any MCP client and call the yadroo/usgs-earthquakes tool with the same JSON input. Agents see the field descriptions of the input schema, so region, eventIds and fields are usable without reading this page — and fields keeps the payload small, which matters when the answer goes into a context window.
Pricing
Pay per event: $0.001 per run start + $0.001 per earthquake row. Both are charged on the actor's free tier; Apify's plan discounts apply to the row event automatically (Bronze $0.0009, Silver $0.0008, Gold and above $0.0007).
| Run | Rows | Cost |
|---|---|---|
| This week's M4.5+ events | 15 | 0.001 + 15 × 0.001 = $0.016 |
| The default run (M2.5+, last week) | 50 | 0.001 + 50 × 0.001 = $0.051 |
| A 100-id lookup | 100 | 0.001 + 100 × 0.001 = $0.101 |
| The largest run the schema allows | 2000 | 0.001 + 2000 × 0.001 = $2.001 |
Every run is charged the start event, also a run that finds nothing. Every row written to the dataset is charged, including the found: false marker row of an eventIds value the catalog does not know — it is an answer, and the run says so in its status. maxItems is the hard cap on rows and so on cost; on top of it, Apify's Maximum cost per run stops the run when the budget is used up, keeping (and charging) only the rows already paid for and saying so in the run status: "Stopped at your spending limit: 3 rows delivered."
Limits & FAQ
Measured speed (2026-10-09, Apify cloud, 256 MB). A search run makes one counting request per area plus one request per 1 000 events, paced one request per second. Measured: the default run (50 rows, magnitude 2.5+, last week) took 5 s with 2 requests; the widest search the schema allows returned 1 345 rows in 12 s with 3 requests (magnitude 1+ worldwide for a week, maxItems 2000) — about 110 rows a second once a page arrives, and roughly 15 requests a minute at the actor's own pace. No HTTP 429 and no Retry-After was seen in any run. An eventIds lookup is the slow job, because each id is one request: about 1 id a second, so 100 ids need around 100 s. Everything the schema allows fits comfortably into the default run timeout of 900 s.
Rate limits. USGS publishes no request limit and no quota for this service (checked 2026-10-09), so this actor sets its own polite pace: one request per second per host, retries included, with exponential backoff and Retry-After honoured on HTTP 429 and 5xx. There is no robots.txt on the host (it answers 404), so there is no Crawl-delay to follow. A bigger run does not go faster — it just uses more one-second-apart requests.
The run stops before it is killed. If the clock or your spending limit runs out, the run ends successfully with the rows it has and says so in its status ("Stopped before the run timeout: N rows saved", "Stopped at your spending limit: N rows delivered") instead of being cut off without a word.
One query hands out at most 20 000 events. That is the service's own limit. The actor's maxItems goes to 2 000, so it never runs into it; when your filters match more than 20 000 events the run says so in the status and returns the newest (or largest, with sortBy: "magnitude") ones first. Narrow the window for the rest.
Magnitudes and epicentres change. A new event is published automatically within minutes and revised for hours or days: magnitude, depth, epicentre, alert level and felt count all move. status tells you whether a record is reviewed or still automatic, updatedAt when it last changed. A schedule with onlyNew alone delivers each event once, as first seen; add trackRevisions to receive it again with its corrected numbers (a new row, charged as a row).
Impact fields are rare. alert (PAGER) exists for a few dozen events a year. mmi needs a ShakeMap, cdi and feltReports need public reports, and almost no event before about 2010 has any of them. The tsunami flag means a message was issued, not that a wave arrived, and is empty for most older events.
Felt reports are US-heavy and keep growing. Did You Feel It is well known in the United States and little known elsewhere, so a Californian M3 can have more reports than a much larger quake abroad, and a count read an hour after an event is lower than the final one.
Detection is not uniform. The dense U.S. networks catalog quakes down to magnitude 0, while most of the world is complete only from about magnitude 4.5. Counting small quakes across regions therefore compares network density, not seismicity.
It is a catalog, not a warning system. No forecasts, no casualty figures, no building-level damage, no waveform data, and no alerting: a run reads what the catalog holds at that moment. For the non-earthquake entries (quarry blasts, explosions, ice quakes, landslides) use eventTypes; leave it empty and they are included.
Empty is a valid answer. Narrow filters — orange alerts in one month, M5+ in a quiet region — legitimately match nothing. The run then succeeds with zero rows and says "the filters matched nothing in that window", while a filter value it cannot resolve (a misspelled region) fails the run immediately with the closest values named.
The service can be slow exactly when you need it. USGS is busiest right after a large earthquake. The actor retries with backoff and, if it still cannot read, ends with a clear error instead of hammering the service.
Questions or problems: open an issue on the Issues tab of this actor.
Made by Yadroo. Sibling actors: nasa-eonet-events, nasa-asteroid-approaches, open-meteo-weather, osm-geocode, public-holidays.