How a number gets on the page
Method
What this is
ShowdownWire quotes public ratings, poll tables, and prediction-market prices. It does not run a forecast model and it does not blend a poll with a price into one probability. Paragraphs marked Desk notes are prose about those figures. They are not an extra data source.
Path to the majority
The Senate scenario starts from the Wikipedia composition and reassigns each race on the ballot from the incumbent party to the consensus. Toss-ups stay open until you set them. A seat with no incumbent party in the table is left inside the starting total. The House scenario uses Cook’s published seat totals. Cook toss-ups in the district table are the ones you toggle. Seats absent from that table are the remainder of Cook’s published Democratic and Republican counts, not a guess about any individual district.
Photos and bios
Candidate bios are the first sentences of the English Wikipedia article, with a link back to that page. Photos are saved only from Wikimedia Commons when the file’s license is public domain, CC0, CC BY, CC BY-SA, GFDL, or another Commons free-use grant, or from the public-domain official portrait of a member of Congress. A fair-use, non-commercial, or all-rights-reserved file is not stored. Run python3 scripts/profiles.py to refresh the cache. No key is required.
Prices
Each Senate race, each governor race, the chamber-control contracts, and every House district with a public market is tied to a checked ticker or slug in data/market_map.json. The price is the bid/ask midpoint when the spread is 10 cents or less, otherwise the last trade. Both venues are shown. A race is flagged when they pick different parties. Outcomes under 1 cent are omitted. PredictIt stays off.
Disagreement index
The index adds 50 when the ratings and the market pick opposite parties, 50 when the polling average and the market do, the absolute difference between those two Democratic edges, and 25 when Kalshi and Polymarket pick different parties. A toss-up is a market inside 5 cents or a poll inside 2 points. It is arithmetic on quoted numbers, not a model.
Presidential margins
2020 and 2024 state margins are parsed from the Wikipedia results-by-state tables. A row is kept only when the two major-party percentages and the table’s Margin cell agree within 0.2 points. District margins are stored only for the districts those tables name. The label says state or district.
Poll minus market
The gap is the Democratic share minus the Republican share in the polling average, minus the same difference in the Polymarket price (Kalshi if Polymarket is missing), expressed in points. It is blank when a candidate cannot be tied to a party from the table.
Ratings
Cook, Sabato, Inside Elections, Decision Desk HQ, RealClearPolitics, Silver Bulletin, FiftyPlusOne, The Economist, Fox, and Split Ticket are read from the Wikipedia predictions tables via the Wikipedia REST API. Those sites are not scraped. Each cell keeps the as-of date and the link Wikipedia printed.
WikipediaCook Political ReportDecision Desk HQThe EconomistFifty Plus OneFox NewsInside ElectionsRealClearPoliticsSabato's Crystal BallSilver BulletinSplit TicketKalshiPolymarketcivicAPIThe HillPolitico
Consensus maps Safe or Solid to 3, Likely to 2, Lean to 1, Tilt to 0.5, and Toss-up to 0, signed by party. The label is Toss-up when the absolute average is under 0.5, otherwise Lean, Likely, or Safe plus the leading party. A race is treated as competitive when any rater starts at Toss-up, Lean, or Tilt.
Polling average
The simple average is the equal-weighted mean of the aggregator rows on the Wikipedia page, excluding Wikipedia’s own “Average” row. Undecided is not allocated. If there are no aggregator rows, the fallback is the mean of the five most recent individual polls in the general-election section. Primary tables are ignored. A first-preference table is used ahead of a ranked-choice table for the same poll. When only ranked-choice rounds exist, the ballot row is kept if Wikipedia marks one, otherwise round 1.
Alaska governor
An early pull stored the August 18, 2026 top-four primary as if it were the general. Those rows are dropped when the matchup has more than four names, every poll ends on or before the primary, or the seed marks the race for review. A later general-election table with four or fewer candidates and field dates after the primary is kept.
Markets
Kalshi and Polymarket yes-prices are shown as published. Outcomes under 1¢ are dropped, which removes a stray Nebraska contract that printed at a fraction of a cent. PredictIt is off by default because its feed is limited to non-commercial use. Prices are not vig-adjusted. A divergence flag appears only when the polling-average leader and the Polymarket (or, if absent, Kalshi) leader are different parties.
Money and results
Senate fundraising comes from openFEC when FEC_API_KEY is set. Without the key, the previous snapshot’s figures stay and are marked carried forward; a seed load keeps the October 18 figures that were already in the file. Governors file with the states, not the FEC. Election-night results use civicAPI. The default mode is test data and is labeled synthetic. It is not a vote total.
Gaps left as TODO
House seats that every forecaster calls safe are not in the ratings table. Per-race storylines are not written. Oklahoma’s incumbent party is null because the source cell says Appointed. Those holes stay empty.