Pull live signals into your trading bot, Discord, dashboard, or research notebook. All endpoints return JSON. No API key required for read access.
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": 348,
"qualifiedCount": 129,
"byKind": {
"buy": 217,
"sell": 88
},
"peakPerformance": {
"count": 92,
"avg": -15.2,
"median": 0,
"hitRate": 22,
"best": 230.9,
"worst": -100
},
"bestCall": {
"symbol": "GOBALIEN",
"peakPct": 230.9,
"score": 33.897498287162904
},
"takeProfitTable": [
{
"threshold": 10,
"pctReached": 7,
"n": 6
},
{
"threshold": 20,
"pctReached": 5,
"n": 5
},
{
"threshold": 30,
"pctReached": 5,
"n": 5
},
{
"threshold": 50,
"pctReached": 2,
"n": 2
},
{
"threshold": 75,
"pctReached": 2,
"n": 2
},
{
"threshold": 100,
"pctReached": 2,
"n": 2
}
],
"performance": {
"1h": {
"count": 49,
"avg": -7.1,
"median": 0,
"hitRate": 18,
"best": 84.3,
"worst": -99.9
},
"peak": {
"count": 92,
"avg": -15.2,
"median": 0,
"hitRate": 22,
"best": 230.9,
"worst": -100
}
},
"avgBuyers": 2.2
}GET /api/signals?limit=2open ↗{
"signals": [
{
"id": 499,
"token_address": "Ej9EW4d2QE8dkH8aYyufU5zeXGn2U8V7jx9qH5RVqdaj",
"token_symbol": "yud",
"token_name": "evilclaude",
"detected_at": "2026-05-09T20:11:31.654013+00:00",
"score": 49.296057195102165,
"buyers": [
"G3tyVodGtbwZjmFRwKFKQEW7x1HTUNYFVK7LMXcsuTdV"
],
"buyer_count": 1,
"combined_volume_usd": 8250.647004,
"price_at_signal": 0.006352135125696004,
"price_now": 0.006352135125696004,
"pnl_pct": 0,
"meta": {
"v24hUSD": 346746.12888364063,
"liquidity": 6.7,
"marketCap": 6352135.132035435,
"buyerRanks": [
11
],
"holderCount": 107,
"topHolderPct": null,
"holderDelta24h": null,
"priceChange24h": -88.47037083256923,
"holderDeltaPct24h": null
},
"kind": "buy",
"price_1h": 0.006352135125696004,
"price_6h": null,
"price_24h": null,
"pnl_1h_pct": 0,
"pnl_6h_pct": null,
"pnl_24h_pct": null,
"snapshot_1h_at": "2026-05-09T21:15:04.309+00:00",
"snapshot_6h_at": null,
"snapshot_24h_at": null,
"peak_pct": 0
},
{
"id": 498,
"token_address": "8wGunbGJjgZ8GBgW1YRtJrfAYQtW4uUcvC3r5StWp8VU",
"token_symbol": "ROAF",
"token_name": "Russian Oil Asset Fund",
"detected_at": "2026-05-09T20:09:11.821668+00:00",
"score": 46.564896850239855,
"buyers": [
"9hut6smiiN8Wf6GXE6JzbUGy84bTy8q99siQFjRAEcRB"
],
"buyer_count": 1,
"combined_volume_usd": 6000.6470039999995,
"price_at_signal": 3.6283740702930856,
"price_now": 3.6283740702930856,
"pnl_pct": 0,
"meta": {
"v24hUSD": 153894.95426728413,
"liquidity": 3635.96,
"marketCap": 3628374077.546205,
"buyerRanks": [
19
],
"holderCount": 198,
"topHolderPct": null,
"holderDelta24h": null,
"priceChange24h": 527.1299492570065,
"holderDeltaPct24h": null
},
"kind": "buy",
"price_1h": 3.6283740702930856,
"price_6h": null,
"price_24h": null,
"pnl_1h_pct": 0,
"pnl_6h_pct": null,
"pnl_24h_pct": null,
"snapshot_1h_at": "2026-05-09T21:15:04.318+00:00",
"snapshot_6h_at": null,
"snapshot_24h_at": null,
"peak_pct": 0
}
]
}/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.