| # | Wallet | Score | Realized PnL | Win Rate | Buy Vol | Sell Vol | Trades | Tokens | Avg Size | Largest | Last Trade |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Loading leaderboard... | |||||||||||
| Token | Chain | Type | Signal Price | Current Price | Return | Sent |
|---|
Integrate smart money signals into your platform. Understand signal types, query our APIs, and build real-time notification flows for your users.
Wallets are ranked by a proprietary composite trader_score that identifies consistently skilled traders. Unlike single-metric rankings (PnL, win rate), the score is resistant to one-trade flukes, dust-wallet noise, and garbage upstream data.
The score includes multiple safety filters to automatically exclude bots, dust wallets, and wallets with anomalous data. MEV/arb bots (detected by zero net PnL) are filtered by default. Each wallet also receives a data_confidence badge (high/medium/low) based on the number of closed positions, so you know how trustworthy the score is. Scores are recomputed every 15 minutes.
convergence_min_wallets (default 3) is still required. Global engine window is set via Lambda env CONVERGENCE_WINDOW_HOURS (default 6h).convergence_min_wallets (default 3) but fewer than 5 qualifying wallets on the same token; set min wallets to 2 for the earliest P1 tier.whale_min_trade_usd and whale_max_rank)market object (question, outcome, slug) from DynamoDB enrichment.clob_token_id (buys only), subject to convergence_min_wallets and the same global window as DEX (env CONVERGENCE_WINDOW_HOURS).convergence_min_wallets (default 3) but fewer than 5 on the same CLOB; use 2 for earliest P1 if you lower that setting in customer-config.
Polymarket uses the same page layout as DEX chains, but a separate ranked wallet pool and outcome-based convergence (grouping by clob_token_id). Use the controls below to explore bettors, tune PM notifications, and deep-link to markets.
chain=polymarket. Wallets show a PM badge; explorer links go to Polygonscan.min_tokens=2, min_closed=0, min_buy_vol=1000 (see API Reference table).pm_convergence_bet_p0 and pm_convergence_bet_p1 independently of DEX convergence.market.question/market.outcome_label via Postgres first (secret POLYMARKET_PG_SECRET, default pg_ds1_config), then falls back to DynamoDB mappings/items. If enrichment can’t resolve, the UI falls back to the CLOB id prefix.question / outcome.cta.slug or cta.item_id from the payload.GET /leaderboard?chain=polymarket — Ranked bettor pool.GET /trader?wallet=...&chain=polymarket — Profile and positions by CLOB id.PUT /config — Include polymarket in chains and PM types in signal_types as in the config body table above.Whale-move and sell-signal types are DEX-only today; enabling them does not create Polymarket whale/sell alerts.
https://api.mbd.xyz/v3/alpha
Authorization header.
Authorization: Bearer mbd-your-api-key-here
401 Unauthorized.
realized_pnl_usd. Switch to trader_score for a composite view blending PnL efficiency, win rate, consistency, and activity. Bot wallets are filtered by default.| Parameter | Default | Description |
|---|---|---|
| rank_by | realized_pnl_usd | Sort metric. Options: trader_score, realized_pnl_usd, true_win_rate (or win_rate), net_pnl_usd, total_buy_volume_usd, trade_count, tokens_traded, avg_trade_size_usd, largest_trade_usd. Invalid values return 400. |
| limit | 50 | Number of results (max 200) |
| min_trades | 1 | Minimum trade count filter |
| min_tokens | 5 (base/eth), 3 (sol), 2 (polymarket) | Minimum unique tokens traded (filters market-maker bots) |
| min_closed | 5 (base/eth/sol), 0 (polymarket) | Minimum closed positions (wallets need closed trades for PnL/win-rate data) |
| min_buy_vol | 5K (base/eth), 1K (sol/polymarket) | Minimum buy volume USD — filters out dust wallets with negligible activity |
| max_buy_vol | 1B | Maximum buy volume USD — filters out aggregators and bots with unrealistic volume |
| chain | base | Chain to query: base, ethereum, solana, polymarket |
| offset | 0 | Pagination offset. Use with limit to paginate results (e.g., offset=20&limit=20 for page 2) |
| hide_bots | true | Filter out MEV/arb bot wallets (detected by zero net PnL). Set to false to see the full unfiltered pool |
data_confidence (high/medium/low based on closed positions), pipeline_info (data_since, data_age_days, latest_trade), and trader_score for every wallet.
# Top 25 wallets on Base (default: sorted by realized PnL, bots filtered) curl -H "Authorization: Bearer mbd-your-api-key-here" \ "https://api.mbd.xyz/v3/alpha/leaderboard?limit=25&chain=base" # Top 50 wallets on Solana sorted by composite trader score curl -H "Authorization: Bearer mbd-your-api-key-here" \ "https://api.mbd.xyz/v3/alpha/leaderboard?rank_by=trader_score&chain=solana&limit=50" # Polymarket smart-money leaderboard (notification pipeline index) curl -H "Authorization: Bearer mbd-your-api-key-here" \ "https://api.mbd.xyz/v3/alpha/leaderboard?chain=polymarket&limit=25" # Page 2 of results (wallets 21-40) curl -H "Authorization: Bearer mbd-your-api-key-here" \ "https://api.mbd.xyz/v3/alpha/leaderboard?limit=20&offset=20&chain=base"
chain and type filters — filtered queries paginate through DynamoDB to return the full limit of matching items. Use /signals for cursor-based paginated history.| Parameter | Default | Description |
|---|---|---|
| since | 24h ago | ISO 8601 timestamp — return notifications newer than this |
| limit | 50 | Max results (max 100) |
| type | all | Filter by signal type: convergence_p0, convergence_p1, whale_move, sell_signal, pm_convergence_bet_p0, pm_convergence_bet_p1 |
| chain | all | Filter by chain: base, ethereum, solana, polymarket |
| wallet_id | — | Wallet address for personalized enrichment. Two layers: (1) ML reranking — Polymarket signals are reordered by predicted relevance using a model trained on the wallet's trading history (adds relevance_rank). (2) Position enrichment — each signal is checked against the wallet's on-chain positions and receives a personal block. Held-token signals are boosted to top, then ML-reranked Polymarket, then DEX by recency. |
# Latest 20 signals curl -H "Authorization: Bearer mbd-your-api-key-here" \ "https://api.mbd.xyz/v3/alpha/notifications?limit=20" # Personalized: ML-reranked + enriched with wallet positions curl -H "Authorization: Bearer mbd-your-api-key-here" \ "https://api.mbd.xyz/v3/alpha/notifications?wallet_id=0x7a3f...9e2d&limit=20" # Only sell signals on Base curl -H "Authorization: Bearer mbd-your-api-key-here" \ "https://api.mbd.xyz/v3/alpha/notifications?type=sell_signal&chain=base&limit=10" # Poll for new signals since last check curl -H "Authorization: Bearer mbd-your-api-key-here" \ "https://api.mbd.xyz/v3/alpha/notifications?since=2026-03-23T10:00:00Z&limit=50"
{
"wallet_id": "0x4bfb41d5b3570defd03c39a9a4d8de6bd8b8982e",
"count": 3,
"notifications": [
{
// Polymarket signal — ML-reranked, wallet holds this outcome
"signal_type": "pm_convergence",
"chain": "polymarket",
"headline": "5 top bettors converged on YES",
"market": { "question": "Will BTC hit $100K?", "outcome_label": "Yes", ... },
"relevance_rank": 1, // ML-predicted relevance (lower = more relevant)
"personal": { // Wallet holds this outcome
"holds_token": true,
"your_bet": "Yes",
"avg_cost_basis_usd": 0.35,
"remaining_shares": 142.5,
"unrealized_pnl_pct": 57.1,
"relevance": "validates_your_bet"
},
"why": { "personal": "You hold 142 shares of Yes at $0.35 avg - top traders just validated your bet" },
...
},
{
// DEX signal — wallet holds this token
"signal_type": "convergence",
"chain": "base",
"headline": "5 top traders bought $TOSHI",
"personal": { // Wallet holds this token
"holds_token": true,
"position_size_usd": 2450.00,
"net_position_usd": 1950.00,
"avg_entry_price_usd": 0.000650,
"unrealized_pnl_pct": 24.9,
"direction": "BUY",
"relevance": "validates_your_position"
},
"why": { "personal": "You hold $1,950 of $TOSHI - top traders just validated your position" },
...
},
{
// Signal where wallet has no position
"signal_type": "pm_convergence",
"chain": "polymarket",
"relevance_rank": 3,
"personal": { "holds_token": false },
...
}
]
}
curl -H "Authorization: Bearer mbd-your-api-key-here" \ "https://api.mbd.xyz/v3/alpha/config"
| Body Field | Type | Description |
|---|---|---|
| daily_budget | number | Max notifications per day (5–50) |
| chains | list | Active chains: ["base", "ethereum", "solana", "polymarket"] (subset per account) |
| signal_types | list | Active signal types: ["convergence_p0", "convergence_p1", "whale_move", "sell_signal", "pm_convergence_bet_p0", "pm_convergence_bet_p1"] (subset per account) |
| min_trades | number | Minimum trade count for ranked wallets |
| min_win_rate | number | Minimum win rate (0–1) for signal-generating wallets |
| min_closed_positions | number | Minimum closed positions required |
| webhook_url | string | Webhook endpoint for real-time signal delivery |
| min_trade_size_usd | number | Min individual trade size in USD to count toward a signal (default: 50). Trades below this threshold are excluded from convergence counts and sell signals. |
| convergence_min_wallets | number | Minimum distinct qualifying wallets before a convergence can fire (default: 3). Classification: P0 when count is 5+, P1 when between this minimum and 4. Set to 2 for earliest P1. Applies to DEX and Polymarket. |
| convergence_window_hours | number | Stored per customer (default: 6). Used for pruning/state and copy; the detector’s global rolling window also follows Lambda env CONVERGENCE_WINDOW_HOURS (typically match these). |
| whale_min_trade_usd | number | Min trade size for whale alerts (default: 50000) |
| whale_max_rank | number | Max rank for whale alerts (default: 50) |
| min_trader_score | number | Min composite score for triggering wallet (0–1) |
| min_trigger_win_rate | number | Min win rate for triggering wallet (0–1) |
| min_trigger_closed | number | Min closed positions for triggering wallet |
| min_avg_holding_period_hours | number | Min avg holding period (hours) across a wallet's closed positions. Filters out scalpers. Default: 0 (no filter). |
| min_token_liquidity_usd | number | Min 24h volume for the token |
| min_token_holders | number | Min holder count for the token |
| priority_filter | string | Priority filter: "all", "P0", "P0,P1", etc. |
| cooldown_hours | number | Hours between duplicate signals for same token (default: 2) |
# Set daily budget to 30 and enable only P0 signals curl -X PUT \ -H "Authorization: Bearer mbd-your-api-key-here" \ -H "Content-Type: application/json" \ -d '{ "daily_budget": 30, "priority_filter": "P0", "chains": ["base", "ethereum"] }' \ "https://api.mbd.xyz/v3/alpha/config" # Tighten quality gates curl -X PUT \ -H "Authorization: Bearer mbd-your-api-key-here" \ -H "Content-Type: application/json" \ -d '{ "min_trader_score": 0.2, "min_trigger_win_rate": 0.5, "min_trigger_closed": 3 }' \ "https://api.mbd.xyz/v3/alpha/config"
| Parameter | Default | Description |
|---|---|---|
| wallet | required | Wallet address |
| chain | base | Chain to query: base, ethereum, solana, polymarket |
# Full profile for a wallet on Base curl -H "Authorization: Bearer mbd-your-api-key-here" \ "https://api.mbd.xyz/v3/alpha/trader?wallet=0x7a3f...9e2d&chain=base"
limit of matching items per page. Returns full signal payloads including traders, trade details, and why-reasons.| Parameter | Default | Description |
|---|---|---|
| chain | all | Filter by chain: base, ethereum, solana |
| type | all | Filter by type: convergence_p0, convergence_p1, whale_move, sell_signal, pm_convergence_bet_p0, pm_convergence_bet_p1 |
| limit | 20 | Results per page (max 100) |
| cursor | — | Pagination cursor from next_cursor in previous response |
| wallet_id | — | Wallet address for personalized enrichment. Same behavior as /notifications — ML reranking for Polymarket signals (adds relevance_rank), position enrichment (adds personal block), and smart ordering. |
# First page of Solana convergence signals curl -H "Authorization: Bearer mbd-your-api-key-here" \ "https://api.mbd.xyz/v3/alpha/signals?chain=solana&type=convergence_p0&limit=20" # Next page using cursor curl -H "Authorization: Bearer mbd-your-api-key-here" \ "https://api.mbd.xyz/v3/alpha/signals?cursor=eyJjdXN0b21lci..."
polymarket outcome/CLOB pricing may not resolve cleanly — treat PM metrics as best-effort.| Parameter | Default | Description |
|---|---|---|
| chain | all | Filter by chain: base, ethereum, solana, polymarket (PM returns may be unreliable) |
| days | 7 | Lookback window (1–30) |
| limit | 200 | Max signals to return (max 500) |
| dedup | false | Deduplicate by token+chain (keeps earliest signal per token) |
# Base chain signal performance over last 14 days curl -H "Authorization: Bearer mbd-your-api-key-here" \ "https://api.mbd.xyz/v3/alpha/signals/performance?chain=base&days=14"
wallet_id to any /notifications or /signals request to get personalized results. Two layers are applied:Layer 1: ML Reranking (Polymarket only) — Signals are reordered by an ML model trained on the wallet's Polymarket trading history. Each signal gets a relevance_rank field (lower = more relevant). The model predicts relevance even for markets the wallet hasn't interacted with.
Layer 2: Position Enrichment (DEX + Polymarket) — Each signal is checked against the wallet's on-chain positions. Matching signals get a personal block with position details.
Result ordering: (1) Held-token signals first, by position size desc → (2) Non-held Polymarket by relevance_rank asc → (3) Non-held DEX by recency.
curl -H "Authorization: Bearer YOUR_API_KEY" \ "https://api.mbd.xyz/v3/alpha/notifications?wallet_id=0x4bfb41d5...&limit=20" # With chain filter (only queries relevant backend): curl -H "Authorization: Bearer YOUR_API_KEY" \ "https://api.mbd.xyz/v3/alpha/notifications?wallet_id=0x4bfb41d5...&chain=polymarket&limit=20"
{
"signal_type": "pm_convergence",
"chain": "polymarket",
"headline": "5 top bettors converged on Yes",
"market": {
"question": "Will BTC hit $100K?",
"outcome_label": "Yes",
"slug": "will-btc-hit-100k",
"details": { "image": "https://polymarket-upload.s3..." }
},
"relevance_rank": 1, ← ML-predicted relevance (lower = better)
"personal": { ← wallet holds this outcome
"holds_token": true,
"your_bet": "Yes", ← which outcome the wallet bet on
"avg_cost_basis_usd": 0.35, ← avg price per share
"remaining_shares": 142.5, ← shares still held
"position_cost_usd": 49.88,
"realized_pnl_usd": 12.40,
"unrealized_pnl_usd": 28.50,
"unrealized_pnl_pct": 57.1,
"relevance": "validates_your_bet"
},
"why": {
"personal": "You hold 142 shares of Yes at $0.35 avg - top traders just validated your bet"
}
}
{
"signal_type": "convergence",
"chain": "base",
"headline": "5 top traders bought $TOSHI",
"personal": { ← wallet holds this token
"holds_token": true,
"position_size_usd": 2450.00, ← total bought
"net_position_usd": 1950.00, ← bought minus sold
"avg_entry_price_usd": 0.000650, ← avg cost basis
"unrealized_pnl_pct": 24.9, ← current price vs entry
"direction": "BUY",
"relevance": "validates_your_position"
},
"why": {
"personal": "You hold $1,950 of $TOSHI - top traders just validated your position"
}
}
{
"personal": { "holds_token": false },
"relevance_rank": 5 ← still ML-ranked (Polymarket only)
}
Without wallet_id: Standard broadcast feed. No personal block, no relevance_rank, no reranking. Zero overhead. Fully backward-compatible.
Chain routing: chain=base skips Polymarket lookups. chain=polymarket skips DEX lookups. No filter queries both.
Addresses: EVM (Base, Ethereum, Polymarket): lowercased automatically. Solana: case-sensitive base58.
{
"signal_id": "conv-base-TOSHI-20260319-0845",
"signal_type": "convergence",
"notification_type": "convergence_p0",
"priority": "P0",
"chain": "base",
"headline": "5 top-ranked traders bought $TOSHI in last 6h",
"token": {
"address": "0xac17...",
"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,
"trader_score": 0.4821,
"realized_pnl_usd": 142000,
"true_win_rate": 0.65,
"closed_positions": 31,
"winning_positions": 20,
"trade_count": 214,
"avg_trade_size_usd": 3250.00,
"total_buy_volume_usd": 695500.00,
"trade": {
"size_usd": 8420.50,
"token_bought": "TOSHI",
"token_sold": "WETH",
"token_bought_amount": 19250000,
"token_sold_amount": 3.48,
"transaction_hash": "0x8b2e...f41a",
"traded_at": "2026-03-19T08:32:15+00:00"
}
}
// ... more traders
],
"summary": {
"trader_count": 5,
"total_usd_inflow": 34200.00,
"highest_rank": 4
},
"why": {
"reasons": [
{ "text": "Trader #4 has $142K realized profit (65% win rate, 31 closed positions)" },
{ "text": "Token price up +12% since first smart entry" },
{ "text": "Combined inflow $34.2K in 6 hours" }
]
},
"cta": {
"action": "swap",
"token_address": "0xac17...",
"chain": "base"
},
"timestamp": "2026-03-19T08:45:00Z"
}
Each notification includes a why.reasons[] array that explains why this signal matters. These amplifiers help your users make informed decisions.
The leaderboard has two layers of controls: table controls for adjusting the current view and a config panel (gear icon) for persisting per-customer settings.
CONVERGENCE_WINDOW_HOURS. Shorter windows require wallets to cluster more tightly in time.
GET /notifications?since=<last_check> every 10-30 seconds with your Bearer token. Store the latest sent_at timestamp to avoid re-processing signals.headline, why.reasons[], and token fields to build rich notification cards. DEX signals use traders[] (merged rows with nested trade). Polymarket signals use user_trades[] — each item is { trader, trade } — plus market and often cta.action: polymarket with slug / item_id. The cta object provides deep-link data for swaps or Polymarket.cta.token_address and cta.chain to open your swap UI. For Polymarket, use cta.slug or cta.item_id to open the event or market page (see demo “View on Polymarket”).GET /leaderboard to show your users who the top traders are. Default trader_score ranking surfaces consistently skilled traders. Switch to realized_pnl_usd or true_win_rate for single-metric views.wallet_id to /notifications or /signals to get personalized results. Two things happen: (1) Polymarket signals are ML-reranked by predicted relevance to this wallet (using a model trained on trading history), and each gets a relevance_rank field shown as a blue badge on the card. (2) All signals are enriched with the wallet's positions — a personal block shows position size, entry price, PnL, and relevance label. Result ordering: held-token signals first, then ML-reranked Polymarket, then DEX by recency. Without wallet_id, you get the standard broadcast feed. Try it: open the notification panel and enter a wallet address, or use a shareable demo link like leaderboard?wallet_id=0x4bfb...