# FEMA Disaster Recovery & Mitigation Projects (`wishbone_data/fema-recovery-projects`) Actor

Project-level FEMA Public Assistance rebuild projects and Hazard Mitigation (HMGP, BRIC, FMA) applications from the official OpenFEMA API - including pending mitigation projects not yet funded. Filter by state, date, amount, keyword, category.

- **URL**: https://apify.com/wishbone\_data/fema-recovery-projects.md
- **Developed by:** [Walter Washburn](https://apify.com/wishbone_data) (community)
- **Categories:** Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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

## FEMA Disaster Recovery & Mitigation Projects Scraper (Public Assistance + HMGP/BRIC)

Get **project-level FEMA disaster rebuild and hazard-mitigation projects** as clean rows: who the public applicant is, what is being repaired or built, where, how much money is obligated, and - for mitigation - which projects are still **pending or just submitted to FEMA** and haven't gone out to bid yet.

Data comes straight from the official **OpenFEMA API** (no API key, no login, no browser). One run can return tens of thousands of records in under a minute.

### What does this Actor do?

It combines two FEMA datasets that are hard to use on their own:

| Project type | What it covers | Typical use |
|---|---|---|
| **Public Assistance (PA) funded projects** | Every obligated repair/replacement project after a declared disaster - roads & bridges, water control, public buildings, utilities, parks, debris removal | Find agencies with fresh federal money for rebuild work |
| **Hazard Mitigation Assistance (HMA) sub-applications** | HMGP, BRIC, FMA, Post-Fire and PDM projects - elevations, acquisitions, flood control, generators, seismic retrofits, drainage, wildfire mitigation | Find mitigation projects **before** they're bid (status Pending / Submitted to FEMA / Approved) |

Extras you don't get from the raw API:

- **Applicant names and addresses** for PA projects (the raw dataset only has an ID - the Actor resolves it to e.g. *"Wahkiakum County, Cathlamet"*).
- One **flat, consistent schema** for both datasets, ready for CSV/Excel.
- Filters that FEMA's own site doesn't give you together: state, date, minimum dollar amount, keyword, damage category, HMA program, "construction only", "pipeline only".

### Who uses it?

- **Contractors and construction sales teams** - civil, bridge, drainage, roofing, generator, modular and building-materials suppliers looking for public agencies that just received rebuild or mitigation funding.
- **Engineering and disaster-recovery consultants** - grant management, BCA, environmental and design firms tracking HMGP/BRIC pipelines by state.
- **Grant writers and economic-development offices** - benchmark what neighbouring counties applied for and got.
- **Journalists, researchers, insurers** - follow the money after a hurricane, flood or wildfire.

### How to use it

1. Pick the project types (both by default).
2. Add states (e.g. `WA`, `OR`) and a start date.
3. Optional: minimum amount, keyword (`bridge`, `culvert`, `school`, `seawall`, `generator`), PA damage categories, HMA programs.
4. Run it and download JSON, CSV, Excel, or pipe it into Google Sheets, Make, Zapier or your CRM.

#### Input example

```json
{
  "datasets": ["publicAssistance", "hazardMitigation"],
  "states": ["WA", "OR"],
  "sinceDate": "2025-01-01",
  "minAmount": 100000,
  "maxItems": 200
}
```

Find mitigation construction work that hasn't been awarded yet:

```json
{
  "datasets": ["hazardMitigation"],
  "states": ["FL", "TX", "LA"],
  "constructionOnly": true,
  "pendingOnly": true,
  "minAmount": 500000
}
```

Only road and bridge repairs in Texas:

```json
{ "datasets": ["publicAssistance"], "states": ["TX"], "damageCategories": ["C"], "keyword": "bridge" }
```

#### Output example

```json
{
  "source": "Public Assistance",
  "projectId": "PA-4650-151",
  "disasterNumber": 4650,
  "incidentType": "Severe Storm(s)",
  "title": "East Valley Road & Wilson Creek Culvert Damages",
  "applicant": "Wahkiakum County",
  "applicantCity": "Cathlamet",
  "state": "WA",
  "county": "Wahkiakum County",
  "category": "C - Roads and Bridges",
  "status": "Eligible",
  "stage": "Obligated",
  "totalAmount": 892292.93,
  "federalShare": 803063.63,
  "lastObligationDate": "2026-09-25",
  "disasterUrl": "https://www.fema.gov/disaster/4650"
}
```

```json
{
  "source": "Hazard Mitigation Assistance",
  "projectId": "EMS-2024-FM-006-0001",
  "title": "Acquisition",
  "applicant": "DEPARTMENT OF ECOLOGY",
  "state": "WA",
  "county": "PIERCE COUNTY; SKAGIT COUNTY; WHATCOM COUNTY; KING COUNTY",
  "status": "Submitted to FEMA",
  "program": "Flood Mitigation Assistance",
  "totalAmount": 12839703.66,
  "submittedDate": "2026-08-05",
  "proposedStartDate": "2027-08-06",
  "includesConstruction": true,
  "hazard": "Flooding",
  "benefitCostRatio": 1.27
}
```

Turn on **Include raw OpenFEMA record** to get all 80+ original HMA fields (building-code year, community lifelines, BCA totals, etc.).

### Output fields

| Field | Meaning |
|---|---|
| `source` | Public Assistance or Hazard Mitigation Assistance |
| `projectId` | PA: `PA-<disaster>-<project worksheet>`; HMA: sub-application ID |
| `title`, `category` | Project title / damage category (PA) or activities (HMA) |
| `applicant`, `applicantCity`, `applicantAddress` | Public agency, district, tribe or non-profit receiving funds |
| `state`, `county` | Location (HMA: benefiting counties) |
| `status`, `stage` | Eligibility / process step (PA) or application status (HMA) |
| `totalAmount`, `federalShare`, `totalObligated` | Dollars |
| `firstObligationDate`, `lastObligationDate` | PA funding dates |
| `submittedDate`, `proposedStartDate`, `proposedEndDate` | HMA pipeline dates |
| `includesConstruction`, `hazard`, `program`, `benefitCostRatio` | HMA details |
| `disasterNumber`, `disasterUrl` | Link to the FEMA disaster page |

### Pricing

This Actor uses **pay-per-event** pricing - you pay only for records you get:

| Event | Price |
|---|---|
| Actor start | $0.005 per run |
| `project-record` | **$3.00 per 1,000 project records** ($0.003 each) |

Examples: 200 records = $0.61. A full state-year of PA + HMA records (~3,000) = about $9. Set **Max results** or the run's *maximum cost* and the Actor stops cleanly at your budget - you never pay for more than you asked for. Platform compute is included.

### Tips

- `maxItems` applies **per project type** so one type doesn't crowd out the other.
- HMA **pipeline only** keeps Pending, Submitted to FEMA, Approved and Subaward Offered/Accepted - the stages where work is still ahead.
- Keyword matching is done by OpenFEMA on the title and handles common capitalisations (`bridge`, `Bridge`, `BRIDGE`).
- Schedule it weekly with a `sinceDate` a few weeks back to get a running feed of newly obligated projects.

### FAQ

**Is this legal?** Yes. OpenFEMA data is published by the U.S. Government for public reuse and is not subject to copyright; FEMA's API is designed for programmatic access. The Actor calls the official API at a polite rate. Applicants are public entities (counties, cities, districts, agencies, tribes and non-profits), not private individuals. FEMA asks that you don't imply FEMA endorsement of your product.

**How fresh is the data?** OpenFEMA refreshes these datasets roughly daily (see `lastRefresh` on PA records). The Actor always queries live.

**Why are some HMA amounts or titles empty?** FEMA doesn't publish every field for every sub-application, especially older HMGP records. We never invent values.

**Can I get the individual properties bought out or elevated?** Not in this Actor - the property-level dataset is deliberately excluded because it concerns private homeowners.

**Something broke or a field is missing?** Open an issue on the Actor's Issues tab - we usually respond within a day.

# Actor input Schema

## `datasets` (type: `array`):

Public Assistance = repair/rebuild of roads, bridges, buildings, utilities after declared disasters. Hazard Mitigation = HMGP / BRIC / FMA mitigation projects, including pending applications not yet funded.

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

Two-letter state/territory codes, e.g. WA, TX, FL. Leave empty for all states.

## `sinceDate` (type: `string`):

YYYY-MM-DD. Public Assistance: last obligation date. Hazard Mitigation: date submitted to FEMA.

## `minAmount` (type: `integer`):

Skip projects below this total amount.

## `keyword` (type: `string`):

e.g. bridge, culvert, school, seawall, generator. Matches the project title (PA) or title/activity/sub-applicant (HMA).

## `damageCategories` (type: `array`):

Public Assistance only. A Debris, B Protective measures, C Roads & bridges, D Water control, E Buildings & equipment, F Utilities, G Parks/other.

## `hmaPrograms` (type: `array`):

Hazard Mitigation only. Leave empty for all programs.

## `constructionOnly` (type: `boolean`):

Only mitigation sub-applications flagged as including construction.

## `pendingOnly` (type: `boolean`):

Excludes closed, withdrawn, denied and void applications - useful for finding upcoming work.

## `disasterNumbers` (type: `array`):

Optional FEMA disaster numbers, e.g. 4834.

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

Stop after this many records for each selected project type. 0 = no limit.

## `includeRawRecord` (type: `boolean`):

Adds every original OpenFEMA field under 'raw' (HMA has 80+ fields).

## `enrichApplicants` (type: `boolean`):

Looks up each PA applicant ID (a public agency, district or non-profit) and adds its name, city and address. Adds a few seconds per 1,000 records.

## Actor input object example

```json
{
  "datasets": [
    "publicAssistance",
    "hazardMitigation"
  ],
  "states": [
    "WA",
    "OR"
  ],
  "sinceDate": "2025-01-01",
  "minAmount": 100000,
  "constructionOnly": false,
  "pendingOnly": false,
  "maxItems": 200,
  "includeRawRecord": false,
  "enrichApplicants": true
}
```

# Actor output Schema

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

No description

## `results` (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 = {
    "datasets": [
        "publicAssistance",
        "hazardMitigation"
    ],
    "states": [
        "WA",
        "OR"
    ],
    "sinceDate": "2025-01-01",
    "minAmount": 100000,
    "maxItems": 200
};

// Run the Actor and wait for it to finish
const run = await client.actor("wishbone_data/fema-recovery-projects").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 = {
    "datasets": [
        "publicAssistance",
        "hazardMitigation",
    ],
    "states": [
        "WA",
        "OR",
    ],
    "sinceDate": "2025-01-01",
    "minAmount": 100000,
    "maxItems": 200,
}

# Run the Actor and wait for it to finish
run = client.actor("wishbone_data/fema-recovery-projects").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 '{
  "datasets": [
    "publicAssistance",
    "hazardMitigation"
  ],
  "states": [
    "WA",
    "OR"
  ],
  "sinceDate": "2025-01-01",
  "minAmount": 100000,
  "maxItems": 200
}' |
apify call wishbone_data/fema-recovery-projects --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,wishbone_data/fema-recovery-projects"
        }
    }
}
```

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/wJogOjEGZ8MwDh8hH/builds/kHYPZJpv7mjHMTgYn/openapi.json
