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
}
| Field | Example value | Meaning |
|---|---|---|
row_type | candle | race, candidate, candle or trade |
venue | kalshi | kalshi or polymarket |
race_id | SENATEAZ-24 | Kalshi event ticker (SENATEAZ-24) or Polymarket event id; on every row, so rows join to their race |
market_id | SENATEAZ-24-R | One 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