Polymarket order book data

Polymarket order book data: what it looks like and where to get it

Full L2 depth for Polymarket's outcome tokens — every price level and the size resting at each. Polymarket does not archive it, so it has to be captured live. Here is what the data actually looks like once you have it.

Figures measured on the published dataset, 2026-08-24.

Short answer

What the data is

An order book snapshot is the set of resting bids and asks for one outcome token at one moment: every price level, and how many shares sit at each. Level 2 means the whole ladder, not just the best bid and ask.

Two tokens per marketA binary market has an Up token and a Down token, each with its own book. They are separate order books, not two sides of one.
Prices are probabilitiesEvery level sits in [0, 1]. A bid of 0.19 is someone offering 19 cents for a contract that pays 1.00 if that outcome wins.
Sizes are share countsMultiply by price for the dollar value resting at that level.
Ladders are best-price firstBids descend from the highest, asks ascend from the lowest.
Depth varies per snapshotMedian 39 bid levels on 5-minute markets, but it ranges from zero to over 120. Never assume a fixed number.

What a snapshot looks like

One row per token per moment, with the ladders as parallel arrays. Best price first, so index 0 is the top of book:

{
  "market_slug": "btc-updown-5m-1787551200",
  "outcome": "Up",
  "captured_at": "2026-08-23T14:31:07Z",
  "seconds_to_close": 53.0,
  "bid_prices": [0.19, 0.18, 0.17],
  "bid_sizes":  [147.34, 63.69, 277.77],
  "ask_prices": [0.20, 0.21],
  "ask_sizes":  [13.60, 152.17],
  "crossed": false
}

That example is worth reading twice. The midpoint is 0.195, which looks like a liquid market — but there are 13.6 shares at the best ask. A 100-share buy, about $21, would average 0.2086: 4.3% above top of book. Headline price and executable price are not the same thing, and only the ladder tells you the difference.

Three properties that break naive analysis

PropertyMeasuredWhy it happens
Books go one-sided near settlement76.2% of 5-minute snapshots in the final minuteAs a binary market resolves, nobody offers the losing side and nobody bids the winning one. This is real market behaviour, not missing data, and it breaks code that assumes two-sided books.
Some snapshots are crossed3.24% on 5-minute markets, 1.50% on 4-hourBest bid at or above best ask, which is not tradeable. One side of the captured book was momentarily stale. Median duration is 2 seconds and 98.2% clear within 60 seconds.
Contract length changes everything4-hour books are one-sided 0.5% of the time; 5-minute, 16.9%A longer contract holds a two-sided market for almost all of its life. Conclusions drawn from 5-minute books do not transfer to 4-hour ones.

All three are measured on the published dataset — 897,192 snapshots across 805 resolved markets — so you can check every figure against files you can download:

import pandas as pd
df = pd.read_parquet("updown_5m.parquet")

(df.best_bid >= df.best_ask).mean()                 # crossed rate
(df.bid_prices.str.len() == 0).mean()               # empty bid side
df[df.seconds_to_close <= 60].crossed.mean()        # crossed near settlement

Polymarket does not archive it

The /book endpoint returns the book as it is now. There is no historical equivalent, no date parameter, and nothing behind it storing yesterday's state. Depth is forward-only.

Rebuilding it from the websocket archive is the obvious workaround and it does not hold up. Replaying a public delta archive against its own snapshots diverged at 67.8% of 381,093 checkpoints, and 6.4% came back crossed. Extra levels outnumbered missing ones 4.2 to 1 — one-directional, which means removal events are absent from the stream rather than the replay logic being wrong. The full measurement is here.

Getting it

FAQ

What is Polymarket order book data?

The full set of resting bids and asks for a market's outcome tokens at a point in time — every price level and the size available at each. A binary market has two tokens, Up and Down, each with its own book. Prices are probabilities in [0, 1] and sizes are share counts.

Does Polymarket provide historical order book data?

No. Polymarket's /book endpoint returns the current state of a book and there is no historical equivalent, no date parameter, and no archive behind it. Depth is forward-only: if nobody recorded the ladders while a market was live, they do not exist anywhere.

Can I rebuild Polymarket order books from the websocket archive?

Not reliably. Replaying a public delta archive against its own snapshots diverged at 67.8% of 381,093 checkpoints, with 6.4% returning crossed books. Extra levels outnumbered missing ones 4.2 to 1, indicating removal events absent from the stream. The feed carries no sequence numbers, so dropped messages leave no detectable gap.

Why are so many Polymarket order books one-sided?

Because binary markets resolve. In the final minute of a 5-minute market, 76.2% of snapshots have an empty bid or ask side — nobody offers the losing outcome and nobody bids the winning one. It is genuine market behaviour, and any analysis that indexes bid_prices[0] without guarding will fail on those rows.

What does crossed order book data mean?

The best bid is at or above the best ask, which cannot happen in a functioning book because those orders would match. It means one side of the captured snapshot was momentarily stale. In our data it affects 3.24% of 5-minute rows, lasts a median of 2 seconds, and 98.2% of episodes clear within 60 seconds. The rows are flagged rather than removed so the rate stays measurable.

How do I get Polymarket order book data?

It has to be captured live. PolyOrderbooks records full L2 depth at 1-second resolution across Polymarket's crypto markets and serves it over REST, with resolved outcomes attached. A free tier queries at the same resolution, and 897,192 snapshots across 805 resolved markets are published openly on Zenodo under CC BY 4.0.