# Hail Storm Reports with ZIP Codes (NOAA) (`flecked_coffee/hail-storm-reports`) Actor

Every hail and damaging-wind report from NOAA's Storm Prediction Center, with hail size in inches, local time, county, and the ZIP codes around each report. Filter by state, size, or miles from a ZIP. Built for roofing and restoration lead lists.

- **URL**: https://apify.com/flecked_coffee/hail-storm-reports.md
- **Developed by:** [Jordon Penninger](https://apify.com/flecked_coffee) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.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 Storm Reports with ZIP Codes (NOAA)

Every hail report (and, if you want, every damaging-wind report) that the National Weather Service logged, with the **ZIP codes around each one**. Pick states, a minimum hail size, or a radius around your shop's ZIP code, and get a clean table you can turn into a door-knocking or mailer list the same day.

Built for **roofing, gutter, siding, auto hail repair and restoration companies**, and the lead-gen agencies that work for them.

### What you get

One row per storm report:

| Field | Example |
|---|---|
| `localTime` | 2026-05-28 5:30 PM EDT |
| `type` | Hail / Wind damage |
| `hailSizeInches`, `hailSizeName` | 1.75, golf ball |
| `windMph` | 65 (blank for damage reports with no measured gust) |
| `location`, `county`, `state` | 2 W Matthews, Mecklenburg, NC |
| `zipCode` | 28105 (nearest ZIP code) |
| `nearbyZips` | 28105, 28104, 28227 (ZIP codes within 5 miles; you set the radius) |
| `comments` | "Golf ball hail covering the ground." |
| `nwsOffice` | GSP |
| `latitude`, `longitude`, `mapUrl` | 35.12, -80.75, Google Maps link |

### Example inputs

Yesterday and today's quarter-size-or-bigger hail in Texas, Oklahoma and Colorado, without wind reports:

```json
{ "daysBack": 2, "states": ["TX", "OK", "CO"], "minHailSize": "1", "includeWind": false }
```

With no input it returns the last 7 days of quarter-size-and-up hail and wind damage nationwide, capped at 200 reports.

Golf-ball hail within 75 miles of your shop over the last month, plus wind damage:

```json
{ "daysBack": 30, "nearZip": "75201", "radiusMiles": 75, "minHailSize": "1.75", "includeWind": true }
```

A past storm season for a market study:

```json
{ "startDate": "2025-03-01", "endDate": "2025-08-31", "states": ["CO"], "minHailSize": "1.25" }
```

### Where the data comes from

The **NOAA Storm Prediction Center's preliminary local storm reports**, the same feed the weather service, insurers and news use. Reports come from NWS offices, trained spotters, emergency managers and the public, and show up within minutes of a storm. Files go back to 2004.

ZIP codes come from the **U.S. Census Bureau's ZIP Code Tabulation Area** centers: a ZIP code is "nearby" when its center is within your radius of the report.

### Good to know

- A storm day runs **noon to noon UTC** (8 a.m. to 8 a.m. Eastern in summer), which is how NOAA files reports. An evening storm and its after-midnight reports land on the same day.
- Reports are **preliminary**: NOAA sometimes corrects a size or location a day or two later, and not every storm gets a report. A report marks a point; the hail swath around it can run several miles.
- This Actor reads public government data only. It doesn't include homeowner names or contact details.

### Pricing

Pay per result: you're charged only for the reports returned. Set **Max results** to cap a run.

### Want it in your inbox instead?

**Hail Alerts** from Flecked Coffee emails you new hail and wind-damage reports around your shop twice a day, with the ZIP codes to work. See https://apify.com/flecked_coffee or email fleckedcoffee@gmail.com.

# Actor input Schema

## `daysBack` (type: `integer`):

How many storm days to read, ending today. A storm day runs noon to noon UTC (8 a.m. to 8 a.m. Eastern in summer). Ignored if you set a start date.

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

Optional. First storm day to include (YYYY-MM-DD). NOAA's report files go back to 2004.

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

Optional. Last storm day to include (YYYY-MM-DD). Defaults to today.

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

Two-letter state codes, e.g. TX, CO, NC. Leave empty for the whole country.

## `minHailSize` (type: `string`):

Skip hail smaller than this. 1 inch (quarter size) is where roof damage usually starts.

## `includeWind` (type: `boolean`):

Also return damaging-wind reports (trees and power lines down, roofs damaged, gusts of 58 mph or more).

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

With wind reports on: skip measured gusts below this. Damage reports without a measured speed are always kept.

## `nearZip` (type: `string`):

Optional. Keep only reports within the radius below of this ZIP code, e.g. your shop.

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

With a ZIP code: how far from it to look.

## `zipRadiusMiles` (type: `integer`):

Each report lists the ZIP codes whose center is within this many miles of it (plus the single nearest ZIP code).

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

Stop after this many reports, to cap what a run costs. 0 means no limit.

## Actor input object example

```json
{
  "daysBack": 7,
  "states": [
    "TX",
    "OK",
    "CO"
  ],
  "minHailSize": "1",
  "includeWind": true,
  "radiusMiles": 50,
  "zipRadiusMiles": 5,
  "maxItems": 200
}
```

# Actor output Schema

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

One item per report: time, hail size or wind speed, location, county, state, nearest ZIP and nearby ZIP codes.

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

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

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,flecked_coffee/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/7oJSnIN60hybCRWuA/builds/E7YRBHU3m2dbSxtcE/openapi.json
