SFOLN

Catalogue / Data utilities

US Address Geocoder – Census Tract & Flood

sfoln/us-address-enrichment · Real estate, Developer tools, Automation On request

Geocode US addresses with the US Census Bureau geocoder: matched address, latitude/longitude, state and county FIPS, census tract, block group, block, congressional and legislative districts, ZCTA and metro area, plus an optional FEMA flood zone. $3 per 1,000 addresses; no-match addresses are free.

About

What it does

US Address Geocoder – Census Tract & Flood turns US street addresses into coordinates and Census geographies with the official US Census Bureau geocoder: the standardised matched address, latitude/longitude, state and county FIPS codes, census tract, block group and block, the congressional and state legislative districts, place, ZCTA, metro area and school district. Add the FEMA flood zone of each address (zone, Special Flood Hazard Area flag, base flood elevation, FIRM panel and its effective date) with one switch. Built for real estate, insurance, lending, public-sector and data teams who need tract-level joins or flood screening without a GIS stack. $3 per 1,000 matched addresses, plus $2 per 1,000 flood zones; addresses the Census cannot match are free.

Price

Price per delivered record

EventPricePer 1,000Charged for
Enriched address
address
$0.003$3 / 1,000Charged once per address (or latitude,longitude point) that the US Census geocoder matched to a single US location, with its Census geographies. Addresses without a match, ambiguous addresses, invalid inputs and errors are free.
Flood zone
flood-zone
$0.002$2 / 1,000Optional add-on (includeFloodZone): charged once per enriched address for which FEMA's National Flood Hazard Layer has a flood zone at the point. Points outside the digital flood maps or marked "AREA NOT INCLUDED" (no flood hazard determination) are free.

Apify free plan: up to 10 items per run. Paid plans have no per-run cap; set maxTotalChargeUsd to cap spend.

Run

Call it from code, an agent or the Console

This API is private on Apify for now. Email us and we will publish it for you, usually within two working days. The calls below work once it is public. contact@sfoln.com

curl · synchronous run, rows in the response
curl -X POST "https://api.apify.com/v2/actors/sfoln~us-address-enrichment/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"addresses":["1600 Pennsylvania Ave NW, Washington, DC 20500"]}'
mcp.json · hosted Apify MCP server
{
  "mcpServers": {
    "apify": {
      "type": "http",
      "url": "https://mcp.apify.com?tools=sfoln/us-address-enrichment"
    }
  }
}
asynchronous run · for large batches
POST https://api.apify.com/v2/actors/sfoln~us-address-enrichment/runs?maxTotalChargeUsd=1
GET  https://api.apify.com/v2/actor-runs/{runId}            # until status is SUCCEEDED
GET  https://api.apify.com/v2/datasets/{defaultDatasetId}/items?format=json

Authenticate with an Apify API token. MCP clients can instead sign in with OAuth when prompted. Example prompt for an agent: Find the census tract, county FIPS code, congressional district and FEMA flood zone of 1600 Pennsylvania Ave NW, Washington, DC 20500.

Input

Input fields

US addresses (or latitude,longitude points) to geocode with the US Census Bureau geocoder. Each input produces one dataset record with a `status` field; only matched addresses are charged.

FieldTypeDefaultMeaning
addresses *arrayrequiredAddresses
US addresses, one per line, as one line of text ("1600 Pennsylvania Ave NW, Washington, DC 20500", at most 100 characters) or a point ("38.8977,-77.0365"). Through the API you can also send objects: {"street", "city", "state", "zip"}, {"address": "<the whole address on one line>"} or {"latitude", "longitude"}. Accounts on the Apify free plan can process up to 10 addresses per run.
includeFloodZonebooleanfalseAdd the FEMA flood zone (+$0.002 per address)
Look up the FEMA National Flood Hazard Layer at each matched point: flood zone (A, AE, VE, X …), Special Flood Hazard Area flag, base flood elevation, FIRM panel and its effective date. Charged as the flood-zone event only when FEMA has a zone at the point.
includeFccAreabooleanfalseAdd the FCC block and market areas (free)
Add the FCC Area API answer for each matched point: 2020 Census block, its population, and the FCC market areas (CMA, PEA, BTA, MTA, BEA …). No extra charge.
vintagestring"Current_Current"Census geography vintage
Which geography vintage the tract, block, districts and other areas come from. Current_Current is the latest (e.g. the 120th Congress districts); Census2020_Current gives the 2020 Census tracts and blocks; ACS vintages match American Community Survey tables. One of "Current_Current", "Census2020_Current", "ACS2026_Current", "ACS2025_Current", "ACS2024_Current", "ACS2023_Current", "ACS2022_Current", "ACS2021_Current", "Census2010_Current".
maxItemsinteger1000Max addresses
Safety cap on how many addresses are processed in this run; the rest are ignored and reported as inputItemsDropped in the OUTPUT record. Range 1–100000.
concurrencyinteger5Concurrency
How many addresses are processed in parallel (the Census geocoder is also rate-limited to 10 requests per second per run). Range 1–10.
includeRawbooleanfalseInclude raw upstream responses
Attach the unmodified Census, FEMA and FCC answers to each record under raw (much larger output).
Example input
{
  "addresses": [
    "1600 Pennsylvania Ave NW, Washington, DC 20500"
  ]
}

Output

One record per input item

Records land in the run's dataset; a synchronous call returns them directly. Each has a status (ok is charged; everything else is free) and a charged flag. The run's OUTPUT record totals items and charges.

FieldTypeMeaning
inputstring | objectInput
The address (or point) exactly as sent.
statusstringStatus
ok | not_found | error | skipped_invalid | skipped_budget | skipped_free_plan | skipped_unmetered e.g. "ok"
chargedbooleanCharged
Whether this record incurred its pay-per-event charge (the address event; add-on charges are listed in chargedAddOns).
chargedEventstringCharged event
Pay-per-event event charged for this record (present only when charged): address.
chargedCountintegerEvents charged
Events actually charged when the charge came back short of the requested count (present only then; a warning explains it).
chargedAddOnsarrayCharged add-ons
Add-on events charged for this record besides chargedEvent (present only then): flood-zone.
sourcestringSource
Upstream data source: us-census-geocoder (with FEMA NFHL and the FCC Area API for the optional fields).
fetchedAtstringFetched at
ISO timestamp.
errorobjectError
{ code, message, provider?, status? } when status is not ok. Codes: not_found (no match, or a point outside the US), ambiguous_address (several candidates, see candidates), invalid_input; set by the runtime: budget_exhausted, free_plan_limit, unmetered, aborted, charge_failed, record_too_large, invalid_record, dataset_push_failed; upstream: http_error (with the HTTP status), network, tls_error, timeout, invalid_json, unexpected_type, too_large, invalid_response.
warningsarrayWarnings
Notes about this record: a flood zone that was not charged or not available, an FCC lookup that failed, a charge that came back short.
inputTypestring | nullInput type
address | coordinates.
matchTypestring | nullMatch type
exact (the match agrees with every part of the input) | non_exact (the Census corrected or completed the address: check matchedAddress) | tie (several candidates, not charged) | no_match (not charged) | null for coordinate inputs.
matchedAddressstring | nullMatched address
The address as the Census standardised it, e.g. "1600 PENNSYLVANIA AVE NW, WASHINGTON, DC, 20500".
latitudenumber | nullLatitude
WGS84 latitude of the match (interpolated along the street segment), or the input point.
longitudenumber | nullLongitude
WGS84 longitude.
candidatesarrayCandidates
Only for matchType tie: up to 10 { matchedAddress, latitude, longitude, stateCode, countyFips } the address could be.
addressComponentsobject | nullAddress components
{ houseNumber, street, streetName, city, state, zip } of the matched address (mailing city and state, which can differ from the Census geography, e.g. Washington, DC addresses in Maryland).
tigerLineIdstring | nullTIGER/Line ID
Census TIGER/Line edge the address range lies on.
tigerLineSidestring | nullStreet side
L or R side of the TIGER/Line edge.
stateFipsstring | nullState FIPS
2-digit state FIPS code of the point (the Census geography).
stateCodestring | nullState
USPS state code of the point.
stateNamestring | nullState name
State name.
countyFipsstring | nullCounty FIPS
5-digit state + county FIPS code.
countyNamestring | nullCounty
County (parish, borough) name.
tractGeoidstring | nullCensus tract GEOID
11-digit state + county + tract code (the key of tract-level ACS tables).
tractCodestring | nullTract code
6-digit tract code within the county.
blockGroupGeoidstring | nullBlock group GEOID
12-digit block group GEOID.
blockGroupCodestring | nullBlock group
1-digit block group within the tract.
blockGeoidstring | nullBlock GEOID
15-digit Census block GEOID.
blockCodestring | nullBlock code
4-digit block code within the tract.
congressionalDistrictobject | nullCongressional district
{ code, geoid, name, congress }: code is the district number ("00" at large, "98" non-voting delegate), congress e.g. 120.
stateLegislativeDistrictUpperobject | nullState senate district
{ geoid, code, name } of the upper-house district.
stateLegislativeDistrictLowerobject | nullState house district
{ geoid, code, name } of the lower-house district (null where there is none, e.g. DC, Nebraska).
placeobject | nullPlace
{ geoid, code, name, type }: the incorporated place (city, town) or census designated place.
countySubdivisionobject | nullCounty subdivision
{ geoid, code, name } (township, town, census county division).
zctastring | nullZCTA
ZIP Code Tabulation Area (the Census approximation of a ZIP code area).
cbsaobject | nullMetro / micro area
{ geoid, code, name, type }: core-based statistical area, type metropolitan or micropolitan.
csaobject | nullCombined statistical area
{ geoid, code, name }.
metropolitanDivisionobject | nullMetropolitan division
{ geoid, code, name } inside the largest metro areas.
schoolDistrictobject | nullSchool district
{ geoid, code, name, type }: unified, else elementary or secondary district.
urbanAreaobject | nullUrban area
{ geoid, code, name } (null in rural areas).
pumaobject | nullPUMA
{ geoid, code, name } Public Use Microdata Area.
censusRegionstring | nullCensus region
Northeast, Midwest, South or West.
censusDivisionstring | nullCensus division
e.g. South Atlantic.
vintagestring | nullVintage
Census geography vintage used (input vintage).
floodZoneobject | nullFlood zone
Only with includeFloodZone: { zone, zoneSubtype, sfha, riskLevel, baseFloodElevation, depth, elevationUnit, verticalDatum, dfirmId, panel, panelEffectiveDate, panelType, otherZones } from FEMA's National Flood Hazard Layer; null when FEMA has no zone at the point (not charged).
fccAreaobject | nullFCC area
Only with includeFccArea: { blockFips, blockPopulation2020, countyFips, countyName, stateFips, stateCode, stateName, marketAreas: { cma, pea, bta, mta, bea, eag, mea, rea, rpc, vpc, ivm, amt } }.
rawobjectRaw
Only with includeRaw: the unmodified census, fema and fcc answers.
Example record
Example record
{
  "input": "1600 Pennsylvania Ave NW, Washington, DC 20500",
  "status": "ok",
  "charged": true,
  "chargedEvent": "address",
  "chargedAddOns": [
    "flood-zone"
  ],
  "source": "us-census-geocoder",
  "fetchedAt": "2026-10-14T22:38:12.176Z",
  "inputType": "address",
  "matchType": "exact",
  "matchedAddress": "1600 PENNSYLVANIA AVE NW, WASHINGTON, DC, 20500",
  "latitude": 38.898702605245,
  "longitude": -77.035189204737,
  "addressComponents": {
    "houseNumber": "1600",
    "street": "PENNSYLVANIA AVE NW",
    "streetName": "PENNSYLVANIA",
    "city": "WASHINGTON",
    "state": "DC",
    "zip": "20500"
  },
  "tigerLineId": "76225813",
  "tigerLineSide": "L",
  "stateFips": "11",
  "stateCode": "DC",
  "stateName": "District of Columbia",
  "countyFips": "11001",
  "countyName": "District of Columbia",
  "tractGeoid": "11001980000",
  "tractCode": "980000",
  "blockGroupGeoid": "110019800001",
  "blockGroupCode": "1",
  "blockGeoid": "110019800001034",
  "blockCode": "1034",
  "congressionalDistrict": {
    "geoid": "1198",
    "code": "98",
    "name": "Delegate District (at Large)",
    "congress": 120
  },
  "stateLegislativeDistrictUpper": {
    "geoid": "11002",
    "code": "002",
    "name": "Ward 2"
  },
  "stateLegislativeDistrictLower": null,
  "place": {
    "geoid": "1150000",
    "code": "50000",
    "name": "Washington city",
    "type": "incorporated_place"
  },
  "countySubdivision": {
    "geoid": "1100150000",
    "code": "50000",
    "name": "Washington city"
  },
  "zcta": "20006",
  "cbsa": {
    "geoid": "47900",
    "code": "47900",
    "name": "Washington-Arlington-Alexandria, DC-VA-MD-WV Metro Area",
    "type": "metropolitan"
  },
  "csa": {
    "geoid": "548",
    "code": "548",
    "name": "Washington-Baltimore-Arlington, DC-MD-VA-WV-PA CSA"
  },
  "metropolitanDivision": {
    "geoid": "4790047764",
    "code": "47764",
    "name": "Washington, DC-MD Metro Division"
  },
  "schoolDistrict": {
    "geoid": "1100030",
    "code": "00030",
    "name": "District of Columbia Public Schools",
    "type": "unified"
  },
  "urbanArea": {
    "geoid": "92242",
    "code": "92242",
    "name": "Washington--Arlington, DC--VA--MD Urban Area"
  },
  "puma": {
    "geoid": "1100106",
    "code": "00106",
    "name": "District of Columbia (South Central) PUMA"
  },
  "censusRegion": "South",
  "censusDivision": "South Atlantic",
  "vintage": "Current_Current",
  "floodZone": {
    "zone": "X",
    "zoneSubtype": "AREA OF MINIMAL FLOOD HAZARD",
    "sfha": false,
    "riskLevel": "minimal",
    "baseFloodElevation": null,
    "depth": null,
    "elevationUnit": null,
    "verticalDatum": null,
    "dfirmId": "110001",
    "panel": "1100010018C",
    "panelEffectiveDate": "2010-09-27",
    "panelType": "Countywide, Panel Printed",
    "otherZones": []
  }
}

FAQ

Questions

Which addresses can it geocode?
Street addresses in the 50 states, DC and Puerto Rico that are in the Census Bureau's address ranges (TIGER/Line). PO boxes, rural route boxes and addresses outside the US are not matched; they come back as no_match and are not charged.
What does matchType mean?
exact: the match agrees with every part you gave (house number, street, directional, street type, city or ZIP, state). non_exact: the Census corrected or completed something, for example a missing street type or a different ZIP, so check matchedAddress. tie: the address fits several places (not charged; the candidates are listed). no_match: nothing found (not charged).
Is a ZCTA the same as a ZIP code?
Almost: a ZIP Code Tabulation Area is the Census Bureau's area approximation of a 5-digit ZIP code, so it can differ from the ZIP in the mailing address (addressComponents.zip).
How precise is the flood zone?
It is the FEMA National Flood Hazard Layer zone at the geocoded point. Census coordinates are interpolated along the street segment, so they can be a few lots away from the building; near a zone boundary otherZones lists the neighbouring zone.

Machine-readable

This page for agents