# FEMA Disaster Recovery Tracker: All 50 States (`maniginam/fema-disaster-recovery-tracker`) Actor

Track FEMA disaster recovery money in all 50 states, DC, and US territories: Public Assistance projects, obligations, and applicants, Hazard Mitigation grants, and Individual Assistance.  Filter by state, county, disaster, date, incident type, and amount, or monitor for new and changed records.

- **URL**: https://apify.com/maniginam/fema-disaster-recovery-tracker.md
- **Developed by:** [ManiGinaM](https://apify.com/maniginam) (community)
- **Categories:** Lead generation, Business
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.25 / 1,000 fema records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

Get a feed of new FEMA disaster recovery money as it is obligated, in all 50 states, DC, and US territories.  Pick a state, a disaster, or a type of disaster, turn on monitor mode, and schedule the Actor: each run delivers only the Public Assistance projects, obligations, applicants, Hazard Mitigation grants, and housing assistance totals that are new or changed since the last run, and you pay only for those records.

### Monitor mode

Set `onlyNewOrChanged` to true and add a schedule, for example every weekday at 7 AM Central.  The Actor keeps a history for that exact search in a named key-value store, `fema-disaster-recovery-tracker-monitor`.  The first run delivers every matching record as `new`.  Later runs deliver only records FEMA added (`new`) and records whose FEMA data changed (`changed`).  Unchanged records are skipped and never charged.

A record counts as changed when its `sourceHash` moves.  That is FEMA's own row hash where FEMA publishes one, and otherwise a SHA-256 of every field in the row except FEMA's bookkeeping id and refresh time.  So a new obligation, a revised project amount, a status change, or a new closeout date all show up, while FEMA's nightly refresh of an unchanged row does not.

Good to know before you rely on it:

- History is keyed on the dataset and every filter: states, counties, disaster numbers, declaration dates, incident types, and minimum amount.  Order and letter case do not matter, and neither does `maxResults`.  Change any filter, including a declaration date you move forward, and the Actor starts a fresh history and reports every matching record as `new` again.  Keep the filters fixed for a monitor.
- Each run stops after delivering `maxResults` records, so set it high enough for a busy week after a major disaster.
- Grant award activities are one row per obligation, so in this dataset every row is a new event and only ever shows up as `new`.
- Two schedules running the same search at the same time share one history, and the run that finishes last wins.
- Each search's history holds the 100,000 records delivered most recently.  Past that, the record delivered longest ago is forgotten and would be reported as `new` if it ever came back.
- If the saved history ever becomes unreadable, the run fails with a message naming the record to delete, instead of charging you again for every record.

### What does it do?

The Actor reads FEMA's free OpenFEMA API and returns one clean record per row in the same shape for every dataset: disaster number and name, declaration date, incident type, state, county, city and ZIP when FEMA has them, recipient, project title, category, status, approved and obligated dollars, the key dates, a link to the disaster on fema.gov, and every original FEMA field under `details`.

| `dataset` | What one record is | Rows at OpenFEMA (October 2026) |
| --- | --- | --- |
| `paFundedProjects` | A Public Assistance project (project worksheet) with its approved and obligated dollars | about 851,000 |
| `paAwardActivities` | One Public Assistance obligation, including negative amounts when FEMA reduces one | about 1,227,000 |
| `paApplicants` | A state, local, tribal, or nonprofit applicant for Public Assistance, with its address | about 200,000 |
| `hmaSubapplications` | A Hazard Mitigation Assistance subapplication (HMGP, BRIC, FMA, and others) | about 64,000 |
| `ihpHouseholds` | One Individuals and Households Program registration, with no names or addresses | about 26,250,000 |
| `housingOwners` | Housing assistance to homeowners, totaled by disaster, county, city, and ZIP code | about 161,000 |
| `housingRenters` | Housing assistance to renters, totaled by disaster, county, city, and ZIP code | about 148,000 |

Public Assistance projects carry only an applicant id, so the Actor fills in `recipientName` from FEMA's applicants dataset.  Every record gets its disaster name, declaration date, and incident type from FEMA's disaster declarations catalog, so the incident type wording is the same in every dataset.  There is no browser, no proxy, no login, and no API key.

### Who is it for?

- Disaster restoration, debris, roofing, and rebuilding contractors looking for funded projects and the parishes, counties, and agencies receiving them.
- Grant writers and Hazard Mitigation consultants tracking obligations, subapplications, and closeouts for clients.
- Insurers, reinsurers, and lenders measuring federal assistance by ZIP code after a storm.
- Journalists, researchers, and watchdog groups following where recovery money goes.
- Emergency management and public finance consultants benchmarking one disaster against another.

### How to use

1. Open the Actor in Apify Console and pick a FEMA dataset, such as Public Assistance funded projects.
2. Pick one or more states and, if you know them, disaster numbers.
3. Optionally narrow the search under **Filters** by county, declaration date, incident type, or amount.
4. Click **Start** and wait for the run to finish.
5. Open the **Output** tab to preview records, then export them as JSON, CSV, Excel, or XML.
6. To watch for new and changed records, turn on monitor mode and add a schedule.

### Input

| Field | Type | Description |
| --- | --- | --- |
| `dataset` | dataset | One of the seven datasets above.  Default `paFundedProjects`. |
| `states` | list of states | Two-letter state or territory codes, for example `TX`, `FL`, `LA`, or `PR`.  Empty means the whole country. |
| `counties` | list of names | County, parish, or borough names such as `Jefferson Parish` or `Harris`.  The word County, Parish, or Borough is optional and `St.` matches `Saint`.  Records with no county, or marked `Statewide`, are left out when this is set.  Not available for `paApplicants`.  Up to 100. |
| `disasterNumbers` | list of text | FEMA disaster numbers written as text, for example `"4673"` for Hurricane Ian in Florida or `"4332"` for Hurricane Harvey in Texas.  Up to 200. |
| `declaredSince` | date | Earliest disaster declaration date, `YYYY-MM-DD`. |
| `declaredUntil` | date | Latest disaster declaration date, `YYYY-MM-DD`, inclusive. |
| `incidentTypes` | list of incident types | FEMA incident types such as `Hurricane`, `Flood`, `Severe Storm`, or `Fire`. |
| `minAmount` | number | Keep only records with at least this many dollars: obligated for Public Assistance and Hazard Mitigation, approved for household and housing assistance.  Not available for `paApplicants`. |
| `maxResults` | number | Most records to deliver in one run.  Default 1000, maximum 500,000. |
| `onlyNewOrChanged` | true or false | Monitor mode.  Delivers only records that are new or changed since the previous run of the same search. |

Records come newest disaster first.  Declaration dates and incident types are matched against FEMA's disaster declarations catalog first, then the dataset is searched for those disasters.  Hazard Mitigation subapplications that are not tied to a disaster (for example BRIC and Flood Mitigation Assistance grants) have no disaster number, so they are left out when you filter by disaster, declaration date, or incident type.

Sample input:

```json
{
  "dataset": "paFundedProjects",
  "states": ["FL", "GA", "SC", "NC"],
  "incidentTypes": ["Hurricane"],
  "declaredSince": "2020-01-01",
  "minAmount": 1000000,
  "maxResults": 5000,
  "onlyNewOrChanged": true
}
```

### Output

Each record is one dataset item.  This is a real Public Assistance project from Hurricane Ida in Louisiana:

```json
{
  "dataset": "paFundedProjects",
  "recordKey": "paFundedProjects:4611|000-U04A1-00|430",
  "disasterNumber": 4611,
  "disasterTitle": "HURRICANE IDA",
  "declarationDate": "2021-08-29",
  "incidentType": "Hurricane",
  "state": "LA",
  "county": "Statewide",
  "city": null,
  "zipCode": null,
  "recipientId": "000-U04A1-00",
  "recipientName": "Louisiana Department of Transportation and Development",
  "title": "OPER100 / Emergency Protective Measures",
  "category": "B - Emergency Protective Measures",
  "status": "Eligible",
  "amountApproved": 15005039.37,
  "amountObligated": 15005039.37,
  "firstObligatedDate": "2022-05-16",
  "lastObligatedDate": "2022-05-16",
  "appliedDate": null,
  "sourceLastRefresh": "2026-07-23T18:44:06.680Z",
  "sourceHash": "1e522f99b16705eba33918b571d1d20ae4c48968",
  "femaDisasterUrl": "https://www.fema.gov/disaster/4611",
  "suspectDates": null,
  "details": {
    "disasterNumber": 4611,
    "declarationDate": "2021-08-29T00:00:00.000Z",
    "incidentType": "Hurricane",
    "pwNumber": 430,
    "applicationTitle": "OPER100 / Emergency Protective Measures",
    "applicantId": "000-U04A1-00",
    "damageCategoryCode": "B",
    "damageCategoryDescrip": "Emergency Protective Measures",
    "projectStatus": "Eligible",
    "projectProcessStep": "Obligated",
    "projectSize": "Large",
    "county": "Statewide",
    "countyCode": "33",
    "stateAbbreviation": "LA",
    "stateNumberCode": "22",
    "projectAmount": 15005039.37,
    "federalShareObligated": 15005039.37,
    "totalObligated": 15005039.37,
    "lastObligationDate": "2022-05-16T00:00:00.000Z",
    "firstObligationDate": "2022-05-16T00:00:00.000Z",
    "mitigationAmount": 0,
    "gmProjectId": 667369,
    "gmApplicantId": 127405
  },
  "changeType": "notTracked"
}
```

You can download results as JSON, CSV, Excel, or XML, or read them through the Apify API.

- `recordKey` identifies a record within its dataset and is what monitor mode remembers.
- `amountApproved` is the project amount for Public Assistance projects, the federal share for Hazard Mitigation, and the approved assistance for households and housing.  `amountObligated` is what FEMA has obligated, and is empty for datasets that do not report it.
- `county` reads like `Jefferson Parish` or `Harris County` across datasets.  Public Assistance records for a whole state read `Statewide`.  Hazard Mitigation records list the benefiting counties as FEMA spells them, separated by semicolons.
- `details` keeps every field FEMA published for the row, so nothing is lost.
- Dates are calendar days, `YYYY-MM-DD`.  Any date later than tomorrow in Central time is not credible, so it is published as null and its raw value is kept in `suspectDates` under the field name.
- `changeType` is `new` or `changed` in monitor mode and `notTracked` otherwise.

### Pricing

This Actor uses pay-per-event pricing.

- **FEMA record:** $5.00 per 1,000 records delivered to your dataset ($0.005 each).
- **Actor start:** Apify's standard start event ($0.00005).
- There is no separate charge per dataset item.

Every Public Assistance project for Hurricane Harvey in Texas is about 6,600 records, or about $33, and Hurricane Ida in Louisiana is about 3,650 records, or about $18.  A weekly monitor of one state's Public Assistance projects often delivers a few dozen new or changed records, so it costs well under a dollar a week.  You can cap any run with `maxResults` or Apify's maximum charge setting, and Apify may apply a default maximum charge to runs started without one, so raise it for a full pull.  The Actor stops cleanly at your limit, and you are charged only for records that actually reach your dataset.

#### Estimated compute cost

Default memory is 512 MB.  The Actor reads up to 10,000 rows per request (2,000 for the larger household and Hazard Mitigation rows) with at least one second between requests.  Measured on Apify at 512 MB, 100 Hurricane Ida project records took 8 seconds and about $0.001 in platform usage, and 1,586 records took 6 seconds and about $0.008.  Most of that is dataset storage writes, about $0.005 per 1,000 records, while compute is a fraction of a cent per run.  Searches that filter by county read rows they do not deliver, so a county search across a very large dataset such as household registrations can take a few minutes, still only cents in compute.

### Data source and freshness

Data comes from OpenFEMA, FEMA's public data API at `https://www.fema.gov/api/open/`.  FEMA updates each dataset on its own schedule, from daily to monthly, and `sourceLastRefresh` shows FEMA's refresh time when the dataset has one.

- Public Assistance Funded Projects Details: `v2/PublicAssistanceFundedProjectsDetails`
- Public Assistance Grant Award Activities: `v2/PublicAssistanceGrantAwardActivities`
- Public Assistance Applicants: `v1/PublicAssistanceApplicants`
- Hazard Mitigation Assistance Subapplications: `v2/HmaSubapplications`, which replaced the older Hazard Mitigation project datasets FEMA retired in October 2026
- Individuals and Households Program Valid Registrations: `v2/IndividualsAndHouseholdsProgramValidRegistrations`
- Housing Assistance Program Data, Owners and Renters: `v2/HousingAssistanceOwners` and `v2/HousingAssistanceRenters`
- Disaster names and declarations: `v1/FemaWebDisasterDeclarations`

The Actor pages with OData `$top` and `$skip`, waits at least a second between requests, retries server errors politely, and honors `Retry-After`.  If OpenFEMA asks the run to wait more than a minute, or stays down after several retries, the run stops with a short message and keeps every record it already delivered.  Run it again later.  If FEMA inserts rows while a long run is paging, a row can shift onto a later page; the Actor remembers the most recent deliveries so a shifted row is not delivered or charged twice.

### Is it legal to use this data?

OpenFEMA is a public API that FEMA publishes for anyone to use, and works of the U.S. federal government are generally not subject to copyright.  Household registration data has no names or addresses.  The data is provided as is, without any guarantee that it is complete or current.  Confirm anything important with FEMA or the grant recipient.  This Actor is an independent tool and is not affiliated with or endorsed by FEMA or the U.S. Department of Homeland Security.

### API and integrations

You can start this Actor and read its results with the [Apify API](https://docs.apify.com/api/v2), the Apify Python and JavaScript clients, or the Apify CLI.  The API returns each run's dataset in the same formats as the Console.

Apify integrations can pass results on when a run finishes, for example to Google Sheets, Slack, Zapier, Make, or your own webhook.  Set them up on the Actor's **Integrations** tab, and pair them with a schedule for a hands-off feed.

### FAQ

**Do I need an OpenFEMA account or API key?**  No.  OpenFEMA is free and open.

**How do I find a disaster number?**  Search the disaster on `https://www.fema.gov/disaster/declarations`.  The number is in the page address, for example `4673` for Hurricane Ian in Florida.  You can also filter by `incidentTypes` and `declaredSince` instead of naming disasters.

**Why does a county filter miss some Public Assistance projects?**  FEMA records statewide projects, often the largest ones, as `Statewide` instead of under a county.  Run without `counties` to include them.

**Why are some Hazard Mitigation amounts missing?**  FEMA reports an obligated amount only once money is obligated, so subapplications still under review show an empty or zero `amountObligated`.  `amountApproved` carries the federal share FEMA lists for the subapplication.

### Related Actors

- [US EPA ECHO Compliance Monitor](https://apify.com/maniginam/us-epa-echo-compliance-monitor): EPA facilities, violations, and enforcement cases in all 50 states.
- [Louisiana Building Permits (Baton Rouge, NOLA)](https://apify.com/maniginam/louisiana-building-permits): Baton Rouge and New Orleans building permits.
- [Louisiana Distressed Property & Sheriff Sale Leads](https://apify.com/maniginam/louisiana-distressed-property-leads): sheriff sales, blight, and tax-adjudicated property leads in Louisiana.
- [East Baton Rouge Absentee Owner Parcel Leads](https://apify.com/maniginam/east-baton-rouge-absentee-owner-leads): East Baton Rouge Parish parcels with owner mailing addresses and absentee flags.
- [Gulf Coast USACE Permits & Wetland Monitor](https://apify.com/maniginam/gulf-coast-usace-permits): U.S. Army Corps of Engineers permits and wetland determinations on the Gulf Coast.

### Feedback and custom requests

Found a bug, a wrong value, or a source that changed?  Open an issue in the Issues tab on this Actor's page.  Need another field, filter, or source, or a version built for your team?  Describe it in the Issues tab as a custom request.

# Changelog

This Actor's version history is a separate document: https://apify.com/maniginam/fema-disaster-recovery-tracker/changelog.md

# Actor input Schema

## `dataset` (type: `string`):

Which OpenFEMA dataset to search.  Public Assistance funded projects are the obligated rebuilding projects; award activities are each obligation as it happens; applicants are the governments and nonprofits that applied; Hazard Mitigation subapplications are mitigation grants; IHP registrations are individual households (no names); housing assistance is aggregated by ZIP code.

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

Two-letter state or territory codes.  Leave empty for the whole country.

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

County, parish, or borough names, such as Jefferson Parish or Harris.  The word County, Parish, or Borough is optional and St. matches Saint.  Records with no county, or marked Statewide, are left out when this is set.  Not available for Public Assistance applicants.  Up to 100.

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

FEMA disaster numbers, such as 4673 for Hurricane Ian in Florida.  Leave empty for every disaster.  Up to 200.

## `declaredSince` (type: `string`):

Earliest disaster declaration date (YYYY-MM-DD).  Leave empty for no lower bound.

## `declaredUntil` (type: `string`):

Latest disaster declaration date (YYYY-MM-DD), inclusive.  Leave empty for no upper bound.

## `incidentTypes` (type: `array`):

Keep only disasters FEMA declared for these incident types, such as Hurricane or Flood.  Leave empty for all.

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

Keep only records with at least this many dollars: obligated for Public Assistance and Hazard Mitigation, approved for household and housing assistance.  Not available for Public Assistance applicants.  Leave at 0 for every amount.

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

Stop after delivering this many records.  Each delivered record is one charged event.

## `onlyNewOrChanged` (type: `boolean`):

Remember what this search delivered and, on later runs with the same filters, deliver only records that are new or whose FEMA data changed.  Schedule the Actor to get a feed of fresh obligations.

## Actor input object example

```json
{
  "dataset": "paFundedProjects",
  "states": [
    "TX",
    "FL"
  ],
  "disasterNumbers": [
    "4332",
    "4673"
  ],
  "maxResults": 100,
  "onlyNewOrChanged": false
}
```

# Actor output Schema

## `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 = {
    "dataset": "paFundedProjects",
    "states": [
        "TX",
        "FL"
    ],
    "disasterNumbers": [
        "4332",
        "4673"
    ],
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("maniginam/fema-disaster-recovery-tracker").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 = {
    "dataset": "paFundedProjects",
    "states": [
        "TX",
        "FL",
    ],
    "disasterNumbers": [
        "4332",
        "4673",
    ],
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("maniginam/fema-disaster-recovery-tracker").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 '{
  "dataset": "paFundedProjects",
  "states": [
    "TX",
    "FL"
  ],
  "disasterNumbers": [
    "4332",
    "4673"
  ],
  "maxResults": 100
}' |
apify call maniginam/fema-disaster-recovery-tracker --silent --output-dataset

```

## MCP server setup

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

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/upncxrTZlTm0HRnrF/builds/7KFliSEiahnhofaLx/openapi.json
