Build a crypto whale alert bot for X
big transfers, posted as they land
Watch the chain for transfers above your threshold, name the wallets you know, and post each one to X within a minute. Free on-chain data, a 40-line script, and no X developer account.
Card required, cancel any time.
The short answer
Poll Etherscan's free V2 tokentx endpoint (or mempool.space for Bitcoin) every 30 seconds, keep transfers above your threshold, swap known addresses for names like "Binance", and send each one to POST https://opentweet.io/api/v1/posts with publish_now. Do not repost Whale Alert's feed: its terms forbid publishing its data without permission. On-chain data is public.
Whale accounts are some of the biggest on crypto X: @whale_alert has 2.8M followers and @lookonchain 711K. Their posts become the news: on October 27-28, 2026, whales moving about $500M of BTC to Coinbase Prime was reported straight from Lookonchain and Arkham alerts. A niche whale account (one chain, one token, one set of wallets) is still open. Accounts posting on-chain moves already run on OpenTweet.
Six alerts a whale account posts
Pick one or two. The accounts people follow are predictable: same format, same threshold, every time.
Big transfer
LiveAmount, token, from and to. The classic whale alert. One post per transfer above the threshold.
Exchange flow
LiveCoins moving into an exchange (possible selling) or out of one (possible holding). Label the side you know.
Dormant wallet wakes up
LiveA wallet untouched for years moves coins. On October 13, 2026 one moved 4,582 BTC after six years.
Stablecoin mints and burns
LiveNew USDT or USDC printed or burned at the issuer. Traders watch these as liquidity signals.
Daily flow recap
DailyNet exchange inflow and the five largest moves of the day, posted at a fixed time. Fits Pro even on busy days.
Wallet watchlist
LiveA fund, a treasury company or a known trader. Every move they make, nothing else.
Where the data comes from
Prices and limits checked October 29, 2026 on each provider's pricing page. Start with a free one; pay only when you add chains.
| Source | Chains | Free tier and price | Best for |
|---|---|---|---|
| Etherscan API V2 | 60+ EVM chains, one key | 3 calls/s, 100K/day; BNB, Base, OP, Avalanche paid (from $49/mo) | Big token transfers on Ethereum, Arbitrum, Polygon |
| mempool.space | Bitcoin | Free REST and WebSocket, no key; limits not published | BTC moves to and from exchange wallets |
| Alchemy Address Activity | 30+ EVM chains and Solana | Free tier with 5 webhooks; up to 100,000 addresses per webhook | Watching a fixed list of whale or exchange wallets |
| Helius webhooks | Solana | 1M credits a month free; 1 credit per webhook event | Solana whales and large token swaps |
| Arkham API | Multi-chain, with entity labels | By request; plans from $100/mo in credits | Naming who moved it |
| Whale Alert API | 14 chains | $29.95/mo, personal use only; Enterprise $699/mo | Reading alerts, not reposting them (see terms) |
A USDT whale bot in 40 lines
Every 30 seconds it asks Etherscan for the latest USDT transfers on Ethereum, keeps the ones above $10M, replaces known addresses with names, and posts each new one. It remembers the last block and the hashes it posted, so a restart never double-posts. No URL in the text, so no alert is a link post.
Python
import json, pathlib, time, requests
ES_KEY = "your_etherscan_key"
OT_KEY = "ot_your_key"
USDT = "0xdAC17F958D2ee523a2206206994597C13D831ec7" # Tether on Ethereum
MIN_USD = 10_000_000
LABELS = { # your own list, lowercase addresses
"0x...": "Binance",
"0x...": "Coinbase",
}
STATE = pathlib.Path("whale_state.json")
state = json.loads(STATE.read_text()) if STATE.exists() else {"block": 0, "seen": []}
def who(addr):
return LABELS.get(addr.lower(), f"unknown wallet {addr[:6]}…{addr[-4:]}")
while True:
r = requests.get("https://api.etherscan.io/v2/api", params={
"chainid": 1, "module": "account", "action": "tokentx",
"contractaddress": USDT, "startblock": state["block"],
"sort": "desc", "page": 1, "offset": 1000, "apikey": ES_KEY,
}).json()
txs = r["result"] if isinstance(r.get("result"), list) else []
for tx in reversed(txs): # oldest first
amount = int(tx["value"]) / 10 ** int(tx["tokenDecimal"])
if amount < MIN_USD or tx["hash"] in state["seen"]:
continue
text = (f"{amount:,.0f} #USDT (${amount / 1e6:,.1f}M) moved\n"
f"from {who(tx['from'])}\nto {who(tx['to'])}\n\n"
f"tx {tx['hash'][:10]}…")
requests.post("https://opentweet.io/api/v1/posts",
headers={"Authorization": f"Bearer {OT_KEY}"},
json={"text": text, "publish_now": True})
state["seen"] = (state["seen"] + [tx["hash"]])[-500:]
if txs:
state["block"] = max(int(t["blockNumber"]) for t in txs)
STATE.write_text(json.dumps(state))
time.sleep(30) # 2 Etherscan calls a minute, far under the free limitWhat it posts
25,000,000 #USDT ($25.0M) moved
from unknown wallet 0x3f5c…a91e
to Binance
tx 0x8a1d77c2…For another token, change the contract address. For another EVM chain, change chainid. Every OpenTweet field is in the API reference.
Add context with an AI agent
A raw alert says what moved. The posts that get quoted say what it might mean. Keep the live alerts in code, and once a day let Claude, ChatGPT or Cursor, connected to the OpenTweet MCP server, read your bot's log and write the recap:
Keep predictions out. "Moved to an exchange" is a fact; "about to dump" is a guess that ages badly.
Which plan fits your bot
Flat monthly price, no per-post fee. The deciding number is how many alerts a day your threshold lets through.
| Setup | Typical volume | Plan |
|---|---|---|
| One token, high threshold, plus a daily recap | Up to 20 posts a day | Pro, $19.99/mo |
| Several chains or a busy token | Up to 100 posts a day, 3 X accounts | Advanced, $29/mo |
| A network of chain-specific whale accounts | Up to 300 posts a day, 10 X accounts | Agency, $49/mo |
Posts with a URL (an explorer link, even a bare domain) count toward link posts: Pro 1 a day, Advanced 10, Agency 20, plus link credits. On the X API directly, a post with a URL costs $0.20 against $0.015 for a plain one. See pricing.
Use public data, not someone's feed. Whale Alert's terms forbid publishing its data without written permission. Etherscan's free plan is for personal and research use, so read its terms before you monetize the account.
Label it as a bot. X's developer guidelines ask automated accounts to turn on the Automated label and say in the bio who runs them. Never auto-reply alerts under other people's posts.
No paid shilling without the label. X allows paid crypto promotion again only with the Paid Partnership label, and not in the EU, UK or Australia. X also bans apps that pay people to post ("InfoFi") since January 2026. More in X automation rules.
Not financial advice, and say so. A transfer to an exchange is not always a sale: exchanges move coins between their own wallets all day. Label internal moves, or filter out transfers where both sides are the same exchange.
Frequently asked questions
How do I build a whale alert bot for X?
Watch a chain for transfers above a threshold, label the wallets you recognize, and post each hit to POST https://opentweet.io/api/v1/posts with publish_now. For Ethereum tokens, poll the Etherscan V2 tokentx endpoint every 30 seconds; for Bitcoin, use the mempool.space API; to watch specific wallets, use an Alchemy or Helius webhook. OpenTweet posts through a normal X login, so you do not need an X developer account.
Can I repost Whale Alert's alerts on my own X account?
Not as a feed. Whale Alert's terms (updated October 2, 2026) say you may not circulate, reproduce or publish its data in any form without written permission. The one exception is sharing alerts and graph images with the Whale Alert watermark and URL left intact. Its Alerts API ($29.95 a month) is labelled personal use only. Build from public chain data instead: Etherscan, mempool.space and node webhooks carry no such restriction.
Is the Etherscan API free for a whale bot?
For Ethereum and many other chains, yes. Etherscan's free plan allows 3 calls per second and up to 100,000 calls a day, labelled personal and research use. One V2 key covers 60+ chains through a chainid parameter, but BNB Smart Chain, Base, OP Mainnet, Avalanche and a few others need a paid plan, from $49 a month. The old V1 API was shut down on August 15, 2025.
How do I track Bitcoin whale transactions for free?
mempool.space has a free REST and WebSocket API. Track an address set (exchange wallets, a known whale) over wss://mempool.space/api/v1/ws, or read each new block's transactions from the REST API and keep outputs above your threshold. It publishes no rate limits but returns 429 and can ban clients that overdo it, so poll per block, not per second.
How do I know a wallet belongs to an exchange?
Keep your own label list: exchange hot and cold wallets are public on block explorers and in open-source label sets, and your followers will tell you when one is wrong. Arkham sells entity labels through its API (request access, plans start at $100 a month in credits), and it describes its attribution as probabilistic, so say "likely" when a label is a guess.
Should the alert link to the transaction?
It is a cost choice. A post with a URL counts toward OpenTweet link posts (Pro 1 a day, Advanced 10, Agency 20, plus credits), and on the X API it costs $0.20 against $0.015 for a plain post. A bare domain like etherscan.io counts as a link too. Most whale accounts post the amount, the token and the wallets, and put the hash in the text without a URL.
How many alerts a day can the bot post?
Pro publishes up to 20 posts a day, Advanced 100 and Agency 300. Set the threshold so a normal day fits: $10M+ for USDT on Ethereum, or a fixed list of wallets you watch. An account that posts every $1M transfer is noise, and followers mute it.
Posting headlines and price moves instead? See the crypto news bot. Watching one thing and posting when it changes? See the X alert bot.
Everything you can build on X with OpenTweet
Post to X from your code, a watcher, or an AI agent. Start anywhere in the cluster.
OpenTweet vs the X API
Post, schedule, and automate X without a developer account or the $200/mo minimum.
X DM outreach, human-approved
Find and qualify leads, AI-draft DMs, approve each one, and drip-send from your own account via API or MCP.
Post to X without an API
The clean, account-safe way to post to X from your code or an AI agent.
Twitter MCP Server
Give Claude, Cursor, and OpenClaw the ability to post to X. 44 tools included.
Developer docs
Quickstart, API keys, MCP setup, and the REST reference for posting to X from code or an agent.
Cross-posting reference
One call posts to X, Bluesky and LinkedIn. The platforms field, per-network results, and why a network gets skipped.
Social media API for AI agents
Three ways an agent can post to X, Bluesky and LinkedIn, and the trade-offs of each.
LinkedIn MCP server
Post and schedule to a LinkedIn profile from Claude or Cursor through the official LinkedIn API.
XMCP vs OpenTweet
X's official MCP server bills per API call and cannot schedule. Compare it with the flat-fee hosted MCP.
MCP for AI agents
Connect your AI client to X in under two minutes, no X developer account.
Developer API and keys
REST endpoints, one bearer key, and usage tracking. Build on OpenTweet.
OpenTweet for AI agents
The posting layer for autonomous agents and automations that live on X.
Build an AI Twitter persona
Give your AI agent its own X account. Setup, cadence, and the rules that keep it safe.
Best MCP servers for social media
The 2026 ranked list. How the hosted OpenTweet MCP compares with the official X MCP and others.
Best API to post to X
Seven options priced at real volumes, and why links decide the bill.
Cheapest way to post to X via code
Flat fee vs pay-per-use. Why the $0.20 per-link fee flips the math past ~145 link posts a month.
X API pricing 2026
Every pay-per-use X API endpoint price from docs.x.com in one searchable table.
Bluesky posting API
Post and schedule to Bluesky with one REST call and OAuth, and cross-post to X and LinkedIn in the same request.
Automate LinkedIn posts
Post to LinkedIn from an AI agent, n8n or a script through the official Posts API, with one REST or MCP call.
The next whale, posted in a minute
Connect X, create a key, and point your watcher at it.