Polymarket Historical Data — Free Full L2 Order Book Archive
Free historical Polymarket order book data: a daily Parquet archive of the full L2 book recorded from the live CLOB WebSocket feed since 2026-07-25 — every book snapshot, price-change delta and trade the recorder received, plus a derived top-of-book stream, across the markets it records (crypto up/down, sports and politics). CC BY 4.0, one free API key, samples with no key at all.
Coverage: 3 streams · one Parquet partition per UTC day · CC BY 4.0 · sizes in the live manifest, since 2026-07-25 (the live manifest lists what exists right now). Free — API key — delivered via Archive.
Data summary
| Category | Prediction Markets |
|---|---|
| Coverage | 3 streams · one Parquet partition per UTC day · CC BY 4.0 · sizes in the live manifest |
| Start date | 2026-07-25 |
| Delivery | APIArchiveStreamMCP |
| Access | Free — API key |
| Partitioning | venue=polymarket/date=YYYY-MM-DD/{book_events,trades,l1_quotes}.parquet |
| REST | /v1/polymarket/archive/datasets/v1/polymarket/archive/url |
| Manifest | https://data.vike.io/archive/manifest.json |
Getting started
# Every available date with per-stream sizes and row counts — no key required:
curl -O https://data.vike.io/archive/manifest.json
# Download one day of one stream (needs a free key; archive downloads do NOT
# count against your hourly limit). -C - resumes an interrupted download.
curl -H "X-API-Key: vk_..." -C - -O \
"https://data.vike.io/archive/venue=polymarket/date=2026-10-11/trades.parquet"
# Free evaluation sample — one full up/down market, no key required:
curl -O https://data.vike.io/archive/samples/book_events.parquet
import io, requests
import polars as pl
H = {"X-API-Key": "vk_..."}
day = "2026-10-11"
url = f"https://data.vike.io/archive/venue=polymarket/date={day}/l1_quotes.parquet"
# Download the whole file, THEN parse it locally. A remote column reader
# re-fetches the footer and every column chunk as separate Range requests
# on each query — slower for you and heavier for the archive.
df = pl.read_parquet(io.BytesIO(requests.get(url, headers=H, timeout=600).content))
print(df.group_by("condition_id").len().sort("len", descending=True).head(10))
// The archive itself is bulk Parquet — use the Polymarket MCP tools to
// discover markets and resolve the condition_ids you then join the
// archive on:
{"jsonrpc": "2.0", "id": 1, "method": "tools/call",
"params": {"name": "polymarket_markets",
"arguments": {"limit": 20}}}
Or in plain language — Ask Claude: find the most-traded Polymarket bitcoin market this week, then tell me which archive files I need to replay its order book.
Schema
book_events
Full L2: snapshots + price_change deltas + trades + tick-size and status markers. `bids`/`asks` hold JSON level arrays.
| Column | Type |
|---|---|
token_id | String |
condition_id | String |
ts | Int64 |
local_ts | Int64 |
seq | UInt64 |
event_type | Enum8('book'=1,'price_change'=2,'trade'=3,'tick_size_change'=4,'status'=5) |
is_snapshot | UInt8 |
side | Enum8('none'=0,'buy'=1,'sell'=2) |
price | Decimal(9, 4) |
size | Decimal(18, 6) |
best_bid | Decimal(9, 4) |
best_ask | Decimal(9, 4) |
bids | String |
asks | String |
tick_size | Decimal(9, 4) |
status | LowCardinality(String) |
trades
Taker tape only — one row per print.
| Column | Type |
|---|---|
token_id | String |
condition_id | String |
ts | Int64 |
local_ts | Int64 |
seq | UInt64 |
price | Float64 |
size | Float64 |
side | String |
l1_quotes
Derived top-of-book bid/ask, one row per L1 change.
| Column | Type |
|---|---|
token_id | String |
condition_id | String |
ts | Int64 |
local_ts | Int64 |
bid | Decimal(9, 4) |
ask | Decimal(9, 4) |
bid_size | Decimal(18, 6) |
ask_size | Decimal(18, 6) |
Real rows from the free sample file
Real rows from the free evaluation sample — one full crypto up/down 5-minute market (both outcome tokens, open through resolution), regenerated daily; no key required. These rows were read from the 2026-09-01 sample. Source: https://data.vike.io/archive/samples/
trades
| token_id | condition_id | ts | local_ts | seq | price | size | side |
|---|---|---|---|---|---|---|---|
| 65198662956…402410 | 0xd73785d0…059a05 | 1788269593315 | 1788269595951 | 0 | 0.76 | 5.0 | buy |
| 65198662956…402410 | 0xd73785d0…059a05 | 1788269593609 | 1788269596285 | 0 | 0.75 | 1.333332 | buy |
| 65198662956…402410 | 0xd73785d0…059a05 | 1788269593628 | 1788269596322 | 0 | 0.75 | 3.04 | buy |
| 65198662956…402410 | 0xd73785d0…059a05 | 1788269593811 | 1788269596501 | 0 | 0.74 | 24.648646 | buy |
l1_quotes
| token_id | condition_id | ts | local_ts | bid | ask | bid_size | ask_size |
|---|---|---|---|---|---|---|---|
| 65198662956…402410 | 0xd73785d0…059a05 | 1788269404012 | 1788269405125 | 0.42 | 0.45 | 235.0 | 50.0 |
| 65198662956…402410 | 0xd73785d0…059a05 | 1788269404014 | 1788269405125 | 0.42 | 0.45 | 235.0 | 55.0 |
| 65198662956…402410 | 0xd73785d0…059a05 | 1788269404015 | 1788269405126 | 0.42 | 0.44 | 235.0 | 50.0 |
book_events
| token_id | condition_id | ts | seq | event_type | side | price | size | asks | tick_size |
|---|---|---|---|---|---|---|---|---|---|
| 65198662956…402410 | 0xd73785d0…059a05 | 1788269333901 | 990 | price_change | sell | 0.99 | 96293.28 | [[0.99,96293.28]] | 0.01 |
| 65198662956…402410 | 0xd73785d0…059a05 | 1788269334132 | 991 | price_change | sell | 0.5 | 247.86 | [[0.5,247.86]] | 0.01 |
| 65198662956…402410 | 0xd73785d0…059a05 | 1788269334132 | 992 | price_change | sell | 0.51 | 629.12 | [[0.51,629.12]] | 0.01 |
Example applications
- Backtest an up/down market-making strategy
If you are testing whether quoting inside the spread on 5-minute crypto up/down markets earns the maker share it appears to, replay book_events sequence-by-sequence and fill your quotes against the actual taker tape in trades — the archive carries both sides of that experiment at full depth.
- Measure resolution-window microstructure
If your hypothesis is that spreads widen and depth vanishes in the final seconds before resolution, l1_quotes gives you top-of-book at every L1 change through a market's final minutes — no sampling, no conflation.
- Study cross-market information flow
If you suspect politics and sports books move before correlated crypto up/down books, the whole universe is in one archive with a common clock (`ts` venue time plus `local_ts` capture time), so lead–lag is a join, not a data-engineering project.
Access
Free — get an API key at vike.io/account (up to 3 keys per account) and send it as X-API-KEY on every request.
Archive files are licensed CC BY 4.0 — use them for anything, credit Vike. API responses carry the same attribution ask. Keys, rate limits and errors: the API page.