Last updated: August 2026.
The goal: a message in your Telegram the moment a wallet you respect opens a position on Polymarket. The public API gives you every part you need. This is the honest build, step by step, including the part where "profitable" turns out to be the hard word in the sentence.
Step 1: pick the wallets worth watching
Before you can alert on profitable wallets you have to find them, and this is the step most DIY bots get wrong. The raw material is public: any wallet's full history is one GET away.
curl "https://data-api.polymarket.com/activity?user=0xWALLET&limit=500"
The feed carries every TRADE and, critically, every REDEEM with usdcSize, so you can reconstruct realized outcomes. Compute win rate by resolved markets, not by trades, and require a real sample: ten or more resolved markets with positive total P&L is a reasonable floor.
The trap is that a naive "highest win rate" list is mostly fake. Among wallets with a 90 percent or higher win rate, 43,179, about 61 percent, are farmers: wallets that buy outcomes already at 95 cents or higher and collect the last few cents at settlement. A farmer buys Yes at 96 cents, it settles at 1 dollar, and the win rate chart looks elite while predicting nothing. Filter any wallet whose average buy price sits at or above 95 cents; the full logic is on our farmer filter page.
Step 2: poll their activity on a loop
With a clean watchlist the alert loop is genuinely simple. Keep the last seen timestamp per wallet and diff:
import time, requests
WATCHLIST = ["0xWALLET_1", "0xWALLET_2"]
last_seen: dict[str, int] = {}
def new_events(wallet: str) -> list[dict]:
rows = requests.get(
"https://data-api.polymarket.com/activity",
params={"user": wallet, "limit": 50},
timeout=30,
).json()
fresh = [r for r in rows if r["timestamp"] > last_seen.get(wallet, 0)]
if rows:
last_seen[wallet] = max(r["timestamp"] for r in rows)
return fresh
while True:
for w in WATCHLIST:
for ev in new_events(w):
if ev.get("type") == "TRADE" and ev.get("usdcSize", 0) >= 500:
notify(ev) # step 3
time.sleep(60)
Two practical notes. First, be a polite client: one request per wallet per minute is fine, hammering the endpoint from a loop with no sleep will get your IP throttled. Second, seed last_seen on the first run instead of alerting on history.
Step 3: push to Telegram
Create a bot with @BotFather, grab the token and your chat id, and notify is four lines:
def notify(ev: dict) -> None:
text = (f'{ev["proxyWallet"][:10]} {ev["side"]} '
f'${ev.get("usdcSize", 0):,.0f} in {ev.get("title", "?")[:60]}')
requests.get(
f"https://api.telegram.org/bot{TOKEN}/sendMessage",
params={"chat_id": CHAT_ID, "text": text},
timeout=10,
)
That is the whole bot. Cron it, or run it under systemd with a restart policy, and you have wallet alerts.
Step 4: cut the noise
The first day you will love it; the first week you will mute it. Three filters keep it useful:
- Size floor. Alert from 500 dollars up, or whatever makes a move meaningful for the wallet's own bankroll.
- Deduplicate fills. One logical order fills as several rows in the same transaction. Group by transaction hash before alerting or every big order rings five times.
- Side context. A SELL closing a winner and a SELL cutting a loss read the same in the feed. Without position context you cannot tell which alert you got.
Where DIY breaks
The loop above works. What it cannot do by itself:
Latency. Polling gives you a floor of about a minute. Real-time needs the WebSocket stream plus reconnect and stall-detection logic, which is its own small service to operate. Our companion tutorial on monitoring smart money flows covers that stream.
"Profitable" drifts. A wallet you vetted in January can be a farmer by March, or start hedging, and your static watchlist will not notice. Keeping the classification honest means recomputing win rates, farmer fingerprints and hedge patterns across the wallet's whole history as it grows. At index scale that is 1.5B+ fills across 3.1M wallets, with NegRisk-corrected P&L so multi-outcome markets do not double-count, and FIFO accounting so redemptions land on the right entries. The details are in our methodology.
Discovery. Your bot only watches wallets you already know. The profitable wallet that starts printing next week is not on your list, and nothing in this loop will add it.
Or take the ready-made version
OrcaLayer runs this exact pipeline as a product on its own index. The whale alerts feed streams every trade of 500 dollars or more by farmer-filtered smart money wallets, free in the browser. Following specific wallets with personal Telegram alerts is on the Pro tier. For your own automation, Premium exposes the same feed as a real-time SSE stream through the REST API, Python SDK and MCP server, one authenticated GET instead of a polling fleet.
Build it yourself to understand it; that knowledge transfers. Run ours when you want the classification, the discovery and the uptime to be someone else's job.