Live metricsTraders & Cohorts

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

Loading smart-money positioning…
SNAPSHOT
Get this dataCopy a runnable request for the data behind this view.View requestHide request
cURL
curl -s "https://api.asksurf.ai/gateway/v1/prediction-market/polymarket/smart-money" \
  -H "Authorization: Bearer $SURF_API_KEY"
One call. Each market returns smart_wallets_yes / smart_wallets_no (which side more smart wallets sit on) and smart_buy_volume_usd − smart_sell_volume_usd (the net dollar flow). A row 'disagrees' when the wallet-count majority side is the opposite of the net-dollar side — e.g. more wallets on YES while the dollars net-sold.

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

Top 20 Polymarket wallets by trailing-30d volume
SNAPSHOT

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
cURL
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)) }'
This card is a captured snapshot: the top 20 wallets by trailing-30d volume across Surf's full Polymarket trade tape — a warehouse ranking, because the public API is wallet- or market-scoped, not a global 30-day firehose you can page through to rank every wallet. You can still reproduce any single row exactly: pull that wallet's own trailing-30d fills (address returns every trade where it is the maker or the taker) and apply the same formula the card uses — volume30d halves the maker+taker double-count ((Σ amount_usd) / 2), trades30d is the fill count, makerSharePct is the share of those fills where the wallet is the maker. topCategory needs one extra hop: map each fill's market to its category via polymarket/markets, then take the wallet's most-frequent. Polymarket-only — no Kalshi wallet tape exists.

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

The week's 15 largest single Polymarket whale fills ($50k+ floor), each attributed to the real, non-infra taker
SNAPSHOT
Get this dataCopy a runnable request for the data behind this view.View requestHide request
cURL
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"
Pull recent whale trades, keep single fills >= $50,000, then attribute each fill to the real (non-infra) participant: the taker, unless the taker is Polymarket's CTF exchange contract (0xe111...996b / 0xe222...0f59 — confirm via wallet/labels/batch: label CTFExchange or NegRisk*), in which case the maker. Rank the survivors by fill size and take the top 15. The chart's pre-computed data was verified row-for-row against Surf's full Polymarket trade tape over the captured week. Polymarket-only: Kalshi has no wallet-level trade tape in the warehouse.

Trader X-Ray

One wallet, fully X-rayed — open positions, size, and unrealized PnL
SNAPSHOT

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
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"
Two public calls compose this X-ray — open positions and the recent-fills tape — for this example wallet. Swap the address for any Polymarket wallet. The captured figures above reproduce exactly from handoff/queries/trd-xray-seed.sql.md.

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

Which markets big money moved INTO (green) and OUT OF (red) over the last 7 days.
SNAPSHOT
Accumulating (net buys in)Distributing (net sells out)
Get this dataCopy a runnable request for the data behind this view.View requestHide request
cURL
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.
Reproduces the net-flow ranking from public building blocks: over-fetch recent whale-sized fills, keep those >= $50k over a 7-day window, attribute each to the non-infra participant (the taker, unless the taker is Polymarket's CTFExchange contract, in which case the maker), then net large buys minus large sells per market. The chart's pre-computed series runs this same logic over Surf's full Polymarket trade tape; Kalshi exposes no wallet-level tape, so this is Polymarket-only.

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

Global top 15 Polymarket wallets by summed all-time cost basis — exchange infrastructure excluded
SNAPSHOT

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
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"
This table is a captured snapshot (as of 2026-07-09): the global top 15 wallets by summed all-time USD cost basis (exposure) across every Polymarket position — a Polygon-warehouse aggregation with the two CTFExchange infra contracts excluded. The public leaderboard endpoint above is the closest live analog: it ranks wallets by volume / realized PnL / trade count (sort_by = volume | pnl | trade_count), not cost basis.

Market Whale Concentration

The 5 largest holders by USD cost basis, per canonical market
SNAPSHOT
Holds YesHolds No

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
cURL
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}'
The snapshot ranks each market's top-5 holders by USD cost basis from Polymarket's position tables (market_top_holders), captured on the date shown on the card. The public API exposes no per-market holders list, so reproduce it in two hops: (1) group a market's whale trades by wallet to surface the big holders, then (2) pull any wallet's actual position — size, current value, P&L — in that market. Resolved markets return shares=0 (tokens burned on redemption); cost basis and realized P&L stay on the position row.

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.

A price gap is not free money: venues differ on fees, settlement rules and resolution sources, and a thin book moves against you the moment you cross it. This table shows where the two venues' Yes prices disagree, in cents — and how persistently that gap has held over the trailing 90 days.

The Pair Book

Loading matched pairs…
SNAPSHOT

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
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"
matching/pairs returns the cross-venue mapping (Polymarket condition_id <-> Kalshi ticker). $CID/$TICKER come from a matched row; the two prices calls return each venue daily Yes close. Current Yes is the latest daily point per venue; gap = |polyYes - kalshiYes| x 100 (absolute cents on the shared 0-1 scale); 90-day gap is the median and max of the daily |gap| over the trailing 90 days; liquidity share is the 7-day-smoothed split of each venue daily volume (Kalshi contracts valued at a $1 proxy). The four rows are one matched market per domain, all future-resolving and live on both venues: Spain (Sports) and Fed-no-cuts (Economics), the two canonical anchors, plus Bitcoin-$250K (Crypto) and Reza-Pahlavi-enter-Iran (Politics), one World Cup maximum. Snapshot captured 2026-07-09.

How the cross-venue price gap moves, day by day

Loading matched pairs…
SNAPSHOT
|Poly − Kalshi| daily gap
Get this dataCopy a runnable request for the data behind this view.View requestHide request
cURL
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"
Captured 2026-07-09. Matched cross-venue pairs come from the first call; each pair's 90-day |gap| history is the daily |Polymarket Yes close − Kalshi Yes close| × 100 from the two /prices calls, on days both venues priced. $CID/$TICKER are a row's polymarket.condition_id / kalshi.market_ticker — e.g. the widest current gap, Fed-no-cuts: 0xd4e77ba6f29fc093509d24f508631abd445ecf506bbdc9c4c80e60256a318527 / KXRATECUTCOUNT-26DEC31-T0. The gaps stay within ~2¢ and never fully converge — but a price gap is not automatic arbitrage, since venues differ on fees, settlement and resolution.

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

Median |Poly − Kalshi| gap by days-to-resolution — it holds ~0.9¢ from 90 days out right to settlement, a persistent divergence (not a fee-free arbitrage)
SNAPSHOT
Median |Poly − Kalshi| gap

Venue Flow Ledger

Loading matched-pair liquidity share…
SNAPSHOT
PolymarketKalshi
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

Loading matched countries...
SNAPSHOT
Kalshi priced higherPolymarket priced higher

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}'
Builders

Ship it on Surf's live API

The same tables and endpoints this page runs on — free tier, no card required.

API docs ↗
Funds & desks

Need a data feed, not a demo?

Talk to us about enterprise access, custom pipelines, and SLAs.

Talk to us