# US Hail & Storm Damage Reports (NWS + NOAA Radar Hail) (`supplemental_gorse/us-hail-storm-reports`) Actor

Daily US hail, wind and tornado reports from official NWS Local Storm Reports, plus optional NOAA NEXRAD radar hail footprints. Filter by state, date, hail size, wind speed or radius around a point. For roofing, restoration, auto-hail repair, insurance and public adjusters.

- **URL**: https://apify.com/supplemental_gorse/us-hail-storm-reports.md
- **Developed by:** [Calvin Torng](https://apify.com/supplemental_gorse) (community)
- **Security:** Limited permissions
- **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 records

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

## US Hail & Storm Damage Reports (NWS + NOAA Radar Hail)

Get every **hail, damaging-wind and tornado report** in the US for any date range, state, or radius around your service area, as clean JSON, CSV or Excel. Each run can also add **NOAA NEXRAD radar hail footprints**, which catch hail that nobody phoned in, and **county-by-day roll-ups**.

Built for **roofing and exterior contractors, storm-restoration and paintless-dent-repair crews, public adjusters, insurers, storm-marketing agencies, and AI agents**.

### What you get

| Record type | Source | What's in it |
|---|---|---|
| `storm_report` | Official **NWS Local Storm Reports**, the ground-truth reports from spotters, law enforcement, the public and NWS offices, served by the Iowa Environmental Mesonet (Iowa State University) | Time (UTC), state, county, place ("2 N Garland"), lat/lon, hail size (inches + "golf ball" label), wind mph, NWS severe flag, measured/estimated, who reported it, the NWS remark ("roof blown off a barn"), the NWS product link, and a map link |
| `radar_hail_cell` (optional) | **NOAA NEXRAD Level-III hail signatures** via the NCEI Severe Weather Data Inventory | Grid cell (~7 mi) per day with max radar-estimated hail size, severe-hail probability, number of detections, first/last time, and radar sites |
| `county_summary` (optional) | Roll-up of the reports returned | Per county per day: report counts, max hail, max wind, first/last time, sample places |

All data is US-government or university **public-domain** weather data. No personal data, no logins, no proxies.

### Example uses

- "Every hail ≥ 1 inch in Texas and Oklahoma in the last 3 days" → a daily scheduled run for canvassing routes
- "Anything severe within 40 miles of my shop last night" → a center point plus radius
- Insurance or claims checks: "was there hail at this location on this date?"
- Feed an AI agent or CRM with fresh storm counties every morning

### Input

| Field | Default | Notes |
|---|---|---|
| `states` | all | 2-letter codes, e.g. `["TX","OK"]` |
| `lastDays` | 3 | Used when `startDate` is empty |
| `startDate` / `endDate` | — | `YYYY-MM-DD` (UTC), end inclusive, max 31 days per run |
| `eventCategories` | hail, wind, tornado | Also flood, winter, marine, other |
| `minHailInches` | 0 | 1.0 = quarter size (NWS severe threshold) |
| `minWindMph` | 0 | Wind-damage reports without a speed are kept |
| `severeOnly` | false | Hail ≥ 1", wind ≥ 58 mph or wind damage, or a tornado |
| `centerLat` / `centerLon` / `radiusMiles` | — / — / 25 | Radius filter; adds `distanceMiles` |
| `includeRadarHail` | false | Needs `states` or a center point |
| `minRadarHailInches` / `minRadarSevereProb` / `radarGridDegrees` | 1.0 / 50 / 0.1 | Radar thresholds |
| `includeCountySummary` | true | |
| `sortBy` | newest | `newest`, `largestHail`, `nearest`. Ground reports always come before radar cells |
| `maxItems` | 50 | Cap on storm records (ground + radar) |

```json
{ "states": ["TX","OK"], "lastDays": 3, "minHailInches": 1, "severeOnly": true, "includeRadarHail": true, "maxItems": 50 }
```

### Output example

```json
{
  "recordType": "storm_report",
  "eventType": "HAIL",
  "occurredAtUtc": "2026-05-20T22:58:00Z",
  "state": "TX", "county": "Brewster", "location": "5 NE Marathon",
  "lat": 30.25, "lon": -103.2,
  "hailSizeInches": 1.75, "hailSizeLabel": "golf ball",
  "meetsNwsSevereCriteria": true, "measurement": "measured",
  "reportedBy": "Other Federal",
  "remark": "Report from the IBHS Hail Field Research team measured hailstones up to 1.89 inches.",
  "nwsProductUrl": "https://mesonet.agron.iastate.edu/p.php?pid=202605221126-KMAF-NWUS54-LSRMAF",
  "mapUrl": "https://www.google.com/maps?q=30.25,-103.2"
}
```

### Pricing

Pay per event: you pay per **storm record** saved and per **county summary** saved, plus a tiny Apify start fee. There is no monthly contract. Set a max cost per run in Apify Console, and the Actor stops cleanly when it is reached. See the price on this page's pricing tab.

### Good to know

- **Preliminary data.** Local Storm Reports are preliminary and NWS can correct them later. Times are UTC.
- **Radar hail is an estimate.** NEXRAD maximum hail size comes from an algorithm and often runs larger than what reaches the ground. Use it to find likely footprints and confirm with ground reports.
- Radar cells are scoped with approximate state bounding boxes, so cells near a state line can belong to the neighbouring state. Ground reports carry their exact state.
- Coverage depends on who reported: rural hail can be missing from ground reports but present on radar.
- Not for life-safety use. For active warnings, use weather.gov.

### Data sources and credits

- NWS Local Storm Reports via the [Iowa Environmental Mesonet](https://mesonet.agron.iastate.edu/) (Iowa State University). Public domain, attribution appreciated ([disclaimer](https://mesonet.agron.iastate.edu/disclaimer.php)).
- NOAA NCEI [Severe Weather Data Inventory](https://www.ncei.noaa.gov/products/severe-weather-data-inventory) (NEXRAD `nx3hail`).

This Actor is not affiliated with or endorsed by NOAA, NWS or Iowa State University.

# Actor input Schema

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

2-letter state codes, e.g. TX, OK, CO. Leave empty for all US states.

## `lastDays` (type: `integer`):

Used when Start date is empty: look back this many days from now (UTC).

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

Optional. YYYY-MM-DD. Overrides 'Last N days'. Max range per run: 31 days.

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

Optional. YYYY-MM-DD. Defaults to now.

## `eventCategories` (type: `array`):

Which report types to include.

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

Drop hail reports smaller than this. 1.0 = quarter size (NWS severe threshold). 0 = keep all.

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

Drop wind reports with a measured/estimated speed below this. Wind-damage reports without a speed are kept. 0 = keep all.

## `severeOnly` (type: `boolean`):

Keep only reports meeting NWS severe criteria: hail >= 1 in, wind >= 58 mph or wind damage, or a tornado.

## `centerLat` (type: `number`):

Optional. With Center longitude and Radius, keep only reports near a point (e.g. your service area).

## `centerLon` (type: `number`):

Negative for the US, e.g. -97.52 for Oklahoma City.

## `radiusMiles` (type: `integer`):

Search radius around the center point. Default 25.

## `includeRadarHail` (type: `boolean`):

Adds NEXRAD radar hail signatures (NCEI SWDI), aggregated per day into ~7-mile grid cells. Catches hail that nobody phoned in. Needs States or a center point.

## `minRadarHailInches` (type: `number`):

Radar-estimated maximum hail size threshold.

## `minRadarSevereProb` (type: `integer`):

NEXRAD probability of severe hail threshold.

## `radarGridDegrees` (type: `number`):

Cell size for aggregating radar detections. 0.1 deg is roughly 7 miles.

## `includeCountySummary` (type: `boolean`):

Adds one roll-up row per county per day (counts, max hail, max wind) for the reports returned.

## `sortBy` (type: `string`):

Order of records before Max items is applied.

## `maxItems` (type: `integer`):

Maximum storm records (ground reports + radar cells) to save. Keeps cost predictable.

## Actor input object example

```json
{
  "states": [
    "TX",
    "OK"
  ],
  "lastDays": 3,
  "eventCategories": [
    "hail",
    "wind",
    "tornado"
  ],
  "minHailInches": 0,
  "minWindMph": 0,
  "severeOnly": false,
  "radiusMiles": 25,
  "includeRadarHail": false,
  "minRadarHailInches": 1,
  "minRadarSevereProb": 50,
  "radarGridDegrees": 0.1,
  "includeCountySummary": true,
  "sortBy": "newest",
  "maxItems": 50
}
```

# Actor output Schema

## `overview` (type: `string`):

Default dataset items: NWS ground storm reports, optional NOAA radar hail cells, and county-day summaries.

# 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"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("supplemental_gorse/us-hail-storm-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",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("supplemental_gorse/us-hail-storm-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"
  ]
}' |
apify call supplemental_gorse/us-hail-storm-reports --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,supplemental_gorse/us-hail-storm-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/SBgvsmhTFKyee4IgC/builds/HmlemhOJwPpz4bCOM/openapi.json
