DEV Community

SmartMoneyData
SmartMoneyData

Posted on

Track Polymarket Whales and Top Traders with Python (No API Key)

Polymarket is a prediction market: people bet real money on elections, sports, crypto prices and world events, and every trade settles on-chain. That makes it unusually transparent. You can see every wallet, every bet and every position.

That transparency is also why people watch the "smart money" there. When a wallet with a long record of profits puts $50,000 on one outcome, it is worth knowing about. This tutorial shows how to follow those wallets without running a blockchain indexer.

What you will build

  • A feed of large ("whale") trades as they happen
  • The top traders by profit, with their current open positions
  • The biggest holders on each side of any market
  • A watchlist of specific wallets and their portfolios

The data source

We will use the Polymarket Whale Tracker, which reads Polymarket's public data. It needs no Polymarket account and no API key. It has four modes:

Mode Returns
whales large trades: wallet, trader name, side, outcome, price, usdValue, market, and the trader's portfolio value
top-traders the leaderboard by profit or volume, with each trader's top open positions
market a market's prices, volume, liquidity, top holders of each outcome and recent large trades
wallets portfolio value and open positions for wallets you choose

It costs $3 per 1,000 records.

Step 1: Setup

pip install apify-client pandas
export APIFY_TOKEN="your-token-here"   # Apify Console → Settings → API & Integrations
Enter fullscreen mode Exit fullscreen mode

Step 2: Whale trades

import os
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])

run = client.actor("smartmoney-data/polymarket-smart-money").call(
    run_input={"mode": "whales", "minUsd": 10000, "lookbackHours": 24, "maxResults": 100}
)
for t in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(t["timestamp"], t["trader"], t["side"], t["outcome"], f'${t["usdValue"]:,.0f}', "on", t["market"])
Enter fullscreen mode Exit fullscreen mode

In a test run on October 13, 2026 with a lower $1,000 minimum, the 20 most recent large trades were all from the previous few minutes and added up to about $40,000. The largest was a $5,000 bet on "No" at 63 cents in a combined Brazil, Israel and US Senate election market. Each row also carries traderPortfolioValue, so you can tell a $5,000 bet from a wallet worth $35,000 (a big conviction bet) from the same bet by a wallet worth $5 million (pocket change).

Filter by topic or side:

run_input = {"mode": "whales", "minUsd": 25000, "marketKeyword": "election", "side": "BUY"}
Enter fullscreen mode Exit fullscreen mode

Step 3: What are the best traders holding?

run = client.actor("smartmoney-data/polymarket-smart-money").call(
    run_input={"mode": "top-traders", "timePeriod": "MONTH", "orderBy": "PNL",
               "maxResults": 25, "positionsPerTrader": 5}
)
for tr in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(f'#{tr["rank"]} {tr["trader"]}  profit ${tr["pnlUsd"]:,}  volume ${tr["volumeUsd"]:,}')
    for p in tr["topPositions"]:
        print(f'    {p["outcome"]:>4} @ {p["avgPrice"]}  now {p["currentPrice"]}  ${p["currentValue"]:,.0f}  {p["market"]}')
Enter fullscreen mode Exit fullscreen mode

If several of the month's top traders hold the same outcome, that is a crowded smart-money position:

import pandas as pd
from collections import Counter

traders = list(client.dataset(run["defaultDatasetId"]).iterate_items())
crowded = Counter((p["market"], p["outcome"]) for tr in traders for p in tr["topPositions"])
for (market, outcome), n in crowded.most_common(10):
    print(n, "top traders hold", outcome, "on", market)
Enter fullscreen mode Exit fullscreen mode

Step 4: Who holds a market?

Pass a Polymarket URL (or slug). An event URL covers all of its open markets:

run = client.actor("smartmoney-data/polymarket-smart-money").call(
    run_input={"mode": "market", "markets": ["https://polymarket.com/event/ballon-dor-winner-2026"],
               "holdersPerOutcome": 10, "minUsd": 5000}
)
for m in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(m["market"], f'volume ${m["volumeUsd"]:,.0f}')
    for o in m["outcomes"]:
        top = o["topHolders"][0] if o["topHolders"] else None
        print("  ", o["outcome"], o["price"], "biggest holder:", top and top["trader"], top and top["shares"])
Enter fullscreen mode Exit fullscreen mode

Step 5: Watch specific wallets

run = client.actor("smartmoney-data/polymarket-smart-money").call(
    run_input={"mode": "wallets", "wallets": ["0x...", "0x..."], "positionsPerTrader": 20}
)
Enter fullscreen mode Exit fullscreen mode

Schedule this in Apify Console (every hour, say) and connect Slack, email or Google Sheets to get a running log.

Use it from an AI assistant

https://mcp.apify.com/?tools=smartmoney-data/polymarket-smart-money
Enter fullscreen mode Exit fullscreen mode

Then ask: "What are this month's 10 most profitable Polymarket traders betting on right now?"

FAQ

Do I need a Polymarket account or API key? No. Everything comes from Polymarket's public data endpoints.

How live is it? Trades show up seconds after they happen. Each run is a snapshot, so schedule it for an ongoing feed.

Why do some traders show a wallet address instead of a name? Polymarket only shows a username if the trader set one. Otherwise the actor uses Polymarket's generated pseudonym.

Is this legal to use? Yes. It reads public on-chain and public API data. Check whether Polymarket is available where you live before trading on it.


Data is for informational purposes only and is not investment or betting advice.

Top comments (0)