vike
API EndpointsPolymarket

Polymarket

Every endpoint over Polymarket — the recorded CLOB (market directory, probability candles, book snapshots, the raw event tape, on-chain settlement, bulk-archive discovery) and two trader routes (a wallet's profile, smart-money signals).

11 endpoints under https://data.vike.io/v1/polymarket/. Nine are over the Polymarket CLOB as recorded by Vike — not a proxy of Polymarket's own API; two are trader routes over the on-chain trade tape. They answer on the same host, behind the same API key and the same hourly budget as every other namespace.

Querying is one of two ways in — the other is bulk

These answer a question at a time, in JSON. The Polymarket archive serves the same recording as Parquet files, a day at a time — 411 GB of book events, trades and L1 quotes, read with pyarrow or DuckDB rather than curl.

Reach for the archive whenever the answer is every row in a window

Use the archive, not these endpoints, when you need all of a window. A ranged file read does not spend the hourly request budget, while paging the same history through these endpoints does — and a Parquet reader issuing one Range request per column chunk is how a single 1.26 GB file once cost 20,237 units.

In the OpenAPI spec, but without response schemas

/v1/openapi.json lists every endpoint here, but like the rest of /v1 it declares no response bodies — which is why these pages exist and why the response examples and field notes on them were read off the live API. The request lines and parameter lists, by contrast, are generated from that spec.

Every endpoint here is GET: any other method returns 405 {"detail":"Method Not Allowed"}, and a path that is not a route returns 404 {"detail":"Not Found"} — FastAPI's own bodies, which are not the {"error": ...} shape a rejected parameter gets.

Start here

TaskEndpoint
Find a market by name and get the ids every other call takes/markets
Look up one market you already hold a condition id for/markets/{condition_id}
Check that a token has a recorded tape, and over what span, before spending calls on it/market_stats
Chart a market's implied probability as candles, hourly or daily/ohlcv
Read the order book as it stood at a moment you name/orderbook
Replay the raw tick tape for an hour and page through it/events
Find out how a market actually ended, from chain truth/settlements/{condition_id}
Profile a trader: realized P&L, hit rate, open positions, equity curve/wallets/{address}
See which markets the profitable wallets are buying, or bought below the mid/smart_money
List the Parquet files for a day and size a download before starting it/archive/datasets
Resolve one known day and stream to its download URL/archive/url

What it looks like in use

A first session
# find: bitcoin markets by slug; each row carries a condition_id and two token_ids
curl -s "https://data.vike.io/v1/polymarket/markets?query=bitcoin&limit=3" \
  -H "X-API-Key: $VIKE_API_KEY"

# orient: TOKEN is one token_id from a row above; first_ms and last_ms bound its recorded tape
curl -s "https://data.vike.io/v1/polymarket/market_stats?token_id=$TOKEN" \
  -H "X-API-Key: $VIKE_API_KEY"

# chart: FIRST_MS is that first_ms; bars come oldest first, so this is the first 48 hourly probability candles
curl -s "https://data.vike.io/v1/polymarket/ohlcv?token_id=$TOKEN&interval=1h&from=$FIRST_MS&limit=48" \
  -H "X-API-Key: $VIKE_API_KEY"

# drill in: FROM and TO are epoch milliseconds one hour apart inside that span; the trade prints in it, 100 to a page
curl -s "https://data.vike.io/v1/polymarket/events?token_id=$TOKEN&event_type=trade&from_ms=$FROM&to_ms=$TO&limit=100" \
  -H "X-API-Key: $VIKE_API_KEY"

# page: has_more was true, so repeat the call with the response's next_cursor
curl -s "https://data.vike.io/v1/polymarket/events?token_id=$TOKEN&event_type=trade&from_ms=$FROM&to_ms=$TO&limit=100&cursor=$CURSOR" \
  -H "X-API-Key: $VIKE_API_KEY"

An unrecognised query parameter is refused rather than ignored, as 400 {"error":"unknown query parameter 'x' (this endpoint accepts: …)"}. On the market-data routes (everything except /wallets/{address} and /smart_money) a value that does not parse as a number or a boolean falls back to that parameter's default instead of failing. The two trader routes validate instead: a bad window, mode, hours, limit or address is a 400. On every route an empty value counts as absent and a repeated parameter takes its last value.

One spelling

/v1/polymarket/... is the only form. Seven older flat paths — /v1/markets, /v1/markets/{condition_id}, /v1/market_stats, /v1/ohlcv, /v1/orderbook, /v1/settlements/{condition_id} and /v1/events — answered until 2026-09-03 and now return 404. They predated the namespace and were retired once the usage record showed that, across its whole history, they had served 28 requests, all from the owner's own key.

Code on a flat path needs one edit

If you have code on a flat path, add /polymarket after /v1; nothing else changes. The namespaced form matches onchain and hyperliquid, and cannot collide with a future route in those namespaces.

Two traps in the flat spelling

The archive endpoints have no flat alias. /v1/archive/datasets and /v1/archive/url are 404 — those two are reachable only through /v1/polymarket/archive/....

There is no bare settlements route. /v1/settlements is retired with the other flat paths and /v1/polymarket/settlements has no route at all; both answer 404, and an authenticated caller still pays the round trip. The working form always carries a condition id: /v1/polymarket/settlements/{condition_id}.

Identifiers: condition_id and token_id

A market has a condition_id and each of its outcomes has a token_id, and the two are not interchangeable; Polymarket data model says which endpoint takes which.

One call gets you both, and it is the right first call in this namespace:

cURL
curl -H "X-API-Key: $VIKE_API_KEY" \
  "https://data.vike.io/v1/polymarket/markets?query=bitcoin&limit=3"

Each row carries the market's condition_id and its two token_ids; every market-data endpoint here takes one or the other. /markets shows the response.

A wrong or unknown id is not an error

/markets/{condition_id} and /settlements/{condition_id} answer 200 with an empty array [] for an id they do not know — including a well-formed token_id passed where a condition_id belongs, which is a silent empty result rather than a rejection. Check for an empty array; do not rely on a 404. /market_stats fails the same way in its own shape: an unrecorded token is one row of zeros, never [].

The endpoints

EndpointWhat it does
/marketsThe market directory — search and filter the recorded market universe by slug.
/markets/{condition_id}One market's detail — the same row shape as the directory, for a single market.
/market_statsAggregate recorded activity for one outcome token in a single row.
/ohlcvCandles for one outcome token, priced in probability, 0–1.
/orderbookAn order-book snapshot for one outcome token.
/eventsThe raw per-market event tape: book snapshots and deltas, trade prints, tick-size changes and stream-health status markers.
/settlements/{condition_id}The on-chain settlement of one market: which outcome won, what the payout vector was, and the block and timestamp at which it resolved.
/wallets/{address}One trader's profile — lifetime volume, realized P&L and hit rate over a chosen window, markets, trades, positions and an equity curve.
/smart_moneySmart-money signals: markets the profitable cohort is buying (flows) or bought below the mid (mispricings).
/archive/datasetsA JSON index of every downloadable archive partition, across both Hive layouts.
/archive/urlResolves one partition to its absolute download URL plus that file's known byte and row counts.

Bulk archive discovery

Two endpoints that index the Parquet archive rather than serving market data. They tell you what partitions exist and where to download them; the files themselves are served from https://data.vike.io/archive/, and the archive pages cover the layouts, the schemas and — importantly — how to download without exhausting your budget.

Both are namespaced-spelling only. There is no /v1/archive/... flat alias.

Metering

Every call in this namespace spends one unit of the same hourly budget as MCP and the other /v1 namespaces — see Rate limits. Archive downloads from https://data.vike.io/archive/ do not spend it, but the two discovery endpoints above are ordinary API calls and do.

The mistake this namespace invites is worth repeating from that page: if you want book history rather than a snapshot, download whole archive partitions and read them locally. Pointing a Parquet client at an archive URL issues a request per column chunk, and one file can produce tens of thousands of them.

REST and MCP: which routes share code

Both surfaces are served from the same code where it matters, and they are not one-to-one:

REST endpointMCP tool (https://vike.io/mcp)Same implementation?
/ohlcvpolymarket_ohlcvYes — the same query.
/wallets/{address}polymarket_walletYes — the route runs the tool.
/smart_moneypolymarket_smart_moneyYes — the route runs the tool.
/marketspolymarket_marketsNo. REST searches the recorded universe by slug; the tool ranks the top markets by 24h volume.
/markets/{condition_id}polymarket_market_detailNo. Different row shapes.
/market_stats, /orderbook, /events, /settlements/{condition_id}, /archive/*—REST only.

The second Polymarket MCP server that once answered at data.vike.io/mcp (nine tools, one per route) was retired on 2026-09-03 with zero authenticated calls in its history. There is one MCP server, and the Polymarket tools are on it; data.vike.io/mcp now reaches that same server.

  • Bulk archive — full L2 book events, the taker tape and derived top-of-book as Parquet, and the download guidance the two discovery endpoints above lead to.
  • Rate limits · Authentication

On this page