Migration Data and History
Retrieve domestic inflows, outflows, and net migration for a given geography and quarter, broken down by demographics. This endpoint covers U.S. domestic migration only — international moves are not included.
Supported geography types: zip, fips, block_group, point, address, polygon.
Retrieve migration data and history for a geography
Request
Provides domestic inflows, outflows, and net migration for a geography and quarter, broken down by demographics. International migration is not covered by this endpoint.
| geography_type required string |
The type of geography being queried. Limit one value per call.
Accepted values:
zip, fips, block_group, point, address, polygon |
| geography_name required string |
The identifier for the geography being queried. Limit one value per call. Format depends on geography_type.
Examples:
22201 (zip), 51013 (fips), 550630004023 (block_group), (38.88,-77.09) (point), "2300 Clarendon Blvd, Arlington, VA 22201" (address)
|
| quarter required string or array of strings |
The quarter or range of quarters to query. Provide a single quarter or a start/end pair to define a range. There are no limits on the number of quarters; the only limit is the range CENSAI has processed (2018Q1 to today).
Examples:
2025Q3, [2021Q1, 2025Q3], [2018Q1, 2025Q3]
|
| demographics array of strings |
Demographic dimensions to break down the response. Multiple demographics can be requested in one call.
Basic demographics (one token total):
age, income, gender, education.Premium demographics (one token each): wealth, affinity, marital_status, owner_renter, race, children_in_hh.Cross tabs (e.g. wealth x age, income x age) cost two tokens each.See the CENSAI Data Dictionary for the complete list and bucket definitions.
Caveat:
owner_renter is not reported for property or address-level queries, since all results would be classified as renter.
|
Responses
Retrieve top 10 origins and destinations for a geography
Request
Returns the top 10 origin and top 10 destination geographies for moves involving the target geography. Origins and destinations are calculated against the full quarter range supplied (a single set of 10, not 10 per quarter).
| geography_type required string |
The type of the target geography. Limit one value per call.
Accepted values:
zip, fips, cbsaCaveat: origin / destination data is not provided for property or block group geographies. Zip-level routes can still be returned for a property query.
|
| geography_name required string |
The identifier for the target geography.
Examples:
22201, 51013 |
| quarter required string or array of strings |
A single quarter or range of quarters. There are no limits on the number of quarters; the only limit is the range CENSAI has processed (2018Q1 to today).
Examples:
2025Q3, [2021Q1, 2025Q3] |
| od_geography_type string |
Geography type to use for the returned origins and destinations. Can differ from the target geography_type. If omitted, defaults to the target's geography type.
Accepted values:
zip, fips, cbsa |
Responses
Retrieve current population for a geography
Request
Returns today's point-in-time population count for a geography, broken down by demographics if requested.
| geography_type required string |
The type of geography being queried.
Accepted values:
zip, fips, cbsa, block_group, point, address, polygon |
| geography_name required string |
The identifier for the geography being queried.
Examples:
22201, 51013, 550630004023, (38.88,-77.09), "2300 Clarendon Blvd, Arlington, VA 22201" |
| demographics array of strings |
Demographic dimensions to break down the population count. Multiple demographics can be requested in one call. See the CENSAI Data Dictionary for accepted values and bucket definitions.
Caveat:
owner_renter is not reported for property or address-level queries. |
Responses
Retrieve current scores for a geography
Request
Returns the requested current scores for a geography. Historic scores are not supported.
| geography_type required string |
The type of geography being queried.
Accepted values:
zip, fips, cbsa |
| geography_name required string |
The identifier for the geography being queried.
Examples:
22201, 51013 |
| scores required array of strings |
The list of scores to retrieve. All three available scores can be requested in a single call.
Accepted values:
"Rental Affordability", "Mortgage Affordability", "Investability" |
Responses
Retrieve top 10 lookalike geographies
Request
Returns the top 10 geographies that look most similar to the queried geography, mirroring the platform's lookalikes functionality.
| geography_type required string |
The type of geography being queried.
Accepted values:
zip, fips, cbsa |
| geography_name required string |
The identifier for the geography being queried.
Examples:
22201, 51013 |
| distance integer |
Distance buffer in miles. If omitted, lookalikes are returned nationwide with no distance constraint.
Examples:
50, 100, 500 |
| buffer_direction string |
Whether to return lookalikes within or beyond the supplied distance. Defaults to "Within" if not provided.
Accepted values:
"Within", "Beyond" |
Responses
Retrieve median income of inflows and outflows
Request
Returns the median income of inflows and the median income of outflows for a geography across the supplied quarter range.
| geography_type required string |
The type of geography being queried.
Accepted values:
zip, fips, cbsa, block_group, point, polygon |
| geography_name required string |
The identifier for the geography being queried.
Examples:
22201, 51013, 550630004023, (38.88,-77.09) |
| quarter required string or array of strings |
A single quarter or range of quarters. There are no limits on the number of quarters; the only limit is the range CENSAI has processed (2018Q1 to today).
Examples:
2025Q3, [2021Q1, 2025Q3] |
Responses
CENSAI Data Dictionary
The demographics below are reportable on both the migration and population endpoints. For bucketed demographics, records that don't meet the listed values are returned as "Unknown".
| genderstring | Not bucketed. Values: Male, Female. |
| marital_statusstring | Not bucketed. Values: Married, Single. |
| incomenumeric (bucketed) | Buckets: <$25K, $25K-$50K, $50K-$75K, $75K-$100K, $100K-$200K, $200K+. |
| wealthstring (bucketed) | Buckets: $2.084M+, $1.062M-2.084M, $540K-1.062M, $195K-540K, $69K-195K, <$69K. |
| owner_renterstring (bucketed) | Values: Renter, Homeowner. Not reported for property or address-level queries. |
| affinitystring (bucketed) | Buckets: Liberal (0–0.3), Swing (0.3–0.7), Conservative (0.7–1). |
| educationstring (bucketed) | Values: Bachelors, No Bachelors. |
| racestring | Modeled race; values come directly from the race field. Empty values are returned as Unknown. |
| ageinteger (bucketed) | Buckets: 18-29, 30-44, 45-54, 55-64, 65+. |
| children_in_hhstring | Values: Children Present, No Children Present. |
| median_incomeaggregate | Migration endpoint returns separate median income values for inflows and outflows. Population endpoint returns a single median income for the geography. |
| household_countaggregate | Population endpoint only. Returns the count of households in the geography. |
Pricing and Limits
Tokens are calculated per call as: (# of geographies) × (# of quarters) × (# of demographics). Only one geography is allowed per call. Cross tabs (e.g. wealth × age) cost two tokens each.
| Lowest geography | Credits | Subscription | Additional calls |
| Zip code | 40,000 | Starter: $499/month | 6¢/call |
| Block group | 250,000 | Developer: $799/month | 2¢/call |
| Property and trade area | 300,000 | Scale: $899/month | 2¢/call |





