Track Whale Wallet Movements Across 8 Chains in Python
One polling script gets you large wallet transfers and swaps across Ethereum, BSC, Avalanche, Polygon, Arbitrum, Base, Optimism, and Solana — no per-chain node or explorer key required.
The Problem: 8 Chains, 8 Explorers
"Track whale wallets" sounds like one task until you try to do it across more than one chain. Ethereum whale tracking usually means an Etherscan-style API. BSC and Avalanche mean running or renting access to a full node, since their public RPC endpoints throttle hard under sustained polling. Polygon, Arbitrum, Base, and Optimism are technically EVM-compatible but each has its own bridge contracts, gas-token quirks, and preferred RPC providers. Solana is a different transaction model entirely — no simple "from/to/value" log, just program instructions you have to decode. And that's before you handle the noise problem: a single large wallet doing a multi-hop DEX route can throw off five or six near-duplicate log entries for what is really one economic action.
Building this yourself means standing up (or paying for) infrastructure per chain, writing a swap-detection heuristic per DEX router, and de-duplicating wash-loop spam before you can even ask "did a whale move $500k in the last hour?" Multiply that by 8 chains and it stops being a side project.
Smart Money API already does the chain-specific plumbing: it watches all 8 chains, applies DEX-router and swap-detection heuristics per chain, collapses near-duplicate rows into a single event with a repeat_count, and normalizes everything into one event schema regardless of which chain it came from. You call one endpoint and get a feed you can filter by chain, size, and event type.
That normalization matters more than it sounds like. A "transfer" on Ethereum and a "swap" on Solana are structurally different events at the RPC level, but from a monitoring standpoint they're the same question: did a large wallet move size, and where did it go? By the time the data reaches this endpoint, every chain's raw logs have already been reduced to the same five or six fields — chain, address, event type, token, USD size, and a transaction reference — so the script below works identically whether you point it at Ethereum, Base, or Solana.
Prerequisites
You'll need:
- Python 3.8 or newer
- The
requestslibrary (pip install requests --break-system-packagesor inside a virtualenv) - A free API key from smartmoneyapi.com/signup — the whale-events endpoint below is public and works without a key, but sign up anyway since most of the rest of the whale/derivatives surface is gated and you'll want the same key across playbooks
GET /v1/whales/events and GET /v1/whales/summary are both public. Free tier is 200 calls/day if you do add a key.
The Endpoint
GET https://api.smartmoneyapi.com/v1/whales/events accepts these optional query parameters:
| Param | Values | Default |
|---|---|---|
| chain | ethereum, bsc, avalanche, polygon, arbitrum, base, optimism, solana | all 8 |
| hours | 1–168 | 24 |
| significance | low, medium, high, critical | medium |
| event_type | transfer_in, transfer_out, swap | all |
| limit | 1–200 | 50 |
| offset | 0–10000 | 0 |
The response separates total (raw event count in the window) from distinct (post-dedup events actually returned) — the gap between them tells you how much wash-loop/multi-hop noise got collapsed before it reached you. Each event carries a repeat_count so you can see how many near-duplicate rows fed into it.
Python Whale Feed Script
This script polls the endpoint on a loop, filters to a minimum USD size client-side, and prints a clean one-line-per-event feed. It also includes a generator, iter_all_events, that pages through an entire lookback window using offset — useful for a one-shot "get everything in the last N hours" pull instead of the rolling poll.
JavaScript / Node.js Variant
The same single-poll filter/print logic in Node.js (18+) using the built-in fetch — no npm dependencies.
The response shape is the same either way — swap the print_event() call for a webhook POST and you have an alert bot. A free account is enough to prototype this end-to-end.
Create a free account →Expected Output
A poll of the public endpoint (no filters, default window) returns JSON shaped like this (one event shown; a real response returns up to limit):
The Python script would print that row as something like: [ ethereum] swap USDC $ 500,000 0xabc12...9def tx:0x1234567890... — and would only show it at all if MIN_USD is at or below 500,000.
What to Build Next
Once the feed above is running, a few directions worth taking it:
- Webhook it to Telegram or Discord. Replace the console print with a webhook POST inside
print_event()and you have a standing whale-alert bot with almost no additional code. - Add cross-chain net flow.
GET /v1/whales/summary(also public, no params) returns an aggregated 24h view: per-chainchain_counts(event_count, volume_usd), per-chainnet_flows(inflow, outflow, net, direction), andtop_movers(address, chain, 24h volume, 24h event count) — useful for a dashboard view instead of a raw event feed. - Narrow with
significanceandevent_type. If you only care about high-conviction swaps rather than routine transfers, setsignificance=highandevent_type=swapserver-side instead of filtering everything client-side. - Persist and de-dupe across polls. Store seen
tx_hashvalues locally so a rolling poll (as opposed to the one-shot generator) doesn't re-print events you already saw in the previous window. - Compare wallets over time. Keep a rolling log per address and you can start answering questions like "is this wallet accumulating or distributing this week" without building your own indexer — the endpoint gives you the raw events, the aggregation logic is yours to keep as simple or as detailed as you need.
Skip the 8 node integrations
One API key gets you deduplicated whale events across 8 chains, plus derivatives, on-chain, and options data on the same key.
See plans and limits