vike
API EndpointsPolymarket

/leaderboard

The Polymarket wallet leaderboard — wallets ranked by realized P&L, hit rate, volume or trade count, lifetime or over a window, with bot and whale tags and the confidence interval on the hit rate.

GET https://data.vike.io/v1/polymarket/leaderboard

Polymarket wallets ranked by realized P&L, hit rate, volume or trade count, for all time or over a window, optionally inside one market category. It is the board vike.io/polymarket shows, served as an array of rows from the hourly leaderboard table, not from the raw tape. It is the same answer the polymarket_leaderboard MCP tool gives — the route runs that tool.

cURL
# the default board: lifetime realized P&L, largest first, wallets with at least 20 resolved markets, 20 rows
curl -H "X-API-Key: $VIKE_API_KEY" \
  "https://data.vike.io/v1/polymarket/leaderboard"

# the last 30 days in crypto markets, ranked by the P&L of markets that resolved inside them, with small-trade bots left out (an average trade of at least $20)
curl -H "X-API-Key: $VIKE_API_KEY" \
  "https://data.vike.io/v1/polymarket/leaderboard?category=Crypto&window=30d&sort=realized_pnl_window&min_avg_usd=20&limit=2"

# the biggest losers of all time
curl -H "X-API-Key: $VIKE_API_KEY" \
  "https://data.vike.io/v1/polymarket/leaderboard?sort=realized_pnl_asc&limit=10"

# the most active by resolved markets, second page of 20: offset is rows to skip and rank continues at 21
curl -H "X-API-Key: $VIKE_API_KEY" \
  "https://data.vike.io/v1/polymarket/leaderboard?sort=resolved&limit=20&offset=20"

# thin records too: with min_resolved=0 a wallet with two resolved markets can appear, and its hit_rate means little
curl -H "X-API-Key: $VIKE_API_KEY" \
  "https://data.vike.io/v1/polymarket/leaderboard?min_resolved=0&sort=last_seen&limit=20"

# the board is rebuilt once an hour, so a research series is a stored one: keep each response with its timestamp
curl -s -H "X-API-Key: $VIKE_API_KEY" \
  "https://data.vike.io/v1/polymarket/leaderboard?limit=50" -o "leaderboard-$(date -u +%Y%m%dT%H).json"
categoryqueryoptional
all (default), Crypto, Sports, Politics, Pop-Culture or Tech. Every figure is recomputed on that category's markets only. Any other value is a 400.
windowqueryoptional
24h, 7d, 30d or all. Default all. The period behind trades_window, volume_window_usd and realized_pnl_window_usd (P&L of the markets that RESOLVED inside it), and what the *_window sorts rank on. 24h, 7d and 30d are rebuilt hourly and a market's resolution time can be corrected later, so they can be revised; all is not affected. Any other value is a 400.
sortqueryoptional
realized_pnl (default, lifetime USD, largest first), realized_pnl_asc (biggest losers first), realized_pnl_window and realized_pnl_window_asc (P&L inside window), hit_rate (highest first, nulls last; the top is often wallets that buy near-certain outcomes just under $1, a 100% rate on a sliver of P&L, so set realized_pnl_usd against volume_all_usd before reading it as skill), resolved (most resolved markets), volume_24h and trades_24h (USD volume and trade count inside window; the names are historical), volume_all, trades_all, markets (lifetime), last_seen (most recent first). Ties break on the wallet address. Any other value is a 400.
min_resolvedqueryoptional
Minimum resolved markets, a count from 0 to 4294967295. Default 20, so a hit_rate rests on a real sample; 0 includes wallets too thin for one.
min_volume_usdqueryoptional
Minimum lifetime volume in USD (buys plus sells), a finite number of 0 or more. Default 0.
min_avg_usdqueryoptional
Minimum average trade size in USD, a finite number of 0 or more. Default 0. 20 leaves out every wallet tagged bot.
limitqueryoptional
Rows per page, a positive integer. Default 20; values above 50 are capped at 50.
offsetqueryoptional
Rows to skip, an integer from 0 to 1000. Default 0. The board is rebuilt hourly, so a page fetched after a rebuild can repeat or skip a wallet. Above 1000 is a 400: narrow with category or a min_* filter instead.

A real response for the second request, cut to its first row.

Example response (first row)
[
  {
    "rank": 1,
    "proxy_wallet": "0x32ed2e546b187ca15e2841edc82b22c713cf8ec3",
    "pseudonym": "",
    "display_name": "",
    "realized_pnl_usd": 486847.83,
    "realized_pnl_window_usd": 106260.86,
    "resolved_markets": 93972,
    "hit_rate": 0.544339,
    "hit_rate_ci": 0.003184,
    "volume_all_usd": 12839471.17,
    "volume_window_usd": 3092527.93,
    "trades_all": 599277,
    "trades_window": 112219,
    "avg_trade_usd": 21.42,
    "markets": 94080,
    "first_seen": "2026-06-11T18:16:39.000Z",
    "last_seen": "2026-10-19T15:00:15.000Z",
    "tags": ["whale", "hot"]
  }
]

Reading it

  • Money is USD, ratios are fractions. realized_pnl_usd is lifetime P&L realized on resolved markets. realized_pnl_window_usd, volume_window_usd and trades_window cover window, and equal the lifetime fields when window=all. An open position contributes nothing until its market resolves, and a market that resolved invalid is excluded from P&L, hit rate and the resolved count. USD is rounded to the cent and ratios to six places.
  • hit_rate is a fraction from 0 to 1, volume-weighted, and null where undefined. 0.62 is 62%. It is the share of the wallet's resolved dollar volume that sat in markets where it made money, not a count of wins. A wallet with no resolved volume has hit_rate: null, never 0; a real 0.0 means every resolved dollar sat in a losing market.
  • A high hit_rate is not skill by itself. A wallet that buys near-certain outcomes just under $1 wins nearly every market for a sliver of profit, so hit_rate: 1.0 beside a small realized_pnl_usd on a large volume_all_usd is an arbitrage pattern. Sorting by hit_rate puts these first; set the P&L against the volume before reading a rate as an edge.
  • hit_rate_ci is a plus-or-minus half-width, as a fraction. It is the half-width of the 95% Wilson interval, with hit_rate treated as a proportion over resolved_markets: 0.544339 with 0.003184 reads as 54.4% give or take 0.3 points. Because hit_rate is volume-weighted rather than a count, the interval is indicative, not exact. It is null where hit_rate is. A wide one means a thin record.
  • The default asks for 20 resolved markets, and the top of a category can still be bots. min_resolved defaults to 20 so a rate rests on a real sample; 0 lists every wallet. Even so, the wallets with the most resolved markets in Crypto carry hundreds of thousands of them at an average trade of cents to about ten dollars: on 2026-10-19 the five at the top of category=Crypto&sort=resolved were all tagged bot. tags holds bot (an average trade under $20 over at least 100 trades), whale (lifetime volume of $100,000 or more), and hot or cold (lifetime P&L of +$1,000 or −$1,000 over at least five resolved markets). They are rules on these figures, not a classification of anyone. min_avg_usd=20 leaves out every bot.
  • first_seen is not an age. It is the wallet's first trade in the recorded tape, which starts on 2026-01-01. A wallet that traded earlier, or went quiet and came back, shows a later date, so do not call one new on the strength of it. The website's new tag is not served for that reason.
  • Windows are rebuilt hourly and can be revised. 24h, 7d and 30d are hour-granular, and a market's resolution time is corrected retroactively when the chain shows a different close than the one first recorded, so a windowed figure can move between two calls. The lifetime figures and window=all do not depend on a resolution time. Read a windowed rank as of the hour you fetched it.
  • Paging is by offset on a board that moves. offset skips rows (0 to 1000) and rank continues across pages. Ties break on the wallet address, so one request returns one page. The board is rebuilt hourly, so a page fetched after a rebuild can repeat or skip a wallet; for a snapshot, fetch within one hour. An empty array means no wallet passes the filters.
  • Wallet addresses are public on-chain data, and pseudonym and display_name are Polymarket's own profile fields, empty for many wallets. Nothing here identifies a person.
  • It sorts the whole board on every call. Expect a second or so, not milliseconds, and cache the answer: it changes once an hour. For one wallet's equity curve and positions use /wallets/{address}.

Errors

StatusWhen
400category, window or sort is not one of the values above; limit is not a positive integer; offset is not an integer from 0 to 1000; min_resolved, min_volume_usd or min_avg_usd is negative, not a number, or not finite; or an unknown query parameter is sent. The body is {"error": "…"}. A limit above 50 is not an error: it is capped at 50.
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.
cURL
# the default board: lifetime realized P&L, largest first, wallets with at least 20 resolved markets, 20 rowscurl -H "X-API-Key: $VIKE_API_KEY" \  "https://data.vike.io/v1/polymarket/leaderboard"# the last 30 days in crypto markets, ranked by the P&L of markets that resolved inside them, with small-trade bots left out (an average trade of at least $20)curl -H "X-API-Key: $VIKE_API_KEY" \  "https://data.vike.io/v1/polymarket/leaderboard?category=Crypto&window=30d&sort=realized_pnl_window&min_avg_usd=20&limit=2"# the biggest losers of all timecurl -H "X-API-Key: $VIKE_API_KEY" \  "https://data.vike.io/v1/polymarket/leaderboard?sort=realized_pnl_asc&limit=10"# the most active by resolved markets, second page of 20: offset is rows to skip and rank continues at 21curl -H "X-API-Key: $VIKE_API_KEY" \  "https://data.vike.io/v1/polymarket/leaderboard?sort=resolved&limit=20&offset=20"# thin records too: with min_resolved=0 a wallet with two resolved markets can appear, and its hit_rate means littlecurl -H "X-API-Key: $VIKE_API_KEY" \  "https://data.vike.io/v1/polymarket/leaderboard?min_resolved=0&sort=last_seen&limit=20"# the board is rebuilt once an hour, so a research series is a stored one: keep each response with its timestampcurl -s -H "X-API-Key: $VIKE_API_KEY" \  "https://data.vike.io/v1/polymarket/leaderboard?limit=50" -o "leaderboard-$(date -u +%Y%m%dT%H).json"
Example response (first row)
[  {    "rank": 1,    "proxy_wallet": "0x32ed2e546b187ca15e2841edc82b22c713cf8ec3",    "pseudonym": "",    "display_name": "",    "realized_pnl_usd": 486847.83,    "realized_pnl_window_usd": 106260.86,    "resolved_markets": 93972,    "hit_rate": 0.544339,    "hit_rate_ci": 0.003184,    "volume_all_usd": 12839471.17,    "volume_window_usd": 3092527.93,    "trades_all": 599277,    "trades_window": 112219,    "avg_trade_usd": 21.42,    "markets": 94080,    "first_seen": "2026-06-11T18:16:39.000Z",    "last_seen": "2026-10-19T15:00:15.000Z",    "tags": ["whale", "hot"]  }]