Kalshi Historical Order Book Data

Kalshi does not retain its order-book history. We record it live — L2 depth up to 20 levels per side for selected markets in a volume-ranked polling set. Depth and trade prints have different capture populations; each archive documents the sports, observed timestamps and dark windows it actually contains.

Archives are versioned snapshots. Dated snapshot: 901,585,623 depth rows · 35,983,957 trade prints · 937,569,580 total rows · book samples 2026-06-21T17:24:31.656958Z through 2026-10-11T23:57:21.231062Z · includes sparse earlier trade-print backfill from 2026-05-15; not continuous coverage · artifact vintage 2026-10-11; separate from observation times. Each product gives its own observed dates and coverage limits.

Start with the free Kalshi depth CSV and Python example. For the paid two-day ZIP, follow the Kalshi tryout walkthrough to check the manifest, coverage and separate book and trade clocks.

Inspect a Kalshi depth sample in Python

Download the free Kalshi order book CSV as kalshi_micro_tape_sample.csv, then run this with Python's standard library. The versioned depth and trade schema documents the separate paid tables.

import csv
from datetime import datetime, timezone
from decimal import Decimal

with open("kalshi_micro_tape_sample.csv", newline="", encoding="utf-8-sig") as handle:
    rows = list(csv.DictReader(handle))

for row in rows[:5]:
    observed = datetime.fromtimestamp(float(row["timestamp"]), timezone.utc)
    price_dollars = Decimal(row["price_c"]) / Decimal("100")
    print(observed.isoformat(), row["ticker"], row["side"],
          "level", row["level"], "dollars/share", price_dollars,
          "contracts", Decimal(row["size"]))

Here, timestamp is the recorded snapshot time in Unix seconds, price_c is cents per share, size is contracts, and level 0 is the best recorded price on that side. The sample may show a deeper level or only one side of a ticker; these rows alone do not establish its spread or a fill. Historical depth captured through Jul 19, 2026 had already lost fractional size precision; reading it as a decimal cannot restore that information.

This is a depth-schema example, not a trade-print sample or a complete view of each market. For a paid analysis, inspect the specific manifest and coverage notes first. The Kalshi tryout guide walks through the actual ZIP, separate timestamps and research limits.

Kalshi Microstructure Tape — $199

The full archive: book and prints together, which is what microstructure work actually needs.

  • • 901,585,623 L2 depth rows — up to 20 levels per side. The family mix depends on the volume-ranked poll selection at each capture cycle.
  • • 35,983,957 trade prints, deduplicated by trade_id with captured taker labels and fractional quantity.
  • • Game-state context observed at retrieval time, where present. capture_ts is retrieval time; created_time is trade time. Backfilled prints do not establish game state at trade time.
  • • Capture limits: the included stats identify print families and sampling scope for this version. It is not a full-exchange tape.
  • • Print retrieval lag: median 26.3s, p90 87s — measured on the 2,039,483 prints of the Jul 19, 2026 launch vintage and not re-measured for this one; compute it per print from capture_ts − created_time
  • • Corrected COVERAGE.md derives UTC global-poll gaps over 120 seconds from the timestamps, for this version; this is not a per-ticker or full-exchange completeness claim

To verify a personalized ZIP, compare its included MANIFEST.json SHA-256 with this product's archive_metadata.source_documents digest in the public catalog, then check each member against that trusted manifest. The buyer ZIP's whole-file hash changes with its license comment.

Per-sport slices — $39 each

Each ZIP has its own measured slice coverage map. Choose the sport and archive vintage you need.

Tennis — ATP / WTA / ITF

Dated snapshot: 155,268,651 depth rows · 0 trade prints · 155,268,651 total rows · book samples 2026-06-21T17:24:31Z through 2026-10-11T23:57:21Z · artifact vintage 2026-10-11; separate from observation times. Selected-market coverage and measured gaps are documented in the archive.

Details →

MLB — book + prints

Dated snapshot: 264,508,013 depth rows · 15,797,417 trade prints · 280,305,430 total rows · book samples 2026-06-21T17:24:31Z through 2026-10-11T23:57:21Z · artifact vintage 2026-10-11; separate from observation times. Selected-market coverage and measured gaps are documented in the archive.

Details →

WNBA — book + prints

Dated snapshot: 24,173,228 depth rows · 2,744,291 trade prints · 26,917,519 total rows · book samples 2026-06-21T21:24:15Z through 2026-10-10T04:05:22Z · artifact vintage 2026-10-11; separate from observation times. Selected-market coverage and measured gaps are documented in the archive.

Details →

Esports — LoL / CS2

Dated snapshot: 41,954,355 depth rows · 0 trade prints · 41,954,355 total rows · book samples 2026-06-22T06:11:14Z through 2026-10-11T23:57:21Z · artifact vintage 2026-10-11; separate from observation times. Selected-market coverage and measured gaps are documented in the archive.

Details →

NFL — book + prints

Dated snapshot: 121,165,822 depth rows · 7,099,086 trade prints · 128,264,908 total rows · book samples 2026-06-28T16:10:43Z through 2026-10-11T23:57:21Z · artifact vintage 2026-10-11; separate from observation times. Selected-market coverage and measured gaps are documented in the archive.

Details →

College football — book + prints

Dated snapshot: 95,525,356 depth rows · 5,012,219 trade prints · 100,537,575 total rows · book samples 2026-06-26T10:08:51Z through 2026-10-11T23:57:21Z · artifact vintage 2026-10-11; separate from observation times. Selected-market coverage and measured gaps are documented in the archive.

Details →

Settled Outcomes Layer — $150

One row per game: final score and winner, joinable to any Kalshi tick data on game_id. 2,621 games (1,990 settled) across 7 sports, Dec 2025 – Apr 2026, reconstructed from ~123.9M live quote snapshots. Kalshi publishes no historical results keyed to its tickers. Contains no quote snapshots itself.

Details →

Why this can't be backfilled

Kalshi's API serves the live book and candlestick summaries, but it does not provide a replay of historical L2 depth. Our depth was captured live; some trade prints were collected later through startup backfill. The corrected full-tape coverage map derives global-poll gaps from UTC timestamps, so missing observation windows are visible without implying every ticker was continuously sampled.

For the Polymarket side of the same research program, see the Polymarket historical data archive, or the vendor-neutral buyer's guide to historical order-book data.

Try before buying

Inspect the free 400-row Kalshi depth CSV and published schemas before buying. That CSV contains depth rows, not trade prints, and does not establish the coverage of a paid ZIP. The $9 tryout contains Jul 18–19 UTC write-day partitions with its own manifest and coverage note; the walkthrough checks its actual timestamps.

Documented gaps

The corrected full tape includes an algorithmic UTC map of global-poll gaps over 120 seconds, for this version. This reports recorder observation gaps, not continuous presence of every ticker. The tryout has its own two-partition coverage note.

We use this data

Our own live trading and published lead-lag research run on this capture. License terms.

FAQ

Does Kalshi publish its own historical order book data?

Kalshi's API serves live books, trades and candles, but not a replay of historical L2 order book depth. Our depth snapshots were recorded live; some trade prints were fetched later through startup backfill. An uncaptured book state cannot be reconstructed after the fact.

How deep is the recorded book?

Up to 20 price levels per side. Kalshi exposes more levels on some markets; our recorder stores the top 20. The recorded levels describe selected markets, not the entire exchange or guaranteed executable liquidity.

Does the trade tape cover every market?

No. This version's CAPTURE_STATS.json identifies the captured print families. Depth and prints have different selected capture populations and vary over time. A missing row does not establish that a market was closed or that no trade occurred.

Which timestamp should I use for trade analysis?

created_time is exchange trade time; capture_ts is when our recorder retrieved the print. Attached game state belongs to retrieval time, not the sporting event or exchange trade time. Event-time work needs a separately verified score timeline. Depth timestamp is the recorded snapshot time.

Is the data gap-free?

No. COVERAGE.md and the observed gap maps report intervals derived from delivered timestamps for each version. Global polls do not establish continuous observation of an individual ticker. Compare the specific manifest, dates and sampling limits of the archive or slice you plan to use.

Can I inspect a free sample in Python?

Yes. Download the public depth CSV and run the standard-library example on this page. It contains timestamp, ticker, side, level, price_c and size fields, not trade prints. The sample demonstrates the depth schema; it does not establish the coverage or completeness of a paid ZIP.

Can I buy just one sport?

Yes. The six $39 slices cover tennis, MLB, WNBA, esports, NFL and college football, each with its own vintage and measured coverage. Tennis and esports are depth-only captures. The $9 tryout has Jul 18–19 UTC write-day partitions and its own manifest and coverage note; compare product documentation before buying.

Start with the tryout

Two Jul 18–19 UTC write-day partitions from the same capture and data schema, with a tryout-specific manifest and coverage note — for $9. A boundary poll has a Jul 17 23:59:42 UTC timestamp. No global-poll gap exceeds two minutes, but individual markets can leave the selected set.