Kalshi Data: Historical Prices, Order Book Depth and Open Interest
Kalshi has no data marketplace and no bulk export button. What it has is a free, unauthenticated API that exposes more than most traders realise, plus two gaps that no endpoint will ever fill for you. This page maps what exists, what it costs, and what you have to record yourself before it disappears.
The short answer
- Prices and volume: available free via the API, including per market candlestick history.
- Open interest: available free, delivered as
open_interest_fpon the market object. - Order book depth: current state only. Historical depth does not exist unless you recorded it.
- Bulk archive download: does not exist. You build it by polling and storing.
Every Kalshi data source, and what it gives you
| Source | What you get | Cost | Notes |
|---|---|---|---|
Candlesticks endpointGET /series/{series}/markets/{ticker}/candlesticks | OHLC price history per market ticker | Free | The primary route for historical price series. Poll and persist to build an archive. |
Events with nested marketsGET /events?status=open&with_nested_markets=true&limit=50 | Bulk snapshot: prices, volume, open interest | Free | Best bulk discovery call. Roughly 250+ markets per request. |
Order bookGET /markets/{ticker}/orderbook | Current bid and ask depth | Free | Live state only. No historical depth is served, so snapshot it yourself. |
Series metadataGET /series/{series_ticker} | Settlement source, contract terms, frequency | Free | Tells you which NWS station or data source settles a contract. |
Portfolio and fillsGET /portfolio/* | Your own orders, positions, settlements | Free, auth required | RSA-PSS signed. Your fill history is the only trade level data you can fully export. |
All market data routes live on https://api.elections.kalshi.com/trade-api/v2. Portfolio routes live on https://external-api.kalshi.com/trade-api/v2. Using the wrong host is the most common reason a data pull comes back empty. Details in the API reference.
How to download Kalshi historical data
There is no archive endpoint, so the practical approach is a two step collector. First enumerate the markets you care about, then pull candlestick history for each ticker and write it to storage.
# 1. Enumerate open markets in bulk
GET https://api.elections.kalshi.com/trade-api/v2/events
?status=open&with_nested_markets=true&limit=50
# 2. Pull price history per market ticker
GET https://api.elections.kalshi.com/trade-api/v2/series/{series}
/markets/{ticker}/candlesticks
?start_ts={unix}&end_ts={unix}&period_interval=60Run that on a schedule and you accumulate exactly the dataset Kalshi does not sell you. The important detail is starting early: markets that settle and age out become far harder to reconstruct, and depth data is never recoverable after the fact.
The two gaps you cannot fill retroactively
Historical order book depth
The order book endpoint is a live snapshot. There is no parameter that returns yesterday's book. If you want to study how depth moved before a resolution, you must be snapshotting on an interval today. Every hour you wait is an hour of depth history that no longer exists.
Trade level tape for other participants
Aggregate volume and open interest are published, but an individual print by print tape of who traded what is not exposed. Your own fills are fully available through the portfolio endpoints. Everyone else's activity is visible only in aggregate.
Reading the fields correctly
API v2 renamed most of the fields that data pipelines depend on. If your collector is writing nulls, this is almost always the reason.
| What you want | Field name | Format |
|---|---|---|
| Open interest | open_interest_fp | number, e.g. 246292.19 |
| Volume | volume_fp | number, e.g. 785807.77 |
| Best bid | yes_bid_dollars | string, e.g. "0.3300" |
| Best ask | yes_ask_dollars | string, e.g. "0.3400" |
| Bid depth | yes_bid_size_fp | number, e.g. 2574.02 |
| Last traded price | last_price_dollars | string, e.g. "0.3300" |
Price fields are strings in dollars, not integer cents. Cast before arithmetic. Size and volume fields use the _fp suffix and arrive as numbers.
Building a Kalshi screener
A useful screener does not need a paid data feed. One bulk events call returns several hundred markets with everything you need to rank them. Filter client side on the criteria that actually predict tradability.
- Liquidity floor: drop markets where
yes_bid_size_fpis thin, since a visible price with no depth is not tradable. - Spread filter: compute
yes_ask_dollarsminusyes_bid_dollarsand exclude anything wider than your edge. - Conviction bands: markets priced above 0.88 or below 0.12 behave very differently from midrange contracts.
- Exclude combos: multivariate tickers inflate counts and rarely carry real bids.
Frequently asked questions
Can I download historical Kalshi data?
There is no single download button for a full historical archive. Kalshi exposes candlestick history per market through the API, and settled markets remain queryable after resolution. To build a historical dataset you poll the candlesticks endpoint per market ticker and store the results yourself. Most serious traders run a daily collector for exactly this reason.
Does Kalshi provide historical order book data?
Not as a historical archive. The order book endpoint returns the current book only, so depth history has to be recorded by you as it happens. If you need historical depth, snapshot the order book on a schedule and persist it. Once a moment has passed, that depth is gone and cannot be retrieved retroactively.
How do I get Kalshi open interest?
Open interest arrives on the market object as open_interest_fp, returned as a fixed point number such as 246292.19. It is not a separate endpoint. Request the market or use the events endpoint with nested markets, then read the field directly from each market.
Is Kalshi market data free?
Yes. Market data endpoints including markets, events, order books, candlesticks and series require no API key and no payment. Authentication is only needed for portfolio actions such as placing orders or reading your balance. Rate limits still apply to unauthenticated calls, so batch politely.
What is the best way to screen Kalshi markets in bulk?
Use GET /events?status=open&with_nested_markets=true&limit=50 against api.elections.kalshi.com. It returns events with markets embedded, which gives you several hundred markets per call including prices, volume and open interest. Filter client side on volume_fp and bid depth to build a screener.
How far back does Kalshi candlestick history go?
History exists for the lifetime of each individual market, so it is bounded by when that contract was listed rather than by a fixed lookback window. Short cycle markets such as the 15 minute crypto contracts have very brief histories. Long running series accumulate considerably more.
A collector that already runs
The Kalshi AutoTrader Bot Kit ships the API client, correct field mapping and a backtesting framework, so market data lands in a usable shape from the first run instead of after a week of debugging field names.
See the Bot Kit — API client, risk manager, backtester