API reference: GET /api/v1/flood/zone
One endpoint. It takes an address or a point and returns the FEMA flood zone, SFHA flag, static base flood elevation and FIRM panel at that point.
GET https://api.floodzoneapi.com/api/v1/flood/zoneAuthentication
Send your key as a bearer token: Authorization: Bearer fza_.... A ?key= query parameter also works, but URLs end up in logs, so prefer the header. Keys belong to your account and work only on this API. Create and revoke them on your account page; up to five at a time.
Parameters
Send exactly one of: address, or lat with lon.
| Name | Type | Description |
|---|---|---|
| address | string, 5 to 300 characters | A US street address with a house number. City and state, or a ZIP, make the match more reliable. Geocoded with the US Census Geocoder (Public_AR_Current benchmark); if Census has no match, an OpenStreetMap result is used only when it carries the same house number. |
| lat | number, -90 to 90 | Latitude, WGS84 decimal degrees. |
| lon | number, -180 to 180 | Longitude, WGS84 decimal degrees. Longitudes in the continental US are negative. |
Response fields
Every successful answer is HTTP 200 with Content-Type: application/json, including points FEMA has not mapped ("mapped": false). Within v1, fields may be added; existing fields are not renamed or removed.
- queryobject
- Echo of your input:
{"address": ...}or{"lat": ..., "lon": ...}. - location.lat, location.lonnumber
- The point looked up, to 6 decimal places.
- location.geocoderstring or null
"census"(US Census Geocoder),"openstreetmap"(fallback, used only when its result has the same house number as your address) ornullwhen you sent coordinates.- location.precisionstring
"address_range": interpolated along the street segment's address range (Census)."address_point": an OpenStreetMap building or address point."input_coordinates": your lat and lon.- location.matched_addressstring or null
- The address the geocoder matched. Compare it with what you sent.
- location.candidatesinteger or null
- How many matches the geocoder returned. We use the first; more than 1 means the address was ambiguous.
- location.county, location.county_fips, location.statestring or null
- County name, 5-digit county FIPS and 2-letter state code, when the geocoder supplies them (
nullfor coordinate lookups). - flood_zone.mappedboolean
falsewhen FEMA's digital map has no flood hazard area at the point. All otherflood_zonefields are thennullor empty.- flood_zone.zonestring or null
- FEMA's
FLD_ZONE, for example"AE","X","VE". See the zone table below. - flood_zone.subtypestring or null
- FEMA's
ZONE_SUBTY, for example"FLOODWAY"or"AREA OF MINIMAL FLOOD HAZARD". - flood_zone.descriptionstring or null
- A one-line definition from the FIRM legend.
- flood_zone.sfhaboolean or null
- FEMA's
SFHA_TF: in a Special Flood Hazard Area or not.nullwhen unmapped orAREA NOT INCLUDED. - flood_zone.static_bfeobject or null
{elevation, unit, datum}fromSTATIC_BFE,LEN_UNITandV_DATUM.nullwhere FEMA stores -9999 (no single elevation for the zone). Datums vary (NGVD29, NAVD88 and others).- flood_zone.depthobject or null
{value, unit}for AO zones, fromDEPTH; otherwisenull.- flood_zone.dfirm_idstring or null
- The digital FIRM database the zone polygon belongs to, for example
"12086C". IDs ending in C are countywide. - flood_zone.polygon_idstring or null
- FEMA's
FLD_AR_IDfor the polygon. Useful for spotting when the polygon at a point changes. - flood_zone.at_zone_boundaryboolean
truewhen the point touches polygons with different zones. We return the most hazardous: V zones, then other SFHA zones, then shaded X (0.2%, shallow or small-basin 1%, future conditions, levee-protected), then other X, then D.- flood_zone.other_zonesarray
- The other zones at a boundary:
[{zone, subtype, sfha}]. - firm_panelobject or null
nullwhen no FIRM panel covers the point.- firm_panel.panelstring
- The FIRM panel number, for example
"12086C0317L"(the final letter is the panel's revision suffix). - firm_panel.effective_datestring or null
- The panel's effective date,
YYYY-MM-DD.nullwhere FEMA's record holds a placeholder such as 9999-09-09. - firm_panel.panel_type, firm_panel.dfirm_idstring
- FEMA's
PANEL_TYP(for example "Countywide, Panel Printed") and the panel's DFIRM ID. - firm_panel.other_panelsarray
- Other panels covering the point, at county lines. The main panel is the one from the same DFIRM as the zone polygon, then the latest effective date.
- source.dataset, source.service, source.layersstring, string, array
- FEMA National Flood Hazard Layer, the map service URL, and the layers queried: 28 (Flood Hazard Zones) and 3 (FIRM Panels).
- source.query_pointobject
- The point sent to FEMA: your point rounded to 5 decimal places (about 1.1 m), which is also the cache key.
- source.queried_atstring
- When FEMA answered, ISO 8601 UTC. On a cached answer this is the original time.
- source.cached, source.cache_ttl_secondsboolean, integer
- Whether this answer came from the cache, and the cache lifetime (86400 seconds).
- noticestring
- The informational notice. Show it, or its substance, wherever you show the zone to end users.
Example: a point where two counties' panels overlap
This New Orleans point sits where Orleans Parish (22071C) and Jefferson Parish (22051C) panels overlap. The zone polygon belongs to 22071C, so that panel comes first even though the other took effect later.
curl -sG https://api.floodzoneapi.com/api/v1/flood/zone \
-H "Authorization: Bearer $FZA_KEY" \
-d lat=29.9511 -d lon=-90.0715{
"query": {
"lat": 29.9511,
"lon": -90.0715
},
"location": {
"lat": 29.9511,
"lon": -90.0715,
"geocoder": null,
"precision": "input_coordinates",
"matched_address": null,
"candidates": null,
"county": null,
"county_fips": null,
"state": null
},
"flood_zone": {
"mapped": true,
"zone": "X",
"subtype": "0.2 PCT ANNUAL CHANCE FLOOD HAZARD",
"description": "0.2% annual chance flood hazard. Outside the Special Flood Hazard Area.",
"sfha": false,
"static_bfe": null,
"depth": null,
"dfirm_id": "22071C",
"polygon_id": "22071C_10245",
"at_zone_boundary": false,
"other_zones": []
},
"firm_panel": {
"panel": "22071C0229F",
"effective_date": "2016-09-30",
"panel_type": "Countywide, Panel Printed",
"dfirm_id": "22071C",
"other_panels": [
{
"panel": "22051C0225F",
"effective_date": "2018-02-02",
"panel_type": "Countywide, Panel Printed",
"dfirm_id": "22051C"
}
]
},
"source": {
"dataset": "FEMA National Flood Hazard Layer (NFHL)",
"service": "https://hazards.fema.gov/arcgis/rest/services/public/NFHL/MapServer",
"layers": [
{
"id": 28,
"name": "Flood Hazard Zones"
},
{
"id": 3,
"name": "FIRM Panels"
}
],
"query_point": {
"lat": 29.9511,
"lon": -90.0715
},
"queried_at": "2026-09-29T02:02:26Z",
"cached": true,
"cache_ttl_seconds": 86400
},
"notice": "Informational. This is the zone shown on FEMA's effective flood map (NFHL) at this point. It is not a Standard Flood Hazard Determination (FEMA Form 086-0-32), a prediction of flood risk, or an insurance quote, and it does not reflect a Letter of Map Amendment issued for a single structure."
}Zone values
| zone (subtype) | sfha | Meaning (FIRM legend) |
|---|---|---|
| A | Yes | 1% annual chance flood hazard. No base flood elevations determined. |
| AE | Yes | 1% annual chance flood hazard. Base flood elevations determined. |
| AH | Yes | 1% annual chance shallow flooding, usually areas of ponding, with depths of 1 to 3 feet. Base flood elevations determined. |
| AO | Yes | 1% annual chance shallow flooding, usually sheet flow on sloping terrain, with depths of 1 to 3 feet. Flood depths determined. |
| AR | Yes | 1% annual chance flood hazard in an area where a decertified flood protection system is being restored. |
| A99 | Yes | 1% annual chance flood hazard in an area to be protected by a federal flood protection system under construction. |
| V | Yes | Coastal 1% annual chance flood hazard with wave action. No base flood elevations determined. |
| VE | Yes | Coastal 1% annual chance flood hazard with wave action. Base flood elevations determined. |
| X (0.2 PCT ANNUAL CHANCE FLOOD HAZARD) | No | 0.2% annual chance flood hazard. FEMA also writes this subtype with a suffix such as "IN COASTAL ZONE". |
| X (1 PCT DEPTH LESS THAN 1 FOOT) | No | 1% annual chance flood hazard with average depths of less than 1 foot. |
| X (1 PCT DRAINAGE AREA LESS THAN 1 SQUARE MILE) | No | 1% annual chance flood hazard with a drainage area of less than 1 square mile. |
| X (1 PCT FUTURE CONDITIONS) | No | Future-conditions 1% annual chance flood hazard. |
| X (AREA WITH REDUCED FLOOD RISK DUE TO LEVEE) | No | Area with reduced flood risk due to a levee. |
| X (AREA OF MINIMAL FLOOD HAZARD) | No | Area of minimal flood hazard. |
| D | No | Possible but undetermined flood hazard. No flood hazard analysis has been done. |
| OPEN WATER | As FEMA marks it | Open water. |
| AREA NOT INCLUDED | null | Not included in this flood map study, so no zone is determined here. |
Response headers
| Header | Meaning |
|---|---|
| X-Quota-Limit | Calls your plan includes this calendar month (UTC). |
| X-Quota-Remaining | Calls left this month after this one. |
| X-RateLimit-Limit, X-RateLimit-Remaining | The per-second limit (5) and what is left of it. |
| Retry-After | On 503 and 429 rate-limit answers: seconds to wait before retrying. |
What counts as a call
- Every authenticated request counts against the month's quota, including 404
address_not_found. - 422 (bad input) and any 5xx (FEMA, the geocoder or we failed) are refunded automatically, so the quota only pays for answers.
- 401 and rate-limited requests are never metered.
- At the quota, calls return 429
quota_exceededuntil the first day of the next month (UTC), or until you upgrade. There is no overage billing. - Rate limit: 5 requests per second per key.
Caching
FEMA's answer for a point is cached for 24 hours, keyed by the point rounded to 5 decimal places (about 1.1 m), and FEMA is queried at that rounded point. Address geocodes are cached for 24 hours. Unmapped answers are never cached, because FEMA occasionally returns an empty answer for a mapped point and a second try gets the zone. source.cached and source.queried_at tell you exactly what you got.
Known limits of a zone lookup
- It reports the effective map, not flood risk, and it is not a Standard Flood Hazard Determination.
- Letters of Map Amendment (LOMAs) for single structures are not reflected. Effective Letters of Map Revision (LOMRs) are, because FEMA folds them into the NFHL polygons.
- Preliminary maps that have not taken effect are not included.
- Address-range geocoding places a house somewhere along its block face. Near a zone line, send your own rooftop or parcel coordinates.
- US states, DC, Puerto Rico, Guam, American Samoa, the Northern Mariana Islands and the US Virgin Islands only. Coverage by state.
OpenAPI
The machine-readable description is at /openapi.json (OpenAPI 3.1), for client generators and API tools.