Market trades
Every trade in one Polymarket market with the wallet behind it, newest first, from 2026-01-01 to a few minutes ago. Page through the whole history by following next_cursor, up to 10,000 rows a page.
GET https://data.vike.io/v1/polymarket/markets/{condition_id}/tradesOne market's trades with the wallet that made each one: who traded, which side, how many shares and at what price.
History runs from 2026-01-01 to a few minutes ago. A page of 1,000 rows typically takes 0.5 to 2 seconds, and the busiest
open market on 2026-10-31 (28,670 trades from 2,692 wallets) is three requests of 10,000, so you can walk a whole market.
These are on-chain trades, the same source as /wallets/{address}
and /leaderboard; the recorded order-book tape behind
/events carries no wallet at all. The MCP tool
polymarket_market_trades runs the same query with the page capped at 200 rows.
# the newest 1,000 trades of one market, with their wallets
curl -H "X-API-Key: $VIKE_API_KEY" \
"https://data.vike.io/v1/polymarket/markets/0x1754a73958d281ae5d060f7d09484437158c0070603ae4477ccd8da4971d7b71/trades"
# one hour of it, up to 10,000 rows (from_ms inclusive, to_ms exclusive)
curl -H "X-API-Key: $VIKE_API_KEY" \
"https://data.vike.io/v1/polymarket/markets/0x1754a73958d281ae5d060f7d09484437158c0070603ae4477ccd8da4971d7b71/trades?from_ms=1793443200000&to_ms=1793446800000&limit=10000"
# walk the whole history: pass next_cursor back verbatim until has_more is false
CUR=""
while :; do
PAGE=$(curl -s -G -H "X-API-Key: $VIKE_API_KEY" --data-urlencode "cursor=$CUR" \
"https://data.vike.io/v1/polymarket/markets/0x1754a73958d281ae5d060f7d09484437158c0070603ae4477ccd8da4971d7b71/trades?limit=10000")
echo "$PAGE" | jq -c '.trades[]'
[ "$(echo "$PAGE" | jq -r .has_more)" = "true" ] || break
CUR=$(echo "$PAGE" | jq -r .next_cursor)
donecondition_idpathrequired0x-prefixed market condition id (0x and 64 hex digits). An unknown or malformed id is 200 with an empty trades, never a 404.from_msqueryoptionalto_msqueryoptionalfrom_ms. Default: no upper bound.cursorqueryoptionalnext_cursor back unchanged.limitqueryoptional1000, hard cap 10000. A page of 1,000 typically takes 0.5 to 2 seconds and a full 10,000 up to about 10 seconds when the service is busy; each page counts as one request, so ask for full pages.A real page (the first three rows of limit=3) from a settled 5-minute BTC market.
{
"trades": [
{
"ts": 1793446564000,
"tx_hash": "0x4670581e25651d5f6b9c650f7441912c810217b708ce1c60f3c668a1dc9083d3",
"log_index": 641,
"block_number": 96494072,
"proxy_wallet": "0x0f9aeda816444d01c5972bb62d792c8f7ebcdfb8",
"name": "",
"pseudonym": "",
"side": "SELL",
"role": "taker",
"outcome": "Up",
"outcome_index": 0,
"token_id": "32857589250468672103259250493340774181428193946352537992791411256292873836299",
"size": 50.67,
"price": 0.999
},
{
"ts": 1793446564000,
"tx_hash": "0x4670581e25651d5f6b9c650f7441912c810217b708ce1c60f3c668a1dc9083d3",
"log_index": 638,
"block_number": 96494072,
"proxy_wallet": "0x6940545d736920890c575cc73dbf0959a3831c6c",
"name": "",
"pseudonym": "",
"side": "BUY",
"role": "maker",
"outcome": "Up",
"outcome_index": 0,
"token_id": "32857589250468672103259250493340774181428193946352537992791411256292873836299",
"size": 50.67,
"price": 0.999
},
{
"ts": 1793446524000,
"tx_hash": "0x0ac9c15949a548fb666830bc93bebb34192b3a436784563547e77faa887f48b2",
"log_index": 385,
"block_number": 96494045,
"proxy_wallet": "0x9a3c523b9069ad60b518f0085d9e1f0b81c2661d",
"name": "",
"pseudonym": "",
"side": "SELL",
"role": "taker",
"outcome": "Up",
"outcome_index": 0,
"token_id": "32857589250468672103259250493340774181428193946352537992791411256292873836299",
"size": 6.66,
"price": 0.999
}
],
"has_more": true,
"next_cursor": "1793446524000:0x0ac9c15949a548fb666830bc93bebb34192b3a436784563547e77faa887f48b2:385:0x9a3c523b9069ad60b518f0085d9e1f0b81c2661d:32857589250468672103259250493340774181428193946352537992791411256292873836299:SELL"
}The first two rows are the two sides of one match: the taker row is the aggressor selling 50.67 shares, the maker
row is the resting order that bought them.
The fields
| Field | Meaning |
|---|---|
ts | The block's time, epoch ms. It is whole seconds, so many trades share one ts. |
tx_hash, log_index, block_number | Where the fill is on chain. log_index orders the fills of one transaction. |
proxy_wallet | The Polymarket proxy wallet that placed the order. It is not necessarily the person's own address. |
name, pseudonym | Polymarket's display labels for the wallet. "" when it has none. |
side | BUY or SELL of the token_id. |
role | maker for a resting order that was hit, taker for the order that hit it. |
outcome, outcome_index | The outcome this token is (Up, Yes, …) and its position in the market's outcome list. |
token_id | The outcome token traded. Use it with /orderbook and /ohlcv. |
size, price | Shares traded, and the price per share, from 0 to 1. |
Reading it
- Newest first, and a stable order. Rows are ordered by time and then by a fixed tie-break, so a page boundary
inside one block neither repeats nor skips a row.
next_cursoris a string only whilehas_moreistrue, andnullon the last page. - A window pages the same way.
from_msis inclusive andto_msexclusive, so consecutive windows never count a trade twice. To read forward in time, take hour-sized windows and page each one back. - Every page costs one request, like any other call, against the rate limits.
- An unknown market is an answer, not an error. The body is
{"trades": [], "has_more": false, "next_cursor": null}. A window that ends before 2026-01-01 is empty for the same reason, and theX-Vike-Noteheader says so. - The latest trades are a few minutes behind the chain.
One row is one order's fill, not one match
A match is several rows: the resting maker orders that were hit, and one taker row for the aggressor, whose size is
the sum of theirs. Adding size * price over both roles counts the match twice, and the two roles price a
complementary-token match differently (over 15 minutes of one market: $11,060 summed over maker rows, $17,066 over
taker rows). Pick one role and stay with it; never add both.
A few percent of fills are not rows
Fills one wallet made on one token inside a single transaction can be merged into one row, so a count here can sit under the on-chain fill count (-3.2% of fills and -2.3% of USD over 58 markets checked on 2026-10-17).
Errors
| Status | When |
|---|---|
400 | cursor is not a next_cursor from this route, to_ms is not after from_ms, or a query parameter the route does not take is sent. The body is {"error": "…"}. |
401 / 429 | No or bad credential, or the hourly budget is spent — see Authentication and Rate limits. |
503 | The store behind it is unavailable. The body carries no driver text. |
A successful call costs one credit, like every /v1 route.