Polymarket Whale Tracker (2026): How to Track Big Wallets With the API
The Short Answer
Polymarket has no dedicated whale endpoint, but its public Data API gives a whale tracker everything it needs, with no API key. GET /v2/trades?filter_type=CASH&filter_amount=10000 returns every trade worth $10,000 or more, newest first, and each row names the wallet in proxy_wallet. Pass that address as user to /v2/positions, /v2/value and /v2/activity to see what the wallet holds and does, and use /v2/leaderboard to seed a watchlist of the biggest winners. In our checks on 3 October 2026, the 200 most recent trades of $10,000 or more covered just over nine hours.
Key Takeaways
- Set
filter_type=CASH. The default,TOKENS, counts shares, and the smallest 10,000-share trade in our sample was worth $10. - Every trade row carries the wallet, so one address links the trade feed to that wallet's positions, activity, value and stats.
- The trades feed was cached for up to five minutes in our checks, while one wallet's activity feed was cached for 15 seconds.
- The feed shows the taker side of each fill by default. Add
taker_only=falseto catch whales who rest limit orders. - Big is not the same as informed: the largest trades we found were sales at 99.9 cents of outcomes that had all but won.
Does Polymarket have a whale tracker API?
Not as one endpoint. A whale tracker is a loop: find large trades, look up the wallets behind them, and keep watching the wallets worth following. Polymarket attributes every fill to a wallet in its public Data API at https://data-api.polymarket.com, so each step is a keyless GET request.
| Step | Endpoint | What it returns |
|---|---|---|
| Find large trades | GET /v2/trades | Every fill above a dollar or share size, with the wallet that made it |
| Size up a wallet | GET /v2/positions, /v2/value, /v2/user-stats | Holdings, marked portfolio value, markets traded and biggest win |
| Follow a wallet | GET /v2/activity | Trades, splits, merges, redemptions and rewards, newest first |
| Seed a watchlist | GET /v2/leaderboard | Top wallets by PnL or volume over a day, week, month or all time |
List endpoints return a { data, pagination } envelope and page with an opaque next_cursor. The full field reference is in our Polymarket Data API guide.
How do you find large trades on Polymarket?
Ask the trades feed for a minimum cash size. This returns the 50 most recent trades worth $10,000 or more across all of Polymarket:
curl -s "https://data-api.polymarket.com/v2/trades?filter_type=CASH&filter_amount=10000&limit=50"
| Parameter | What it does |
|---|---|
filter_type | CASH filters on dollar value. TOKENS, the default, filters on shares |
filter_amount | The minimum trade size in that unit. Defaults to 0.01 |
side | BUY or SELL |
condition, event_id | Up to 20 market or event ids, for whales in specific markets |
taker_only | Defaults to true, which serves each fill once, on its taker side |
limit, cursor | First page size (default 100, maximum 1,000 as of October 2026), then the cursor for deeper pages |
In our checks, every row returned with CASH had a size times price at or above the threshold. With the default TOKENS, a 10,000-share trade priced at a tenth of a cent, worth $10, passed the same filter. Without a user, market or event filter, the feed covers a rolling window of the current and previous month, while market and event filters reach back three years.
To turn the query into a tracker, poll it and print only trades you have not seen. This runs on Node 18 or newer with no dependencies:
const BASE = 'https://data-api.polymarket.com';
const MIN_USD = 10_000;
const seen = new Set();
let baseline = true;
async function poll() {
const url = new URL('/v2/trades', BASE);
url.searchParams.set('filter_type', 'CASH');
url.searchParams.set('filter_amount', String(MIN_USD));
url.searchParams.set('limit', '100');
const res = await fetch(url);
if (!res.ok) throw new Error(`Data API returned ${res.status}`);
const { data } = await res.json();
for (const t of data.reverse()) {
const key = `${t.transaction_hash}:${t.token_id}:${t.proxy_wallet}`;
if (seen.has(key)) continue;
seen.add(key);
if (baseline) continue;
const usd = Math.round(t.size * t.price).toLocaleString('en-US');
console.log(`${t.side} $${usd} of "${t.outcome}" on ${t.title} by ${t.proxy_wallet}`);
}
baseline = false;
}
await poll();
setInterval(() => poll().catch(console.error), 60_000);
The first poll only records what is already there, so the watcher alerts on new trades instead of replaying the last 100. Polling faster than once a minute buys little: in our checks every /v2/trades response carried Cache-Control: public, max-age=300, and repeated requests for the same URL returned the same page for minutes. Expect a large trade to surface up to about five minutes after it fills. Combo trades arrive with an empty outcome and a title that joins their legs with AND.
The unified TypeScript SDK exposes the same filter on listTrades:
import { createPublicClient, TradeFilterType } from '@polymarket/client';
const client = createPublicClient();
const pages = client.listTrades({ filterType: TradeFilterType.Cash, filterAmount: 10_000, pageSize: 50 });
const { items } = await pages.firstPage();
for (const trade of items) {
const usd = Number(trade.size) * Number(trade.price);
console.log(trade.wallet, trade.side, Math.round(usd), trade.title);
}
The SDK renames proxy_wallet to wallet and returns size and price as decimal strings, so convert them before multiplying. Use @polymarket/client 0.11.0 or later.
How do you see what a whale holds?
Pass the proxy_wallet from a trade row as user. This reads a wallet's stats card, marked portfolio value, largest open positions and first recorded action in parallel:
const BASE = 'https://data-api.polymarket.com';
async function get(path, params) {
const url = new URL(path, BASE);
for (const [key, value] of Object.entries(params)) url.searchParams.set(key, String(value));
const res = await fetch(url);
if (!res.ok) throw new Error(`${path} returned ${res.status}`);
return (await res.json()).data;
}
const wallet = process.argv[2]; // a proxy_wallet from the large-trades feed
const [stats, value, positions, firstActions] = await Promise.all([
get('/v2/user-stats', { user: wallet }),
get('/v2/value', { user: wallet }),
get('/v2/positions', { user: wallet, filter_type: 'CASH', filter_amount: 1000, sort_by: 'CURRENT_VALUE', limit: 10 }),
get('/v2/activity', { user: wallet, sort_direction: 'ASC', start: 1, limit: 1 }),
]);
console.log({
marketsTraded: stats?.trades ?? null,
biggestWinUsd: stats?.biggest_win ?? null,
portfolioUsd: value.value,
firstSeen: firstActions[0] ? new Date(firstActions[0].timestamp * 1000).toISOString() : null,
});
for (const p of positions) {
console.log(p.outcome, p.title, Math.round(p.current_value), Math.round(p.unrealized_pnl));
}
On /v2/positions, filter_type=CASH with filter_amount=1000 keeps holdings marked at $1,000 or more. /v2/user-stats counts distinct markets traded, not fills. The activity call sorts oldest first, and start=1 lifts the default three-year floor so the first row is the wallet's first recorded action. Always query the account wallet rather than a signing key, as explained in our Polymarket proxy wallet guide.
A snapshot of open positions shows conviction, not skill. For a track record, request status=CLOSED on /v2/positions, which returns exited positions sorted by realized PnL by default.
How do you follow a whale's activity?
Poll /v2/activity for each wallet on your watchlist:
curl -s "https://data-api.polymarket.com/v2/activity?user=0xWHALE_WALLET&limit=50"
It returns trades plus splits, merges, redemptions and rewards, newest first, each with usdc_size, the cash value of the action. Deposits and withdrawals are left out unless you pass exclude_deposits_withdrawals=false.
Activity is the better feed for wallets you already know. It was cached for 15 seconds in our checks, against five minutes for trades, and it shows maker fills. When we followed one wallet behind a $21,000 buy, its activity showed three more fills in the same market at 94 cents within a second, which the default trades feed left out because they filled as maker. Add taker_only=false to /v2/trades to include those, then de-duplicate, because one fill can then appear for both the taker and the maker.
How do you use the leaderboard to find whales?
Large trades find wallets that moved money today. The leaderboard finds wallets that made money over a period:
curl -s "https://data-api.polymarket.com/v2/leaderboard?time_period=week&sort_by=PNL&limit=50"
Each row carries rank, user_id (the wallet), pnl and volume. Volume counts shares on both sides, never dollars, so a wallet trading one-cent contracts can rank high on the volume board with little money behind it. A strong watchlist keeps wallets that show up in both places: large trades this week and a place on the weekly or monthly PnL board. Every parameter is covered in our Polymarket leaderboard API guide.
What can mislead a Polymarket whale tracker?
- Near-settled trades. In our checks, the three largest trades of the previous eight days were sales at 99.9 cents of outcomes that had all but won, worth $1.7 million to $2.1 million each. A fifth of the 100 trades over $100,000 were priced at 95 cents or more. Those read as exits, not new views, so consider skipping prices near 0 or 1.
- Brand-new wallets. One wallet made five buys worth about $140,000 within 80 minutes of its first trade, and
/v2/user-statsstill returneddata: nullfor it. Treat null as "no stats yet" and read its first activity instead. Gamma's/public-profile?address=also returns the profile'screatedAt. - Hedges and market making. A large fill can be one leg of a hedge or a market maker's inventory. The
mergeableflag on a position shows when a wallet holds both outcomes of a market. - Size is not skill. Large wallets lose too. One wallet behind a $21,000 trade in our checks also held a position marked about $18,700 below its cost.
Acting on someone else's trade carries the same risk as any trade, plus the cost of arriving late, which our copy trading guide covers in detail.
How do you track whales across prediction markets?
Polymarket's Data API answers for Polymarket, and large traders work other venues too. The Predictefy API scores trades from nine venues, including Polymarket, Hyperliquid, Limitless and Myriad, and tags each one with the wallet's category at the time: bot, whale, smart, fresh or fish. One request returns the whale trades from all of them:
import Predictefy from '@predictefy/sdk';
const client = new Predictefy({ apiKey: process.env.PREDICTEFY_API_KEY });
const whaleTrades = await client.fetchSmartMoney({
category: 'whale',
minScore: 60,
window: 'day',
limit: 50,
});
for (const trade of whaleTrades) {
console.log(trade.venue, trade.wallet, trade.side, trade.usdSize, trade.tradeScore, trade.categoryAtTrade);
}
tradeScore runs from 0 to 100 and is built from the wallet's score, the trade's size, its entry and its timing. categoryAtTrade is the wallet's category when it traded, not today. Add venue: 'polymarket' to narrow the feed to one venue. Each request costs 10 credits, and scores are informational signals rather than recommendations.
Frequently Asked Questions
Is there a Polymarket whale tracker API?
Not a dedicated one, but the public Data API covers it. GET /v2/trades with filter_type=CASH and filter_amount returns every trade above a dollar size along with the wallet that made it, and the positions, activity and leaderboard endpoints profile and follow those wallets. No API key is needed.
How do I find Polymarket trades over $10,000?
Request /v2/trades on data-api.polymarket.com with filter_type=CASH and filter_amount=10000. Without filter_type, the filter counts shares, so a 10,000-share trade at a tenth of a cent, worth $10, would pass. Add side, condition or event_id to narrow the results.
How do I see a Polymarket wallet's positions?
Call /v2/positions with user set to the wallet's proxy address. It returns open positions by default, with size, average price, current value and unrealized PnL, and status=CLOSED returns exited positions sorted by realized PnL. /v2/value returns the marked value of the whole portfolio.
How quickly do large trades show up in the Data API?
The data itself was about a second behind the chain in our checks, but /v2/trades responses were cached for up to 300 seconds, so a large trade can take up to about five minutes to appear. A single wallet's /v2/activity feed was cached for 15 seconds.
Can I follow a whale's trades in real time?
Close to it. Poll the wallet's /v2/activity feed, which was cached for 15 seconds in our checks and includes maker fills that the default trades feed leaves out. Polymarket's market WebSocket streams each trade's price and size live, but it does not name the wallet.
Does a large trade mean the whale knows something?
No. Many of the largest trades are exits at 99 cents or more, hedges or market making. Check a wallet's closed positions and realized PnL before giving its trades any weight, and size anything you do to your own bankroll.