Guide · updated September 2026

How to get Kalshi order book and historical data

Kalshi exposes its order book, trade tape and price history through a plain REST API. Several of the data endpoints are public. This guide lists the exact endpoints, the parameters that matter, and the gotchas (fixed-point numbers, cursors, the three-month live window).

Base URL and auth

Production base URL: https://external-api.kalshi.com/trade-api/v2. Trade history and candlesticks are public. The order book endpoint is listed under authenticated requests, which use an API key ID plus an RSA-PSS signature on each request. Create a key from your account settings; read-only is enough for everything on this page.

1. Live order book

GET https://external-api.kalshi.com/trade-api/v2/markets/{ticker}/orderbook?depth=10
  • depth: number of price levels per side, 0 (default) for all.
  • Returns resting yes bids and no bids. A no bid at 40¢ is the same liquidity as a yes ask at 60¢, so convert when you build a single ladder.
  • Prices come back in dollars as fixed-point strings; parse them as decimals, not floats, if you are doing accounting.

2. Trade history (public)

GET https://external-api.kalshi.com/trade-api/v2/markets/trades?ticker=KXBTC-26SEP02-B100000&limit=1000&min_ts=1756700000
  • limit 1 to 1000, cursor for the next page (empty when done).
  • min_ts / max_ts are Unix seconds.
  • Each trade has yes_price_dollars, count_fp (contracts, 2 decimals), taker_outcome_side (yes or no) and created_time. Use taker side to reconstruct aggressor flow.

3. Candlesticks (historical prices, public)

GET https://external-api.kalshi.com/trade-api/v2/series/{series_ticker}/markets/{ticker}/candlesticks?start_ts=1754000000&end_ts=1756700000&period_interval=60
  • period_interval: 1 (minute), 60 (hour) or 1440 (day).
  • Each candle carries yes bid and yes ask OHLC, trade price OHLC (null if no trades), volume_fp and open_interest_fp.
  • Add include_latest_before_start=true to get a synthetic opening candle for charts.

4. Older data: the historical endpoints

Live endpoints target about the last three months. Settled markets older than the cutoff move to a separate namespace with the same cursor pagination:

GET https://external-api.kalshi.com/trade-api/v2/historical/cutoff
GET https://external-api.kalshi.com/trade-api/v2/historical/markets
GET https://external-api.kalshi.com/trade-api/v2/historical/markets/{ticker}/candlesticks
GET https://external-api.kalshi.com/trade-api/v2/historical/trades
GET https://external-api.kalshi.com/trade-api/v2/historical/fills      (your own, authenticated)
GET https://external-api.kalshi.com/trade-api/v2/historical/positions  (your own, authenticated)

Check /historical/cutoff first so your script knows whether to hit the live or archived path for a given date.

5. A minimal Python loop

import requests, time
BASE = "https://external-api.kalshi.com/trade-api/v2"
def all_trades(ticker, min_ts):
    cursor = ""
    while True:
        r = requests.get(f"{BASE}/markets/trades",
                         params={"ticker": ticker, "limit": 1000,
                                 "min_ts": min_ts, "cursor": cursor}).json()
        yield from r["trades"]
        cursor = r.get("cursor") or ""
        if not cursor:
            break
        time.sleep(0.2)  # be polite to the rate limit

Rate limits are tiered by account; the public tier is fine for research if you sleep between pages. Store the fixed-point strings as decimals and convert contract counts with two decimal places.

Your own fills are the data that matters most

Market data tells you what the crowd did. Your fills tell you whether you have an edge. FillBook pulls your Kalshi fills with a read-only key and turns them into realized P&L with fees folded in, win rate by category, and edge by holding time, with no scripts to maintain.

See the live demo → or read how Kalshi fees work before you build a strategy on this data.

FAQ

Is the Kalshi order book available via API?
Yes. GET /markets/{ticker}/orderbook returns the resting yes and no bids for a market, with an optional depth parameter (0 returns every level). Current docs list it under authenticated endpoints, so create a read-only API key first.
Can I get Kalshi trade history without an API key?
Yes. GET /markets/trades is public. Filter by ticker and a min_ts / max_ts window, page with the cursor field, and read yes_price_dollars, count_fp and taker_outcome_side per trade.
Does Kalshi provide historical price data (OHLC candlesticks)?
Yes. GET /series/{series_ticker}/markets/{ticker}/candlesticks returns candlesticks with period_interval of 1 (minute), 60 (hour) or 1440 (day) between start_ts and end_ts, including yes bid/ask OHLC, trade price OHLC, volume and open interest.
How far back does Kalshi historical data go?
Live endpoints target roughly the last three months. Older, settled data moves behind the /historical/* endpoints (markets, trades, candlesticks, and your own fills, orders and positions). Call GET /historical/cutoff to see where the boundary currently sits.
Is there a bulk download of Kalshi historical data?
Not as a file export. Everything is cursor-paginated JSON over the API, so a small script that walks the cursor is the standard approach.

Endpoints reflect Kalshi's public API docs as of September 2026. Not affiliated with Kalshi; always confirm against docs.kalshi.com.