# US Address Geocoder & FEMA Flood Zone Risk API (`infocomp/us-address-risk-enricher`) Actor

US address geocoder with Census Bureau lat/lon, tract and block FIPS, plus FEMA flood zone and National Risk Index scores. Batch enrich from keyless official data. $3 per 1,000 addresses.

- **URL**: https://apify.com/infocomp/us-address-risk-enricher.md
- **Developed by:** [InfoComp Data](https://apify.com/infocomp) (community)
- **Categories:** Lead generation, Business, Developer tools
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 enriched addresses

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

## US Address Geocoder & FEMA Flood Zone Risk API

Paste a list of U.S. addresses and get **one row per address** back with:

- **Census Bureau geocoding**: matched address, latitude/longitude, and state, county, census tract, block group and block FIPS/GEOIDs.
- **FEMA flood zone at the point**, from the National Flood Hazard Layer (NFHL): zone (A, AE, VE, X, D…), zone subtype, whether the point is in a Special Flood Hazard Area, base flood elevation where published, and FIRM ID.
- **FEMA National Risk Index (NRI)** for the **census tract** and **county**: composite risk score and rating, expected annual loss, social vulnerability, community resilience, and risk ratings for 11 hazards (inland and coastal flooding, hurricane, tornado, wildfire, earthquake, hail, strong wind, heat wave, winter weather, landslide).

All data comes from official, keyless U.S. government services. You don't need an API key and there is no scraping.

> **NRI values are area scores for the census tract or county, not property-level assessments.** That's why their field names start with `nriTract…` and `nriCounty…`.

### Pricing (pay per event): you pay only for matched addresses

| Mode | Event | Price | Per 1,000 |
|---|---|---|---|
| `full` (default): geocode + FEMA flood zone found + NRI tract/county | `address-enriched` | $0.003 | **$3.00** |
| `full`, but the FEMA flood zone is missing or unavailable for a matched address | `address-geocoded` | $0.001 | **$1.00** |
| `geocode_only`: lat/lon + FIPS | `address-geocoded` | $0.001 | **$1.00** |

- **No start fee.** **Unmatched, tied, invalid and failed addresses are free.** They are still in the output with `charged: false` and a `status` explaining why.
- **Full mode bills $0.003 only when a FEMA flood zone was actually found.** If FEMA has no digital flood map at the point, or the FEMA flood-map request fails (each FEMA request gets a 4 s timeout and exactly one retry), the row gets `floodZone: "unavailable"` plus a `floodZoneUnavailableReason` and is billed at the $0.001 geocode-only rate. The same $0.001 rate applies if the National Risk Index lookup fails.
- Duplicate addresses are processed once by default (`skipDuplicates`).
- The run stops cleanly when it reaches your **maximum cost per run**.

### Input

```json
{
  "addresses": ["1600 Pennsylvania Ave NW, Washington, DC 20500", "800 Decatur St, New Orleans, LA 70116"],
  "structuredAddresses": [{"id": "loan-123", "street": "233 S Wacker Dr", "city": "Chicago", "state": "IL", "zip": "60606"}],
  "mode": "full",
  "includeCountyRisk": true
}
```

- `addresses` takes one-line addresses. `structuredAddresses` takes street/city/state/zip, plus an optional `id` that is echoed back as `inputId`. You can use both in one run, for up to 50,000 addresses.
- Include the ZIP code, or the city and state.
- Supported: the 50 states, DC, Puerto Rico and the U.S. Island Areas (Census geocoder coverage).

### Output sample (real row from a local test run on Oct 28, 2026, about 1:22 PM CT; per-hazard fields trimmed)

```json
{
  "inputAddress": "800 Decatur St, New Orleans, LA 70116",
  "status": "MATCHED",
  "matchType": "Exact",
  "matchedAddress": "800 DECATUR ST, NEW ORLEANS, LA, 70116",
  "latitude": 29.957576305632,
  "longitude": -90.061926241683,
  "stateFips": "22",
  "countyFips": "22071",
  "tractGeoid": "22071013502",
  "blockGeoid": "220710135022003",
  "floodStatus": "FOUND",
  "floodZone": "X",
  "floodZoneUnavailableReason": null,
  "floodZoneSubtype": "AREA WITH REDUCED FLOOD RISK DUE TO LEVEE",
  "inSpecialFloodHazardArea": false,
  "dfirmId": "22071C",
  "nriTractStatus": "FOUND",
  "nriTractRiskScore": 94.1,
  "nriTractRiskRating": "Relatively High",
  "nriTractExpectedAnnualLossUsd": 4680513.03,
  "nriTractHurricaneRiskRating": "Very High",
  "nriTractInlandFloodingRiskRating": "Very Low",
  "nriCountyRiskScore": 98.25,
  "nriCountyRiskRating": "Relatively High",
  "nriVersion": "December 2025",
  "nriLevel": "Census-tract (and county) area score; not a property-level assessment.",
  "charged": true,
  "chargedEvent": "address-enriched",
  "disclaimer": "Not an official flood determination. Flood zone is read from FEMA's National Flood Hazard Layer at the geocoded point and may differ from an official FEMA Standard Flood Hazard Determination (Form 086-0-32), a LOMA/LOMR, or the zone for the whole parcel or structure. National Risk Index values are census-tract and county area scores, not property-level assessments.",
  "attribution": "Geocoding and census geographies: U.S. Census Bureau Geocoder. Flood zones: FEMA National Flood Hazard Layer (NFHL). Risk scores: FEMA National Risk Index.",
  "notEndorsed": "This product uses the Census Bureau Data API but is not endorsed or certified by the Census Bureau. This product uses the Federal Emergency Management Agency's National Risk Index dataset API or downloadable datasets but is not endorsed by FEMA. The Federal Government or FEMA cannot vouch for the data or analyses derived from these data after the data have been retrieved from the Agency's website(s). Flood zones come from FEMA's National Flood Hazard Layer web services; this product is not endorsed by FEMA.",
  "retrievedAt": "2026-10-28T18:22:22Z"
}
```

**`status` values:**

| Status | Meaning |
|---|---|
| `MATCHED` | The Census geocoder found the address. |
| `NO_MATCH` | Not in the Census address ranges. Free. |
| `TIE` | Several equally good candidates. Add the ZIP or more detail. Free. |
| `INVALID_INPUT` | Needs a street plus ZIP, or street + city + state. Free. |
| `GEOCODER_ERROR` | The Census service failed after retries. Free. |

**`floodStatus` values:**

| Flood status | Meaning |
|---|---|
| `FOUND` | A flood zone was read at the point. |
| `NO_NFHL_DATA` | FEMA has no digital flood map for this location (unmapped, or paper maps only). `floodZone` = `"unavailable"`, reason `FEMA_NO_DIGITAL_FLOOD_MAP`. Billed $0.001. |
| `ERROR` | The FEMA request failed after its one retry. `floodZone` = `"unavailable"`, reason `FEMA_LOOKUP_FAILED: …`. Billed $0.001. |

If the census tract code isn't in the NRI table (for example, Connecticut's 2022 planning regions), the Actor looks the tract up by point and sets `nriTractGeoid` to the NRI tract it used.

### How fast?

These are local test timings, not platform numbers:

- 6 addresses: about 4 s.
- 100 addresses: about 20 s, including 84 matched and enriched.
- Geocode-only: under 1 s per 100 addresses.

The Actor uses the Census batch geocoder (1,000 addresses per request) and rate-limited FEMA queries. FEMA requests go out at most 4 at a time and at least 0.15 s apart. Each one has a short timeout (`femaTimeoutSecs`, default 4 s) and is retried exactly once, after a backoff of about 1 s (or the server's Retry-After), on timeouts, 429 and 5xx responses. A stalled FEMA server therefore cannot hang the run. Census batch requests are retried up to 4 times with exponential backoff.

### Use cases

- Flood zone screening for real-estate, lending and insurance lead lists.
- Adding tract/county FIPS to CRM or loan files for ACS, CRA/LMI or territory joins.
- Ranking portfolios by FEMA NRI tract risk, such as hurricane or wildfire rating.

### Business Leads: add location and flood/hazard risk to a lead list

Many lead lists already carry a business address. Run those addresses through this Actor to add a lat/lon, county and census tract FIPS, the FEMA flood zone at the point and FEMA National Risk Index tract/county ratings. You can then sort or filter leads by territory or hazard exposure, for example roofing, restoration, insurance or lending prospects in high hurricane-risk tracts.

1. Export the leads from one of the tools below, or your own CRM, as street/city/state/zip.
2. Pass them in `structuredAddresses` and put your lead or record ID in `id`. It comes back as `inputId`, so you can join the rows back to your list.
3. Use `geocode_only` mode ($1 per 1,000) if you only need FIPS codes for territory joins.

The flood and risk values describe the location only. They are not an official flood determination and they say nothing about the business itself.

### Important: disclaimers, attribution, not endorsed

- **Not an official flood determination.** The flood zone is read from FEMA's National Flood Hazard Layer at the geocoded point. It may differ from an official FEMA Standard Flood Hazard Determination (Form 086-0-32), a LOMA/LOMR, or the zone for the whole parcel or structure. Don't use it for flood insurance purchase requirements.
- **National Risk Index values are census-tract and county area scores, not property-level assessments.**
- **Attribution:** geocoding and census geographies come from the U.S. Census Bureau Geocoder. Flood zones come from the FEMA National Flood Hazard Layer (NFHL). Risk scores come from the FEMA National Risk Index (December 2025 release at the time of testing).
- **Not endorsed (exact notices required by the source terms):**
  - Census Bureau: "This product uses the Census Bureau Data API but is not endorsed or certified by the Census Bureau."
  - FEMA National Risk Index: "This product uses the Federal Emergency Management Agency's National Risk Index dataset API or downloadable datasets but is not endorsed by FEMA. The Federal Government or FEMA cannot vouch for the data or analyses derived from these data after the data have been retrieved from the Agency's website(s)."
  - FEMA flood map: flood zones come from FEMA's National Flood Hazard Layer web services; this product is not endorsed by FEMA.
- No FEMA, DHS or Census Bureau logos or seals are used.
- Every output row repeats these notices (`disclaimer`, `attribution`, `notEndorsed`), along with `sourceUrls` and `retrievedAt` for citation.
- The output contains no personal data: no names and no owners. Only the address you supplied is echoed back.

### Related InfoComp tools

- [Form D Funding Leads: New Startup & Private Raise Filings](https://apify.com/infocomp/form-d-funding-leads): companies that just raised private capital, from public SEC EDGAR Form D filings.
- [New Business Filings Leads: Colorado | Business Leads](https://apify.com/infocomp/new-business-filings-colorado): newly registered Colorado LLCs, corporations and nonprofits from the State's public open data.
- [FMCSA New Carrier Leads: New MC Authorities | Business Leads](https://apify.com/infocomp/fmcsa-new-carrier-leads): trucking companies, freight brokers and forwarders whose FMCSA operating authority was just granted.
- [FMCSA Carrier Vetting & Watchlist: Authority, Insurance, Flags](https://apify.com/infocomp/fmcsa-carrier-vetting): bulk-check USDOT numbers: operating authority, insurance on file, safety flags and change alerts from FMCSA public data.
- [FDA Medical Device Establishment Leads | Business Leads](https://apify.com/infocomp/fda-device-establishment-leads): medical device makers, contract manufacturers and sterilizers from FDA registration data via openFDA.
- [OIG Exclusion Check & Medicare Opt-Out Screen - Bulk NPI LEIE](https://apify.com/infocomp/oig-exclusion-optout-screen): bulk-check NPIs against the HHS-OIG LEIE file and the CMS Medicare opt-out list.
- [SAM.gov Contract Opportunities Scraper: Federal RFPs & Bids](https://apify.com/infocomp/sam-gov-opportunities): US federal contract opportunities (RFPs, solicitations, awards) from the official SAM.gov API.
- [Tender Feed API: EU TED, UK Find a Tender & Contracts Finder](https://apify.com/infocomp/eu-uk-tenders): EU and UK public tenders in one feed, from official TED, Find a Tender and Contracts Finder APIs.
- [Greenhouse, Lever, Ashby & SmartRecruiters Jobs Scraper API](https://apify.com/infocomp/ats-jobs-feed): live job postings from Greenhouse, Lever, Ashby and SmartRecruiters via their public job-board APIs.
- [VIN Decoder Bulk: Specs, Recalls, MPG & Fuel Cost per Mile](https://apify.com/infocomp/bulk-vin-decoder-recalls-mpg): decode VINs in bulk with NHTSA vPIC, plus recall campaigns and EPA fuel economy.
- [Academic Paper Scraper: arXiv, PubMed, Crossref & OpenAlex API](https://apify.com/infocomp/scholarly-paper-search): search arXiv, PubMed, Crossref and OpenAlex in one run, de-duplicated by DOI.
- [CMS Home Health, Hospice & Dialysis Leads | Business Leads](https://apify.com/infocomp/cms-facility-leads): Medicare-certified home health agencies, hospices and dialysis centers from CMS open data, facility-level.
- [HUD Multifamily Owner/Manager Leads | Business Leads](https://apify.com/infocomp/hud-multifamily-leads): HUD-assisted apartment properties with management company, firm phone, Section 8 contract expiry and REAC score.
- [Company Name to Website Finder & Enrichment | Business Leads](https://apify.com/infocomp/wikidata-company-finder): turn company names into official websites, HQ, employees, industry, ticker, LEI and SEC CIK from Wikidata.
- [FDA 510(k) New Clearance Leads | Business Leads](https://apify.com/infocomp/fda-510k-clearance-leads): companies that just got a medical device cleared by FDA: new 510(k) decisions from openFDA.

### Sources

- U.S. Census Bureau Geocoder, batch geographies: https://geocoding.geo.census.gov/geocoder/Geocoding_Services_API.html
- FEMA National Flood Hazard Layer, Flood Hazard Zones layer: https://hazards.fema.gov/arcgis/rest/services/public/NFHL/MapServer/28 (about: https://www.fema.gov/flood-maps/national-flood-hazard-layer)
- FEMA National Risk Index, census tracts and counties: https://hazards.fema.gov/nri/
- Terms: https://www.census.gov/data/developers/about/terms-of-service.html, https://www.fema.gov/about/openfema/terms-conditions

# Actor input Schema

## `addresses` (type: `array`):

Single-line U.S. addresses, e.g. 1600 Pennsylvania Ave NW, Washington, DC 20500. Include the ZIP code (or city and state) for the best match rate. Up to 50,000 per run.

## `structuredAddresses` (type: `array`):

Addresses split into fields: \[{"id": "your-ref-1", "street": "233 S Wacker Dr", "city": "Chicago", "state": "IL", "zip": "60606"}]. "id" is optional and is echoed back as inputId. Street plus ZIP, or street plus city and state, is required.

## `mode` (type: `string`):

Full adds the FEMA NFHL flood zone at the point and FEMA National Risk Index scores for the census tract and county. Geocode only returns lat/lon and state/county/tract/block FIPS.

## `includeCountyRisk` (type: `boolean`):

Full mode: also add the county-level National Risk Index score and rating (area score, not property-level). No extra charge.

## `skipDuplicates` (type: `boolean`):

Process each distinct address once (case and punctuation ignored), so you are not charged twice for the same address.

## `maxAddresses` (type: `integer`):

Stop after this many addresses (your max cost per run also applies).

## `maxConcurrency` (type: `integer`):

FEMA does not publish rate limits, so the Actor stays conservative (requests are also spaced at least 0.15 s apart and retried with exponential backoff).

## `femaTimeoutSecs` (type: `integer`):

Each FEMA flood-map and National Risk Index request is given this long, then retried exactly once. If it still fails, the flood zone is marked "unavailable" and the address is billed at the $0.001 geocode-only rate.

## Actor input object example

```json
{
  "addresses": [
    "1600 Pennsylvania Ave NW, Washington, DC 20500",
    "800 Decatur St, New Orleans, LA 70116",
    "400 Broad St, Seattle, WA 98109",
    "3251 South Miami Avenue, Miami, FL 33129",
    "2313 Red River Street, Austin, TX 78705"
  ],
  "structuredAddresses": [
    {
      "id": "example-1",
      "street": "233 S Wacker Dr",
      "city": "Chicago",
      "state": "IL",
      "zip": "60606"
    }
  ],
  "mode": "full",
  "includeCountyRisk": true,
  "skipDuplicates": true,
  "maxAddresses": 50000,
  "maxConcurrency": 4,
  "femaTimeoutSecs": 4
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "addresses": [
        "1600 Pennsylvania Ave NW, Washington, DC 20500",
        "800 Decatur St, New Orleans, LA 70116",
        "400 Broad St, Seattle, WA 98109",
        "3251 South Miami Avenue, Miami, FL 33129",
        "2313 Red River Street, Austin, TX 78705"
    ],
    "structuredAddresses": [
        {
            "id": "example-1",
            "street": "233 S Wacker Dr",
            "city": "Chicago",
            "state": "IL",
            "zip": "60606"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("infocomp/us-address-risk-enricher").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 = {
    "addresses": [
        "1600 Pennsylvania Ave NW, Washington, DC 20500",
        "800 Decatur St, New Orleans, LA 70116",
        "400 Broad St, Seattle, WA 98109",
        "3251 South Miami Avenue, Miami, FL 33129",
        "2313 Red River Street, Austin, TX 78705",
    ],
    "structuredAddresses": [{
            "id": "example-1",
            "street": "233 S Wacker Dr",
            "city": "Chicago",
            "state": "IL",
            "zip": "60606",
        }],
}

# Run the Actor and wait for it to finish
run = client.actor("infocomp/us-address-risk-enricher").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 '{
  "addresses": [
    "1600 Pennsylvania Ave NW, Washington, DC 20500",
    "800 Decatur St, New Orleans, LA 70116",
    "400 Broad St, Seattle, WA 98109",
    "3251 South Miami Avenue, Miami, FL 33129",
    "2313 Red River Street, Austin, TX 78705"
  ],
  "structuredAddresses": [
    {
      "id": "example-1",
      "street": "233 S Wacker Dr",
      "city": "Chicago",
      "state": "IL",
      "zip": "60606"
    }
  ]
}' |
apify call infocomp/us-address-risk-enricher --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,infocomp/us-address-risk-enricher"
        }
    }
}
```

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/1wxZFiAeXZtAuka27/builds/DiIZir3pWeQPcGeCX/openapi.json
