Polymarket Whale Tracker
Track large Polymarket trades. Set a USDC threshold and get the market, outcome, side, size, price, time, transaction hash and wallet. No API key needed.
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
minTradeSize,sizeBasis,side(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export the results
Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.
Pricing
$0.0021 per trade = $2.1 per 1,000
| You are charged for | When | Price |
|---|---|---|
| Trade returned | One trade returned in the dataset. Diagnostic rows and the labelled sample row are not charged. | $0.0021 |
Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-09-20, and they are what you are actually charged.
Inputs
| Field | What it does | Type |
|---|---|---|
minTradeSize | Only return trades at or above this size. Measured in USDC by default, so 10000 means trades where at least $10,000 changed hands. Polymarket applies this on its side, so smaller trades are never fetched and never charged. | integer |
sizeBasis | USDC measures the money that changed hands (shares x price). Shares measures the contract count, which picks up big positions bought cheaply at long odds. | string |
side | Keep only buys, only sells, or both. Buy and sell are from the taker's point of view. | string |
sinceHoursAgo | Leave empty for no time limit. Polymarket has no date parameter, so the run reads newest first and stops once it is past your window. | integer |
markets | Narrow the search to particular markets. Paste Polymarket links (https://polymarket.com/event/...), market slugs, or raw condition ids. Leave empty to watch every market at once. | array |
traders | Narrow the search to particular wallets, as 0x addresses. Anything that is not a 0x address is skipped and reported rather than quietly widening the search. | array |
maxTrades | Stop after this many. A run tops out at 50,000; past that, add a time window or a market and run it again. | integer |
includeTraderPosition | Adds shares held, average entry price, current value and open profit or loss, as Polymarket publishes them. Costs one extra request per trader and market, so it makes a run slower. | boolean |
includeMarketHolders | Adds the biggest holders of each outcome in the markets your trades touch. One extra request per market, whatever the number of trades in it. | boolean |
topHoldersPerMarket | Only used when the largest holders are switched on. Polymarket returns at most 500 per outcome. | integer |
What you get
A structured dataset — each result includes fields like:
tradedAtmarketQuestionoutcomesidesizeUsdcsharespricetraderAddresstraderDisplayNametransactionUrlmarketUrlExport every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.
Related tools in Developer & Research Tools
Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.
GitHub Scraper
Search GitHub repos and users: stars, forks, language, topics, licence, plus user bio, company and followers. No token needed. $0.90 per 1,000 rows.
Stack Overflow / Stack Exchange Scraper
Search Stack Overflow and Stack Exchange by keyword or tag. Score, answer count, views, reputation and body text. $2 per 1,000 questions.
Package Registry Scraper (npm + PyPI)
Get npm and PyPI package metadata as JSON. Version, license, author, repo, keywords and npm monthly downloads. $2 per 1,000 packages.
arXiv Scraper
Search arXiv papers by title, author, abstract or category. Get full abstracts, authors, categories, DOI, dates and PDF links. $2 per 1,000 papers.
OpenAlex Scholarly Works Scraper
Search 250M+ OpenAlex papers with no API key. Get titles, authors, venue, year, citations, DOI, OA links and full abstracts. $2.00 per 1,000 papers.
Crossref Scholarly Works Scraper
Search 150M+ papers on Crossref: DOI, title, authors, journal, publisher, date, citations and abstract. No API key. $1.00 per 1,000 works.
Where this tool sits
- Categories
- Developer & Research Tools
Polymarket Whale Tracker: every large trade on Polymarket, with the wallet behind it
Set a size threshold and you get one row per Polymarket trade at or above it, newest first: the market question, the outcome, the side, the USDC that changed hands, the fill price, the time, the transaction hash and the wallet that signed it. Narrow it to certain markets or wallets, and add the trader's current position or the market's biggest holders when you want the context. How far back you can see depends on the threshold, because Polymarket's public trade history stops at about 50 days and a low threshold fills your row cap long before that.
| Input | A size threshold, plus optional markets, wallets, side and time window |
| Output | One row per trade at or above the threshold |
| Ceiling | 50,000 trades per run, and about 50 days of Polymarket history |
| Account needed | None: no Polymarket account, no wallet, no key |
| Price | $2.10 per 1,000 trades, flat on every plan |
🔍 What Polymarket Whale Tracker does
Polymarket applies the size threshold itself, so smaller trades never reach you and are never charged. Each trade that does arrive is checked again on size, side and time window, and a fill seen twice comes back once.
Polymarket has no date filter, so sinceHoursAgo works by reading newest first and stopping once it is past your window. That is also why there is no "trades from last March" option: reaching it would mean paging through everything since. Measured on 19 September 2026, 10,000 trades at a $10,000 threshold covered about 15 days, and at $25,000 the 50-day limit came before the row cap did.
Markets can be Polymarket links, market slugs or condition ids, mixed. Wallets must be 0x addresses. A mistyped one is skipped and reported, never turned into a search of every market.
The two extras are looked up once per wallet and market, or once per market, and reused within the run. So one wallet's forty trades in one market take one extra lookup, not forty. Both make a run slower, and both are off unless you turn them on.
traderDisplayName and traderPseudonym are the labels Polymarket shows next to a wallet: a handle someone typed and a nickname the site generated. Neither is verified, and a wallet is not a person. This never tries to work out who a wallet belongs to. When Polymarket builds a "name" out of the address itself, the field is left null.
📥 What you give it
{
"minTradeSize": 25000,
"sizeBasis": "usdc",
"sinceHoursAgo": 24,
"maxTrades": 500
}
Following particular wallets, with their positions:
{
"traders": ["0x67542c3219b37fd1610aad290676ff91cdbfe3bc"],
"minTradeSize": 1000,
"includeTraderPosition": true
}
| Field | Prefilled with | What it is |
|---|---|---|
minTradeSize | 10000 | Only trades at or above this size. Left out of an API call it is 0, which means every trade of any size. |
sizeBasis | usdc | usdc measures the money that changed hands. shares measures the contract count, which catches big positions bought cheaply at long odds: 100,000 shares at 3 cents is $3,000 on a 33-to-1 shot. |
side | any | any, BUY or SELL, from the taker's side. |
sinceHoursAgo | 24 | Only trades from the last N hours. Empty means no window. More than a year is read as a year. |
markets | empty | Polymarket links, market slugs or condition ids. Empty watches every market at once. |
traders | empty | Wallets to follow, as 0x addresses. |
maxTrades | 200 | Where to stop, 1 to 50,000. Left out of an API call, it is 500. |
includeTraderPosition | false | Adds what that wallet holds in that market now: shares, average entry, current value, and profit or loss. |
includeMarketHolders | false | Adds the market's largest holders across all its outcomes, biggest first. |
topHoldersPerMarket | 10 | How many holders, 1 to 500. Only read when the holders are on. |
📤 What you get back
A real row from a run on 29 September 2026:
{
"tradedAt": "2026-09-29T13:26:48.000Z",
"timestamp": 1790688408,
"marketQuestion": "Dota 2: LGD Gaming vs Xtreme Gaming (BO3) - BLAST Slam Group A",
"outcome": "LGD Gaming",
"outcomeIndex": 0,
"side": "BUY",
"sizeUsdc": 30550.83,
"shares": 45000,
"price": 0.6789073733,
"traderAddress": "0x1eeaf77002cf1eef5305abae702ddc3ccc86db08",
"traderDisplayName": "110thst",
"traderPseudonym": "Snoopy-Statin-Spool",
"transactionHash": "0x6497570c8e9ec9f21666d247c17839d0e9db04329a546e682924d33a023b7054",
"transactionUrl": "https://polygonscan.com/tx/0x6497570c8e9ec9f21666d247c17839d0e9db04329a546e682924d33a023b7054",
"conditionId": "0xf5514cca9e1a1879e8901c35d33714d446a47613ed39eeab30166eee5c89a6f8",
"tokenId": "104036161673518535467152916057562873523320038948071879753857499152088151012316",
"marketSlug": "dota2-lgd-xtreme-2026-09-29",
"eventSlug": "dota2-lgd-xtreme-2026-09-29",
"marketUrl": "https://polymarket.com/event/dota2-lgd-xtreme-2026-09-29",
"fetchedAt": "2026-09-29T13:27:49.321Z"
}
With the extras on, a row also carries these, shown here from two runs on 20 September:
{
"traderPosition": {
"shares": 13513.7,
"avgPrice": 0.7299,
"currentPrice": 0.725,
"entryCostUsd": 9864.9874,
"currentValueUsd": 9797.4325,
"realizedPnlUsd": 0,
"unrealizedPnlUsd": -67.5549,
"totalPnlUsd": -67.5549,
"percentPnl": -0.6847,
"outcome": "Arman Tsarukyan",
"redeemable": false
},
"marketTopHolders": [
{
"address": "0x224a89dbe0db0d6124b335edabd15b3f877da3d5",
"displayName": "wr0ngw4yb3tt0r",
"pseudonym": "Unwieldy-Supporter",
"shares": 445858.326032,
"outcomeIndex": 0,
"avgPrice": 0.177,
"currentValueUsd": 222.9291,
"totalPnlUsd": -78732.3384
}
]
}
| Field | What it is |
|---|---|
sizeUsdc, shares, price | The money that changed hands (shares times price, to the cent), the contract count, and the fill price. |
side | BUY or SELL, from the taker's side. A big sell is a big trade too. |
outcome, outcomeIndex | Which outcome was traded. outcome is null on combination markets, which Polymarket leaves unlabelled, and outcomeIndex is null on the rolling up-or-down markets. |
transactionHash, transactionUrl | The on-chain transaction, with a link to it. One order filled against several counterparties is several rows sharing one hash. |
conditionId, marketSlug, marketUrl | Which market, three ways. |
traderPosition | Null when Polymarket shows no current position for that wallet in that market, and missing when the lookup failed. |
marketTopHolders | Null when the market's holders could not be read. |
🧾 Reading the output
The free sample row is a complete, real-looking trade, so no ordinary field tells it apart. Look for the flags:
| Row | How to spot it | Charged |
|---|---|---|
| A trade | No _sample or _diagnostic field | yes |
| The sample row | _sample: true, charged: false. Written when the input asks for nothing, or when a field holds a value that cannot work, with a note saying which | no |
| The diagnostic row | _diagnostic: true, charged: false, a note, and the badTraders, badMarkets and marketsNotFound it could not use. Written when none of the markets or wallets you gave could be used | no |
There are no error codes. Every run also writes RUN_REPORT to its key-value store: what each search listed and returned, how many trades fell below the threshold or outside the window, which markets could not be found, and why the run stopped.
A run ends as Failed only when none of its searches could be read, when the run's price could not be read, or when your maximum charge does not cover a single trade. To keep only trades, drop every row carrying _sample or _diagnostic.
▶️ How to run it
1. Open Polymarket Whale Tracker and click Try for free. 2. Set Minimum trade size, and Measure the size in if you want shares instead of USDC. 3. Narrow it with Markets (optional) or Trader addresses (optional), and set Only trades from the last N hours. 4. Set Maximum trades, and tick the position or holder extras if you want them. 5. Click Start, then download the dataset as JSON, CSV or Excel, or read it from the API.
💰 How much does it cost?
$2.10 per 1,000 trades, flat on every Apify plan. The position and holder extras ride on the rows you already pay for and cost nothing more.
Not charged: the sample row, the diagnostic row, and trades below your threshold or outside your filters, since they never become rows. If you set a maximum charge for the run, it stops at the last trade that fits.
💡 What people use it for
- A feed of every fill over $25,000 in the last day, across all markets, in one spreadsheet.
- Following a handful of wallets you already track, with what each still holds after the trade.
- Checking who else holds a market before reading much into one big buy. A $60,000 buy looks
different from a wallet already holding half a million shares.
- Spotting long-odds swings, with
sizeBasis: "shares"and a high share count.
🚧 What it does not do
- Nothing older than about 50 days. Earlier trades are still on the blockchain, but not in
Polymarket's public trade history, and no setting here reaches them.
- One row is one fill, not one order. A large order split across six counterparties is six rows.
sizeUsdcis money moved, not conviction or profit. Selling a position is a large trade too.- No order book, price history or market catalogue. Trades and holders only.
- No identity. Wallets, and the labels Polymarket shows, nothing more.
- No trading. It reads. There is no wallet or key here and no order placement.
🧭 Which prediction market scraper do you need?
| If you want | Use |
|---|---|
| Large Polymarket trades, the wallets behind them and the biggest holders | This one |
| Kalshi markets with prices, volume, open interest and results | Kalshi Markets Scraper |
| Pre-game sports odds and player props | Sports Odds Scraper |
| Stock trades that members of Congress disclose | Congress Stock Trades Scraper |
❓ Questions people ask
Do I need a Polymarket account or an API key? No. Nothing to sign up for, and this asks you for no key.
What counts as a whale? You decide; that is what minTradeSize is. $10,000 is a sensible start.
Can I run it on a schedule? Yes, and sinceHoursAgo is built for it. Set the window a little longer than the schedule, say one hour every 15 minutes, so a slow run never leaves a gap. A trade seen by two runs comes back in both, so de-duplicate on the six fields a run uses itself: transactionHash, traderAddress, tokenId, side, shares and price.
Why do two rows share a transaction hash? One order can fill against several counterparties in the same transaction. Each fill is its own row, with its own size and price.
shares or usdc? usdc for who is moving real money. shares for who is taking a big swing at long odds, where the stake is small and the position is huge.
🆘 If something breaks
Open the Issues tab on the actor page. Send the input and the run ID; RUN_REPORT usually shows where the run stopped and why.