# Hail Map & Storm Damage Reports: Roofing Leads (NWS) (`daperk/storm-damage-hail-reports`) Actor

Hail map data and storm damage reports from the National Weather Service: hail size, wind damage, tornado and flood reports by state, county or address. Roofing leads, hail history by address, hardest-hit counties. No API key. Pay per row.

- **URL**: https://apify.com/daperk/storm-damage-hail-reports.md
- **Developed by:** [Daniel Pena](https://apify.com/daperk) (community)
- **Categories:** Lead generation, Real estate, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 storm reports

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Hail Map & Storm Damage Reports: Roofing Leads (NWS)

Get **fresh hail, wind damage, tornado and flood reports** from the US National Weather Service, minutes after they are filed. Filter by state, hail size and date. Rank the **counties hit hardest**. Or paste a list of addresses and get a **hail and storm history for each one**.

No API key. No login. No proxy. The data is public domain.

Built for:

- **Roofing and exterior contractors** who need to know where hail fell last night, not 90 days later.
- **Paintless dent repair (PDR) and auto hail teams** chasing hail swaths.
- **Public adjusters, insurance and claims teams** who need to check "was there hail near this address, and when?"
- **Storm restoration marketers** planning door knocking, mailers and ads by county.
- **Real estate, property managers and inspectors** checking storm exposure of a property.
- **AI agents and MCP clients** that need a simple "storm history for this address" tool.

### Why this Actor

Most storm data tools on the Store read the NOAA Storm Events Database. That database is great for research, but it is published months after the storm. Contractors and adjusters need the reports from **today and yesterday**.

This Actor reads the **NWS Local Storm Reports (LSR)** feed, the same reports the NWS issues during and right after a storm (spotters, emergency managers, law enforcement, mPING, weather stations). It is updated in near real time and goes back more than 10 years.

| | This Actor | Typical NOAA Storm Events scrapers |
|---|---|---|
| Delay after a storm | Minutes | About 75 to 120 days |
| Hail size in inches + common name (Quarter, Golf ball...) | Yes | Partly |
| Counties ranked by damage | Yes | No |
| Storm history for an address | Yes (free US Census geocoder built in) | No |
| API key or proxy needed | No | Varies |

### Three modes

#### 1. Storm reports

One row per report. Example: every hail report of 1 inch or bigger in Texas and Oklahoma in the last 24 hours.

```json
{
  "mode": "reports",
  "states": ["TX", "OK"],
  "eventTypes": ["hail"],
  "minHailInches": 1,
  "lookbackHours": 24
}
```

Example row (real report):

```json
{
  "eventType": "HAIL",
  "timeUtc": "2026-05-19T03:37:00.000Z",
  "hailSizeInches": 1.75,
  "hailSizeName": "Golf ball",
  "windMph": null,
  "place": "4 NE Milan",
  "county": "Sumner",
  "state": "KS",
  "latitude": 37.32,
  "longitude": -97.64,
  "magnitudeQualifier": "Estimated",
  "reportSource": "Public",
  "remark": "Report from mPING: Golf Ball (1.75 in.).",
  "nwsOffice": "ICT",
  "mapUrl": "https://www.openstreetmap.org/?mlat=37.32&mlon=-97.64#map=12/37.32/-97.64"
}
```

#### 2. Hardest-hit counties

One row per county, ranked by a 0 to 100 severity score (big hail and tornadoes count the most). Great for deciding where to send crews or spend ad money.

```json
{
  "mode": "areas",
  "states": ["TX", "OK", "KS"],
  "startDate": "2026-05-01",
  "endDate": "2026-05-31"
}
```

Example row (real data, May 2026):

```json
{
  "county": "Sherman",
  "state": "KS",
  "severityScore": 81,
  "reportCount": 44,
  "hailReports": 34,
  "maxHailInches": 2.75,
  "maxHailName": "Baseball",
  "windDamageReports": 1,
  "windGustReports": 7,
  "maxWindMph": 82,
  "tornadoReports": 1,
  "firstReportUtc": "2026-05-16T22:29:00.000Z",
  "lastReportUtc": "2026-05-29T23:39:00.000Z",
  "topPlaces": ["Goodland", "13 NNW Ruleton"]
}
```

#### 3. Address storm history

Paste US addresses (or `lat,lon`). For each one you get the hail, wind and tornado reports within your radius, the biggest hail and its date, and the closest reports.

```json
{
  "mode": "locations",
  "locations": ["455 N Main St, Wichita, KS 67202", "32.7767,-96.7970"],
  "radiusMiles": 5,
  "historyDays": 1095,
  "minHailInches": 1
}
```

Example row (real report):

```json
{
  "input": "455 N Main St, Wichita, KS 67202",
  "matchedAddress": "455 N MAIN ST, WICHITA, KS, 67202",
  "stormFound": true,
  "hailReportsNearby": 18,
  "maxHailInches": 2.75,
  "maxHailName": "Baseball",
  "maxHailDateUtc": "2025-09-04T00:40:00.000Z",
  "maxHailDistanceMiles": 2.14,
  "windDamageReportsNearby": 18,
  "stormDays": 19,
  "nearestReportMiles": 0.49,
  "nearbyReports": [ { "timeUtc": "2025-06-17T22:08:00.000Z", "eventType": "TSTM WND DMG", "distanceMiles": 0.49, "place": "1 ESE Downtown Wichita", "remark": "Several powerlines down throughout the metro." } ]
}
```

Addresses that cannot be found come back as a row with an `error` message, and **you are not charged for them**.

### Input options

| Field | What it does |
|---|---|
| `mode` | `reports`, `areas` or `locations` |
| `states` | 2-letter codes. Empty = whole US (max 93 days per run). With states: up to 10 years |
| `eventTypes` | `hail`, `wind_damage`, `wind_gust`, `tornado`, `flood`, `tropical`, `lightning`, `winter`, `wildfire`, `other`, `all` |
| `minHailInches` | Skip smaller hail. 1.0 = quarter size |
| `minWindMph` | Skip weaker wind gusts. 58 = NWS severe |
| `lookbackHours` | Hours back from now (reports and areas) |
| `startDate` / `endDate` | Fixed period, `YYYY-MM-DD` in UTC |
| `locations` | Addresses or `lat,lon` (address mode, up to 500) |
| `radiusMiles` | Search radius around each address (0.5 to 50) |
| `historyDays` | Days back per address (up to 3650) |
| `maxResults` | Stop after this many charged rows |

### Pricing (pay per event)

You only pay for rows you get. No monthly fee.

| Event | Price | When it is charged |
|---|---|---|
| Storm report | $0.002 ($2 per 1,000) | Each report row in Storm reports mode |
| County summary | $0.01 | Each county row in Hardest-hit counties mode |
| Address storm check | $0.03 | Each address that was found and checked |
| Actor start | Apify default (tiny) | Once per run |

Rows with errors (bad address, lookup failed) are free. Set `maxResults` or a maximum cost per run in Apify to cap spend. The Actor stops cleanly when your cost limit is reached.

Example costs: 500 hail reports = $1.00. 50 counties = $0.50. 100 addresses = $3.00.

### What it costs for your business

Storm counts change a lot by season and region, so the table shows the cost for a given number of rows. Use `maxResults` or a max cost per run to cap spend.

| You are | Typical setup | If you get | You pay |
|---|---|---|---|
| Roofer covering 1 or 2 states | Storm reports, daily schedule, `lookbackHours: 24`, hail 1 inch and up | 1,000 reports in a month | $2.00 |
| Storm restoration marketer | Hardest-hit counties, weekly run | 4 runs of 25 counties | $1.00 |
| Public adjuster or claims team | Address storm history | 200 addresses in a month | $6.00 |
| Roof inspector or real estate team | Address storm history, before each visit | 50 addresses in a month | $1.50 |
| PDR or auto hail team | Storm reports, whole US, `lookbackHours: 48`, hail 1.75 inch and up | 500 reports in a month | $1.00 |
| Developer or AI agent | Any mode through the Apify API or MCP | 10,000 reports | $20.00 |

Prices: $0.002 per storm report, $0.01 per county, $0.03 per address that was found and checked. Bad addresses and failed lookups are free. Apify adds its small default fee for each run start.

**When something else is a better fit**

- You only want yesterday's reports on a map and do not need filters or exports. The NWS Storm Prediction Center posts free daily storm report pages and CSV files at spc.noaa.gov/climo/reports.
- You need a hail swath map (where hail fell between reports). This Actor gives you report points, not swaths. Radar based hail map services cover that.
- You need research grade, final storm records. Use the NOAA Storm Events Database. It comes out months later but it is the official record.

### Use it from AI agents (MCP)

This Actor works well as a tool for Claude, ChatGPT, Cursor and other MCP clients through the Apify MCP server. Good prompts:

- "Which counties in Texas got hail bigger than 1.5 inches in the last 48 hours?"
- "Check the hail history for these 20 addresses over the last 3 years."
- "Was there wind damage within 5 miles of 32.78,-96.80 in May 2026?"

Inputs are simple, outputs are flat JSON, and failed lookups are free, so agents can call it safely.

### Schedule it

Run it every morning with `lookbackHours: 24` and send the dataset to Google Sheets, Slack, email, Zapier or Make with Apify integrations. You get a daily storm list for your service area.

### Data source and legal notes

- Storm reports: **NWS Local Storm Reports**, served by the [Iowa Environmental Mesonet](https://mesonet.agron.iastate.edu/request/gis/lsrs.phtml) at Iowa State University. The IEM states its data is public domain. Credit to the IEM is appreciated and is included in every run summary.
- Address lookup: the free public [US Census Bureau Geocoder](https://geocoding.geo.census.gov/geocoder/). US addresses only.
- The Actor only uses official public data endpoints. No login, no scraping of private pages, no personal data. The addresses you send are only used for the lookup.
- This Actor is independent. It is not made by or endorsed by NOAA, the NWS, Iowa State University or the US Census Bureau.

### Limits and honest notes

- **Local Storm Reports are preliminary.** They are what people saw and measured. They are not official damage surveys and some storms are never reported. Use them as a strong signal, not as proof of damage.
- Reports are **points**, not hail swath maps. A report 4 miles away means hail was seen 4 miles away. Bigger radius = more reports, less certainty.
- US and territories only.
- Whole-US runs are limited to 93 days so responses stay fast. Pick states for longer periods.

### How to find where hail hit yesterday

Pick your states, set a minimum hail size (for example 1 inch) and a lookback of 24 or 48 hours. You get every hail report with size, time, city, county and coordinates, ready to drop on a map or into your CRM for next-morning door knocking.

### How to check hail history for an address

Switch to address mode and paste US addresses. For each one you get the biggest hail nearby, the date, the distance and the nearest storm reports. Useful for roof inspections, insurance claims and real estate checks.

### How to get roofing leads from storm data

Use the hardest-hit counties mode to rank counties by a 0 to 100 severity score, then target those ZIP codes with door knocking, mailers or ads. Schedule the Actor daily to get new hail swaths as soon as the NWS posts them.

### Free hail map data (NOAA / NWS)

Looking for a hail map, a live hail tracker or a hail report map for Texas, Colorado or anywhere in the USA? Every hail report comes with latitude and longitude, hail size and time, straight from the National Weather Service (part of NOAA). Export to CSV and drop it into Google My Maps, a CRM map or a canvassing app to build your own hail damage map for free.

### FAQ

**How fresh is the data?** New NWS reports usually show up within minutes of being issued.

**How far back can I go?** More than 10 years with states selected. Address mode up to 10 years.

**Why is a hail size like 1.75?** NWS reports hail in inches. We add the common name (1.00 Quarter, 1.75 Golf ball, 2.75 Baseball).

**Can I get homeowner names or phone numbers?** No. This Actor does not collect personal data.

**Times are in UTC?** Yes. Storms in the evening in the US often show up with the next day's UTC date.

### Changelog

- 0.1: First release. Storm reports, hardest-hit counties, address storm history.

**Related searches:** hail map, hail reports, hail history by address, storm damage reports, roofing leads, hail storm data api, nws local storm reports, wind damage reports, tornado reports, storm restoration leads, hail tracker, paintless dent repair leads, insurance hail claims data, hail map noaa, hail map live, hail report map, hail damage map, free hail maps, hail map texas, hail map usa, how to get roofing leads.

# Actor input Schema

## `mode` (type: `string`):

<b>Storm reports</b>: one row per report (hail, wind, tornado...). <b>Hardest-hit counties</b>: one row per county with counts, biggest hail and a severity score. <b>Address storm history</b>: one row per address with hail and wind found nearby.

## `states` (type: `array`):

Leave empty for the whole US (max 93 days). With states you can go back up to 10 years. Not used in address mode.

## `eventTypes` (type: `array`):

Which kinds of storm reports to keep.

## `minHailInches` (type: `number`):

Skip smaller hail. 1.0 = quarter size, the size where roof damage usually starts. 1.75 = golf ball. 0 = keep all hail.

## `minWindMph` (type: `integer`):

Skip weaker wind gust reports. 58 mph is the NWS severe level. Wind damage reports are always kept.

## `lookbackHours` (type: `integer`):

For reports and counties: how far back from now. Default 720 = last 30 days. Use 24 or 48 for fresh overnight storms. Ignored if you set a start date.

## `startDate` (type: `string`):

Use a fixed period instead of look back. Format YYYY-MM-DD (UTC).

## `endDate` (type: `string`):

Last day to include (UTC). Empty = up to now.

## `locations` (type: `array`):

Address storm history mode only. One per line. A full US address (street, city, state, ZIP) or "lat,lon" like 32.78,-96.80. Up to 500 per run.

## `radiusMiles` (type: `number`):

Count storm reports within this distance of each address. Reports are point reports, so 3 to 10 miles works well.

## `historyDays` (type: `integer`):

How many days back to search for each address. 365 = last year. Max 3650 (10 years). Ignored if you set a start date.

## `maxNearbyReports` (type: `integer`):

How many of the closest reports to include in each address row.

## `maxResults` (type: `integer`):

Stop after this many charged rows. Use it to control cost.

## `requestDelayMs` (type: `integer`):

Polite pause between calls to the free public data service.

## Actor input object example

```json
{
  "mode": "reports",
  "states": [
    "TX",
    "OK",
    "CO"
  ],
  "eventTypes": [
    "hail",
    "wind_damage",
    "wind_gust",
    "tornado"
  ],
  "minHailInches": 0,
  "minWindMph": 0,
  "lookbackHours": 720,
  "locations": [
    "455 N Main St, Wichita, KS 67202",
    "32.7767,-96.7970"
  ],
  "radiusMiles": 5,
  "historyDays": 365,
  "maxNearbyReports": 10,
  "maxResults": 1000,
  "requestDelayMs": 1000
}
```

# Actor output Schema

## `reports` (type: `string`):

Hail, wind and tornado reports with time, place and size.

## `areas` (type: `string`):

Counties ranked by number and size of reports.

## `locations` (type: `string`):

Reports near each address you entered.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "states": [
        "TX",
        "OK",
        "CO"
    ],
    "locations": [
        "455 N Main St, Wichita, KS 67202",
        "32.7767,-96.7970"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("daperk/storm-damage-hail-reports").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "states": [
        "TX",
        "OK",
        "CO",
    ],
    "locations": [
        "455 N Main St, Wichita, KS 67202",
        "32.7767,-96.7970",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("daperk/storm-damage-hail-reports").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "states": [
    "TX",
    "OK",
    "CO"
  ],
  "locations": [
    "455 N Main St, Wichita, KS 67202",
    "32.7767,-96.7970"
  ]
}' |
apify call daperk/storm-damage-hail-reports --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,daperk/storm-damage-hail-reports"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/YQnwwDha4huGb9vs4/builds/YPtNACdNlQxPj9GCm/openapi.json
