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.

indices.py
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.

choropleth.py
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.

timeseries.py
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.

mcp-tool-call.json
{
  "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_datasetsgeocode

Automate 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.

compliance.py
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.

View the example

Three steps. Thirty seconds.

1

Get your API key

Sign up, get your key in under 30 seconds. No credit card required for the free tier.

terminal
# Your key arrives instantly. Add it to your environment.
export PRAIRIECLOUD_API_KEY="pck_live_xxxxxxxxxxxxxxxxxxxx"
2

Make a request

Human-readable variable names. Plain-English geography. One request.

terminal
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"
3

Get structured JSON

Named fields, margin of error included, metadata in every response. No post-processing required.

response.json
{
  "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.

LevelCountExampleWildcard & Boundaries
Nation1United StatesAll tiers
State52TexasAll tiers
County~3,220Travis County, TXWildcard: Pro+ / Boundaries: Pioneer+
Metro~935Austin-Round Rock-GeorgetownWildcard: Pro+ / Boundaries: Pioneer+
Congressional District~440TX-35Wildcard: Pro+ / Boundaries: Pioneer+
Census Tract~85,000Tract 11, Travis CountyWildcard: Pro+ / Boundaries: Pro+
Block Group~242,000BG 1, Tract 11, Travis CountyWildcard: 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.py
# 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+)
Full API Reference →

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
MCP Setup Guide →

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."

error.json
{
  "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

DatasetVintagesGeo LevelsGeographies
LiveACS 5-Year2009–2024 (16)All 7 levels~332K
LiveACS 1-Year2005–2024 excl. 2020 (19)Nation, State, Metro, CD~1,800
LiveGeography CatalogAll 7 levels392,435
LiveGeoJSON BoundariesAll 7 levels331,559

392 Variables Across 9 Topics

TopicExample Variables
Demographicspop_total, pop_male, pop_female, pop_female_under_5, pop_male_85_plus
Economicsincome_median_household, poverty_below, poverty_family_below
Housinghousing_occupancy_total_housing_units, housing_tenure_occupied_housing_units_owner_occupied, housing_median_value
Socialedu_bachelors_degree, edu_place_less_than_hs, edu_total_25_plus
Healthdisability_total, health_ins_total_civilian, health_ins_male_under_19_uninsured
EquityLanguage, ancestry, nativity, and place of birth variables
Transportationvehicles_total_occupied, vehicles_owner_no_vehicle, vehicles_renter_no_vehicle
EnvironmentEnergy and utility variables
CoreCross-cutting demographic and economic aggregates

Future dataset areas under evaluation

  • Future
    Population 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.

endpoints
# 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=true

GET /v1/compare

Compare variables across multiple geographies side-by-side. Uses geo= with comma-separated geography keys.

endpoints
GET /v1/compare?variables=pop_total,income_median_household&geo=county:48453,county:48201&vintage=2024

GET /v1/timeseries

Track a single variable over time. Uses singular variable= parameter with start and end vintages.

endpoints
GET /v1/timeseries?variable=pop_total&geo=county:Travis+County,+Texas&start_vintage=2015&end_vintage=2024

GET /v1/variables

Discover available variables by keyword search. Returns variable names, labels, topics, and units.

endpoints
GET /v1/variables?search=median+income

GET /v1/geographies

Browse geographies by type and parent, or search by name. Find the exact geography keys for your queries.

endpoints
# By type and parent
GET /v1/geographies?type=county&parent=Texas

# By search
GET /v1/geographies?search=Travis

GET /v1/boundaries/{identifier}

Retrieve GeoJSON boundary polygons. Path-based identifier supports type-level queries with filters or direct single-geo lookups.

endpoints
# All counties in a state
GET /v1/boundaries/county?state=48

# Single county boundary
GET /v1/boundaries/county:48453

Response Headers

Every response includes rate limit and request tracking headers.

response-headers
X-RateLimit-Limit: 50000
X-RateLimit-Remaining: 47832
X-RateLimit-Reset: 1741046400
X-RateLimit-Window: monthly
X-Request-Id: 5c653824-1c47-42ef-b158-5d2e9f1f8669

Your first API call. Thirty seconds.

Get Your Free API Key

Free 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.