12 hours of events spread across four months
Polymarket historical data
What Polymarket historical data exists, and what has to be captured
Polymarket serves price history well — down to 1-minute buckets, on markets that resolved years ago. It does not archive order book depth at all. Knowing which side of that line your question sits on saves a great deal of wasted effort.
Checked against the live API on 2026-08-24.
Short answer
What is actually available
| Data | From Polymarket | Detail |
|---|---|---|
| Price history | Yes, down to 1-minute buckets | CLOB /prices-history returns per-token time series. fidelity is in minutes and 1 is the floor. Bound the window with startTs and endTs — interval=max at fine granularity returns an empty array. |
| Resolved markets and outcomes | Yes, including markets resolved years ago | Gamma serves closed markets when you ask for them. closed=false is the default, which is why old markets look missing until you pass closed=true. |
| Trades | Yes, via the data API and on-chain | Executed trades are public. They tell you what filled, not what was available to fill against. |
| Order book depth | No, not at any granularity | The /book endpoint returns the book as it is now. Nothing archives it. If nobody recorded the ladders while a market was live, that depth does not exist anywhere and cannot be recovered. |
| Spread and liquidity over time | Only as a by-product of depth | Spread is derived from the best bid and ask. With no archived book there is no historical spread series to derive it from. |
The split is clean: anything derived from executed trades is public and retrievable. Anything describing resting liquidity — the ladders, the spread, the depth available at each price — was never stored.
Price history works, and two defaults make it look like it doesn't
The CLOB /prices-history endpoint returns a per-token time series. It is free and needs no key. Two defaults cause most of the confusion about it:
- Closed markets are excluded unless asked for. Gamma defaults to
closed=false. A market that resolved last year is still there — passclosed=trueand it returns. interval=maxwith finefidelityreturns an empty array. Not an error, an empty result, which reads like missing data. Bound the request withstartTsandendTsinstead and the same market returns full 1-minute history.
The real ceiling is resolution. fidelity is expressed in minutes and 1 is the floor. There is no sub-minute price history from Polymarket, and no parameter that produces it.
Order book depth is forward-only
Polymarket's /book endpoint returns the book as it stands right now. There is no historical equivalent, no date parameter, and no archive behind it. Depth is forward-only: if nobody was recording the ladders while a market was live, that depth does not exist anywhere and cannot be recovered afterwards.
This matters more than it sounds for anything execution-related. A price series tells you where the market was. It does not tell you whether you could have traded there, how much size was resting, or what a 100-share order would have cost. Those questions need the book, and the book has to have been captured at the time.
Reconstructing books from the event stream does not work
The obvious workaround is to replay an archived event stream: seed from a snapshot, apply every price_change delta, and rebuild the book at any past moment. Several public archives are shaped for exactly this.
It can be tested without an external reference, because those archives contain both the snapshots and the deltas between them. Seed from one snapshot, replay forward, and compare against the next. The source marks its own homework.
between 57% and 71% in every high-volume hour
best bid at or above best ask, which is not a tradeable state
one-directional, so removal events are absent from the stream
The asymmetry is the diagnostic part. When a replay disagrees it almost always holds levels the source does not, 4.2 to 1. A bug in the delta logic would drop levels about as often as it kept them; one-directional accumulation means removal events are missing from the stream. Polymarket's websocket carries roughly 24,000 events per second across all markets and is not sequenced, so a dropped message leaves no gap to detect.
A live collector survives this because it can ask again — re-reading the full book from REST on a timer repairs whatever drifted. A replay has nothing to re-read against. The market closed months ago. The full measurement is written up here.
Getting the data
- Prices, resolved markets, trades. Use Polymarket's own API. It is free, it is complete, and nothing else will be more authoritative.
- Order book depth. It must have been recorded live. PolyOrderbooks captures full L2 ladders at 1-second resolution across Polymarket's crypto markets and serves them over REST. The free tier queries at the same 1-second resolution as the paid ones, with a shorter history window.
- An open sample. 897,192 snapshots across 805 resolved markets, three contract lengths, published under CC BY 4.0 with a DOI on Zenodo. No signup, and citable.
- A single market to inspect first. The free BTC 5-minute sample is a full market lifecycle in CSV and JSON, no account needed.
FAQ
Does Polymarket have historical data?
Yes for prices, no for order books. The CLOB /prices-history endpoint serves per-token price series down to 1-minute buckets, including markets that resolved years ago, provided you bound the window with startTs and endTs. Order book depth is not archived at any granularity — the /book endpoint returns the current state only.
How far back does Polymarket price history go?
To the market's creation. Markets resolved in 2024 still return full 1-minute series. The common misconception that old data is unavailable comes from two defaults: Gamma excludes closed markets unless you pass closed=true, and interval=max combined with fine fidelity returns an empty array instead of an error.
Can I reconstruct historical order books from Polymarket's event stream?
Not reliably. Replaying a public Polymarket delta archive against its own snapshots diverged at 67.8% of 381,093 checkpoints, and 6.4% of the reconstructions came back crossed. Extra levels outnumbered missing ones 4.2 to 1, which indicates removal events absent from the stream. The feed carries no sequence numbers, so a dropped message cannot be detected after the fact.
Is Polymarket's API free?
Yes. No key, no paid tier, no subscription. What costs money is trading — fees and Polygon gas — not API access. The limits that matter are rate limits and the data the API does not serve, which is order book depth.
What is the finest resolution available for Polymarket price history?
One minute. The fidelity parameter is expressed in minutes and 1 is the floor. There is no sub-minute price history from Polymarket. Second-by-second data has to be captured live as the market trades.
Where can I get historical Polymarket order book data?
It has to have been recorded live. PolyOrderbooks captures full L2 depth at 1-second resolution and serves it through a REST API, with a free tier at the same resolution. A sample of 897,192 snapshots across 805 resolved markets is published openly on Zenodo under CC BY 4.0 with a DOI.