US Storm Reports API: Hail, Wind & Tornado (NWS) avatar

US Storm Reports API: Hail, Wind & Tornado (NWS)

Pricing

from $3.00 / 1,000 storm report rows

Go to Apify Store
US Storm Reports API: Hail, Wind & Tornado (NWS)

US Storm Reports API: Hail, Wind & Tornado (NWS)

Get U.S. hail, wind, tornado and flood reports from official NWS Local Storm Reports within hours (last 7 days): time, hail size or wind speed, lat/lon, county. Filter by state or radius for roofing storm leads, insurance and AI agents. No API key; JSON/CSV, API or MCP; $3 per 1,000.

Pricing

from $3.00 / 1,000 storm report rows

Rating

0.0

(0)

Developer

Japan Open Data

Japan Open Data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

11 hours ago

Last modified

Categories

Share

US Storm Reports API: Hail, Wind & Tornado Reports from the NWS (Last 7 Days)

Get the latest U.S. hail, wind, tornado and flood reports from the National Weather Service as clean JSON, one row per report, within hours of the storm. Each row has time, event type, hail size or wind speed, latitude/longitude, county, state and report source, taken from the NWS's preliminary Local Storm Reports (LSR); filter by state, point and radius, event type or minimum size. Last 7 days, no API key, no login.

  • Storm reports within hours, not months. NWS offices publish Local Storm Reports during and right after a storm, from trained spotters, emergency managers, law enforcement, mesonet stations and the public. This Actor reads them straight from the official NWS API (api.weather.gov).
  • Every storm type in one flat table: hail (inches), thunderstorm wind gusts (mph or knots) and wind damage, tornadoes, funnel clouds, floods and flash floods, heavy rain, snow and ice.
  • Search where it matters: by state (["TX", "OK"]), or around your office, a customer or a property with latitude, longitude and radiusMiles — each row then shows its distance in miles.
  • Clean, de-duplicated rows. Corrected and summary NWS products repeat earlier reports; each report is returned once, in its newest version.
  • Pay only for reports found. "Nothing found" and error rows are free.

What can you do with US Storm Reports?

  1. Roofing, siding and restoration contractors — storm leads the next morning. Run it after a storm night to see where 1"+ hail or 60+ mph winds and tree damage were reported, which counties and towns were hit, and how far they are from your office. Schedule it daily and send the rows to Google Sheets, a CRM or Slack.
  2. Insurance, adjusters and claims teams — early loss triage. See which counties had hail, wind damage, tornadoes or flash floods in the last few days, before official damage surveys and the NOAA Storm Events Database are published (that takes months). Use productUrl to open the original NWS report.
  3. Utilities, logistics, property managers and AI agents — "what happened near me?" Check storm reports around sites, warehouses, routes or rental properties. An AI agent can answer "Was there hail or wind damage within 25 miles of Denver in the last 48 hours?" with one call.

Need hail history for past years at a specific address instead of the last 7 days? Use US Hail History by Location (radar-based hail days back to 1995). The two Actors work well together: this one tells you where storms hit this week, US Hail History tells you how often a place was hit before.

How to use

  1. Click Start with the default input: you get the 50 newest hail and wind reports in the U.S. from the last 72 hours.
  2. Narrow it down: set states, or a point (latitude, longitude) and radiusMiles.
  3. Pick eventTypes (e.g. only hail) and minimum sizes (e.g. minHailInches: 1, minWindMph: 58).
  4. Download the results as JSON, CSV or Excel, or call the Actor from the API / MCP (see below).
  5. For daily storm leads, create a Schedule in Apify Console (e.g. every morning at 7:00 with hoursBack: 24).

Input

Nothing is required. Every field has a default.

InputTypeDefaultWhat it does
stateslist of 2-letter codesall statese.g. ["TX", "OK", "KS"]
latitude, longitudenumbernoneCenter of a search circle in decimal degrees (U.S. longitudes are negative)
radiusMilesnumber50Radius around the point, 1–500 miles
eventTypeslist["hail", "wind"]hail, wind, tornado, flood, rain, winter, other; empty list = all
hoursBackinteger72How far back to look, 1–168 hours (7 days)
minHailInchesnumber0e.g. 1 (quarter size) or 1.75 (golf ball)
minWindMphnumber0e.g. 58 (severe); when set, wind damage reports without a speed are left out
maxResultsinteger50Newest reports first, 1–5000

Input example

Hail of 1 inch or larger within 250 miles of Denver, CO, in the last 7 days:

{
"latitude": 39.7392,
"longitude": -104.9903,
"radiusMiles": 250,
"eventTypes": ["hail"],
"minHailInches": 1,
"hoursBack": 168,
"maxResults": 5
}

Output

One row per storm report, newest first. Every row has status (ok, not_found or error).

Output example

Real output from the input above (cloud run on 2026-09-19, 3 reports found). The first row:

{
"status": "ok",
"eventTime": "2026-09-18T23:45:00Z",
"eventTimeLocal": "2026-09-18T17:45:00-06:00",
"eventType": "Hail",
"eventCategory": "hail",
"eventCode": "Hail",
"magnitude": 1,
"magnitudeUnit": "inch",
"magnitudeQualifier": "measured",
"latitude": 40.31,
"longitude": -108.65,
"location": "6 NNW Massadona",
"county": "Moffat",
"state": "CO",
"source": "Cocorahs",
"remarks": "Maximum hail size 1.00 inch, average hail size 0.50 inch.",
"distanceMiles": 197.59,
"wfo": "GJT",
"productId": "29077392-94f0-4958-b65f-cf9a0dd07594",
"productUrl": "https://api.weather.gov/products/29077392-94f0-4958-b65f-cf9a0dd07594",
"issuedAt": "2026-09-19T00:35:00Z",
"dataSource": "NOAA National Weather Service, preliminary Local Storm Reports (api.weather.gov); public domain; not affiliated with or endorsed by NOAA/NWS"
}

All 3 rows of that run:

Event time (local)TypeSizePlaceCounty, stateSourceDistance
2026-09-18 17:45 MDTHail1.0 in (measured)6 NNW MassadonaMoffat, COCocorahs197.6 mi
2026-09-18 16:30 MDTHail1.0 in (measured)DinosaurMoffat, COCocorahs215.6 mi
2026-09-17 19:56 MDTHail1.5 in (measured)9 ESE BroadwaterMorrill, NEStorm Chaser172.9 mi

With the default input (all states, hail + wind, 72 hours), the same day's cloud run returned 50 rows (46 wind, 4 hail) from SC, WY, KS, CO, TN, NE, NC and KY, for example:

Event time (UTC)TypeSizePlaceCounty, stateSourceRemarks
2026-09-19 02:40Thunderstorm Wind Damage7 NW TroyAbbeville, SCLaw EnforcementTree in roadway on Highway 28 near intersection of Bethia Road. Time estimated.
2026-09-19 01:59Thunderstorm Wind Gust62 mph (measured)2 SW HarrisonSioux, NEPublicPersonal weather station.
2026-09-19 01:47Thunderstorm Wind Gust60 mph (measured)2 E TorringtonGoshen, WYASOSASOS station KTOR Torrington Airport - Tor.
2026-09-19 00:09Thunderstorm Wind Gust69 mph (measured)9 NNW McdonaldCheyenne, KSPublic
2026-09-18 23:23Thunderstorm Wind Damage7 S WheelerCheyenne, KSEmergency MngrEM reports several power poles snapped with lines in the road. …
2026-09-18 22:30Hail1.0 in (measured)DinosaurMoffat, COCocorahsMaximum hail size of 1.00 inch, did cause some damage to car roofs …

When nothing matches, or the input is invalid, you get one free row that says what to change (real output):

{
"status": "not_found",
"error": "No NWS Local Storm Reports matched (hail reports in the last 72 hours in HI hail at least 5 in); widen \"eventTypes\", \"hoursBack\" (max 168), the area or the minimum sizes.",
"dataSource": "NOAA National Weather Service, preliminary Local Storm Reports (api.weather.gov); public domain; not affiliated with or endorsed by NOAA/NWS"
}

Output fields

FieldMeaning
statusok, not_found or error
eventTime, eventTimeLocalWhen the event happened, in UTC and in the NWS office's local time
eventType, eventCategory, eventCodeReadable NWS event name (e.g. "Thunderstorm Wind Gust"), the filter category (hail, wind, tornado, flood, rain, winter, other) and the original NWS code (e.g. Tstm Wnd Gst)
magnitude, magnitudeUnit, magnitudeQualifierHail size (inch), wind speed (mph or knot), EF rating, rain/snow amount etc.; measured or estimated. Empty for damage reports without a number
latitude, longitude, location, county, stateWhere it happened (NWS gives coordinates to 0.01°, about 1 km)
sourceType of reporter, e.g. "Trained Spotter", "Mesonet", "Law Enforcement", "Public" — never a person's name
remarksNWS free-text remarks (see privacy note below)
distanceMilesDistance from your point, when you search around a point
wfo, productId, productUrl, issuedAtNWS office, and the original NWS product the report came from
dataSourceSource and license note
errorOn not_found / error rows: one sentence explaining what to change

How much does it cost to get storm reports?

This Actor uses Pay per event pricing — you pay for storm reports returned, not for compute time.

EventPriceWhen
Storm report row (result-row)$0.003 per row ($3 per 1,000)Each ok row = one storm report
Actor start (apify-actor-start)$0.001 per runOnce at the start of each run
  • not_found and error rows are free.
  • Default run (50 newest U.S. hail and wind reports): about $0.15.
  • "Hail near Denver this week" (the example above, 3 reports): about $0.01.
  • A daily storm-lead check for one state, 30 reports a day: about $0.09 per day, $2.80 per month — no monthly subscription.
  • 1,000 storm reports: $3.
  • Set a maximum cost per run when you start the Actor to cap spending; if it is reached, the Actor stops cleanly and says so in the status message.

Use via API / MCP (AI agents)

Apify API (HTTP). Run the Actor and get the rows in one call:

curl -X POST "https://api.apify.com/v2/acts/japan-open-data~us-storm-reports-live/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"states": ["TX", "OK"], "eventTypes": ["hail"], "minHailInches": 1, "hoursBack": 48}'

Python (apify-client):

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("japan-open-data/us-storm-reports-live").call(run_input={
"latitude": 32.7767, "longitude": -96.797, "radiusMiles": 50,
"eventTypes": ["hail", "wind", "tornado"], "hoursBack": 24,
})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
print(row["status"], row.get("eventTime"), row.get("eventType"), row.get("magnitude"), row.get("location"), row.get("distanceMiles"))

MCP (Claude, ChatGPT, Cursor and other AI agents). Add this Actor as a tool through the Apify MCP server (https://mcp.apify.com), for example with ?tools=japan-open-data/us-storm-reports-live. No field is required, so an agent can call it with {} or with just a state or a point.

Recommended agent settings:

  • "Any hail near X recently?" → {"latitude": <lat>, "longitude": <lon>, "radiusMiles": 25, "eventTypes": ["hail"], "hoursBack": 72}.
  • "Where was the damage last night in Texas?" → {"states": ["TX"], "eventTypes": ["hail", "wind", "tornado"], "hoursBack": 24, "maxResults": 100}.
  • Damaging storms only → minHailInches: 1 and minWindMph: 58.
  • Keep maxResults small (10–50) for chat answers; each row is charged.
  • Always check status; on not_found / error show the error sentence to the user. Tell users these are preliminary reports.
  • For past years at one address, call US Hail History by Location instead.

FAQ

How far back can I get storm reports? About 7 days (hoursBack up to 168). That is how long the NWS API keeps Local Storm Report products. For older hail data use US Hail History by Location; for older confirmed events of all types, NOAA's Storm Events Database is published months later.

How fresh is the data? NWS offices issue Local Storm Reports during and shortly after storms, usually within minutes to a few hours. Each run reads the current NWS product list, so you get what has been published up to that moment.

Are the reports official and final? They are official NWS products but preliminary: sizes, times and places can be corrected, and they are later quality-controlled for the Storm Events Database. When NWS issues a correction, this Actor returns the corrected version.

Can I search by street address? Not directly. Convert the address to latitude/longitude first (for example with the free U.S. Census Bureau geocoder) and use latitude, longitude and radiusMiles.

Is it legal to use this data commercially? Yes. Information from the NWS API is published as open data, free to use for any purpose, and NWS information is in the public domain. This Actor only reads the official API, identifies itself in the User-Agent and keeps its request count small.

Known limitations

  • Last 7 days only (see FAQ). This is not a historical archive.
  • Preliminary reports. Not every storm is reported, and a missing report does not mean nothing happened.
  • Up to 400 NWS products per run. Very wide searches (all states, all event types, 7 days) may stop before the oldest reports; the status message then says so. Narrow the area (states or a point + radius) to go further back.
  • Corrections. Corrected reports are matched by NWS office, event category and place name; in rare cases where NWS also changes the place name, both versions may appear.
  • Remarks privacy filter. remarks is left empty (null) when it contains something that looks like a street address, contact details, a personal weather station or radio ID (e.g. Ambient, WeatherLink, CWOP, call signs) or a person's name. This cautious filter drops roughly 3–4% of remarks, some of them harmless.
  • Coordinates are rounded by NWS to 0.01° (about 1 km), and location is given as "distance + direction + town" (e.g. "7 NW Troy"), not a street address.

Data source and license

  • Source: NOAA National Weather Service API, Local Storm Report (LSR) products — https://api.weather.gov/products/types/LSR (API documentation).
  • License: NWS information is in the public domain (NWS disclaimer). Every row includes dataSource, and productUrl links to the original NWS product.
  • Not affiliated: this Actor is an independent project and is not affiliated with, endorsed by or sponsored by NOAA or the National Weather Service. It does not use NOAA or NWS logos. The data is reformatted (parsed, filtered, de-duplicated) and is not an official NWS publication.
  • No personal data: source is a reporter type only, and remarks that look like personal information are removed (see above).

More from Japan Open Data

Feedback

Found a wrong value, a missing report type, or need another filter (e.g. by county or NWS office)? Open an issue on the Actor's Issues tab with your input and what you expected. If the Actor is useful to you, a short review helps others find it.