Historical Data Archive
Two independently captured tables: 25.7M Polymarket CLOB book observations and 110.5M Kalshi top-of-book observations. Only the Kalshi table carries capture-time score and clock fields; the venues are not pre-keyed. Parquet format, instant download.
One-time purchase · Parquet · schema doc included · public results and evidence coverage
Polymarket rows include top quotes and depth aggregates; Kalshi rows contain top-of-book quotes and activity fields. Timestamps, not advertised cadence, are authoritative.
The files have different physical schemas and no shared exchange key. Cross-venue work requires a verified title/team/date/outcome mapping that fails closed on ambiguity.
Kalshi rows carry the latest observed score, period and clock at capture time. Polymarket rows do not; event-time analysis needs a separate verified join.
Columnar Parquet that loads straight into pandas, Polars or DuckDB. No scraping, no parsing, no rate limits.
Every column, unit and capture caveat is written up in an included schema document, with quick-start examples.
A dense Dec 2025 – Jan 2026 snapshot (~136M rows), dense but not gap-free — per-sport gaps documented in the schema. Newer months ship as separate drops; live data is the cross-venue matched book.
The Polymarket file preserves CLOB book fields and depth aggregates. The Kalshi file preserves top-of-book quotes plus capture-time sports context. Neither file contains executions or settlement outcomes, and their rows are not a pre-computed cross-venue panel.
For cross-venue or event-time work, build an explicit mapping using teams, date, market line, and outcome semantics; then document the as-of tolerance. A midpoint is not a fill, and a capture timestamp is not the sporting event time.
example — query each physical table without inventing a join (DuckDB)
import duckdb
poly = duckdb.sql("""
SELECT timestamp, token_id, yes_bid, yes_ask,
bid_depth_5c, ask_depth_5c
FROM 'poly_snapshots.parquet'
WHERE yes_bid IS NOT NULL AND yes_ask IS NOT NULL
""").df()
kalshi_live = duckdb.sql("""
SELECT timestamp, ticker, yes_bid, yes_ask,
home_score, away_score, period, time_remaining
FROM 'kalshi_snapshots.parquet'
WHERE game_state = 'live' AND tradable_now
""").df()
Historical book states are perishable. Current-book APIs do not reproduce this fixed Dec 2025 – Jan 2026 capture. A researcher can collect future states, but cannot recreate these exact past observations.
The right source depends on whether you need trades, historical book states, both venues, or sports context. For a maintained vendor-by-vendor comparison, see our historical data buyer's guide.
| Approach | Historical quote snapshots | Both venues included | Sports context / outcomes | Effort |
|---|---|---|---|---|
| Polymarket / Kalshi public API | ✗ current state only | ✗ | ✗ | You build it — and the history is already gone |
| Reconstruct on-chain (Polygon) | ~ trades only | ✗ Polymarket only | ✗ | Weeks of plumbing, still no quote tape |
| Odds APIs / OddsJam | ✗ sportsbook odds, not PM books | ✗ | ✗ | $30–999/mo, wrong data |
| ZenHodl archive | ✓ captured snapshots | ✓ separate tables; buyer maps them | Kalshi capture state; no outcomes | Download two Parquets |
The separate MLB matched-book product aligns Polymarket and Kalshi by dated game key and capture time. Its current frozen vintage has 315 dated game keys: 282 settled and 33 explicitly unresolved. It is sampled top-of-book research data, not fills or a promise of profitable divergence.
Inspect a full settled game free on HuggingFace (also on Zenodo with a DOI), then inspect the Polymarket–Kalshi MLB matched-book archive.
Model entries from captured bid/ask observations; on Kalshi rows, segment analysis by the game state observed at capture time.
Study spread and depth dynamics, sampling gaps, quote persistence, and liquidity-state distributions.
Measure realistic entry cost from the recorded bid/ask spread at each captured snapshot, across both venues.
Use the Kalshi capture-state fields as a research input after validating coverage, lag, and outcome joins.
Inspect the data before you pay: free sample files show you the exact schema and quality. Our public results ledger includes wins, losses, nonbinary outcomes and measured execution-evidence coverage rather than a selective profit headline. Usage terms are spelled out in the data license.
The public API does not reproduce this historical book window. The archive contains a Polymarket CLOB table and a separate Kalshi top-of-book table; only Kalshi rows carry capture-time game state, and cross-venue matching is buyer-side.
Apache Parquet, with an included schema document. Loads directly in pandas, Polars or DuckDB.
Yes — grab the samples here and inspect the schema before buying.
A fixed window: Dec 28 2025 – Jan 30 2026 (~136M rows), dense but not gap-free (see schema). The exact historical snapshots cannot be recaptured after the window; newer data ships as separate drops.
Yes. Capture has continued, with disclosed dark windows: the Kalshi Microstructure Tape is a dated vintage refreshed periodically — its current vintage date, row counts, print families and coverage limits are stated on its own page rather than repeated here. We also decoded Polymarket's RFQ-only parlay market from the settlement layer — the study has free samples, and the full panel is available on request.
The standard license covers single-user research and backtesting. For redistribution, multi-seat or white-label feeds, contact us for commercial terms.
One-time $150. Instant download. Free samples first if you want to look before you buy.