Pull live signals into your trading bot, Discord, dashboard, or research notebook. All endpoints return JSON. No API key required for read access.
npm i @smartmoney/sdkDocs โSmart Money Signals is built on Birdeye Data API. Token metadata fields in our response (meta.liquidity_usd, meta.market_cap_usd, meta.volume_24h_usd, meta.holder_count) are point-in-time snapshots sourced from Birdeye at signal-fire. All other fields (scores, cluster detection, stealth patterns, performance tracking) are Smart Money Signals' own derived analytics.
If you build anything on top of this API โ bot, dashboard, embed, third-party SDK, research tool โ please display attribution prominently in your UI:
Powered by Smart Money Signals ยท Built on Birdeye Data API
And link back to https://bds.birdeye.so wherever you display Birdeye-sourced fields. This is required if you redistribute any portion of our payload and ensures we stay aligned with Birdeye's Terms of Service together.
Curl example โ pull the latest 5 signals:
curl https://smart-money-sol.vercel.app/api/signals?limit=5Python:
import requests
r = requests.get("https://smart-money-sol.vercel.app/api/signals", params={"limit": 5})
for sig in r.json()["signals"]:
print(f"${sig['token_symbol']} score={sig['score']:.0f} pnl={sig['pnl_pct']:.1f}%")Node.js (live stream):
import EventSource from "eventsource";
const es = new EventSource("https://smart-money-sol.vercel.app/api/signals/stream");
es.onmessage = (ev) => {
const sig = JSON.parse(ev.data);
console.log("NEW:", sig.token_symbol, "score", sig.score);
};This is the actual JSON our API returns right now โ fetched server-side and rendered fresh on every request.
GET /api/signals/statsopen โ{
"ok": true,
"period": "30d",
"filter": {
"minScore": 30,
"kind": "buy"
},
"total": 0,
"qualifiedCount": 0,
"byKind": {
"buy": 0,
"sell": 0,
"stealth": 0,
"graduation": 0,
"bleed": 0
},
"peakPerformance": null,
"bestCall": null,
"takeProfitTable": [
{
"threshold": 10,
"pctReached": 0,
"n": 0
},
{
"threshold": 20,
"pctReached": 0,
"n": 0
},
{
"threshold": 30,
"pctReached": 0,
"n": 0
},
{
"threshold": 50,
"pctReached": 0,
"n": 0
},
{
"threshold": 75,
"pctReached": 0,
"n": 0
},
{
"threshold": 100,
"pctReached": 0,
"n": 0
}
],
"performance": {
"1h": null,
"peak": null
},
"avgBuyers": 0
}GET /api/signals?limit=2open โ// API unreachable/api/v1/signalslimit โ Page size 1โ200 (default 50)offset โ Pagination offset (default 0)kind โ buy | sell | stealth | graduation | bleedmin_score โ Minimum score filtersince โ ISO8601 โ only signals after this timestamptoken โ Filter by specific token address/api/v1/statsdays โ Lookback (1โ90, default 7)/api/v1/backteststrategy โ all | cluster | elite | stealth | graduation | bleed (default all)days โ Lookback window 1โ90 (default 30)min_score โ Score floor 0โ100 (default 0)stake_usd โ Per-signal stake for the simulation (default 100)/api/signalslimit โ Max signals to return (default 20, max 50)/api/signals/statsdays โ Lookback window (default 30, max 90)minScore โ Score floor (default 30; pass 0 for all signals)/api/signals/[id]/performance/api/signals/stream/api/wallets/top-traderstype โ today | yesterday | 1W | 1M (default today)limit โ 1โ10 (Birdeye free tier cap)/api/tokens/newlimit โ Max tokens (default 20, max 50)/api/health/api/activity{
id: number,
token_address: string, // Solana mint address
token_symbol: string,
token_name: string,
detected_at: string, // ISO timestamp
score: number, // 0โ100, see scoring formula below
kind: "buy" | "sell",
buyers: string[], // wallet addresses
buyer_count: number,
combined_volume_usd: number,
price_at_signal: number,
price_now: number,
pnl_pct: number, // live PnL since signal fired
pnl_1h_pct: number | null, // captured at +1h
pnl_6h_pct: number | null, // captured at +6h
pnl_24h_pct: number | null, // captured at +24h
meta: {
liquidity: number,
marketCap: number,
v24hUSD: number,
priceChange24h: number,
topHolderPct: number,
buyerRanks: number[] // rank of each buying wallet
}
}Score is a 0โ100 composite. Higher = stronger signal.
buyer_weight = sum( 1 / sqrt(rank) ) // unique buyers, weighted by quality
volume_weight = log10(1 + combined_usd) / 5
recency_weight = 1 / (1 + minutes_since_first_buy / 30)
score = clamp( 25 * buyer_weight + 25 * volume_weight + 50 * recency_weight, 0, 100 )Tag @Smart_MoneySol on Telegram or post on X โ we'll boost it. PRs welcome on the open-source version.