vike

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}/trades

One 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.

cURL
# 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)
done
condition_idpathrequired
The 0x-prefixed market condition id (0x and 64 hex digits). An unknown or malformed id is 200 with an empty trades, never a 404.
from_msqueryoptional
Trade time, epoch ms, inclusive. Default: from the first trade.
to_msqueryoptional
Trade time, epoch ms, exclusive. Must be greater than from_ms. Default: no upper bound.
cursorqueryoptional
Resume strictly after the last row of a previous page: pass its next_cursor back unchanged.
limitqueryoptional
Rows per page. Default 1000, 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.

Example response
{
  "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

FieldMeaning
tsThe block's time, epoch ms. It is whole seconds, so many trades share one ts.
tx_hash, log_index, block_numberWhere the fill is on chain. log_index orders the fills of one transaction.
proxy_walletThe Polymarket proxy wallet that placed the order. It is not necessarily the person's own address.
name, pseudonymPolymarket's display labels for the wallet. "" when it has none.
sideBUY or SELL of the token_id.
rolemaker for a resting order that was hit, taker for the order that hit it.
outcome, outcome_indexThe outcome this token is (Up, Yes, …) and its position in the market's outcome list.
token_idThe outcome token traded. Use it with /orderbook and /ohlcv.
size, priceShares 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_cursor is a string only while has_more is true, and null on the last page.
  • A window pages the same way. from_ms is inclusive and to_ms exclusive, 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 the X-Vike-Note header 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

StatusWhen
400cursor 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 / 429No or bad credential, or the hourly budget is spent — see Authentication and Rate limits.
503The store behind it is unavailable. The body carries no driver text.

A successful call costs one credit, like every /v1 route.

cURL
# the newest 1,000 trades of one market, with their walletscurl -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 falseCUR=""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)done
Example response
{  "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"}