Building Notification Streams

This guide walks through setting up a notification stream from scratch — choosing signal types, tuning quality gates, and integrating delivery into your app.


Step 1: Review Your Configuration

Every account starts with a default configuration. Check yours:

curl https://api.mbd.xyz/v3/alpha/config \
  -H "Authorization: Bearer mbd-YOUR_KEY"

Key defaults to review:

SettingDefaultDescription
chainsallWhich chains generate signals
signal_typesallWhich signal types are enabled
daily_budget15-30Max notifications per day
convergence_min_wallets3Wallets needed for convergence
whale_min_trade_usd50000Min trade size for whale alerts
cooldown_hours2Hours between same-token signals

Step 2: Tune Your Configuration

Update only the fields you want to change:

For high-conviction signals only

curl -X PUT https://api.mbd.xyz/v3/alpha/config \
  -H "Authorization: Bearer mbd-YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "min_trader_score": 0.3,
    "min_trigger_win_rate": 0.5,
    "min_trigger_closed": 3,
    "convergence_min_wallets": 4,
    "priority_filter": "P0,P1",
    "daily_budget": 20
  }'

For a specific chain

curl -X PUT https://api.mbd.xyz/v3/alpha/config \
  -H "Authorization: Bearer mbd-YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "chains": ["base"],
    "signal_types": ["convergence_p0", "convergence_p1", "whale_move"]
  }'

Quality Gates Reference

SettingWhat it filtersRecommended for production
min_trader_scoreMinimum composite score (0-1) for triggering wallets0.2 - 0.4
min_trigger_win_rateMinimum win rate for triggering wallets0.4 - 0.6
min_trigger_closedMinimum closed positions for triggering wallets3 - 5
min_token_liquidity_usdMinimum 24h volume for the token10000 - 50000
min_token_holdersMinimum holder count for the token50 - 100
convergence_min_walletsWallets needed for convergence signals3 - 5
whale_min_trade_usdMinimum trade size for whale alerts25000 - 100000

Step 3: Integrate Delivery

Option A: Polling

Poll GET /notifications every 10-30 seconds using the since parameter:

const API_KEY = 'mbd-YOUR_KEY'
let since = new Date(Date.now() - 3600000).toISOString() // start 1 hour ago

setInterval(async () => {
  const res = await fetch(
    `https://api.mbd.xyz/v3/alpha/notifications?since=${since}&limit=50`,
    { headers: { 'Authorization': `Bearer ${API_KEY}` } }
  )
  const { notifications, count } = await res.json()

  for (const signal of notifications) {
    // Process the signal
    console.log(`[${signal.priority}] ${signal.headline}`)
    console.log(`  Token: ${signal.token.symbol} on ${signal.chain}`)
    console.log(`  ${signal.summary.trader_count} traders, $${signal.summary.total_usd_inflow} inflow`)

    // Use signal.cta for deep-linking to swap UI
    // { action: "swap", token_address: "0x...", chain: "base" }

    // Update since to avoid re-processing
    since = signal.timestamp
  }
}, 30000) // every 30 seconds

Option B: Webhook

Set a webhook URL to receive signals via POST:

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://your-app.com/webhooks/smart-money"}'

Your webhook receives the same signal payload as GET /notifications. Handle it like:

// Express.js webhook handler
app.post('/webhooks/smart-money', (req, res) => {
  const signal = req.body

  // Deduplicate using signal_id
  if (alreadyProcessed(signal.signal_id)) {
    return res.sendStatus(200)
  }

  // Process the signal
  processSignal(signal)

  res.sendStatus(200)
})

Step 4: Use the Leaderboard

The leaderboard powers the wallet rankings that drive signals. You can also use it directly:

Show top traders to users

const res = await fetch(
  'https://api.mbd.xyz/v3/alpha/leaderboard?chain=base&rank_by=trader_score&limit=20',
  { headers: { 'Authorization': `Bearer ${API_KEY}` } }
)
const { wallets, total } = await res.json()

// Display in your app
wallets.forEach(w => {
  console.log(`#${w.rank} ${w.wallet_address} — score: ${w.trader_score}, PnL: $${w.net_pnl_usd}`)
})

Filter for experienced traders

?min_trades=50&min_tokens=10&min_closed=5&max_buy_vol=500000

Step 5: Test with Budget Reset

During development, reset your daily budget to receive signals again:

curl -X DELETE https://api.mbd.xyz/v3/alpha/notifications \
  -H "Authorization: Bearer mbd-YOUR_KEY"

This deletes today's notification log and resets the counter.


Signal Anatomy

Every notification includes these fields:

{
  "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" }
}
FieldUse
signal_idDeduplicate signals
headlineDisplay to users
why.reasonsExplain why this signal matters
ctaDeep-link to swap UI
token.price_change_pctShow momentum since smart money entry

What's Next