# US Fire Department Leads Scraper - Fire & Rescue Contacts (`scrapesage/us-fire-department-leads-scraper`) Actor

Scrape every US fire department from the official USFA Registry (FEMA): name, phone, fax, address, website, type (career/volunteer/combination), stations, firefighter staffing, org type & lead score. Filter by state, type & size; monitor only-new. Keyless, no browser.

- **URL**: https://apify.com/scrapesage/us-fire-department-leads-scraper.md
- **Developed by:** [Scrape Sage](https://apify.com/scrapesage) (community)
- **Categories:** Lead generation, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$6.00 / 1,000 fire department 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## US Fire Department Leads Scraper — Fire & Rescue Contacts (Phone, Address, Staffing)

Extract **every US fire department** from the official **USFA National Fire Department Registry** (FEMA / U.S. Fire Administration) as clean, structured B2B leads — **department name, phone, fax, website, headquarters & mailing address, county, department type (career / volunteer / combination), organization type, number of stations, firefighter staffing, total personnel, and a 0–100 lead score.**

\~27,000 registered fire departments. No login, no cookies, no browser — fast extraction straight from the authoritative federal registry, with a **monitor mode** for an only-new feed.

### Why this fire department scraper?

The US fire & rescue service is a multi-billion-dollar procurement market — apparatus (engines, ladders, tankers), turnout gear and PPE, SCBA, station-alerting, records-management / CAD / ePCR software, training, communications, and federal grant programs (AFG / SAFER). But there is **no clean, national, contact-bearing fire-department list** on the market — only scattered Google-Maps scrapes and station-only point files with no phone or staffing.

This actor ships the **richest dataset in the category**, sourced directly from FEMA's official registry:

| Data | Typical lists | This actor |
|---|---|---|
| Department headquarters phone | ❌ rarely | ✅ ~90%+ |
| Website | ❌ | ✅ opt-in field |
| Department type (career / volunteer / combination) | ❌ | ✅ |
| Organization type (local / county / state / federal / tribal / airport / contract) | ❌ | ✅ |
| Number of stations | ❌ | ✅ |
| Active firefighters (career / volunteer / paid-per-call) | ❌ | ✅ |
| Civilian & non-firefighting staff, total personnel | ❌ | ✅ |
| Department size tier + lead score (0–100) | ❌ | ✅ |
| Per-station names & addresses | ❌ | ✅ opt-in |
| Primary-emergency-management-agency flag | ❌ | ✅ |
| Mailing vs HQ address (distinct) | ❌ | ✅ |
| Only-new / changed monitor feed | ❌ | ✅ |

### Use cases

- **Lead generation** — fire departments are active buyers of apparatus, PPE/turnout gear, SCBA, hoses, hydrants, station-alerting, vehicles, uniforms, radios/comms, and software. Score and segment by **size** (`totalActiveFirefighters`, `numberOfStations`), **type** (career departments = bigger budgets; volunteer = grant prospects) and **contactability** (`phone`, `website`).
- **Grant & funding outreach** — target eligible departments for AFG / SAFER and state programs; volunteer and small/rural departments (`departmentSizeTier`, `isVolunteer`) are the classic grant-writing clientele.
- **Software / SaaS sales** — CAD, RMS, ePCR, scheduling, asset & SCBA tracking vendors can target by department type and station count.
- **Market & territory analysis** — map career vs. volunteer coverage, department density, and personnel by state, county, and Census region.
- **Recruiting & staffing** — reach departments by staffing model and size.
- **Monitoring** — schedule recurring runs with **monitor mode** to capture newly-registered or updated departments (new phone, website, staffing or station count) as a fresh feed.

### How to use

1. [Sign up for Apify](https://console.apify.com/sign-up) — the free plan is enough to try this actor.
2. Open the **US Fire Department Leads Scraper**, choose your states / filters (or leave empty for the whole country), and click **Start**.
3. Watch results stream into the dataset table.
4. **Export** as JSON, CSV, Excel, XML, or HTML — or pull results programmatically via the [Apify API](https://docs.apify.com/api/v2).

### Input

```json
{
    "states": ["CA", "TX"],
    "departmentTypes": ["career", "combination"],
    "minFirefighters": 25,
    "hasPhoneOnly": true,
    "includeStations": false,
    "sortBy": "leadScore",
    "maxResults": 1000
}
```

- **states** — 2-letter postal codes (`CA`, `TX`, `NY`). Empty = whole country (~27k departments).
- **cities / counties / zipCodes** — narrow by headquarters location (ZIP accepts prefixes).
- **departmentTypes** — `career`, `volunteer`, `combination`, `mostlyCareer`, `mostlyVolunteer`.
- **organizationTypes** — `local`, `tribal`, `state`, `airport`, `federal`, `military`, `private`, `contract`, `other`.
- **minStations / maxStations / minFirefighters / maxFirefighters / minCareerFirefighters** — size targeting.
- **departmentNameQuery** — name contains text (e.g. `rural`, `township`, `airport`).
- **hasWebsiteOnly / hasPhoneOnly / primaryEmergencyMgmtOnly** — contactability & role filters.
- **fdids** — look up specific departments by USFA Fire Department ID.
- **includeStations** *(default false)* — add a `stations[]` array of individual station names & addresses.
- **minLeadScore / sortBy / maxResults** — ranking and limit.
- **monitorMode / monitorKey** — emit only newly-registered or changed departments per saved search.

### Output

One record per fire department (`recordType: "fireDepartment"`):

```json
{
    "recordType": "fireDepartment",
    "source": "usfa-registry",
    "sourceLabel": "USFA National Fire Department Registry (FEMA)",
    "fdid": "12345",
    "departmentName": "Springfield Fire Department",
    "departmentType": "Career",
    "isCareer": true,
    "isVolunteer": false,
    "isCombination": false,
    "organizationType": "Local (includes career, combination, and volunteer fire departments and fire districts)",
    "organizationCategory": "Local",
    "organizationKey": "local",
    "hqStreet": "200 Main St",
    "hqCity": "Springfield",
    "hqState": "IL",
    "hqZip": "62701",
    "county": "Sangamon",
    "hqFullAddress": "200 Main St, Springfield, IL, 62701",
    "region": "Midwest",
    "mailFullAddress": "PO Box 100, Springfield, IL, 62705",
    "hasDistinctMailing": true,
    "phone": "(217) 555-0100",
    "fax": "(217) 555-0101",
    "website": "https://springfieldfire.gov",
    "hasPhone": true,
    "hasWebsite": true,
    "numberOfStations": 12,
    "activeFirefightersCareer": 210,
    "activeFirefightersVolunteer": 0,
    "activeFirefightersPaidPerCall": 0,
    "totalActiveFirefighters": 210,
    "nonFirefightingCivilian": 18,
    "nonFirefightingVolunteer": 0,
    "totalPersonnel": 228,
    "departmentSizeTier": "major",
    "isPrimaryEmergencyMgmtAgency": true,
    "stations": [],
    "leadScore": 96,
    "leadSignals": ["major_department", "career_department", "multi_station", "has_website", "has_phone", "primary_emergency_mgmt"],
    "scrapedAt": "2026-06-20T12:00:00.000Z"
}
```

Every record also includes `sourceFields` — the full raw registry row — so no source data is ever lost.

### Automate & schedule

Run this actor on autopilot and pull results into your own stack:

- **[Apify API](https://docs.apify.com/api/v2)** — start runs, fetch datasets, and manage schedules over REST.
- **[apify-client for JavaScript](https://docs.apify.com/api/client/js/)** and **[apify-client for Python](https://docs.apify.com/api/client/python/)** — official SDKs.
- **[Schedules](https://docs.apify.com/platform/schedules)** — run it daily/weekly with **monitor mode** for a fresh feed of newly-registered or updated departments.
- **[Webhooks](https://docs.apify.com/platform/integrations/webhooks)** — trigger downstream actions (CRM import, Slack alert, email sequence) the moment a run finishes.

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

const client = new ApifyClient({ token: 'MY_APIFY_TOKEN' });

const run = await client.actor('scrapesage/us-fire-department-leads-scraper').call({
    states: ['CA'],
    departmentTypes: ['career', 'combination'],
    minFirefighters: 25,
    hasPhoneOnly: true,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} fire department leads`);
```

### Integrate with any app

Connect the dataset to 5,000+ apps — no code required:

- **[Make](https://docs.apify.com/platform/integrations/make)** — multi-step automation scenarios.
- **[Zapier](https://docs.apify.com/platform/integrations/zapier)** — push new department leads straight into your CRM.
- **[Slack](https://docs.apify.com/platform/integrations/slack)** — get notified when a monitored search finds new departments.
- **[Google Drive / Sheets](https://docs.apify.com/platform/integrations/drive)** — auto-export every run to a spreadsheet.
- **[Airbyte](https://docs.apify.com/platform/integrations/airbyte)** — pipe results into your data warehouse.
- **[GitHub](https://docs.apify.com/platform/integrations/github)** — trigger runs from commits or releases.

### Use with AI assistants (MCP)

The output is clean, LLM-ready JSON. Call this actor from Claude, ChatGPT, or any agent framework through the **[Apify MCP server](https://docs.apify.com/platform/integrations/mcp)** — ask your assistant to "list career fire departments in California with 25+ firefighters and their phone numbers" and let it run this scraper for you.

### Agent-ready: autonomous payments (x402 & Skyfire)

This actor is **agent-ready** — AI agents can discover it, run it, and **pay for it autonomously**, with no Apify account and no human in the loop. It uses [pay-per-event](https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event) pricing and [limited permissions](https://docs.apify.com/platform/actors/development/permissions), so it qualifies for Apify's agentic-payment standards:

- **[x402](https://docs.apify.com/platform/integrations/x402)** — an open, HTTP-native payment protocol. Agents pay per run in USDC on the Base network directly through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) — no account, no API key.
- **[Skyfire](https://docs.apify.com/platform/integrations/skyfire)** — agent-to-service payments for fully autonomous AI-agent workflows.

Building an AI agent, MCP tool, or autonomous data pipeline? This scraper is ready to plug in and pay as it goes.

### More scrapers from scrapesage

Build a complete **US public-sector & B2B lead-gen stack** from official registries:

- **[US Schools Scraper](https://apify.com/scrapesage/us-schools-scraper)** — schools, districts & colleges with enrollment, staff and contacts (NCES/IPEDS).
- **[NPI Registry Scraper](https://apify.com/scrapesage/npi-nppes-scraper)** — 8M+ US healthcare providers & organizations (NPPES).
- **[SAMHSA Treatment Facility Scraper](https://apify.com/scrapesage/samhsa-treatment-facility-scraper)** — addiction & mental-health treatment facilities with phone & website.
- **[Nonprofit 990 Scraper](https://apify.com/scrapesage/nonprofit-990-scraper)** — IRS 990 nonprofits incl. volunteer fire & rescue 501(c) organizations.
- **[US Business Formation Scraper](https://apify.com/scrapesage/us-business-formation-scraper)** — newly-registered companies from state Secretaries of State.
- **[US Federal Grants Scraper](https://apify.com/scrapesage/us-federal-grants-scraper)** — federal grant opportunities (relevant for AFG/SAFER prospecting).
- **[USAspending Scraper](https://apify.com/scrapesage/usaspending-scraper)** — federal contract & grant awards.
- **[US Banks & Credit Unions Scraper](https://apify.com/scrapesage/us-banks-credit-unions-scraper)** — every FDIC bank & NCUA credit union.
- **[SBA Loan Leads Scraper](https://apify.com/scrapesage/sba-loan-leads-scraper)** — SBA 7(a)/504 financed small businesses.
- **[FMCSA Trucking Scraper](https://apify.com/scrapesage/fmcsa-trucking-scraper)** — motor carriers, fleets & owner contacts.

### Tips

- **Whole country**: leave `states` empty to pull the full ~27k-department registry in one run.
- **Budget targeting**: use `minCareerFirefighters` or `departmentTypes: ["career"]` to focus on departments with full-time staff and larger procurement budgets.
- **Grant prospects**: filter `departmentTypes: ["volunteer"]` with a low `maxFirefighters` for small/rural grant-writing candidates.
- **Recurring feed**: turn on `monitorMode` and run on a [Schedule](https://docs.apify.com/platform/schedules) to receive only new or updated departments.
- **Cost control**: the actor downloads one national file and filters in memory — a whole-country run is fast and inexpensive.

### FAQ

**Where does the data come from?** The official **USFA National Fire Department Registry**, maintained by FEMA's U.S. Fire Administration — the authoritative national list of US fire departments. The actor downloads the registry's own public national export and structures it.

**How current is it?** The registry is continuously updated as departments register and update their information; each run downloads the latest export. Use `monitorMode` to capture changes over time.

**Does it include phone numbers and websites?** Yes — headquarters phone is present for the large majority of departments, and websites where the department published one. Fields are `null` only when the department didn't provide them.

**Are emails included?** No — the registry does not publish department email addresses, so this actor does not fabricate them. Use the `website` field to find a contact form or published address.

**Can I get individual fire-station addresses?** Yes — enable `includeStations` to attach a `stations[]` array of station names and addresses for departments that submitted station detail.

**Can I export to Google Sheets, CSV, or Excel?** Yes — one click in the dataset view, or automatically on every run via the [Google Drive integration](https://docs.apify.com/platform/integrations/drive).

**Is this legal?** This actor collects publicly available data from an official federal registry. You are responsible for using the data in compliance with applicable laws and the source's terms.

### Need help?

Open an issue on the actor's **Issues** tab, or visit the [Apify help center](https://help.apify.com/). Feature requests are welcome — this actor is actively maintained.

# Actor input Schema

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

Filter to one or more US states by 2-letter postal code, e.g. `CA`, `TX`, `NY`. Leave empty for the entire country (~27,000 departments).

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

Filter by headquarters city name(s), e.g. `Houston`, `Phoenix`. Case-insensitive. One per row.

## `counties` (type: `array`):

Filter by county name(s), e.g. `Maricopa`, `Cook`, `Harris` (the word "County" is optional). One per row.

## `zipCodes` (type: `array`):

Filter by ZIP code or ZIP prefix, e.g. `770` matches all `770xx` ZIPs. One per row.

## `departmentTypes` (type: `array`):

Filter by staffing model. `career`, `volunteer`, `combination` (mostly career + mostly volunteer), `mostlyCareer`, `mostlyVolunteer`. Career & combination departments tend to have larger equipment budgets; volunteer departments are prime grant-writing / PPE prospects.

## `organizationTypes` (type: `array`):

Filter by organization type. `local`, `tribal`, `state`, `airport` (transit/airport authority), `federal` (incl. DoD), `military` (DoD only), `private` (industrial brigade), `contract`, `other`.

## `departmentNameQuery` (type: `string`):

Only return departments whose name contains this text (case-insensitive), e.g. `rural`, `township`, `airport`.

## `minStations` (type: `integer`):

Only departments operating at least this many fire stations.

## `maxStations` (type: `integer`):

Only departments operating at most this many fire stations.

## `minFirefighters` (type: `integer`):

Only departments with at least this many active firefighters (career + volunteer + paid-per-call). Use to target larger, higher-budget departments.

## `maxFirefighters` (type: `integer`):

Only departments with at most this many active firefighters. Use to target small / rural departments.

## `minCareerFirefighters` (type: `integer`):

Only departments with at least this many full-time (career) firefighters — a strong budget / procurement-capacity signal.

## `hasWebsiteOnly` (type: `boolean`):

Only return departments that publish a website.

## `hasPhoneOnly` (type: `boolean`):

Only return departments that list a headquarters phone number.

## `primaryEmergencyMgmtOnly` (type: `boolean`):

Only departments flagged as the primary agency for emergency management in their jurisdiction.

## `fdids` (type: `array`):

Look up specific departments by their USFA Fire Department ID (FDID). One per row.

## `includeStations` (type: `boolean`):

Also join the registry's station-level export so each department record carries a `stations[]` array of individual station names & addresses (available for departments that submitted station detail).

## `minLeadScore` (type: `integer`):

Only return departments with a derived lead score at or above this value (0–100).

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

Result ordering. `leadScore` = best leads first (size + contactability).

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

Maximum number of fire-department records to return.

## `monitorMode` (type: `boolean`):

Remember departments seen in previous runs (per monitor key) and emit ONLY newly-registered or updated departments (new phone, website, staffing or station count) on each run. Ideal on a schedule to receive a fresh feed. Works alongside Apify Schedules.

## `monitorKey` (type: `string`):

Names the monitor state so different saved tasks keep separate memory. Use one key per saved search.

## `proxyConfiguration` (type: `object`):

Optional proxy. The USFA registry download needs no proxy; the actor falls back automatically (direct → Apify datacenter → US residential) if a network hiccup occurs. Leave disabled for the cheapest runs.

## Actor input object example

```json
{
  "states": [],
  "cities": [],
  "counties": [],
  "zipCodes": [],
  "hasWebsiteOnly": false,
  "hasPhoneOnly": false,
  "primaryEmergencyMgmtOnly": false,
  "fdids": [],
  "includeStations": false,
  "sortBy": "leadScore",
  "maxResults": 1000,
  "monitorMode": false,
  "monitorKey": "default",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

All scraped US fire department lead records as JSON items in the default dataset.

# 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": [],
    "cities": [],
    "counties": [],
    "zipCodes": [],
    "fdids": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapesage/us-fire-department-leads-scraper").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": [],
    "cities": [],
    "counties": [],
    "zipCodes": [],
    "fdids": [],
}

# Run the Actor and wait for it to finish
run = client.actor("scrapesage/us-fire-department-leads-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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": [],
  "cities": [],
  "counties": [],
  "zipCodes": [],
  "fdids": []
}' |
apify call scrapesage/us-fire-department-leads-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=scrapesage/us-fire-department-leads-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/UJ91rpF7X45HnDtrS/builds/27GvxdE5vLrOWo6tm/openapi.json
