# Hail & Wind Damage Leads for Roofers — Fresh NWS Storm Reports (`future_style_tooling/hail-wind-roof-leads`) Actor

Hail, damaging-wind and tornado reports from the National Weather Service, minutes to hours after the storm, with hail size, nearest ZIP, the warning polygon and a priority score. Filter by state or service area; you never pay twice for the same report.

- **URL**: https://apify.com/future_style_tooling/hail-wind-roof-leads.md
- **Developed by:** [Michael](https://apify.com/future_style_tooling) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $100.00 / 1,000 lead delivereds

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 & Wind Damage Leads for Roofers: Fresh NWS Storm Reports

Get **hail, damaging-wind and tornado reports** from the National Weather Service within minutes to hours of the storm, not the 75+ days it takes for the official Storm Events database. Each lead has the hail size, wind speed, exact coordinates, the **nearest ZIP code**, the county, a map link, the NWS warning it fell in, and a **priority score** built for roofing and exterior contractors.

Built for **roofers, storm-restoration contractors, gutter and siding companies, public adjusters and canvassing teams** who want to know where the hail actually fell before the competition does.

**You are never charged twice for the same report.** Schedule it hourly and each run returns only storm reports you haven't received yet.

### What you get

| Field                                    | Example                                                       |
| ---------------------------------------- | ------------------------------------------------------------- |
| `priority`                               | `high`                                                        |
| `hazardLabel`                            | `Hail`, `Damaging wind gust`, `Wind damage report`, `Tornado` |
| `hailInches`, `hailSize`                 | `2.75`, `Baseball (2.75 in)`                                  |
| `windMph`, `measured`                    | `74`, `true` (instrument) / `false` (estimated)               |
| `locationDescription`, `nearestTown`     | `6 E Mclean`, `Mclean`                                        |
| `county`, `state`                        | `Wheeler`, `TX`                                               |
| `nearestZip`, `nearestZipMiles`          | `79054`, `6.2`                                                |
| `latitude`, `longitude`, `googleMapsUrl` | `35.23`, `-100.49`, map link                                  |
| `eventTimeUtc`, `hoursAgo`               | `2026-10-13T22:47:00.000Z`, `4.2`                             |
| `reportSource`, `remark`                 | `Trained Spotter`, `Baseball size hail near mm149 on I-40.`   |
| `warningType`, `warningMaxHailInches`    | `Severe Thunderstorm Warning`, `2.75`                         |
| `warningId`, `warningUrl`                | `AMA.SV.W.0330.2026`, link to the warning                     |
| `nwsProductId`, `nwsProductUrl`          | The original NWS Local Storm Report text                      |

Every row is flat, so CSV and Excel exports work without any cleanup.

### Coverage

All 50 states and DC, from every National Weather Service office. Reports come from trained spotters, emergency managers, law enforcement, weather stations and the public, verified and published by the NWS as **Local Storm Reports**.

### Storm damage types

| Type (input value)                 | What counts                                      | Default threshold |
| ---------------------------------- | ------------------------------------------------ | ----------------- |
| Hail (`hail`)                      | Hail reports                                     | 1.00 in (quarter) |
| Damaging wind gust (`wind_gust`)   | Measured or estimated gusts, thunderstorm or not | 58 mph            |
| Wind damage report (`wind_damage`) | Roofs, trees on homes, structures, power lines   | always            |
| Tornado (`tornado`)                | Confirmed tornado reports                        | always            |

#### Priority

- **High**: golf-ball hail (1.75 in) or larger, gusts of 75 mph or more, tornadoes, and wind-damage reports that mention roofs, shingles, siding, homes, garages or other buildings.
- **Medium**: 1.25–1.74 in hail, 65–74 mph gusts, other wind damage (trees, power lines).
- **Low**: everything else that passed your thresholds.

Results are sorted by priority, then hail size / wind speed, then newest first.

### How to use it

1. Pick your **states**, or set a **service area** (center point + radius in miles).
2. Adjust the **minimum hail size** if you only chase bigger stones (1.25 in or 1.75 in are common).
3. Click **Start** to try it, then **schedule** it (for example hourly) under *Schedules*.
4. Send new leads where your team works with Apify's **integrations**: Slack, email, Google Sheets, Zapier, Make, or a webhook to your CRM.

Keep **Look back** at 24 hours or more even on an hourly schedule. NWS offices often post reports hours after the storm, and the Actor only delivers each report once anyway.

#### Example input

```json
{
  "states": ["TX", "OK"],
  "hazards": ["hail", "wind_damage", "tornado"],
  "minHailInches": 1.25,
  "minPriority": "medium",
  "centerPoint": "35.4676, -97.5164",
  "radiusMiles": 120,
  "lookbackHours": 72,
  "onlyNew": true
}
```

### Pricing

Pay-per-event. You only pay for what you get:

| Event              | Price     | When                                            |
| ------------------ | --------- | ----------------------------------------------- |
| **Lead delivered** | **$0.05** | Once per new storm report added to your results |
| Run started        | $0.002    | Once per run                                    |

**Examples**

- Three states, checked hourly: about **$1.44/month** in run fees, plus $0.05 per report. A big hail day with 60 qualifying reports costs $3.
- Quiet week with no storms: you pay only the run fees.
- Use **Max leads per run** and Apify's **maximum cost per run** to cap spending on outbreak days.

### FAQ

**Where does the data come from?**
National Weather Service Local Storm Reports and storm-based warnings, retrieved from the Iowa Environmental Mesonet at Iowa State University, which archives NWS products and publishes them as open data. NWS data is public domain. Every lead links to the original NWS product. Thank you to the Iowa Environmental Mesonet for keeping this archive open.

**How is this different from the NOAA Storm Events database?**
Storm Events is the final, quality-controlled record, but it is published about 75 days or more after the storm. Local Storm Reports are the same observations as they come in, minutes to hours after the hail falls, which is when they are useful for canvassing.

**Where does the ZIP code come from?**
It is the ZIP Code Tabulation Area whose 2020 Census center is closest to the report, within 30 miles. It is approximate: a report can sit near a ZIP boundary. Use the coordinates and map link for exact placement.

**What is the warning information?**
If the report fell inside a Severe Thunderstorm or Tornado Warning polygon while it was in effect, you get the warning, the largest hail size and wind speed the NWS forecast for it, and a link. It helps you judge how widespread the damage might be beyond the single report point.

**Are these addresses of damaged homes?**
No. Each lead is a point where the storm was observed, with the nearest town, county and ZIP. Use it to decide which neighbourhoods to canvass or mail. The reports contain no homeowner names or phone numbers.

**Is this legal to use?**
The data is public. You are responsible for following the rules for contacting property owners in your area, including door-to-door solicitation permits, contractor licensing, post-storm solicitation limits some states place on contractors and public adjusters, and do-not-call rules for phone outreach.

**Can I rely on this for safety decisions?**
No. Reports are delivered as-is from the NWS archive for business use and may be delayed or corrected. For warnings, use weather.gov or local media.

**I ran it twice and the second run returned nothing. Is it broken?**
No. With **Only new reports** on, reports you already received are skipped so you don't pay twice. Turn it off to see everything in the look-back window again.

### Changelog

- **0.1**: First release. Hail, wind and tornado reports for all US states, nearest ZIP, warning polygons, priority scoring.

# Actor input Schema

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

Only return reports from these states. Leave empty for the whole US.

## `hazards` (type: `array`):

Hail, measured or estimated damaging gusts, wind-damage reports (trees on houses, roofs off) and tornadoes.

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

1.00 in (quarter) is where shingle damage usually starts. 1.75 in = golf ball.

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

58 mph is the National Weather Service severe threshold.

## `minPriority` (type: `string`):

High = golf-ball hail or larger, 75+ mph gusts, tornadoes, or damage reports that mention roofs or homes. Medium = 1.25–1.74 in hail, 65–74 mph gusts, other wind damage. Low = everything else that passed the thresholds.

## `onlyNew` (type: `boolean`):

Skip reports already delivered by earlier runs in your account. Keep this on for scheduled runs so you never pay twice for the same report.

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

How far back to search. NWS offices often post reports hours after a storm, so keep at least 24 even when running hourly.

## `centerPoint` (type: `string`):

Only return reports within the radius of this point. Format: latitude, longitude (e.g. 35.4676, -97.5164).

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

Used only with a center point.

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

Hard cap on leads (and charges) per run. Highest priority and largest hail come first.

## `matchWarnings` (type: `boolean`):

Look up the Severe Thunderstorm or Tornado Warning polygon each report fell in, with the hail size and wind speed forecast for it.

## Actor input object example

```json
{
  "states": [
    "TX",
    "OK",
    "KS"
  ],
  "hazards": [
    "hail",
    "wind_gust",
    "wind_damage",
    "tornado"
  ],
  "minHailInches": 1,
  "minWindMph": 58,
  "minPriority": "low",
  "onlyNew": true,
  "lookbackHours": 72,
  "radiusMiles": 50,
  "maxResults": 500,
  "matchWarnings": true
}
```

# Actor output Schema

## `leads` (type: `string`):

No description

## `summary` (type: `string`):

No description

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

// Run the Actor and wait for it to finish
const run = await client.actor("future_style_tooling/hail-wind-roof-leads").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",
        "KS",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("future_style_tooling/hail-wind-roof-leads").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",
    "KS"
  ]
}' |
apify call future_style_tooling/hail-wind-roof-leads --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,future_style_tooling/hail-wind-roof-leads"
        }
    }
}
```

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/u9Bcu1jj49qO3xLjS/builds/quvSBmYykbFPNOnPW/openapi.json
