Census Tract & Demographics

Send US addresses or coordinates. Get back the census tract and block group IDs, and the area's ACS 5-year estimates: population, median age, income, poverty rate, education, housing and unemployment.

Run it on ApifyUse it from an agent

What you get for each row

Rows that don't match still come back with a reason, so you can join the results to your list by row number or your own id.

Example

{"operation": "geocode",
 "addresses": ["125 N Main St, Memphis, TN 38103"],
 "fields": ["income", "housing"]}

One result row (demographic values here are illustrative):

{"row": 1, "status": "matched", "match_type": "Exact",
 "matched_address": "125 N MAIN ST, MEMPHIS, TN, 38103",
 "state_fips": "47", "county_fips": "157", "tract": "004200", "tract_geoid": "47157004200",
 "geo_name": "Census Tract 42; Shelby County; Tennessee",
 "demographics": {"median_household_income": 51234, "poverty_rate": 21.7, "median_gross_rent": 1180}}

CSV files work too (by URL or upload). Columns named like address, street, city, state, zip and id are detected automatically. Other operations: coordinates (lat/lon points) and demographics (GEOIDs).

Demographic fields

GroupFields
populationtotal_population, median_age
incomemedian_household_income, per_capita_income, poverty_rate
educationpopulation_25_plus, pct_high_school_or_higher, pct_bachelors_or_higher
housinghousing_units, vacancy_rate, owner_occupied_rate, renter_occupied_rate, median_home_value, median_gross_rent
employmentunemployment_rate

Rates are percentages. Dollar amounts are inflation-adjusted to the release's last year. When the Census publishes no estimate for an area, the value is null and a note says why.

Use it

In the Apify Console

Open the Actor page on Apify, fill in the input form and click Start. Results land in the run's dataset (JSON, CSV or Excel download).

From an AI agent (MCP)

Apify's hosted MCP server exposes the Actor as a tool to Claude, Cursor, VS Code and other MCP clients. Server URL:

https://mcp.apify.com/?tools=errandkit/census-tract-demographics

For example, in Claude Code (sign in to Apify when asked, or add --header "Authorization: Bearer YOUR_APIFY_TOKEN"):

claude mcp add --transport http errandkit "https://mcp.apify.com/?tools=errandkit/census-tract-demographics"

Copy-paste config for Claude Desktop, Cursor, VS Code, Windsurf and ChatGPT →

From code (Apify API)

curl -X POST "https://api.apify.com/v2/acts/errandkit~census-tract-demographics/run-sync-get-dataset-items" \
  -H "Authorization: Bearer YOUR_APIFY_TOKEN" -H "Content-Type: application/json" \
  -d '{"operation":"geocode","addresses":["125 N Main St, Memphis, TN 38103"],"fields":["income"]}'

Errandkit doesn't run its own hosted API yet. Every way of using this tool goes through your Apify account.

Pricing

EventPrice
Location matched to a census tract$0.001 ($1.00 per 1,000)
ACS demographics appended$0.0006 ($0.60 per 1,000)
Unmatched, tied or invalid rowsFree
Actor start (Apify standard)$0.00005

Example: 1,000 addresses with a 92% match rate and demographics cost $1.47.

Launch prices. The price shown on the Apify Store page is the one you are charged, and Apify shows it before every run.

Accuracy and limits

Sources and acceptable use

Matching uses the U.S. Census Bureau Geocoder. Demographics come from the Census Data API (American Community Survey 5-year detailed tables). This product uses the Census Bureau Data API but is not endorsed or certified by the Census Bureau.

Census terms forbid using these data, alone or combined with other data, to identify any individual person, household or business. Our terms forbid it too. Your addresses are sent to the Census Geocoder to be matched. Results are stored only in your own Apify run storage.

Questions

Which ACS release does it use?

ACS 5-year 2020-2024 by default. Earlier releases back to 2017 can be selected.

Am I charged for addresses that don't match?

No. Only matched rows are charged. No-match, tie and invalid rows are free.

Do I need a Census API key?

No. The Actor uses its own key. You can supply your own Census API key in the input if you prefer.

How fast is it?

Geocoding runs in batches of 1,000; one measured batch of 500 took 12 seconds. The Census service speed varies, and it occasionally goes down for maintenance. When that happens you get a clear UPSTREAM_UNAVAILABLE error.