Inspiration

Money in politics is one of the most discussed but least understood forces in American democracy. We've all heard "follow the money," but actually doing it requires knowing which databases to look at, how to cross-reference them, and what the numbers mean, knowledge most people don't have. We wanted to build something that does all of that for anyone, instantly, just by entering their address.

What it does

UnPAC lets you look up every federal, state, and local representative for any U.S. address and see how they vote and who funds them. For each rep, you get their full legislative record categorized across 8 policy areas (healthcare, energy, defense, economy, etc.), their campaign finance breakdown by donor industry, two quantitative influence scores (legislative capture and donor-vote alignment), and an AI-powered conflict-of-interest report that flags specific tensions between their votes and their donors. All data is sourced from official government records.

How we built it

The frontend is built with Next.js 16 and React 19, styled with Tailwind CSS v4, and uses Recharts for data visualization. On the backend, we hit four public APIs in parallel: the Congress.gov API for voting records and bill sponsorships, the FEC API for campaign finance contributions by industry, the Google Civic Information API for address-to-representative lookup, and the OpenStates API for state-level reps. We built a custom influence scoring engine using an HHI-style concentration formula to measure how financially "captured" a legislator is, and a separate voting alignment score that maps donor sectors to bill categories and measures whether a rep's votes track their donors. Finally, we use Claude (Haiku) to synthesize the voting + finance data into a readable conflict-of-interest analysis, with weighted signals for bill sponsorships vs. floor votes.

Challenges we ran into

The biggest challenge was data quality and availability. The FEC and Congress.gov APIs return data in very different formats, with inconsistent name spellings, missing identifiers, and occasional outages. Matching a representative's name across multiple databases without a shared ID required building fuzzy-matching logic. State and local rep data is far less structured than federal data, so coverage is uneven. We also had to carefully design the influence scoring so it was meaningful (early versions either over-flagged every rep or under-flagged obvious cases) requiring several rounds of calibration with real members of Congress.

Accomplishments that we're proud of

We're proud that the entire pipeline works end-to-end using only real, official government data with no mocked results. The two quantitative influence scores (financial capture and donor-vote alignment) are custom-designed metrics we built from scratch that produce intuitive, defensible results. We're also proud of the Claude integration: the prompt is carefully engineered to weight bill sponsorships more heavily than floor votes and to only flag conflicts grounded in specific legislation and specific donor sectors, avoiding vague or misleading outputs.

What we learned

We learned how fragmented and inconsistent public government data actually is; APIs that look clean on paper often require significant normalization to use in practice. We also learned a lot about prompt engineering for factual, nonpartisan analysis: getting Claude to produce structured JSON with specific, grounded claims (rather than generic political commentary) required careful iteration on the system prompt and signal weighting. On the product side, we learned that translating raw finance numbers into something a non-expert can interpret is genuinely hard, and that clear visual hierarchy matters as much as the underlying data.

What's next for UnPAC

We want to expand state and local coverage significantly, since most legislation that affects daily life happens at the state level. We'd like to add historical tracking so users can see how a rep's donor base and voting patterns have shifted over time. We're also exploring a browser extension that surfaces UnPAC data whenever you read a news article that mentions a legislator by name. Longer term, we want to open-source the influence scoring methodology so researchers and journalists can build on it.

Built With

Share this project:

Updates