The data layer for community analytics.
392 Census variables covering demographics, income, housing, education, employment, health, and transportation — from nation to block group. Human-readable names, GeoJSON boundaries, and margins of error — all in one request. Access via REST API or MCP server.
What you can build.
PrairieCloud isn't a dashboard — it's data infrastructure. Plug Census data directly into the tools you already use.
Compute Community Indices
Pull the exact variables needed to compute Social Vulnerability Index (SVI), Area Deprivation Index (ADI), EJScreen, and other composite indices — at any geography level. One request returns everything the formula needs.
response = requests.get(
"https://api.prairiecloud.io/v1/data",
params={
"variables": "pop_total,poverty_below,disability_total,"
"edu_place_less_than_hs,vehicles_owner_no_vehicle",
"geo": "tract:Harris County, Texas",
"vintage": 2024
},
headers={"X-API-Key": API_KEY}
)Build Choropleth Maps
Add include_geometry=true and get GeoJSON boundaries alongside your data. Feed the response directly into Mapbox, Leaflet, Deck.gl, or any mapping library — no boundary file joins required.
response = requests.get(
"https://api.prairiecloud.io/v1/data",
params={
"variables": "income_median_household",
"geo": "tract:Travis County, Texas",
"vintage": 2024,
"include_geometry": "true"
},
headers={"X-API-Key": API_KEY}
)Analyze Demographic Change
Track how any variable evolves over time with the timeseries endpoint. Compare population growth, income shifts, or housing trends across up to a decade of ACS vintages in a single call.
response = requests.get(
"https://api.prairiecloud.io/v1/timeseries",
params={
"variable": "pop_total",
"geo": "county:Travis County, Texas",
"start_vintage": 2015,
"end_vintage": 2024
},
headers={"X-API-Key": API_KEY}
)Give Your AI Agent Census Data
Connect your LLM to Census data via our MCP server. Eight tools give your agent full access to query data, compare geographies, search variables, and more — with structured responses optimized for LLM consumption.
{
"tool": "get_census_data",
"input": {
"variables": "pop_total,income_median_household",
"geo": "county:Travis County, Texas"
}
}8 MCP tools available:
get_census_datacompare_geographiesget_timeseriessearch_variablessearch_geographieslist_topicslist_datasetsgeocodeAutomate Regulatory Compliance
CRA assessments, Opportunity Zone qualification, Qualified Census Tract (QCT) determination, and CDFI target market analysis — all require tract-level Census data. Automate the lookup instead of pulling PDFs from census.gov.
response = requests.get(
"https://api.prairiecloud.io/v1/data",
params={
"variables": "income_median_household,poverty_below",
"geo": "tract:48453001100",
"vintage": 2024
},
headers={"X-API-Key": API_KEY}
)Working example
See Texas population change from county map to tract drill-down.
A copyable cURL and Python workflow using live ACS data, name-based geography, and readable variables.
Three steps. Thirty seconds.
Get your API key
Sign up, get your key in under 30 seconds. No credit card required for the free tier.
# Your key arrives instantly. Add it to your environment.
export PRAIRIECLOUD_API_KEY="pck_live_xxxxxxxxxxxxxxxxxxxx"Make a request
Human-readable variable names. Plain-English geography. One request.
curl "https://api.prairiecloud.io/v1/data?variables=pop_total,income_median_household&geo=county:Travis+County,+Texas&vintage=2024" \
-H "X-API-Key: $PRAIRIECLOUD_API_KEY"Get structured JSON
Named fields, margin of error included, metadata in every response. No post-processing required.
{
"data": {
"county:48453": {
"geo_key": "county:48453",
"name": "Travis County, Texas",
"geo_type": "county",
"fips_state": "48",
"fips_county": "453",
"variables": {
"pop_total": {
"api_name": "pop_total",
"label": "Total Population",
"unit": "count",
"estimate": 1290188.0,
"margin_of_error": 0.0
},
"income_median_household": {
"api_name": "income_median_household",
"label": "Median Household Income",
"unit": "dollar",
"estimate": 75231.0,
"margin_of_error": 892.0
}
}
}
},
"meta": {
"source": {
"dataset": "acs5",
"vintage_year": 2024,
"census_program": "U.S. Census Bureau"
},
"variable_count": 2,
"geography_count": 1,
"request_id": "5c653824-1c47-42ef-b158-5d2e9f1f8669",
"elapsed_ms": 42
},
"links": {
"self": "/v1/data?variables=pop_total,income_median_household&geo=county:Travis+County,+Texas&vintage=2024"
}
}Seven geography levels. Nation to block group.
Sub-county data is where the decisions are made — zoning, grants, lending, site selection. Most Census tools stop at county.
All tiers can query any geography level directly by FIPS code or name. Tier gating controls wildcard expansion and boundary access — not data access itself.
| Level | Count | Example | Wildcard & Boundaries |
|---|---|---|---|
| Nation | 1 | United States | All tiers |
| State | 52 | Texas | All tiers |
| County | ~3,220 | Travis County, TX | Wildcard: Pro+ / Boundaries: Pioneer+ |
| Metro | ~935 | Austin-Round Rock-Georgetown | Wildcard: Pro+ / Boundaries: Pioneer+ |
| Congressional District | ~440 | TX-35 | Wildcard: Pro+ / Boundaries: Pioneer+ |
| Census Tract | ~85,000 | Tract 11, Travis County | Wildcard: Pro+ / Boundaries: Pro+ |
| Block Group | ~242,000 | BG 1, Tract 11, Travis County | Wildcard: Business+ / Boundaries: Business+ |
Why Tract and Block Group Matter
Composite indices like the Social Vulnerability Index (SVI), Area Deprivation Index (ADI), and EJScreen are computed at the Census tract or block group level. If your tool can't reach tract data, you can't build these indices. PrairieCloud serves data at every level the Census Bureau publishes.
GeoJSON Boundaries
Get boundary polygons inline with your data response, or query the dedicated boundaries endpoint for single features or filtered collections. Either way, the geometry is ready for mapping — no shapefile conversion needed.
# Boundaries in data response (Pro+)
response = requests.get(
"https://api.prairiecloud.io/v1/data",
params={
"variables": "pop_total",
"geo": "county:Texas",
"vintage": 2024,
"include_geometry": "true"
},
headers={"X-API-Key": API_KEY}
)
# Or query boundaries directly
boundaries = requests.get(
"https://api.prairiecloud.io/v1/boundaries/county",
params={"state": "48"},
headers={"X-API-Key": API_KEY}
)Two ways in. Same data.
REST API
| Endpoint |
|---|
/v1/data |
/v1/compare |
/v1/timeseries |
/v1/variables |
/v1/geographies |
/v1/boundaries/{id} |
/v1/topics |
/v1/datasets |
- •Standard HTTPS/JSON
- •Any HTTP client
- •Usage dashboard
- •Rate limit headers
- •CSV export (Pro+)
MCP Server
| Tool |
|---|
get_census_data |
compare_geographies |
get_timeseries |
search_variables |
search_geographies |
list_topics |
list_datasets |
geocode |
- •Natural language geography
- •Variable discovery
- •Structured responses
- •No key management in prompts
Built for developers who've been burned by government APIs.
Here's why it doesn't suck.
Human-Readable Variable Names
pop_total not B01003_001E. Every variable has a name that tells you what it is — no lookup table required.
Name-Based Geography
"Travis County, Texas" not state:48&county:453. Query by name, FIPS code, or both. We resolve it.
Margin of Error Included
Every ACS estimate includes its margin of error automatically. No separate request, no separate variable code. It's just there.
Structured JSON Responses
Named fields, typed values, consistent response envelope. No array-of-arrays, no index guessing, no post-processing.
Header-Based Auth
X-API-Key header, prefixed pck_live_, and revocable from your dashboard. No keys in URLs, logs, or browser history.
RFC 7807 Error Messages
Structured errors with type URIs, human-readable detail, and suggestions. "Did you mean Travis?" beats "400 Bad Request."
{
"type": "https://prairiecloud.io/errors/geography-not-found",
"title": "Geography Not Found",
"status": 404,
"detail": "County 'Travisss' not found in Texas. Did you mean 'Travis'?",
"request_id": "5c653824-1c47-42ef-b158-5d2e9f1f8669",
"instance": "/v1/data"
}What's in the warehouse.
Live Datasets
| Dataset | Vintages | Geo Levels | Geographies |
|---|---|---|---|
| LiveACS 5-Year | 2009–2024 (16) | All 7 levels | ~332K |
| LiveACS 1-Year | 2005–2024 excl. 2020 (19) | Nation, State, Metro, CD | ~1,800 |
| LiveGeography Catalog | — | All 7 levels | 392,435 |
| LiveGeoJSON Boundaries | — | All 7 levels | 331,559 |
392 Variables Across 9 Topics
| Topic | Example Variables |
|---|---|
| Demographics | pop_total, pop_male, pop_female, pop_female_under_5, pop_male_85_plus |
| Economics | income_median_household, poverty_below, poverty_family_below |
| Housing | housing_occupancy_total_housing_units, housing_tenure_occupied_housing_units_owner_occupied, housing_median_value |
| Social | edu_bachelors_degree, edu_place_less_than_hs, edu_total_25_plus |
| Health | disability_total, health_ins_total_civilian, health_ins_male_under_19_uninsured |
| Equity | Language, ancestry, nativity, and place of birth variables |
| Transportation | vehicles_total_occupied, vehicles_owner_no_vehicle, vehicles_renter_no_vehicle |
| Environment | Energy and utility variables |
| Core | Cross-cutting demographic and economic aggregates |
Future dataset areas under evaluation
- FuturePopulation Estimates Program (PEP) — Annual population estimates between decennial censuses, with components of change.
The Longer View
PrairieCloud is building toward a broader platform for U.S. government data, not just Census. Additional federal datasets such as BLS, BEA, HUD, USDA, and EPA are under evaluation, but they are not part of the currently available product surface.
Endpoint reference.
A preview of the endpoint surface. Full documentation at docs.prairiecloud.io.
GET /v1/data
Query ACS estimates by variable name and geography. Supports named geographies, FIPS codes, and inline GeoJSON boundaries.
# Query by name
GET /v1/data?variables=pop_total,income_median_household&geo=county:Travis+County,+Texas&vintage=2024
# Query by FIPS code
GET /v1/data?variables=pop_total&geo=tract:Harris+County,+Texas&vintage=2024&include_geometry=trueGET /v1/compare
Compare variables across multiple geographies side-by-side. Uses geo= with comma-separated geography keys.
GET /v1/compare?variables=pop_total,income_median_household&geo=county:48453,county:48201&vintage=2024GET /v1/timeseries
Track a single variable over time. Uses singular variable= parameter with start and end vintages.
GET /v1/timeseries?variable=pop_total&geo=county:Travis+County,+Texas&start_vintage=2015&end_vintage=2024GET /v1/variables
Discover available variables by keyword search. Returns variable names, labels, topics, and units.
GET /v1/variables?search=median+incomeGET /v1/geographies
Browse geographies by type and parent, or search by name. Find the exact geography keys for your queries.
# By type and parent
GET /v1/geographies?type=county&parent=Texas
# By search
GET /v1/geographies?search=TravisGET /v1/boundaries/{identifier}
Retrieve GeoJSON boundary polygons. Path-based identifier supports type-level queries with filters or direct single-geo lookups.
# All counties in a state
GET /v1/boundaries/county?state=48
# Single county boundary
GET /v1/boundaries/county:48453Response Headers
Every response includes rate limit and request tracking headers.
X-RateLimit-Limit: 50000
X-RateLimit-Remaining: 47832
X-RateLimit-Reset: 1741046400
X-RateLimit-Window: monthly
X-Request-Id: 5c653824-1c47-42ef-b158-5d2e9f1f8669Your first API call. Thirty seconds.
Get Your Free API KeyFree tier — no credit card. 1,000 requests/month with direct lookups at any geography level. Upgrade when you need wildcard expansion, boundaries, and higher limits.