5 Agencies, 3 Joins, One District Brief

Open Data

Campaign data teams need district-level numbers under deadline. The federal data is free. Getting it into one spreadsheet still takes longer than the analysis. Here's what happens when you put it all in one place.

Riley Hilliard
Riley Hilliard
Director of High-Fives·Apr 16, 2026·11 min
Copied to clipboard
5 Agencies, 3 Joins, One District Brief

It’s Tuesday evening. The candidate’s town hall is in 30 hours. The district’s loudest issue all cycle has been housing costs, and the opening remarks need three numbers by Thursday morning: median household income, the unemployment rate, and what a house costs relative to what people earn.

The numbers exist. The federal government publishes all of them, for free, updated regularly. The problem is that they’re scattered across four different agencies, each with its own file format, its own naming conventions, and its own way of identifying geographic areas. The unemployment data uses 20-character codes instead of state names. The income data uses county ID numbers that don’t line up with congressional districts. The housing data uses yet another set of IDs. Getting these numbers into the same spreadsheet usually takes longer than actually analyzing them.

OpenData puts all of it in one place. Income, unemployment, housing costs, rent, health coverage, all searchable and filterable the same way. The data cleanup that usually eats your morning is already done.

The public half of the data stack

Campaign data has two halves. The proprietary side (voter files, predictive models, contact history) is what the vendors sell you. The public side (Census income data, federal unemployment numbers, housing prices, rent surveys) is free, updated regularly, and covers every county in the country. It’s also scattered across half a dozen agency websites, each with its own file format and naming conventions.

Income data lives on one website. Unemployment lives on another. Housing costs live on a third. Each agency uses different column names, different file layouts, and different codes to identify the same county or state. The Census alone splits income, housing, education, and demographics into separate downloads, each organized differently. A simple question like “what does affordability look like in this district?” means pulling from four sources and stitching them together by hand.

Idaho's income grew 46% in six years, faster than any state we checked over this window. The data came from a single query against Census income estimates on OpenData.

A state most national models mark as non-competitive had the fastest income growth of any state we checked over this window. But income growth alone doesn’t tell you what a district feels like. For that, you need to see what that income actually buys. And for that, you need data from agencies that don’t talk to each other.

Same data, before and after

Here’s what you actually work with when you pull unemployment data from the Bureau of Labor Statistics, followed by the same data on OpenData.

The raw government file doesn’t say “Idaho” or “unemployment rate” anywhere. Instead, it uses codes like LAUST160000000000003 that pack the state, geographic area, and measurement type into a single string. To turn that into something readable, you need three additional reference files: one to look up the state, one for the area name, and one for the measurement type. Four files just to get one usable number.

Same data, two experiences. The top block is the raw government file: cryptic codes, no state names, no labels for what’s being measured. The bottom is that same data on OpenData, with columns you can actually read, filterable by state name, and sorted by date.

Now the same treatment for Census income and poverty data (SAIPE). The government version has columns with names like poverty_percent_age_5_17_in_families. On OpenData, both unemployment and income data work the same way: pick a state, pick a year, get results.

Two agencies, two completely different source formats, one consistent experience. The column names make sense, the state and county identifiers match across datasets, and neither file required a download or a manual lookup.

What the clean data shows

Once the formatting headaches are out of the way, questions that used to take a morning of file prep become a few minutes of actual analysis. Here are three stories from three different federal sources, all pulled from the same platform.

Where the ground shifted

Income growth varies wildly by state, and the states that moved fastest aren’t necessarily the ones you’d expect. Here’s how median household income changed between 2018 and 2024 across a selection of politically interesting states.

Idaho, Florida, and Montana all grew faster than California. A national model fitted to 2020 data doesn't see a 46% income shift.

Idaho at 45.6% and Florida at 40.1% aren’t the coastal markets that dominate national coverage. Montana (36.7%) and West Virginia (37.7%) moved faster than California (33.1%). If your model of a state’s economic mood is based on 2020 numbers, a 46% income shift is the kind of thing that changes what voters care about.

One in six Texans has no health insurance

Healthcare access is a stump-speech stat in every competitive race in the South and Southwest. The spread between states is enormous, and the data exists in a clean, queryable form from the Census.

Texas at 16.7% uninsured has roughly 5.15 million residents without coverage. Massachusetts at 2.8% is a different country.

This comes from a different federal dataset than the income numbers, but it’s just as easy to pull. The five lowest and five highest states are effectively different countries when it comes to healthcare access. For any campaign in Texas, Georgia, Oklahoma, or Florida, the uninsured rate is a ready-made talking point backed by federal data.

Ada County rent nearly doubled in eight years

Income numbers tell you one story. What that income buys tells another. HUD publishes fair market rents at the county level, and for Idaho counties, the picture is striking. Even the cheapest rural counties saw rent increases well above the 24.5% CPI inflation over the same period.

Ada County (Boise) rent nearly doubled. The cheapest rural counties still grew 40%, well above the 24.5% CPI baseline.

Three federal sources (Census income, Census health insurance, HUD rent data), three completely different file formats, all accessible the same way on one platform. The income chart, the uninsured comparison, and the rent trend all came from the same place. That’s what makes it possible to build a district-level picture without spending the morning wrangling spreadsheets.

The join that eats the morning

The most useful campaign analysis often comes from combining data that different agencies publish separately. Say you want to answer a simple question for the town hall prep: which states have the worst housing affordability relative to what people actually earn?

Two sources have the pieces. Census publishes median household income by state. Zillow publishes what a typical house costs. Same states, but published by different organizations with different file formats and slightly different names for the same places.

Normally, answering this means downloading both files, cleaning up the state names so they match, and manually combining the results. On OpenData, both datasets are already in the same system, so you can combine them in a single query. For the technically inclined, here’s the actual code:

SELECT
  s.name AS state,
  s.median_household_income AS income,
  z.home_value,
  ROUND(CAST(z.home_value AS DOUBLE)
    / s.median_household_income, 2) AS ratio
FROM "census/saipe" s
JOIN "zillow/home-value-index" z
  ON LOWER(s.name) = LOWER(z.region)
WHERE s.year = 2024
  AND s.county_fips = 0
  AND z.date >= '2024-01-01'
  AND z.date <= '2024-01-31'
  AND z.level = 'state'
ORDER BY ratio DESC

You don’t need to write SQL to use the platform (all the earlier examples in this article are point-and-click). But the option is there when you need to combine datasets in ways that a simple filter can’t handle. This particular query runs in about 3 milliseconds.

Idaho at 5.55x affordability is sandwiched between Colorado and DC, despite having a lower income than every state above it except Montana. This finding requires combining two datasets from two agencies.

In Idaho, a typical house costs 5.55 times the median household income, putting it right next to Colorado (5.62x) and DC (5.54x). That’s striking because Idaho’s income ($80,852) is lower than every state above it on this list except Montana. The states where this ratio is worst overlap almost perfectly with the competitive states from the income growth chart. That’s the real story: incomes are rising, but housing costs are rising faster.

You can’t see this in any single government dataset. It only shows up when you combine income data with housing data, which is exactly the kind of analysis that normally takes a morning of spreadsheet work.

The datasets

The datasets that matter for campaign work are spread across a handful of federal agencies. Here’s what’s available on OpenData today, organized by the kinds of questions campaigns actually ask.

Income and poverty: Census income estimates (county-level, 2018-2024), state-level median household income (2010-2024), and federal wage data (monthly, 2006-present)

Employment: BLS unemployment data (county and metro level, monthly since 1976), plus County Health Rankings (every county in the US, annual, 18 metrics including unemployment)

Housing and affordability: Zillow home values (metro and state level, monthly since 2000), HUD fair market rents (county-level, annual), national median home prices (quarterly), and mortgage rates (weekly)

Demographics and health: Census health insurance coverage (state-level, 2008-present), County Health Rankings (county-level: income, poverty, uninsured rates, mental health, drug overdose deaths, and more)

County Health Rankings is worth calling out on its own. It covers all 3,204 US counties with 18 metrics spanning income, health, and social factors in a single dataset. For campaign work, it’s the fastest way to get a snapshot of a county without pulling from four different sources.

Search for “county economic indicators” on OpenData and you get Census income, BLS unemployment, County Health Rankings, and HUD rents in the same result set. The platform understands that “poverty rate” and “children in poverty” are the same concept even when different agencies use different names for it.

Plug it into the tools you already use

Nobody’s asking you to swap out your voter file vendor. But plenty of campaign teams are already using AI tools like Claude or ChatGPT for research, talking-point drafts, and ad copy. The question isn’t whether AI gets used on the campaign. It’s whether the data feeding it can be trusted and traced back to a source.

That’s where OpenData fits in. The platform is designed so AI tools can search for relevant datasets, pull the data, and cite where every number came from. When an AI assistant pulls an income figure from OpenData, it’s the actual Census number, not something the model guessed from its training data. When it pulls an unemployment rate, it’s the actual BLS number. Every data point traces back to its original government source.

Here’s why that matters for campaigns specifically: when the candidate stands on stage and says a number, the source URL exists. There’s no hallucinated statistic, no unattributed claim.

Ask your AI tool to compare income growth across competitive states. It finds the Census income data and federal wage data on OpenData, pulls both, and gives you a comparison table where every number links to the government dataset it came from. That’s a different proposition than asking a chatbot to “find me income data” and hoping whatever it trained on is still accurate.

Thursday morning

Thursday morning, you walk into the strategy meeting. The three numbers you needed: median household income from the Census, the unemployment rate from BLS, and a housing-affordability ratio built by combining Census income with Zillow home prices. Each one traces back to its original government source.

The affordability chart that combines Census and Zillow data ran in about 3 milliseconds. The unemployment data that originally required four reference files to decode is a single search with readable results. The rent data for all 44 Idaho counties is one filter.

Right now, every campaign that needs district-level economic numbers solves the same formatting problem from scratch. Download the files, fight the formats, reconcile the identifiers, hope nothing changed since last quarter. Most people just go with the national model because the alternative is a data cleanup project. That cleanup work only needs to happen once. OpenData has already done it.

Every dataset in this article is free to query at tryopendata.ai with no signup required.


OpenData is in active development. The datasets in this article live at tryopendata.ai.

Datasets used in this article

All datasets are queryable via API. Filter, sort, and download as CSV, JSON, or Parquet.

Riley HilliardRiley Hilliard

Director of High-Fives

At 13, I secretly drilled holes in my parents' wood floor to route a 56k modem line to my bedroom for late-night Age of Empires marathons. That same scrappy curiosity carried through 3 acquisitions, 9 years as a LinkedIn Staff Engineer building infrastructure for 1B+ users, and now fuels my side projects, like OpenData.

Copied to clipboard

More from OpenData

Census SAIPE, BLS unemployment, Zillow home values, and HUD rents are all on OpenData, joinable on geographic keys.

OpenData makes public datasets discoverable, consistently formatted, and queryable without the usual headaches.

Browse Census SAIPE data
  • County-level median household income and poverty rates, 2018-2024
  • Cross-dataset SQL joins across agencies in under 5ms
  • Filter by state, county, or year for any district-level analysis