Polymarket runs several markets on who will control Congress after Tuesday's US midterms. They are separate order books with separate traders: one for the House, one for the Senate, and one "balance of power" market that prices the four combinations.

That makes a nice consistency test. If the combination market says "Democrats win both" and "Republicans win the Senate, Democrats win the House", then adding those two should give you roughly what the House market says on its own.

So we checked, on the morning of 2 November (prices as read at 01:18 UTC).

What each market priced

Market Outcome Price
House Democrats control 94.5%
Senate Democrats control 71.5%
Balance of power Democrats win both 70.5%
Balance of power Republican Senate, Democratic House 23.5%
Balance of power Republicans win both 5.5%
Balance of power Democratic Senate, Republican House 0.5%

Rebuild the House and Senate from the combinations

  • House, Democrats = "both" 70.5 + "R Senate, D House" 23.5 = 94.0%. The House market says 94.5%.
  • Senate, Democrats = "both" 70.5 + "D Senate, R House" 0.5 = 71.0%. The Senate market says 71.5%.

Half a point apart, both times, on markets that don't share an order book. The four combinations (plus a 0.1% "Other") add up to 100.1%. That's about as tidy as a crowd gets.

The part that moved

The House barely moved this week: 91.5% → 94.5% (+3 points). The Senate moved more than twice as much: 64.5% → 71.5% (+7 points) between 26 October and 2 November. If you only watch one number on election night, the Senate is where the market still has doubt left.

Do it yourself

MonitoringRoom reads these markets every minute and serves them as plain JSON:

import requests d = requests.get("https://monitoringroom.com/api/us-midterms-2026", timeout=20).json() p = {(m["chamber"], m["label"]): m["probability"] for m in d["markets"]} both = p[("Senate", "Democrats Sweep")] r_sen_d_h = p[("Senate", "R Senate, D House")] d_sen_r_h = p[("Senate", "D Senate, R House")] print("House D, rebuilt:", round(100 * (both + r_sen_d_h), 1), "vs", round(100 * p[("House", "Democratic Party")], 1)) print("Senate D, rebuilt:", round(100 * (both + d_sen_r_h), 1), "vs", round(100 * p[("Senate", "Democratic Party")], 1)) print("as of", d["asOf"], "source", d["source"]) 

Prices change all day, so your numbers will differ from ours. That's the point of writing down the time.

The live board, with every market's 7-day change and how long each has been tracked: monitoringroom.com/us-midterms-2026. If you're new to reading these: what's priced, House vs Senate vs balance of power.

Market-implied probabilities are what traders are pricing, not a forecast by us and not an endorsement of any party or candidate. Information only — not betting advice.