Schemas Get a free key
LIVE --:--:-- UTC Hyperliquid positions snapshot on a 5-min UTC grid — last boundary --:-- next in -:--
Sources · Polymarket

Free Polymarket API & order-book data

Markets, the raw event tape, order-book snapshots, candles and on-chain settlements over the API — 15 routes under /v1/polymarket, with /events and /orderbook recorded from 2026-07-25. The same days, in bulk, are the Parquet archive below, licensed CC BY 4.0.

15
REST routes
from 2026-07-25
first recorded day of /events and /orderbook
3 streams
book_events · trades · l1_quotes, daily Parquet
CC BY 4.0
archive licence · details
Markets

Polymarket markets API: find a market, then its tokens

Search recorded markets by slug, open or closed; one market by condition_id; and its on-chain resolution.

GET /v1/polymarket/markets Search recorded markets by slug substring; active = true | false (or closed); newest end_date first; limit ≤ 100. A bare array.
GET /v1/polymarket/markets/{condition_id} One market by condition_id, as an array of 0 or 1 rows — an unknown id is 200 [].
GET /v1/polymarket/settlements/{condition_id} The on-chain resolution of one market, 0 or 1 rows. [] means the chain resolved nothing — not that the market is open.
GET /v1/polymarket/settlements/bulk Many resolutions in one walk, oldest first: optional from_ms / to_ms and slug_prefix; limit ≤ 5,000; {settlements, has_more, next_cursor}.

Market search · /markets

GET/v1/polymarket/markets?active=true&limit=25
Open this side to see the captured response.

    

On-chain settlement · /settlements/{condition_id}

GET
Open this side to see the captured response.

    

Search Polymarket markets · /markets

query
active
limit
GET/v1/polymarket/markets?query={query}&active={active}&limit={limit}

    
Press Send ▶ — the captured response appears here

    

One market · /markets/{condition_id}

condition_id
GET/v1/polymarket/markets/{condition_id}

    
Press Send ▶ — the captured response appears here

    

Market resolution · /settlements/{condition_id}

condition_id
GET/v1/polymarket/settlements/{condition_id}

    
Press Send ▶ — the captured response appears here

    
Book · stats · candles

Polymarket order book, stats and candles

The live panels follow one liquid recorded token, picked when the snapshot is captured; its id is in each panel's </> API side.

GET /v1/polymarket/orderbook The nearest book snapshot at or before ts (omit ts for the latest), flattened to levels; depth ≤ 25. One array, asks first then bids.
GET /v1/polymarket/market_stats One token's tape summary: event counts, trade volume, first and last timestamps. Always exactly one row.
GET /v1/polymarket/ohlcv Candles at 1m | 5m | 1h | 1d, oldest first; from / to are epoch ms, both inclusive; limit ≤ 1,000.

Order book · /orderbook

GET
Open this side to see the captured response.

    

Candles · /ohlcv

GET
Open this side to see the captured response.

    

A book can be one-sided, so depth=10 can return fewer than 20 rows. as_of_ts on every row is the snapshot actually used, not the ts you asked for. A snapshot can also list a level more than once — key rows on (side, level).

Order book snapshot · /orderbook

token_id
depth
GET/v1/polymarket/orderbook?token_id={token_id}&depth={depth}

    
Press Send ▶ — the captured response appears here

    

Market stats · /market_stats

token_id
GET/v1/polymarket/market_stats?token_id={token_id}

    
Press Send ▶ — the captured response appears here

    

Polymarket price candles · /ohlcv

token_id
interval
from
limit
GET/v1/polymarket/ohlcv?token_id={token_id}&interval={interval}&from={from}&limit={limit}

    
Press Send ▶ — the captured response appears here

    

Bars come back oldest first and limit cuts the head of the range, so pass from for a recent window. Each captured from pairs with its interval.

Raw tape

Polymarket trade and event tape, in order

GET /v1/polymarket/events — the per-market event tape ordered by receive time and sequence: book snapshots, price changes, trades, tick-size changes and status markers.

GET /v1/polymarket/events Raw event tape for one token (or up to 100 via token_ids); from_ms / to_ms required, ≤ 24h per call; limit ≤ 50,000; event_type filter; next_cursor.

Event tape · /events

GET
Open this side to see the captured response.

    

An enveloped route (/settlements/bulk is the other): {"events": […], "has_more": …, "next_cursor": …}. next_cursor is a string only while has_more is true — pass it back as cursor. bids / asks are strings carrying JSON.

token_id
from_ms
to_ms
event_type
limit
GET/v1/polymarket/events?token_id={token_id}&from_ms={from_ms}&to_ms={to_ms}&event_type={event_type}&limit={limit}

    
Press Send ▶ — the captured response appears here

    
API or archive? /events and /orderbook serve every recorded day from 2026-07-25 and answer in pages; a /events call spans at most 24 hours. Anything you want in bulk is the archive: one Parquet file per stream per UTC day, every recorded market in it.
Traders

Polymarket smart money: who is trading, and who is early

Three routes over the on-chain trade tape — not the recorded book — that run the same code as the MCP tools polymarket_wallet, polymarket_smart_money and polymarket_leaderboard.

GET /v1/polymarket/wallets/{address} One trader: realized P&L, hit rate on resolved markets, volume, categories, recent trades and an equity curve. window = 24h | 7d | 30d | all.
GET /v1/polymarket/smart_money Markets the profitable-wallet cohort is buying (mode = flows) or bought well below the mid (mode = mispricings); hours, category, limit ≤ 20.
GET /v1/polymarket/leaderboard Wallets ranked by realized P&L, hit rate, volume or trade count, lifetime or over a window, with bot and whale tags; category, window, sort, min_resolved, min_volume_usd, min_avg_usd; limit ≤ 50, offset ≤ 1000.
Archive

Polymarket historical data: the Parquet archive

Full L2 Polymarket history as daily Parquet under https://data.vike.io/archive/. The calendar is the captured /archive/datasets reply: click a day for its streams, sizes and rows, and the resolved file URL where the capture has one.

daily partitions · measured from /archive/datasets
coverage, UTC days
Parquet, the by-date layout
across the three streams

Archive calendar · /archive/datasets

GET/v1/polymarket/archive/datasets?limit=1000
Open this side to see the captured response.

    
StreamWhat it holds
book_eventsFull L2: book snapshots, price_change deltas, trade prints, tick-size changes and status markers, in sequence. Recorder gaps are marked with gap_start / live_resume, not hidden.
tradesThe taker tape alone — the trade prints without the book.
l1_quotesDerived top of book: bid, ask and both sizes, one row per change.

Two layouts

By date — one UTC day, every recorded market:venue=polymarket/date=YYYY-MM-DD/<stream>.parquet.

By family — the crypto up/down families on their own: asset=btc/tenor=5m/date=….

Families

Assets btc eth sol xrp doge bnb hype + other; tenors 5m 15m 4h + other. other/other is the catch-all for every market that is not an up/down family. A family with no rows in a stream on a day has no file.

Licence and access

CC BY 4.0 — use it for anything, credit vike. Samples and the manifest need no key. Full files need a free key, and downloads do not count against your 20,000 requests an hour.

No key at all

Resolve, then download

/archive/url resolves one file to a download link of your own, valid 7 days and needing no key. With redirect=1 it answers 302 with a Location header (and the same JSON body), so curl -L lands on the Parquet file. The resolve is one API request; the download it redirects to is not counted.

bash
curl -L -H "X-API-KEY: vk_…" -o trades.parquet \
  "https://data.vike.io/v1/polymarket/archive/url?date=YYYY-MM-DD&stream=trades&redirect=1"

Download whole files and read them locally: a Parquet reader pointed at a remote file issues a range request per column chunk and repeats them on every query.

Download link for one archive file · /archive/url

date
stream
asset
tenor
GET/v1/polymarket/archive/url?date={date}&stream={stream}&asset={asset}&tenor={tenor}

    
Press Send ▶ — the captured response appears here

    

Pass both asset and tenor for a family file, or neither for the whole day. "No such file" is a 400, not a 404.

Archive file list · /archive/datasets

stream
asset
limit
GET/v1/polymarket/archive/datasets?stream={stream}&asset={asset}&limit={limit}

    
Press Send ▶ — the captured response appears here

    

{"datasets": […], "limit", "offset", "total"} in manifest order. Here from / to are YYYY-MM-DD strings — on /ohlcv the same names are epoch ms.

GET /v1/polymarket/archive/datasets The archive file index, filtered by stream, asset, tenor, from / to (YYYY-MM-DD) and paged by limit ≤ 1,000 / offset.
GET /v1/polymarket/archive/url Resolve one file to its download URL; redirect=1 answers 302 to the file.
FAQ

Polymarket API FAQ

Does Polymarket have an API?
Yes. Polymarket's own CLOB and Gamma APIs serve live trading and market data. This API adds the recorded history: the event tape and order-book snapshots from 2026-07-25, candles, on-chain settlements, and the daily L2 Parquet archive.
How do I get Polymarket historical data?
Download the Parquet archive: the full L2 order book, trades and top-of-book quotes, one file per stream per UTC day, CC BY 4.0. Samples and manifest.json need no key; full files need a free key. The archive has its own page: /data/polymarket-historical-data.
How far back does the Polymarket API go?
/events and /orderbook start on 2026-07-25, the first recorded day, with no rolling cut-off after it; an earlier time answers empty. The Parquet archive holds the same days, one file per stream per UTC day.
Is the archive free?
Yes. It is CC BY 4.0. The samples and manifest.json need no key at all; full files need a free key, and downloading them does not count against your hourly limit.
Which stream should I download?
l1_quotes if top of book is enough, trades for the taker tape, book_events for full L2. trades and l1_quotes can be derived from book_events and are far smaller.
Why did a market lookup return []?
/markets/{condition_id} and /settlements/{condition_id} return an array of 0 or 1 rows. An unknown id is 200 []; an empty settlement means the chain resolved nothing — not that the market is still open.
Is the Polymarket API free?
Yes. One free key, 20,000 requests an hour and 200 a minute, up to 3 keys per account, nothing billed.