← Use cases

Use case

2026 Senate Races: Kalshi Odds History and Results

Settled 2026 Senate markets on Kalshi with the winner, every candidate and the daily odds from October 1 to the result.

Say you are writing the post-election piece on whether the prediction markets called the 2026 Senate races, and your editor wants it by Friday. The question is simple: for each race, what did Kalshi’s price say in October, and who won? The answer is spread across dozens of settled markets, each with two or more candidates, and Kalshi’s site shows them one chart at a time.

The manual way, and what it costs

Kalshi’s market pages show a price chart, and its public API is documented and keyless. If you follow three or four races, open the pages and read the charts: that is free and fine. If you write code, you can call the candlestick endpoint yourself, once per candidate. It stops being reasonable at the scale of a cycle. On 2026-11-06 the Senate tag alone covered more than 20 settled 2026 markets with 65 candidate contracts between them, and each contract is a separate chart or request. Older races add a wrinkle: 2024 markets such as SENATEAZ-24 no longer answer on the live path and have to be read from Kalshi’s /historical archive.

The faster way

Kalshi & Polymarket Election Odds History Scraper does the same search once and hands back every row at once.

{
  "tags": [
    "Senate"
  ],
  "cycle": "2026",
  "venues": "kalshi",
  "status": "settled",
  "granularity": "daily",
  "from": "2026-10-01",
  "maxRaces": 20,
  "maxResults": 5000
}

The Senate tag picks every Kalshi series Kalshi itself labels Senate, cycle: 2026 keeps this year’s races, and from: 2026-10-01 keeps the final five weeks, the window an accuracy check cares about. Without that date the run returns each market’s whole life: the same input with no date hit its 5,000-candle cap after 14 races. With it, the test run on 2026-11-06 returned 20 races, 65 candidates and 1,540 daily candles, about $0.63 at the listed prices.

What comes back

{
  "source_url": "https://api.elections.kalshi.com/trade-api/v2/historical/markets/SENATEAZ-24-R/candlesticks",
  "row_type": "candle",
  "venue": "kalshi",
  "race_id": "SENATEAZ-24",
  "market_id": "SENATEAZ-24-R",
  "candidate": "Kari Lake",
  "period": "daily",
  "period_end": "2024-10-08T04:00:00Z",
  "open": 0.14,
  "high": 0.16,
  "low": 0.14,
  "close": 0.15,
  "mean": 0.1503,
  "yes_bid_open": 0.1,
  "yes_bid_high": 0.15,
  "yes_bid_low": 0.1,
  "yes_bid_close": 0.13,
  "yes_ask_open": 1.0,
  "yes_ask_high": 1.0,
  "yes_ask_low": 0.14,
  "yes_ask_close": 0.15,
  "volume": 1447.0,
  "open_interest": 967.0
}
FieldExample valueMeaning
row_typecandlerace, candidate, candle or trade
venuekalshikalshi or polymarket
race_idSENATEAZ-24Kalshi event ticker (SENATEAZ-24) or Polymarket event id; on every row, so rows join to their race
market_idSENATEAZ-24-ROne candidate’s market; on candidate, candle and trade rows
title / series / cycle / tags—Race rows: the race as the venue titles it, its series, election year and tags
winner—Race rows: the candidate(s) whose market settled yes

Two row types close the loop. The race row carries the winner: Jon Ossoff in SENATEGA-26, Jeff Merkley in SENATEOR-26, Troy Jackson in SENATEME-26 in that run. The candle rows carry each candidate’s close per day, and race_id joins them. A candidate’s last October close next to their candidate row’s result (yes or no) is one line of your calibration table.

What you’d do with it

Export the dataset to a sheet, filter row_type to candle, and pivot on race_id and candidate with the latest period_end before election day. Put the candidate rows’ result beside it and you have, per contract, the market’s final probability and the outcome. From there a Brier score or a simple “favourite won” count across the 65 contracts is a formula, not a research project.

Worth knowing

The Senate tag is Kalshi’s label, not a list of seats. In that run it also returned governor-and-Senate combos, “When will AP call the South Carolina U.S. Senate election?” and “How will Platner’s replacement be chosen?”, so filter race titles before you score. Two series worded “Who will win the Senate race in…” (Colorado and Idaho) came back with no winner on the race row, because none of their candidate markets settled yes. History starts when Kalshi listed the market, and Polymarket rows carry the price only. This is public market data, not investment advice.


Run it yourself: How to run Kalshi & Polymarket Election Odds History Scraper walks the whole thing step by step.

For today’s prices on open markets instead of a settled race’s past, the Kalshi & Polymarket Prediction Market Odds Scraper sweeps both exchanges in one run.

Last updated 2026-11-06