OpenFEMA API
Free OpenFEMA API with no key: every US federal disaster declaration since 1953 with county-level detail, plus assistance, claims and shelter datasets. Tested example included.
Endpoint tested and returned HTTP 200 on 2026-08-21
What is the OpenFEMA API?
OpenFEMA is the Federal Emergency Management Agency's public data API, free and needing no key. Its Disaster Declarations Summaries dataset covers every US federal disaster declaration since 1953, one row per designated county, with incident type, dates and which assistance programmes were activated.
The disaster declarations dataset is the backbone of most FEMA analysis, and its shape catches people out: it is one row per declared county, not per disaster. A hurricane affecting sixty counties produces sixty rows sharing a `disasterNumber`, each with its own `designatedArea` and FIPS codes. Group by `disasterNumber` when you want events and leave it ungrouped when you want geographic exposure — conflating the two is how you end up reporting sixty hurricanes.
OpenFEMA uses OData-style query parameters — `$top`, `$skip`, `$filter`, `$select`, `$orderby` — and returns a `metadata` block echoing exactly what it applied, which makes debugging a filter much easier than usual. Note that `metadata.count` is 0 unless you pass `$inlinecount=allpages`, so do not read it as a total by default. The four boolean programme flags (`iaProgramDeclared`, `paProgramDeclared`, `ihProgramDeclared`, `hmProgramDeclared`) tell you what was actually authorised: individual assistance, public assistance, individual and households, and hazard mitigation.
Quick facts
- Base URL
https://www.fema.gov/api/open/v2- Authentication
- No API key or registration for any OpenFEMA dataset. There is no authenticated tier.
- Rate limit
- No published request limit; responses are capped at 1,000 records per page. Page with `$skip`.
- Pricing
- Free. US government works are in the public domain.
- CORS
- Enabled — callable directly from browser JavaScript
- Official docs
- Read the docs
How to use the OpenFEMA API
Every request below was executed against the live API on 2026-08-21, and the response shown is the real body it returned — not an illustration.
1. Fetch the most recent FEMA disaster declaration
GET https://www.fema.gov/api/open/v2/DisasterDeclarationsSummaries?$top=1
curl 'https://www.fema.gov/api/open/v2/DisasterDeclarationsSummaries?$top=1'const res = await fetch("https://www.fema.gov/api/open/v2/DisasterDeclarationsSummaries?$top=1");
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
const data = await res.json();
console.log(data);import requests
res = requests.get("https://www.fema.gov/api/open/v2/DisasterDeclarationsSummaries?$top=1", timeout=20)
res.raise_for_status()
print(res.json()){
"metadata": {
"skip": 0,
"select": null,
"rundate": "2026-08-21T07:59:36.096Z",
"top": 1,
"filter": "",
"format": "json",
"metadata": true,
"orderby": "",
"entityname": "DisasterDeclarationsSummaries",
"version": "v2",
"url": "/api/open/v2/DisasterDeclarationsSummaries?$top=1",
"count": 0
},
"DisasterDeclarationsSummaries": [
{
"femaDeclarationString": "FM-5672-AK",
"disasterNumber": 5672,
"state": "AK",
"declarationType": "FM",
"declarationDate": "2026-08-18T00:00:00.000Z",
"fyDeclared": 2026,
"incidentType": "Fire",
"declarationTitle": "MUKLUK FIRE",
"ihProgramDeclared": false,
"iaProgramDeclared": false,
"paProgramDeclared": true,
"hmProgramDeclared": false,
"incidentBeginDate": "2026-08-17T00:00:00.000Z",
"incidentEndDate": null,
"disasterCloseoutDate": null,
"tribalRequest": false,
"fipsStateCode": "02",
"fipsCountyCode": "240",
"placeCode": "99240",
"designatedArea": "Southeast Fairbanks (Census Area)",
"declarationRequestNumber": "26140",
"declarationRequestDate": "2026-08-17T00:00:00.000Z",
"lastIAFilingDate": null,
"incidentId": "2026081802",
"region": 10,
"designatedIncidentTypes": "R",
"lastRefresh": "2026-08-20T20:50:08.994Z",
"hash": "608a749843b5ff3e0033264b77220e1f58aac816",
"id": "5f3cd139-146c-4b95-be63-f0e4f19e02af"
}
]
}Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
$top | query | Optional | Records to return, up to 1,000. 1 |
$skip | query | Optional | Pagination offset. 1000 |
$filter | query | Optional | OData filter over any field. state eq 'CA' and incidentType eq 'Fire' |
$select | query | Optional | Fields to return, which cuts response size sharply. disasterNumber,state,incidentType |
$orderby | query | Optional | Sort clause. declarationDate desc |
$inlinecount | query | Optional | Set to `allpages` to populate `metadata.count` with the true total. allpages |
Response fields
metadataobject- Echo of the query applied, plus `count` — which stays 0 unless you request `$inlinecount=allpages`.
DisasterDeclarationsSummariesarray- The records, named after the entity rather than a generic `data` key.
femaDeclarationStringstring- Composite identifier such as `FM-5672-AK`, combining type, number and state.
disasterNumberinteger- The event identifier. Repeated across every county row for the same disaster.
declarationTypestring- `DR` major disaster, `EM` emergency, `FM` fire management assistance.
incidentTypestring- `Fire`, `Hurricane`, `Flood`, `Severe Storm` and similar.
designatedAreastring- The county or equivalent designated in that row.
fipsStateCode / fipsCountyCodestring- Zero-padded FIPS codes — keep them as strings or you lose the leading zero.
iaProgramDeclared / paProgramDeclared / ihProgramDeclared / hmProgramDeclaredboolean- Which assistance programmes were authorised.
What you can build with the OpenFEMA API
- Map US disaster declarations by county and incident type
- Count disasters per state per year for trend analysis
- Check whether a specific county has an active declaration
- Correlate declarations with climate or insurance data
- Build an emergency management dashboard
Common errors and how to fix them
Disaster counts are far too high
One row per designated county, not per event.
Fix: Group by `disasterNumber` when counting events; leave rows ungrouped only when measuring geographic extent.
metadata.count is 0
Counting is opt-in.
Fix: Add `$inlinecount=allpages` to get the true total for your filter.
FIPS codes lose their leading zero
They were parsed as integers.
Fix: Keep them as strings — `02` for Alaska becomes `2` and stops matching any shapefile.
400 on a filter
OData syntax error.
Fix: String literals use single quotes and field names are camelCase, matching the response exactly.
OpenFEMA API — frequently asked questions
Does OpenFEMA require an API key?
No. Every OpenFEMA dataset is open and unauthenticated, and there is no paid or registered tier to upgrade to.
Why are there multiple rows with the same disaster number?
Because the dataset records one row per designated county. A large hurricane covering sixty counties yields sixty rows sharing a `disasterNumber`, which is what makes county-level analysis possible.
How far back does the data go?
To 1953, the first year of the modern federal declaration process. That makes it one of the longest continuous US federal datasets available without a key.
What do the programme flags mean?
They record which assistance was authorised: `ia` individual assistance, `pa` public assistance, `ih` individuals and households, and `hm` hazard mitigation. A declaration can activate any combination, and the flags are the fastest way to filter by severity of response.
Tools that pair with this API
JSON to CSV Converter
Convert a JSON array of objects to CSV online. Automatic column headers from the union of all keys, delimiter choice and proper quoting — all in-browser.
CSV Viewer & Table
View CSV as a clean HTML table online. Live search filter, row and column counts, delimiter and header options — all processed locally in your browser.
Date Difference Calculator
Calculate the exact difference between two dates in years, months and days, plus total days, weeks, hours and minutes. Free, fast and private.
OpenFEMA is an independent third-party service and is not affiliated with ByteTools or ByteVancer. Details on this page were verified on 2026-08-21; always check the official documentation before relying on this API in production, as terms and limits can change.