Who Voted How← Back to map
Methodology

About Who Voted How

A free political accountability map of the United States Congress. Every senator and representative gets a profile showing their recent roll-call votes, top campaign donors from FEC filings, and two alignment scores: did they vote the way they publicly said they would, and did they vote in the direction the people who elected them lean?

This page documents exactly how every number on the site is computed and which public datasets are used. The goal is for every claim to be reproducible from the cited sources. If you can't reproduce a score, that's a bug — please open an issue.


Data sources

Member roster + portraits

The list of every current member of Congress — name, party, state, district, chamber, term dates, FEC candidate IDs — comes from unitedstates/congress-legislators, a community-maintained YAML file built from official bioguide, Senate, and House sources. We parse the canonical file from the repo's main branch directly; no third-party mirror, no API key. Official portraits come from the matching unitedstates/images mirror, keyed on bioguide ID.

Roll-call votes

Every roll-call vote — who voted Yea, Nay, Present, or Not Voting on every bill — comes from Voteview.com, the canonical academic source for U.S. Congressional roll-call history maintained at UCLA. We pull rollcalls (bill metadata), votes (per-member casts), and members (the icpsr-to-bioguide mapping) for the 118th Congress (2023–2025) and 119th Congress (2025–) for both chambers.

Vote-cast codes are decoded per the published Voteview methodology: 1 is Yea, 6 is Nay, 7–8 are Present, 9 is Not Voting. Paired and announced votes are folded into their respective Yea / Nay buckets.

Donor data

All campaign donor data comes directly from the U.S. Federal Election Commission via api.open.fec.gov. For each legislator we resolve their principal campaign committee and fetch the employer-aggregated individual contributions for the requested cycle.

One honest caveat. The FEC publishes raw employer strings as donors self-report them. Many entries are non-employer values (“NOT EMPLOYED,” “SELF,” “RETIRED,” “INFORMATION REQUESTED”). We filter those out before display and lightly normalize corporate suffixes (INC, LLC, GROUP, etc.) to merge near-duplicate spellings. This is less aggressive than the hand-curated employer-to-industry rollups OpenSecrets performs; it's also fully reproducible from FEC raw data without an opaque normalization layer. The dollar amount we display next to the filtered-junk total tells you how much of the candidate's individual contributions came from unidentifiable employers.

State partisan lean

Partisan lean of each state comes from the Cook Political Report Partisan Voter Index 2025 edition. PVI compares a state's presidential vote to the national average across the most recent two cycles. Positive values mean the state voted more Democratic than the country average; negative means more Republican.

Source: cookpolitical.com/cook-pvi. We currently apply state-level PVI to both senators and representatives. Real Cook PVI also publishes district-level values for the House — applying those is on the roadmap.

Outside spending (Super PACs)

Independent expenditures — money spent for or against a candidate by Super PACs and other outside groups, not by the candidate's own committee — come from FEC Schedule E filings. For each legislator we fetch the per-cycle aggregation of independent expenditures by candidate via schedule_e/by_candidate, split by support vs oppose, and rank the top committees on each side. Each row links to the committee's public FEC filing page. This is how groups like AIPAC, Citizens United, and the various single-issue Super PACs show their financial weight on a race — money the FEC publicly attributes to a committee but doesn't appear in the candidate's own donor data.

Stock trades (STOCK Act disclosures)

Every senator and representative is required by the STOCK Act to disclose personal stock trades within 30–45 days. For House members we mirror house-stock-watcher-data, a community repository updated daily from disclosures-clerk.house.gov. Each trade row links to the actual disclosure PDF. Estimated volume sums the midpoint of each transaction's amount range (the STOCK Act requires only a bracketed range, not an exact amount).

Senate disclosures are currently unavailable. The community mirror we previously relied on for the Senate (timothycarambat/senate-stock-watcher-data) stopped updating in March 2021, so senators sworn in after that — Tuberville, Vance, Britt, and many others — can't appear in it at all, and the pre-2021 snapshot for senators who were there earlier is years stale. Showing it would be misleading. Until we ship a direct scraper of efdsearch.senate.gov (the Senate's official electronic filing portal), the Senate stock-trade panel says so explicitly rather than pretending the data is empty.

Committee assignments

Committee and subcommittee memberships — including who chairs or serves as ranking member — come from committee-membership-current.yaml in the same unitedstates repo as the roster, paired with committees-current.yaml for committee metadata, jurisdictions, and official URLs.

Sponsored legislation

Bills each member has introduced come from the official Library of Congress API at api.congress.gov. We fetch the sponsored-legislation endpoint per bioguide, filter out amendments (which appear in the same response stream but are noisier at this abstraction level), and surface the most recent primary bills with policy area, latest action, and a link to the full text on congress.gov.

Federal candidates running for office

Candidates currently running for federal Senate and House seats come from the FEC /candidates/searchendpoint, filtered to candidate_status=C (active registration) and has_raised_funds=true (skips paper-only filings). Incumbents are suppressed since they already appear in the main legislators roster — this section is specifically the “who's running against them” view.

Federal judges

Currently-serving federal Article III judges — district court, circuit court, and Supreme Court — come from the Federal Judicial Center federal-judicial-service.csv. Each judge is mapped to the state(s) whose cases their court hears: district courts by the state in the court name, circuit courts to all states in that circuit's territory. The Supreme Court appears under every state. Party reflects the appointing president, not the judge's personal affiliation.

State governors and DC mayor

Hand-curated. No clean programmatic data source exists (NGA has member pages but no API; Wikipedia is unreliable for recent transitions). Every entry is independently verifiable from the governor's official state .gov page, which the UI links to. The data file carries a “Last full audit” date so future maintenance knows when to recheck.

Voter information

The Vote section links to vote.gov (U.S. General Services Administration federal portal) for registration and polling-place lookup, each state's Secretary of State or Board of Elections division for authoritative state-specific rules, and 866-OUR-VOTE (Election Protection, run by the Lawyers' Committee for Civil Rights) for nonpartisan voter assistance.

Stated positions

For each legislator we score on statement-vote alignment, the stance on each issue is sourced to a specific public statement — campaign website, official Senate or House page, or named third-party reporting. Every stance row in our registry carries the source URL, surfaced in the UI next to the stance so the reader can verify the receipt before trusting the score.

This is hand-curated, not exhaustively scraped. Coverage is currently focused on high-profile senators across the political spectrum. Legislators we haven't curated yet fall back to a party-line consistency proxy with a clear label explaining that it's not the real statement-vote score. Adding a senator is one row in the registry; coverage grows over time.

Tagged roll-call bills

For each issue we score on, we maintain a registry of substantive landmark bills. Each entry pins a bill number to an issue and explicitly declares which cast direction (Yea or Nay) advances the “favors” stance on that issue.

This replaces keyword matching against vote descriptions, which was producing false signals — procedural cloture motions hid bill substance behind generic language, and the engine couldn't tell a procedural defense of a bill from substantive opposition to it. Tagged matching is more honest about coverage (smaller initial set, but every match is verified) and handles cases where the bill itself was a regression — a bill restricting abortion rights, for example, where voting Nay actually supports reproductive rights even though “Nay on the bill” sounds like a no.


How the scores are computed

Statement-vote alignment

For each issue the legislator has a sourced stance on:

  1. Look up the tagged roll-call bills for that issue.
  2. For each tagged bill, find the substantive roll calls (passage, cloture, or conference report) referencing that bill number in Voteview's data for the legislator's chamber.
  3. Look up the legislator's cast on each of those roll calls.
  4. Combine the cast with the tag's favors-direction declaration to determine: did this vote support the “favors” stance on this issue? Compare to the stated stance.
  5. Count consistent vs inconsistent votes. An issue is “aligned” when at least half of the tagged votes were consistent. Overall percentage is the share of scoreable issues that came out aligned.

Constituent-vote alignment

For each legislator we look up their state's Cook PVI and decide a lean direction — D when PVI is at least +3, R when it's at most −3, or “swing” when the absolute value is under 3. Then we compute their party-line consistency: how often they vote with the majority of their own party on recent roll calls.

The constituent-alignment percentage combines the two. When the legislator's caucus party matches the state's lean, voting with their party IS voting with the state, so the score equals their party-line consistency. When the parties oppose, voting with their party is voting against the state — the score inverts to 100% minus their party-line consistency. Swing states don't get a single-number score; we surface the party-line consistency for context without forcing an alignment direction.

Independents who caucus with one of the major parties (Bernie Sanders, Angus King) are scored against their caucus party.


Honest limitations

Coverage is finite

Hand-curated stances and tagged bills don't yet cover every legislator or every issue. Where coverage is missing the site tells you so explicitly — no fake number, no “coming soon” placeholder where a real score should be.

Donor data is employer-aggregated, not industry-aggregated

We surface the cleaned FEC employer aggregation, not the industry-rolled-up “Top Contributors” view OpenSecrets hand-curates. Both are valid; the FEC version has the advantage that every dollar can be traced through public filings without an opaque normalization step.

House district-level PVI is not yet applied

Cook PVI publishes per-district values for the House too. We currently apply state-level PVI to representatives as a coarse approximation. A moderate Democrat in a heavily Republican district of an evenly-split state can read as “in step” with their state when in fact they're out of step with their district.

This is decision support, not a verdict

Roll-call votes are often pressured by procedural strategy, amendment positioning, and party leadership. A single “inconsistent” vote on an issue is not proof that a legislator betrayed their stated position — it's a starting point for further investigation. The system surfaces patterns, not gotchas.


Open source

The site code lives at github.com/waxsway/whovotedhow. If you spot an incorrect stance, a misclassified tagged bill, or a Cook PVI value that's out of date, open an issue or a pull request. The registries are intentionally human-editable — each new curated stance or tagged bill is one row.

What this is not

The site does not endorse any candidate or party. It does not rate legislators as “good” or “bad.” Every score is a documented calculation from public sources; the political interpretation is yours. We aim for the methodology to be something a skeptic of any partisan persuasion could audit, run, and either accept or specifically dispute. If something on the site doesn't meet that bar, we want to fix it.


Data attribution
Roster + portraits: unitedstates/congress-legislators, unitedstates/images
Roll-call votes: Voteview.com (UCLA)
Donor records: api.open.fec.gov (U.S. Federal Election Commission)
State partisan lean: Cook Political Report PVI 2025
Outside spending + candidates: FEC Schedules E + candidates/search
STOCK Act disclosures: efdsearch.senate.gov, disclosures-clerk.house.gov via community mirrors
Committee assignments: unitedstates/congress-legislators
Sponsored bills: api.congress.gov (Library of Congress)
Federal judges: Federal Judicial Center
Voter info: vote.gov + state Secretary of State portals + 866-OUR-VOTE (Election Protection)