# Fire & Water Damage Leads for Restoration Pros (`future_style_tooling/fire-water-damage-leads`) Actor

New structure fires, broken water pipes, sprinkler discharges and smoke damage from official city 911 feeds (Seattle, Austin, San Francisco, Baton Rouge, Raleigh, Scottsdale, Edmonton). Exact addresses, priority scoring, and you never pay twice for the same lead.

- **URL**: https://apify.com/future_style_tooling/fire-water-damage-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

## Fire & Water Damage Leads: Real-Time 911 Incidents for Restoration Pros

Get **new structure fires, broken water pipes, sprinkler discharges, kitchen fires and smoke damage** the moment city fire departments dispatch them. The data comes straight from official city 911 / fire-department open-data feeds. You get exact street addresses, map links, a priority score, and reported dollar losses where the city publishes them.

Built for **fire & water damage restoration companies, mitigation contractors, public adjusters, roofers, and property-service businesses** that want to be first on scene. That speed matters because exclusive restoration leads cost $100+ each through lead brokers.

**You are never charged twice for the same incident.** Schedule it every 15 minutes and each run returns only incidents you haven't received yet.

### What you get

| Field                                            | Example                                                        |
| ------------------------------------------------ | -------------------------------------------------------------- |
| `priority`                                       | `high`                                                         |
| `categoryLabel`                                  | `Water damage (pipe, flood, sprinkler)`                        |
| `incidentType`                                   | `BWP - Broken Water Pipe`                                      |
| `address`, `city`, `state`, `zip`, `country`     | `2502 Nueces St`, `Austin`, `TX`, `null`, `US`                 |
| `addressPrecision`                               | `exact` or `intersection`                                      |
| `latitude`, `longitude`, `googleMapsUrl`         | `30.289313`, `-97.743002`, map link                            |
| `incidentTimeLocal`, `minutesAgo`                | `2026-10-29 02:57 CDT`, `42`                                   |
| `timePrecision`                                  | `minute`, or `day` where only the date is published            |
| `estimatedPropertyLoss`, `estimatedContentsLoss` | `60000`, `10000` (Baton Rouge)                                 |
| `unitsResponded`, `exposures`                    | `9` units (San Francisco); `6` exposed buildings (Baton Rouge) |
| `dispatchStatus`, `disposition`                  | `ACTIVE` (Austin), `Fire` (San Francisco)                      |
| `sourceAgency`, `sourceDatasetUrl`               | Official dataset link for every row                            |

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

### Cities covered

| City                  | Freshness                                    | Location precision   | Extras                              |
| --------------------- | -------------------------------------------- | -------------------- | ----------------------------------- |
| **Seattle, WA**       | Real-time (feed updates every 5 minutes)     | Exact address        | Water jobs, kitchen fires           |
| **Austin, TX**        | Real-time (published minutes after dispatch) | Exact address        | Broken water pipes, live status     |
| **San Francisco, CA** | Daily (previous day, loaded overnight)       | Intersection         | Response size → priority            |
| **Baton Rouge, LA**   | Daily (classified 1–2 days after dispatch)   | Exact address + ZIP  | Reported $ property & contents loss |
| **Raleigh, NC**       | Daily (about 2 days after dispatch)          | Exact address + ZIP  | Fires that spread to neighbours     |
| **Scottsdale, AZ**    | Every few days; date only, no time of day    | Exact address        | Mutual-aid calls in Tempe, Mesa…    |
| **Edmonton, AB 🇨🇦**   | Daily (about 2 days after dispatch)          | Nearest intersection | Response size → priority            |

More cities are added as they publish usable feeds. Open an issue to request yours.

### Incident categories

| Category (input value)                          | Examples                                                     | Default |
| ----------------------------------------------- | ------------------------------------------------------------ | ------- |
| Structure fire (`structure_fire`)               | Building, house, high-rise, garage, chimney fires            | ✅      |
| Kitchen fire (`kitchen_fire`)                   | Food on the stove, cooking fires                             | ✅      |
| Smoke damage (`smoke_damage`)                   | Smoke/odor removal, scorch damage without flames             | ✅      |
| Water damage (`water_damage`)                   | Broken pipes, water jobs, flooding, **sprinkler discharges** | ✅      |
| Electrical (`electrical`)                       | Electrical fires, wiring problems, arcing equipment          | ✅      |
| Explosion / collapse (`explosion_collapse`)     | Explosions, structural collapse                              | ✅      |
| Smoke investigation (`smoke_investigation`)     | Unconfirmed smoke reports                                    | ❌      |
| Outdoor / vehicle fire (`outdoor_vehicle_fire`) | Car, dumpster, brush and trash fires                         | ❌      |

#### Priority

- **High**: confirmed building fires, high-rise fires, major water jobs, broken pipes, sprinkler discharges, full structure-fire responses (6+ units in San Francisco, 8+ in Edmonton), fires that spread to a neighbouring property, or reported losses of $25,000+.
- **Medium**: garage, chimney and kitchen fires; minor water jobs; small structure-fire responses.
- **Low**: electrical problems, single-unit calls, unconfirmed reports.

Results are sorted with the highest priority first, then newest first.

### How to use it

1. Pick your **cities** and **categories** (the defaults are tuned for restoration work).
2. Optionally set a **service area** (center point + radius in miles) so you only pay for leads you'd actually drive to.
3. Click **Start** to try it once, then **schedule** it (for example every 15 minutes) under *Schedules*.
4. Send new leads where your team works using Apify's built-in **integrations**: Slack, email, Google Sheets, Zapier, Make, or a webhook to your CRM.

#### Example input

```json
{
  "cities": ["austin", "seattle"],
  "categories": ["structure_fire", "water_damage", "kitchen_fire"],
  "minPriority": "medium",
  "centerPoint": "30.2672, -97.7431",
  "radiusMiles": 20,
  "onlyNew": true
}
```

### Pricing

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

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

**Examples**

- One metro, checked every 15 minutes, ~5 leads a day: about **$15 + $5.76 run fees ≈ $21/month**.
- Checked hourly instead: about **$15 + $1.44 ≈ $16/month**.
- Quiet day with no new incidents: you pay only the run fees.

Set a **maximum cost per run** in the Apify run options and the Actor stops delivering at that amount. Leads you have already been charged for are never re-sent or re-charged.

### FAQ

**Where does the data come from?**
Only official public datasets published by each city: Seattle Fire Department, Austin Fire Department, San Francisco Fire Department, Baton Rouge Fire Department, Raleigh Fire Department, Scottsdale Fire Department and Edmonton Fire Rescue Services. Every row links to its source dataset. No scraping of private sites, no logins, no proxies.

**Is this legal to use?**
These are public records the cities publish for open use. The leads contain **no personal names or phone numbers**, only incident type, location and time. You are responsible for following the rules that apply to contacting property owners in your area. Some states restrict solicitation by contractors or public adjusters for a period after a loss, and telemarketing / do-not-call rules apply to phone outreach. When in doubt, check your state's rules.

**Why are some San Francisco addresses intersections?**
San Francisco publishes dispatch locations at intersection / call-box level. Each row has `addressPrecision` so you can filter or route these differently.

**Why do Baton Rouge, Raleigh and Edmonton leads arrive a day or two late?**
These cities publish incidents after firefighters complete their report. In exchange, Baton Rouge includes the reported property and contents loss. The Actor automatically looks back 3 extra days for these cities (7 for Scottsdale) so late-published incidents are still picked up exactly once.

**Why does a Scottsdale lead have no time of day?**
Scottsdale publishes only the incident date. Those rows have `timePrecision: "day"` and `minutesAgo: null`. Its feed also covers calls Scottsdale crews answered in neighbouring cities, so `city` can be Tempe, Mesa or Phoenix.

**Why are there no water-damage leads from Raleigh or Edmonton?**
Neither city publishes a water or pipe-burst call type, so those cities return fire, smoke, electrical and explosion leads only.

**How do I get alerts instead of a spreadsheet?**
Schedule the Actor, then add a Slack, email or webhook integration on the Actor's *Integrations* tab. Each run's new leads are sent automatically.

**I ran it twice and the second run returned nothing. Is it broken?**
No. With **Only new leads** on, incidents 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.2**: Added Raleigh, Scottsdale (with Tempe/Mesa mutual aid) and Edmonton. New `country` and `timePrecision` fields.
- **0.1**: Initial release with Seattle, Austin, San Francisco and Baton Rouge.

# Actor input Schema

## `cities` (type: `array`):

Which city fire-department feeds to check. Leave empty for all.

## `categories` (type: `array`):

Kinds of incidents to return. Smoke investigations and outdoor/vehicle fires are off by default because they rarely need restoration work.

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

High = confirmed building fires, major water jobs, sprinkler discharges, big reported losses. Medium = garage/chimney/kitchen fires, minor water jobs. Low = electrical problems, small or unconfirmed calls.

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

Skip incidents already delivered to you in an earlier run, so you are never charged twice for the same lead. Turn off to get every incident in the look-back window again.

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

How far back to search. With scheduling plus "Only new leads", 48 hours is plenty. Baton Rouge automatically looks back 3 extra days because incidents are classified late.

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

Only return incidents within the radius of this point. Format: latitude, longitude (e.g. 30.2672, -97.7431). Leave empty for whole cities.

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

Used only when a center point is set.

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

Upper limit on leads (and charges) per run. Highest-priority, newest leads come first.

## `socrataAppToken` (type: `string`):

Free token from any Socrata open-data portal. Only needed if you run this very frequently and hit rate limits.

## Actor input object example

```json
{
  "cities": [
    "seattle",
    "austin",
    "san_francisco",
    "baton_rouge",
    "raleigh",
    "scottsdale",
    "edmonton"
  ],
  "categories": [
    "structure_fire",
    "kitchen_fire",
    "smoke_damage",
    "water_damage",
    "electrical",
    "explosion_collapse"
  ],
  "minPriority": "low",
  "onlyNew": true,
  "lookbackHours": 48,
  "radiusMiles": 25,
  "maxResults": 200
}
```

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("future_style_tooling/fire-water-damage-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("future_style_tooling/fire-water-damage-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 '{}' |
apify call future_style_tooling/fire-water-damage-leads --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,future_style_tooling/fire-water-damage-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/XEh88w7bg4hEIJssd/builds/5DuuXXtVbPkByna8J/openapi.json
