← Back to blog

How to Get Historical Polymarket Order Book Data

By the ZenHodl team — we run the trading bots this blog writes about, and the qualifying live-position record, including losses, is public with its admission rules at /results.

If you're building or backtesting a Polymarket strategy, you eventually hit the same wall: you can get the current order book, and you can get trade history, but you cannot get the historical order book — the full depth, over time, as each market moved.

This guide explains exactly why that data is missing from the public API, why it's harder to get than it looks, and what your actual options are.

What the Polymarket API actually gives you

Polymarket's CLOB API is genuinely good for live trading. What it returns:

What it does not return:

This is the same gap on Kalshi: the API exposes current depth and trades, not a historical depth archive. (We cover the broader landscape in our complete guide to prediction market APIs and the practical Polymarket API guide.)

Why you can't just backfill it

Here's the part that trips people up: historical order book data is not reconstructable retroactively. You cannot write a script today that fetches what the book looked like last month, because the book is ephemeral — it only exists in the moment, and neither venue stores and serves the full historical depth.

A trade tape can sometimes be reassembled after the fact. A full-depth order book over time cannot — if nobody recorded the snapshots as they happened, that information is simply gone. So the only way to have January's order book is to have been capturing it, snapshot by snapshot, in January.

That single fact defines your options.

Your three options

1. Record it yourself, going forward. Stand up a websocket client against both venues, snapshot the book on every update, and store it. This works — it's exactly how the data gets created — but it has two costs: you get zero history before the day you start, and capturing clean, gap-free, multi-venue depth at scale (with reconnection handling and clock discipline) is more engineering than it first appears.

2. Use historical prices. This is simpler than recording a book, but prices alone do not tell you the spread or size available for a hypothetical fill. Do not assume a price-series observation is an executable bid or ask.

3. Buy a recorded archive. If someone already captured the depth, you can skip the year-long wait and the capture engineering. The thing to check is what kind of archive it is.

Match the archive to the research question

Check the fields in the specific product schema before choosing an archive:

A quote midpoint is a recorded price calculation, not a fill. Missing observations are not unchanged quotes.

A concrete example

Start with the free Kalshi-side CSV. Inspect its actual columns and a few rows in DuckDB:

DESCRIBE SELECT * FROM read_csv_auto('orderbook_archive_sample.csv');
SELECT * FROM read_csv_auto('orderbook_archive_sample.csv') LIMIT 5;

The free CSV and paid Parquet files have distinct contracts; check each schema and price unit before comparing values. The paid legacy archive schema defines Kalshi prices in cents and Polymarket prices in 0–1 dollars. For the paid Kalshi file, this query makes the unit conversion explicit:

SELECT datetime_utc, period, time_remaining, home_score, away_score,
       yes_bid / 100.0 AS bid_dollars,
       yes_ask / 100.0 AS ask_dollars,
       mid / 100.0 AS midpoint_dollars
FROM 'kalshi_snapshots.parquet'
ORDER BY datetime_utc;

Game state in the paid archive belongs only to Kalshi and reflects capture time. The Polymarket table has no score or game-clock fields and is not pre-keyed to Kalshi. Inspect recorded quotes alongside that observed context; these files alone cannot establish a sporting event time, a score-response delay or an executable trading edge. Event-time work needs a separately verified timeline.

Where to get it

We publish distinct archive contracts rather than one interchangeable data feed:

Start with the free Polymarket sports CSV and its schema and capture limits. If the fields suit your analysis, test your pipeline on the $9 two-day tryout before choosing the $149 larger archive. The free CSV is a sample, not the complete paid tryout.

For other datasets, browse the samples and schemas and all data archives. Confirm the fields, price units, observed window, mapping requirements and gaps for the artifact you intend to buy. Our historical-data buyer's guide compares source options.

Historical book observations must have been captured when the book was visible. That does not make the archive complete or every other data type non-backfillable: inspect the specific capture and its limits.

Related reading

Get ZenHodl Weekly

One weekly email with live results, one model insight, and product updates.

Tuesday mornings. No spam.

Need historical Polymarket sports order-book data?

Inspect the measured coverage, schema, known gaps, and free sample before buying.