Skip to main content
GET
Download Tick Data
Download the raw orderbook-delta firehose behind Kalshi. Every price-level change at full resolution, as sorted, zstd-compressed Parquet, plus the book snapshots you need to seed a replay. Call with venue=kalshi for the deltas and venue=kalshi_snapshots for the snapshots, then feed the signed URLs into your own DuckDB, Polars, or Spark. Seed a book from a snapshot and replay the deltas to reconstruct it at any instant (see Replaying the book).
Live, self-serve. Sign up, add a payment method for $50 in free credits, and download. Priced at $80.00/GiB of compressed Parquet: a full day of deltas is typically 3 to 5 GiB, about $250 to $400 (August 2026), and a single 15-minute market filtered by market_id is near the $5 minimum. Delta history is available from 2026-03-05 through yesterday (T-1); prices and sizes are lossless sub-cent from 2026-04-20 (earlier days were captured in whole cents and carry price_dollars on a whole cent). See Data Credits & Pricing.
Finalized data only (T-1). Ticks are compacted daily at 06:00 UTC; today and future days return 404 not_final. For ready-made, throttled (one per 0.5 s) book snapshots via the REST API use Kalshi Orderbook History.
Timestamps are epoch milliseconds, UTC. To pull a single market, pass the Kalshi ticker as market_id to prune a day down to 1 or 2 files (Parquet is sorted by ticker). A series root such as KXBTC15M matches every KXBTC15M-* ticker. See filtering to one market.

Schema: orderbook deltas (venue=kalshi)

Orderbook deltas (signed change in resting size at a price level), sorted by (ticker, timestamp, sequence).
Kalshi quotes sub-cent, down to a tenth of a cent. price_dollars and delta_fp carry the exact values; the integer price and delta columns are rounded convenience copies. For sub-cent-accurate work, read price_dollars. The no side is quoted in NO prices (a NO bid at 0.9600 is the same order as a YES ask at 0.0400).

Schema: book snapshots (venue=kalshi_snapshots)

Full-book snapshots, one row per resting level, in the same (side, price_dollars) terms as the deltas. Kalshi sends a snapshot when a market is subscribed (every market open, every reconnect) and our capture re-requests one for every market about once an hour, so a busy market has a snapshot at its open and re-anchors through the day. Rows come from our primary capture stream (source = B); other capture streams may be added later as additional source values. Sorted by (ticker, timestamp, sequence, side, price_dollars). Snapshots are available from 2026-09-18 through yesterday. Earlier dates are not available yet; deltas alone go back to 2026-03-05.

Replaying the book

  1. Pick the latest snapshot for the ticker with timestamp <= t and load all rows sharing its snapshot_id into a map keyed by (side, price_dollars). A NULL side row is an empty book.
  2. Apply every delta with snapshot.timestamp < timestamp <= t, in (timestamp, sequence) order: book[(side, price_dollars)] += delta_fp, dropping levels that reach zero.
  3. Re-anchor whenever you pass another snapshot: if a delta-only chain drifts (a level goes negative, or a snapshot disagrees with your replayed book), the capture missed frames in between; the next snapshot is authoritative and restarts the chain.
Capture gaps. The delta stream is the union of several redundant WebSocket captures, but a market can still be blind for seconds to minutes when every capture was disconnected or backlogged (for example 2026-08-18, when 29 of 97 KXBTC15M markets had silences over 20 s). Deltas alone cannot bridge such a hole; the next snapshot after it does. A replay that only ever seeds once and never re-anchors will drift after a gap.
Get a price before downloading with GET /v2/data/ticks/quote using the same parameters. See Data Credits & Pricing. Other venues: Polymarket Ticks, Opinion Ticks.

Authorizations

x-api-key
string
header
required

Query Parameters

venue
enum<string>
required

Dataset key: polymarket (CLOB price changes), kalshi (orderbook deltas), kalshi_snapshots (Kalshi book snapshots, one row per level), or opinion (orderbook deltas). Dataset key.

Available options:
polymarket,
kalshi,
kalshi_snapshots,
opinion
date
string | null

Single UTC day, YYYY-MM-DD.

start_date
string | null

Range start, YYYY-MM-DD (pair with end_date).

end_date
string | null

Range end, YYYY-MM-DD (inclusive).

start_time
integer | null

Window start, epoch ms UTC. Selects/derives days and prunes parts by ts range.

end_time
integer | null

Window end, epoch ms UTC (inclusive).

market_id
string | null

Prune to the part(s) covering this market/ticker.

Response

Successful Response

Signed-URL download response for a venue/date (or date range).

venue
string
required
status
string
default:final
required
format
string
default:parquet
required
compression
string
default:zstd
required
schema
TickSchemaField · object[]
required

Column names and types in the Parquet files.

sort_order
string[]
required

Columns the files are globally sorted by.

parts
TickPart · object[]
required
total_rows
integer
required
total_bytes
integer
required
date
string | null
start_date
string | null
end_date
string | null
start_time
integer | null
end_time
integer | null
market_id
string | null