Smart Money Signals
Track what the best crypto traders are doing in real time. The Smart Money API surfaces ranked wallets, convergence signals, and whale moves across Base, Ethereum, and Solana.
Base URL: https://api.mbd.xyz/v3/alpha
Auth: Authorization: Bearer mbd-{your-api-key} — the same key used for Studio APIs.
What You Get
| Capability | Endpoint | What it does |
|---|---|---|
| Leaderboard | GET /leaderboard | Top wallets ranked by trader score, PnL, win rate, or any metric |
| Signals | GET /notifications | Real-time alerts when smart money converges on a token |
| Budget Reset | DELETE /notifications | Reset your daily signal budget (for testing) |
| Config | GET /config | View your signal settings |
| Config Update | PUT /config | Tune sensitivity, quality gates, chains, and delivery |
Quick Start
1. Get the leaderboard
Fetch the top 10 smart money wallets on Base:
curl "https://api.mbd.xyz/v3/alpha/leaderboard?chain=base&limit=10" \
-H "Authorization: Bearer mbd-YOUR_KEY"Response:
{
"wallets": [
{
"rank": 1,
"wallet_address": "0x00c0bd10af...",
"trader_score": 0.5591,
"net_pnl_usd": 8442.69,
"true_win_rate": 0.72,
"trade_count": 8,
"tokens_traded": 42
}
],
"total": 1009,
"rank_by": "trader_score",
"chain": "base"
}2. Poll for signals
Check for new signals every 30 seconds:
let lastCheck = new Date(Date.now() - 60000).toISOString()
setInterval(async () => {
const res = await fetch(
`https://api.mbd.xyz/v3/alpha/notifications?since=${lastCheck}&limit=10`,
{ headers: { 'Authorization': 'Bearer mbd-YOUR_KEY' } }
)
const { notifications, count } = await res.json()
if (count > 0) {
for (const signal of notifications) {
console.log(`${signal.notification_type} | ${signal.token.symbol} | ${signal.headline}`)
// signal.cta has { action: "swap", token_address, chain } for deep-linking
}
lastCheck = notifications[notifications.length - 1].timestamp
}
}, 30000)3. View your config
curl "https://api.mbd.xyz/v3/alpha/config" \
-H "Authorization: Bearer mbd-YOUR_KEY"Leaderboard
Trader Score
The default ranking uses a composite formula:
| Component | Weight | What it measures |
|---|---|---|
| PnL efficiency | 40% | Net PnL / buy volume |
| Win rate | 30% | Bayesian-smoothed win rate from closed positions |
| Consistency | 20% | Number of closed positions |
| Activity | 10% | Log-normalized trade count |
Ranking Options
Sort by any of these metrics via the rank_by parameter:
| Metric | Description |
|---|---|
trader_score | Composite score (default) |
realized_pnl_usd | Realized PnL from closed positions |
true_win_rate | Win rate from closed positions |
net_pnl_usd | All-time net PnL |
total_buy_volume_usd | Total buy volume |
trade_count | Number of trades |
tokens_traded | Unique tokens traded |
win_rate | Raw win rate from data provider |
avg_trade_size_usd | Average trade size |
largest_trade_usd | Largest single trade |
Filters
Narrow the leaderboard to experienced traders:
curl "https://api.mbd.xyz/v3/alpha/leaderboard?\
chain=base&\
rank_by=realized_pnl_usd&\
min_trades=50&\
min_tokens=10&\
min_closed=5&\
limit=20" \
-H "Authorization: Bearer mbd-YOUR_KEY"| Parameter | Default | Description |
|---|---|---|
chain | base | base, ethereum, or solana |
min_trades | 1 | Minimum trade count |
min_tokens | 5 | Minimum unique tokens (filters single-pair bots) |
min_closed | 1 | Minimum closed positions (needed for reliable PnL) |
max_buy_vol | 1B | Maximum buy volume USD (filters aggregators) |
limit | 50 | Results to return (max 200) |
Chains
| Chain | Wallet Pool | Best for |
|---|---|---|
base | ~1,000 wallets | Coin trading, growing DEX activity |
ethereum | ~425 wallets | DeFi, highest liquidity |
solana | ~10,000 wallets | Memecoin activity |
Signals
Signal Types
| Type | Priority | Trigger |
|---|---|---|
convergence_p0 | P0 (highest) | 5+ top wallets bought the same token within the convergence window |
convergence_p1 | P1 | 3–4 top wallets bought the same token |
whale_move | P1 | A top-50 wallet made a trade exceeding whale_min_trade_usd |
sell_signal | P2 | Multiple top wallets sold the same token |
Signal Anatomy
Each signal includes:
{
"signal_id": "conv-base-TOSHI-20260323-0845",
"notification_type": "convergence_p0",
"priority": "P0",
"chain": "base",
"headline": "5 top-ranked traders bought $TOSHI in last 6h",
"token": {
"symbol": "$TOSHI",
"current_price_usd": 0.000812,
"price_change_pct": 12.4,
"first_smart_entry_price": 0.000722
},
"traders": [
{
"wallet": "0x7a3f...9e2d",
"leaderboard_rank": 4,
"trade_size_usd": 8420.50,
"win_rate": 0.72
}
],
"summary": {
"trader_count": 5,
"total_usd_inflow": 34200.00,
"highest_rank": 4
},
"why": {
"reasons": [
{ "text": "3 of these traders have >70% win rate" },
{ "text": "Token price up +12% since first smart entry" }
]
},
"cta": {
"action": "swap",
"token_address": "0xac17...",
"chain": "base"
}
}signal_id— unique per signal, use for deduplicationwhy.reasons— human-readable explainability for displaycta— deep-link data for swap UIs
Polling Pattern
import requests
import time
from datetime import datetime, timedelta
API_KEY = "mbd-YOUR_KEY"
BASE = "https://api.mbd.xyz/v3/alpha"
headers = {"Authorization": f"Bearer {API_KEY}"}
since = (datetime.utcnow() - timedelta(hours=1)).isoformat() + "Z"
while True:
resp = requests.get(f"{BASE}/notifications", headers=headers, params={
"since": since,
"limit": 50
})
data = resp.json()
for signal in data.get("notifications", []):
print(f"[{signal['priority']}] {signal['headline']}")
since = signal["timestamp"]
time.sleep(30)Configuration
Your config controls which signals get generated and how many you receive. View it with GET /config, update with PUT /config.
Key Settings
| Setting | Default | What it controls |
|---|---|---|
daily_budget | 15–30 | Max total notifications per day |
per_type_limits | varies | Per-signal-type daily caps |
cooldown_hours | 2 | Min hours between duplicate signals for the same token |
chains | all | Which chains generate signals |
signal_types | all | Which signal types are enabled |
Quality Gates
Tighten these to receive only high-conviction signals:
| Setting | Default | What it filters |
|---|---|---|
min_trader_score | 0 | Minimum composite score for triggering wallets |
min_trigger_win_rate | 0 | Minimum win rate for triggering wallets |
min_trigger_closed | 0 | Minimum closed positions for triggering wallets |
min_token_liquidity_usd | 0 | Minimum 24h volume for the token |
min_token_holders | 0 | Minimum holder count for the token |
convergence_min_wallets | 3 | Wallets needed to trigger convergence |
convergence_window_hours | 6 | Time window for convergence detection |
whale_min_trade_usd | 50000 | Min trade size for whale alerts |
whale_max_rank | 50 | Only top-N wallets trigger whale alerts |
Example: Tighten for production
curl -X PUT "https://api.mbd.xyz/v3/alpha/config" \
-H "Authorization: Bearer mbd-YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"daily_budget": 20,
"min_trader_score": 0.3,
"min_trigger_win_rate": 0.5,
"min_trigger_closed": 3,
"min_token_liquidity_usd": 10000,
"convergence_min_wallets": 4,
"cooldown_hours": 4,
"priority_filter": "P0,P1"
}'Webhook Delivery
Set a webhook URL to receive signals via POST instead of polling:
curl -X PUT "https://api.mbd.xyz/v3/alpha/config" \
-H "Authorization: Bearer mbd-YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"webhook_url": "https://hooks.slack.com/services/T00/B00/xxx"}'The webhook receives the same signal payload as GET /notifications.
Reset Budget (Testing)
During development, reset your daily counter to get a fresh batch of signals:
curl -X DELETE "https://api.mbd.xyz/v3/alpha/notifications" \
-H "Authorization: Bearer mbd-YOUR_KEY"What's Next
- API Reference: Leaderboard — Full endpoint specification
- API Reference: Notifications — Signal endpoint specification
- API Reference: Configuration — Config endpoint specification
- Leaderboard Demo — Live leaderboard UI
Updated 10 days ago
