Tick-level historical order books
for Polymarket & Kalshi
Replay every state of any order book and join it with trades and markets — query in ClickHouse SQL or export Parquet, with no ingestion pipeline to build.
Get Started143B+
Snapshots stored
3.5B+
Snapshots per day
On change
Book capture
Parquet
Export format
Granularity
Granular data, queryable without ETL
Use ClickHouse when you need fast exploration, and Parquet exports when you need offline research.
| Provider | Updates / Day | Resolution | History | Format |
|---|---|---|---|---|
| ProbalyticsBest | 3.5B+ | Every state change | Nov 2025+ | ClickHouse SQL + Parquet |
| File vendors | Varies | Tick / snapshot | Vendor-specific | CSV / Parquet files |
| Native APIs | Live only | Source-dependent | Self-managed | Per-platform JSON |
We store every book state, not a periodic snapshot — several distinct states can share one millisecond. Source timestamps are millisecond-resolution; hash and path_index separate and order states within a tick.
Full orderbook depth in ClickHouse
Each snapshot captures the complete bid and ask sides of the orderbook for a given market outcome. Query the data directly, join it with trades and markets, then export only the slice you need.
- Python SDK — market.orderbook_snapshots() straight into a dataframe
- Query orderbook_snapshots directly via ClickHouse SQL
- Join orderbook depth with markets, trades, and platform metadata
- Download Parquet files via REST API when you need offline analysis
- Every book carries state and continuity — gaps are labelled, not hidden
SELECT market_id, outcome, bids, asks, timestamp FROM orderbook_snapshots WHERE market_id = '...' AND timestamp BETWEEN '2026-03-01' AND '2026-03-02' ORDER BY timestamp LIMIT 100
Pull the book straight into a dataframe
The probalytics package queries ClickHouse for you and hands back a Polars or pandas dataframe — no HTTP plumbing, no Parquet staging, no schema mapping. Parquet downloads via the REST API are still there when you want files on disk.
# pip install probalytics
from probalytics import ProbalyticsClient
client = ProbalyticsClient.from_env()
market = client.markets(
market_platform_id='KXBTC-26JUN-T50000',
platform='KALSHI',
)[0]
# Full-depth book, every state change, as a Polars dataframe
book = market.orderbook_snapshots(
start_time='2026-03-15T00:00:00Z',
end_time='2026-03-15T00:01:00Z',
)
print(book.select('timestamp', 'bids', 'asks'))Use Cases
What you can do with granular orderbook data
Backtesting
Replay exact orderbook state at any millisecond to backtest strategies with realistic slippage and fill simulation.
Market Microstructure
Study bid-ask spread dynamics, liquidity depth, and order flow patterns across prediction markets.
Liquidity Analysis
Track how liquidity evolves around events, news, and market resolutions at every book state.
ML Feature Engineering
Build rich feature sets from orderbook depth, imbalance ratios, and spread dynamics for predictive models.
Coverage
Platform availability
Polymarket
LiveHigh quality from Feb 2026+
Polymarket Perpetuals
LiveEvery state change
Kalshi
LiveFull resolution
Kalshi Perpetuals
LiveEvery state change
Figures as of August 2026.
Ready to query orderbook data?
Query Polymarket and Kalshi orderbook history in SQL, or export the slices you need as Parquet.
Start free trialAlso explore: Market data·Trade data