Traders
Who is actually trading — smart-money positioning, market-level concentration, and activity.
Smart money
Where smart wallets are positioned, whether the wallet-count crowd agrees with the dollar flow, and who's actually behind the volume.
Smart money vs. the crowd
Get this dataCopy a runnable request for the data behind this view.View requestHide request
curl -s "https://api.asksurf.ai/gateway/v1/prediction-market/polymarket/smart-money" \ -H "Authorization: Bearer $SURF_API_KEY"
Top wallets
The 20 Polymarket wallets with the most trading volume, trailing 30 days — a wallet leaderboard, not a smart-money or bot classification.
Top Wallets by 30d Volume
A second wallet leaderboard sits further down this tab (in the "Concentration, not classification" section below), ranked by all-time position cost basis rather than this snapshot's trailing-30d volume.
Get this dataCopy a runnable request for the data behind this view.View requestHide request
WALLET=0xcfc51c0a1a5a78845127d9d9dcb1236f700dc7cf
# fills for this one wallet over the same trailing-30d window (page heavy wallets with &offset=)
curl -s "https://api.asksurf.ai/gateway/v1/prediction-market/polymarket/trades?address=$WALLET&limit=500" \
-H "Authorization: Bearer $SURF_API_KEY" \
| jq --arg w "$WALLET" '{ trades30d: (.data | length), volume30d: (([.data[].amount_usd] | add) / 2), makerSharePct: (100 * ([.data[] | select(.maker_address == $w)] | length) / (.data | length)) }'Who's trading
The largest labeled, non-infra whale fills of the week, and a drill-down into any wallet behind them.
Largest Whale Fills
Get this dataCopy a runnable request for the data behind this view.View requestHide request
curl -s "https://api.asksurf.ai/gateway/v1/prediction-market/polymarket/smart-money?view=trades&limit=200" \ -H "Authorization: Bearer $SURF_API_KEY" curl -s "https://api.asksurf.ai/gateway/v1/wallet/labels/batch?addresses=0xTAKER1,0xTAKER2&limit=20" \ -H "Authorization: Bearer $SURF_API_KEY"
Trader X-Ray
This is one captured example. On the live terminal, every wallet on this page — leaderboard rows, the whale tape, concentration chips — is clickable to X-ray its own live positions and fills.
Get this dataCopy a runnable request for the data behind this view.View requestHide request
curl -s "https://api.asksurf.ai/gateway/v1/prediction-market/polymarket/positions?address=0xcfc51c0a1a5a78845127d9d9dcb1236f700dc7cf" \ -H "Authorization: Bearer $SURF_API_KEY" curl -s "https://api.asksurf.ai/gateway/v1/prediction-market/polymarket/trades?address=0xcfc51c0a1a5a78845127d9d9dcb1236f700dc7cf&limit=5" \ -H "Authorization: Bearer $SURF_API_KEY"
Flow & conviction
Which markets whales are entering — and which they're exiting — over the last 7 days, from the Polymarket trade tape.
Whale Flow Movers
Get this dataCopy a runnable request for the data behind this view.View requestHide request
curl -s "https://api.asksurf.ai/gateway/v1/prediction-market/polymarket/smart-money?view=trades&limit=200" \ -H "Authorization: Bearer $SURF_API_KEY" # Keep fills >= $50,000 in your 7-day window, group by market: net = large buys - large sells (USD). curl -s "https://api.asksurf.ai/gateway/v1/wallet/labels/batch?addresses=0xe111180000d2663c0091e4f400237545b87b996b&limit=20" \ -H "Authorization: Bearer $SURF_API_KEY" # Resolves Polymarket CTFExchange takers so each fill is credited to the real trader, not the exchange.
Concentration & throughput
How concentrated each market's volume is in its top wallets, and the highest-throughput accounts on the tape.
Largest Wallets by Total Exposure
Exposure is each wallet's summed all-time USD cost basis across every Polymarket position; the two Polymarket exchange-infrastructure contracts (CTFExchange) are excluded from the ranking. The tens-of-thousands Markets counts mark automated market-maker wallets — this leaderboard is dominated by them, not by directional traders. Total PnL is the upstream position-level P&L summed and is unreliable for these high-frequency wallets (won positions can still sum to a large negative figure — an accounting artifact of maker redemptions and open-position marks), so read it as directional context, not audited realized profit. Polymarket-only; no Kalshi equivalent exists.
Get this dataCopy a runnable request for the data behind this view.View requestHide request
curl -s "https://api.asksurf.ai/gateway/v1/prediction-market/polymarket/leaderboard?sort_by=volume&order=desc&limit=15" \ -H "Authorization: Bearer $SURF_API_KEY"
Market Whale Concentration
These are the five largest holders by USD cost basis for the selected market — not the full holder set, so the share figures above are within this top-5, never a share of the market's total open interest (the API exposes no per-market total-holder denominator). Resolved markets show shares = 0 because outcome tokens are burned on redemption; their cost basis and realized P&L are retained. Two Polymarket exchange contracts are excluded upstream, and there is no Kalshi equivalent for holder-level data.
Get this dataCopy a runnable request for the data behind this view.View requestHide request
CID=0x7976b8dbacf9077eb1453a62bcefd6ab2df199acd28aad276ff0d920d6992892
curl -s "https://api.asksurf.ai/gateway/v1/prediction-market/polymarket/trades?condition_id=$CID&limit=500" \
-H "Authorization: Bearer $SURF_API_KEY" \
| jq '[.data[] | {w:.taker_address, v:.amount_usd}] | group_by(.w) | map({w:.[0].w, v:(map(.v)|add)}) | sort_by(-.v) | .[:5]'
# then pull any top wallet's actual position (cost basis + P&L) in that market:
curl -s "https://api.asksurf.ai/gateway/v1/prediction-market/polymarket/positions?address=$ADDR" \
-H "Authorization: Bearer $SURF_API_KEY" \
| jq --arg cid "$CID" '.data[] | select(.condition_id==$cid) | {outcome_label, size, current_value, cash_pnl}'Arbitrage
Where Polymarket and Kalshi price the same event differently — every matched pair currently live on both venues, in cents, and which venue owns the flow behind the gap.
The Pair Book
Gap is the absolute cent difference between the two venues' Yes prices — never a percent of a penny price. 90-day gap shows the median and maximum of the daily absolute gap over the snapshot window, counting only days both venues priced. Liquidity is a 7-day-smoothed split of each venue's daily volume — Kalshi contracts are valued at a $1 proxy, so the ratio between venues, not the dollar level, is the signal.
CANONICAL rows are human-verified same-event matches; HEURISTIC rows match on the same underlying event but are not hand-verified.
Get this dataCopy a runnable request for the data behind this view.View requestHide request
curl -s "https://api.asksurf.ai/gateway/v1/prediction-market/matching/pairs?limit=100" \ -H "Authorization: Bearer $SURF_API_KEY" curl -s "https://api.asksurf.ai/gateway/v1/prediction-market/polymarket/prices?condition_id=$CID&time_range=90d&interval=1d" \ -H "Authorization: Bearer $SURF_API_KEY" curl -s "https://api.asksurf.ai/gateway/v1/prediction-market/kalshi/prices?ticker=$TICKER&time_range=90d&interval=1d" \ -H "Authorization: Bearer $SURF_API_KEY"
How the cross-venue price gap moves, day by day
Get this dataCopy a runnable request for the data behind this view.View requestHide request
curl -s "https://api.asksurf.ai/gateway/v1/prediction-market/matching/pairs?limit=100" \ -H "Authorization: Bearer $SURF_API_KEY" curl -s "https://api.asksurf.ai/gateway/v1/prediction-market/polymarket/prices?condition_id=$CID&time_range=90d&interval=1d" \ -H "Authorization: Bearer $SURF_API_KEY" curl -s "https://api.asksurf.ai/gateway/v1/prediction-market/kalshi/prices?ticker=$TICKER&time_range=90d&interval=1d" \ -H "Authorization: Bearer $SURF_API_KEY"
Does the gap close before resolution?
Efficient markets pricing the same event should converge as settlement nears. Matched Polymarket/Kalshi markets don't — the gap barely moves from 90 days out right to resolution.
Efficient markets should converge — these don't
Venue Flow Ledger
Build it yourself →
The flow-share column is Surf's own 7-day-smoothed aggregation of daily matched-pair volume (matching/daily) into each venue's share. The two public building blocks below reproduce it: list the matched pairs, then pull one pair's daily volume on both venues.
curl -s "https://api.asksurf.ai/gateway/v1/prediction-market/matching/pairs?limit=100" \ -H "Authorization: Bearer $SURF_API_KEY" curl -s "https://api.asksurf.ai/gateway/v1/prediction-market/matching/daily?polymarket_condition_id=$CID&kalshi_market_ticker=$TICKER&time_range=90d" \ -H "Authorization: Bearer $SURF_API_KEY"
Home-crowd pricing
Every 2026 World Cup winner market matched across Kalshi (US-only, KYC'd) and Polymarket (global) - where a country's own fanbase can trade one venue but not the other, prices can drift apart.
Home-crowd pricing
Live gap = each venue's own last-traded Yes price, teams above the 1¢ floor only. Window = the study's own kickoff-to-date span, by design, not a stale refresh — flow-bias history: see study.
Build it yourself →
This chart's live rows come from Surf's own trade-level aggregation (venue-bias precompute) over the full 48-team matched population; the two calls below are the public, per-team building blocks - pair a ticker/condition_id with a /prices call for that venue's own last Yes close.
curl -s "https://api.asksurf.ai/gateway/v1/prediction-market/kalshi/markets?series_ticker=KXMENWORLDCUP-26" \
-H "Authorization: Bearer $SURF_API_KEY" | jq '.data[] | {market_ticker, title, status}'
curl -s "https://api.asksurf.ai/gateway/v1/prediction-market/polymarket/events?event_slug=world-cup-winner" \
-H "Authorization: Bearer $SURF_API_KEY" | jq '.data[0].markets[] | {title, condition_id, winning_side}'Ship it on Surf's live API
The same tables and endpoints this page runs on — free tier, no card required.
API docs ↗Need a data feed, not a demo?
Talk to us about enterprise access, custom pipelines, and SLAs.
Talk to us