When a bill receives a recorded roll call vote in the House or Senate, LegislationPatch retrieves the full vote data from the official clerk records — the House Clerk for House votes and the Senate for Senate votes. We pull member-level vote data, match each member against our 119th Congress member database, and flag members who voted against their party's majority on close votes.
The Source: Official Roll Call Records
House roll call votes are published in XML format by the House Clerk at clerk.house.gov/evs/{year}/roll{N}.xml. Each file carries the question, the date, the result, the party breakdown of yeas, nays, present and not voting, and the individual vote of every member who was recorded.
Senate roll call votes are published in XML format by the Senate. The Senate XML has a different structure from the House version, and it usually carries no bioguide ID for a senator — so we match senators to our member database on last name plus state instead. Last name plus state is not automatically unique, so both sides of the comparison are normalized by the same code before they are compared: accents are folded, generational suffixes and middle initials are dropped, and a compound surname is tried at every length, so Van Hollen matches whether the source writes it as one word or two. Where more than one senator from the same state matches, the match is narrowed by given name and then by party. A row that still matches more than one person is left unmatched and logged rather than guessed, so no bioguide ID is ever assigned on a partial match.
The Member Database
Our member database holds 551 member profiles for the 119th Congress, drawn from Congress.gov: 103 senators and 448 representatives. There are more profiles than seats because a seat can be held by more than one person across a two-year Congress: in our data, seven House seats carry two profiles and three states carry three senators. The reasons are the ordinary ones — a member resigns, or dies, or wins a special election, or, in the Senate, is appointed by a governor to fill a vacancy. Every profile is keyed by its Bioguide ID, and House members are identified by that same ID directly in the House XML, which is what makes House matching exact.
For each member, we store the bioguide ID, name, party, state, role — which is what the chamber is derived from — district, a biography with the source it came from — Wikipedia on all 551 records — and a link to it, the floor statements attributed to them, and their voting record. One record also carries a stored photo URL, which the page uses in place of the image it would otherwise build from the bioguide ID; a second carries a portrait-URL field that no code reads. We do not store term data — there is no start date, end date, or years-served field on a profile. The vote history on each member's profile page covers every bill in our database for which we have a recorded vote involving that member's chamber; the page lists the first eight and reveals the rest behind a show-more control.
Crossover Vote Detection
Crossovers are surfaced only on close votes: the margin between yeas and nays must be within 30% of the total yea-plus-nay count. Outside that threshold they are not computed at all, even where members did cross.
That threshold has a measurable effect: on 75 of the 232 roll calls that store a member list, members crossed and none are shown. On the 308-117 House vote on H.R. 139, for example, 117 members voted against their party's majority direction and none are shown, because the margin was 44.9% of the yeas plus nays.
When a vote does meet the threshold, we identify members who voted against their party's majority direction — Republicans who voted nay when most Republicans voted yea, or the reverse, and the same for every other party group on the roll call, independents included — and list them under "Crossed the Aisle" in the bill's voting record. A party that splits exactly even has no majority direction, so nobody in it is listed.
Voice Votes and Unanimous Consent
Not all floor votes produce roll call records. Of the vote records we store, 208 are voice-vote or unanimous-consent passages with no tally at all, against 233 recorded roll calls — 232 of which store the full member list. When a bill in our database passed by voice vote or UC, we note the method and show no member-level tally, because the chamber's chosen method did not produce one.
Updating Vote Data
Vote data is fetched by a script we run, and written to a static per-bill file. The bill, vote, quote and member records these pages load are static JSON files served from this host — your browser does not query a legislative data API while you read. Member portraits are the one piece of member data that is not local: those images load from bioguide.congress.gov, except for the single member noted above, whose bioguide photo is broken and whose portrait we point at the House Clerk instead. A bill's voting record is therefore accurate as of the last time we ran that fetch for it, and re-running the fetch is what updates it.
Drafted from primary source documents by LegislationPatch's automated research pipeline, then reviewed, verified, and edited by James Shearn, Editor. Every figure and citation is checked against the official text before publication. See our editorial standards and AI disclosure.