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

CapabilityEndpointWhat it does
LeaderboardGET /leaderboardTop wallets ranked by trader score, PnL, win rate, or any metric
SignalsGET /notificationsReal-time alerts when smart money converges on a token
Budget ResetDELETE /notificationsReset your daily signal budget (for testing)
ConfigGET /configView your signal settings
Config UpdatePUT /configTune 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:

ComponentWeightWhat it measures
PnL efficiency40%Net PnL / buy volume
Win rate30%Bayesian-smoothed win rate from closed positions
Consistency20%Number of closed positions
Activity10%Log-normalized trade count

Ranking Options

Sort by any of these metrics via the rank_by parameter:

MetricDescription
trader_scoreComposite score (default)
realized_pnl_usdRealized PnL from closed positions
true_win_rateWin rate from closed positions
net_pnl_usdAll-time net PnL
total_buy_volume_usdTotal buy volume
trade_countNumber of trades
tokens_tradedUnique tokens traded
win_rateRaw win rate from data provider
avg_trade_size_usdAverage trade size
largest_trade_usdLargest 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"
ParameterDefaultDescription
chainbasebase, ethereum, or solana
min_trades1Minimum trade count
min_tokens5Minimum unique tokens (filters single-pair bots)
min_closed1Minimum closed positions (needed for reliable PnL)
max_buy_vol1BMaximum buy volume USD (filters aggregators)
limit50Results to return (max 200)

Chains

ChainWallet PoolBest for
base~1,000 walletsCoin trading, growing DEX activity
ethereum~425 walletsDeFi, highest liquidity
solana~10,000 walletsMemecoin activity

Signals

Signal Types

TypePriorityTrigger
convergence_p0P0 (highest)5+ top wallets bought the same token within the convergence window
convergence_p1P13–4 top wallets bought the same token
whale_moveP1A top-50 wallet made a trade exceeding whale_min_trade_usd
sell_signalP2Multiple 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 deduplication
  • why.reasons — human-readable explainability for display
  • cta — 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

SettingDefaultWhat it controls
daily_budget15–30Max total notifications per day
per_type_limitsvariesPer-signal-type daily caps
cooldown_hours2Min hours between duplicate signals for the same token
chainsallWhich chains generate signals
signal_typesallWhich signal types are enabled

Quality Gates

Tighten these to receive only high-conviction signals:

SettingDefaultWhat it filters
min_trader_score0Minimum composite score for triggering wallets
min_trigger_win_rate0Minimum win rate for triggering wallets
min_trigger_closed0Minimum closed positions for triggering wallets
min_token_liquidity_usd0Minimum 24h volume for the token
min_token_holders0Minimum holder count for the token
convergence_min_wallets3Wallets needed to trigger convergence
convergence_window_hours6Time window for convergence detection
whale_min_trade_usd50000Min trade size for whale alerts
whale_max_rank50Only 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