Methodology and sources
Every number on this site is either a prediction-market price or an Associated Press vote count. Nothing is modelled here. This page says exactly where each number comes from and what rules the page applies to it.
What the numbers are
- Chance, odds, map, bar, board, cards, lists: prediction-market prices, meaning what traders are paying for a contract that pays $1 if that outcome happens. Market-implied probability, not a poll, not a model, not a vote count.
- Blend: where both Polymarket and Kalshi have a market on the same outcome, the site shows the simple mean of the two prices. Where only one book has a market, that price is shown. The race detail shows each book separately.
- Votes, percent counted, precincts, calls: the Associated Press, read from the New York Times' public results feed. A race is "called" only when that feed marks a winner.
- NYT needle: where shown in a race detail, the Times' live model estimate from the same feed. Never used in a headline.
Sources, per market
Polymarket
Public Gamma API at gamma-api.polymarket.com (no auth) for market lists and prices, and the public CLOB websocket at ws-subscriptions-clob.polymarket.com for live price changes. Markets are discovered from Polymarket's own midterms tag.
| Senate control | which-party-will-win-the-senate-in-2026 |
|---|---|
| House control | which-party-will-win-the-house-in-2026 |
| Sweep / split | balance-of-power-2026-midterms |
| Republican Senate seats after | republican-senate-seats-after-the-2026-midterm-elections |
| Republican House seats after | republican-house-seats-after-the-2026-midterm-elections |
| Republican governors after | how-many-republican-governors-after-the-2026-midterm-elections |
| Each Senate race | <state>-senate-election-winner, e.g. texas-senate-election-winner |
| Each governor race | <state>-governor-winner-2026, e.g. ohio-governor-winner-2026 |
| House districts | <st>-<nn>-house-election-winner where a market exists, e.g. nc-13-house-election-winner |
Kalshi
Public trade API v2 at api.elections.kalshi.com (no auth for reads). Headline and close races polled every 5 seconds, everything else every 20 seconds; a websocket is not used because Kalshi's requires an account key.
| Senate control | CONTROLS-2026 (D / R) |
|---|---|
| House control | CONTROLH-2026 (D / R) |
| Each Senate race | SENATE<ST>-26 party markets, e.g. SENATETX-26; Louisiana KXSENATELA-26NOV; Ohio and Florida specials SENATEOHS-26, SENATEFLS-26 |
| Governors | GOVPARTY<ST> and KXGOVPARTY<ST> party markets |
| House districts | KXHOUSERACE plus older per-district series for competitive seats (e.g. KXHOUSENC11-26, HOUSEAZ1-26) |
| Seats won by media calls | KXDSENATEWON, KXRSENATEWON, KXDHOUSEWON, KXRHOUSEWON |
| When will AP call it | KXAPCALLSENATE, KXAPCALLHOUSE |
Votes and calls
AP results as published in the New York Times' static JSON, refreshed every 20 seconds:
Fields used: candidate vote totals, percent of expected vote (eevp), precincts reporting, the winner flag (the call), the NYT race rating, candidate party, incumbency and headshot, and poll closing times. Human-readable results are on nytimes.com and apnews.com.
Map
State shapes are US Census Bureau cartographic boundaries from the public-domain us-atlas package, projected with d3's Albers USA.
Rules the page applies
- Seat projection ("53 DEM · REP 46"): seats not up tonight (Senate: 34 for the Democratic caucus including the two independents, 31 Republican, from the AP party balance) plus every race where a party's blended chance is 60% or higher, plus races AP has called. Races between 40% and 60% are toss-ups, counted for neither side, shown as the yellow gap. A called race replaces its market estimate, so nothing is counted twice.
- Tiers: Safe 90%+, Likely 75 to 90, Lean 60 to 75, Toss-up 40 to 60, by the blended chance of the favoured party.
- Colours: dark blue or dark red means not up this year or called by AP. Bright tiers mean favoured by the markets. Yellow means toss-up. Hatching means lean.
- "Chance of controlling the Senate / House" is the blended control market itself, not derived from the race-by-race numbers.
- "Democrats will control the Senate" appears only when locked seats plus AP calls reach 51 (House 218), or the control market exceeds 99%.
- Pills and the sweep line are normalised to sum to 100 after rounding. Odds display in the 1 to 99 range.
- "Since 6 pm" is the change in blended chance since 6:00 pm ET.
Statements wire
Direct quotes only, each linked to the place it was read. No paraphrase. Chosen by hand from live blogs, wire reports, candidates' and officials' own posts, and a curated list on X. Statements are not fact-checked; the tag "claim" marks contested or unverified assertions.
Cadence and hosting
- Prices: Polymarket websocket continuously, Kalshi every 5 seconds, full refresh every 20 seconds, pushed to browsers over a websocket within about a second.
- Votes and calls: every 20 seconds.
- Hosted on Cloudflare Workers. No cookies. A first-party counter records page views by day, path, country and device class, honours Do Not Track and Global Privacy Control, and stores no IP addresses.
- Raw data: /api/snapshot and /api/history.
Limits
- Market prices can be thin or stale in small races; the detail panel shows both books so you can see when they disagree.
- The AP feed can lag the networks' own calls by minutes.
- House projections treat every uncalled district independently.
- A personal project built on election day. Errors are mine.