Get our pump.fun runner calls — in Telegram or over the API.
Bonding Terminal flags graduating pump.fun tokens and smart-money clusters in real time — every call logged with entry, score, model odds, and peak. Also ship Pons Robinhood Chain calls via GET /v1/pons/calls. Join Telegram to trade them yourself, or license the feed over REST + HMAC-signed webhooks.
Telegram plans in SOL (Bonding Terminal) + ETH (Pons) · API billed in SOL · Cancel anytime.
Sub-second calls
The same signal our channel + X post — graduations AND smart-money clusters, pushed the instant they fire, before they trend.
Rich, honest payloads
Entry mcap, curve %, score, tier, model odds (p_graduate / 5x / ETA), smart-money inflow, named KOLs, Solana Tracker risk, momentum, peak multiple + outcome.
You filter, not us
We ship the full firehose at min_score 0 and give you 20+ fields to filter on. One REST endpoint + a signed webhook; cursor sync means you never miss or double-count a call.
Pricing
Two ways in: join Telegram (pump.fun or Pons) and trade the calls yourself, or license the API (/v1/calls + /v1/pons/calls) and build on them. Terminals and high-volume integrations are set up directly with us.
Trade the calls yourself — Bonding Terminal (SOL) and Pons (ETH) channels via OnlySubs. API partners also get GET /v1/pons/calls.
Bonding Terminal — pump.fun
Solana channel · billed in SOL via OnlySubs
Pons — Robinhood Chain
Pons graduation alerts · billed in ETH via OnlySubs
- AI-powered graduation signals
- Bonding-curve momentum + volume/buy-pressure alerts
- Smart-money activity + migration odds scoring
- Sniper / bundle / insider / top-holder risk filters
- Instant channel access on payment · cancel anytime
Bonding Terminal Telegram plans are billed in SOL; Pons plans in ETH. API plans are USD reference prices, charged in SOL at checkout; a lapsed key returns HTTP 402 until renewed. By subscribing or using the API you agree to our .
Quickstart
Authenticate with Authorization: Bearer <key> (or x-api-key). Base URL https://pumpfunbot.org/api/v1.
1 · Pull calls (REST)
Poll with since = the last next_cursor to stream new calls without gaps or duplicates.
# Latest calls — the full firehose (graduation + smart-money clusters)
curl -H "Authorization: Bearer $BT_API_KEY" \
"https://pumpfunbot.org/api/v1/calls?limit=25"
# Incremental sync — poll with the cursor from the previous response
curl -H "Authorization: Bearer $BT_API_KEY" \
"https://pumpfunbot.org/api/v1/calls?since=84213&limit=100"
# Smart-money clusters only (early = 4+ wallets, full = 8+ wallets)
curl -H "Authorization: Bearer $BT_API_KEY" \
"https://pumpfunbot.org/api/v1/calls?kind=cluster_early&limit=25"
# Filter client-side to taste — e.g. only the back-tested high-conviction combo
curl -H "Authorization: Bearer $BT_API_KEY" \
"https://pumpfunbot.org/api/v1/calls?high_conviction=true&limit=25"
# Live "running now" leaderboard, with verified trader outcomes attached
curl -H "Authorization: Bearer $BT_API_KEY" \
"https://pumpfunbot.org/api/v1/runners?min_peak_mult=2&verified=1"
# One token's full call history
curl -H "Authorization: Bearer $BT_API_KEY" \
"https://pumpfunbot.org/api/v1/calls/6MPYewsYPK3L1ak68Gpc9ajuRjRRsGpnVd4mPTzWpump"2 · Receive pushes (Webhook)
We POST each call to your URL and sign the body. Verify the signature, then ack with any 2xx. Non-2xx (or a timeout) triggers automatic retries.
// Verify the HMAC signature on every webhook POST (Node.js)
import crypto from "node:crypto";
app.post("/bonding-terminal/webhook", (req, res) => {
const sig = req.header("X-PFB-Signature"); // "sha256=<hex>"
const body = req.rawBody; // the EXACT bytes received
const expected =
"sha256=" +
crypto.createHmac("sha256", process.env.BT_WEBHOOK_SECRET)
.update(body)
.digest("hex");
if (!sig || !crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected))) {
return res.status(401).end(); // reject forgeries
}
// event: call.new | call.graduated | call.milestone | call.peak
// data.kind: graduation | cluster_early | cluster_full (branch on this)
const { event, data } = JSON.parse(body);
if (event === "call.new" && data.kind.startsWith("cluster")) {
handleSmartMoneyCluster(data); // 4+/8+ smart wallets in
} else {
handleCall(event, data);
}
res.status(200).end(); // 2xx = delivered (no retry)
});Response shape (v1)
Stable, versioned payload — we add fields, never rename or remove them without a version bump. Every call carries kind (graduation / cluster_early / cluster_full) so you can route each type.
{
"tier": "realtime",
"delay_seconds": 0,
"count": 1,
"next_cursor": 84213,
"data": [
{
"id": 84213,
"kind": "graduation",
"mint": "6MPYewsYPK3L1ak68Gpc9ajuRjRRsGpnVd4mPTzWpump",
"symbol": "ANSEM",
"name": "ansem",
"called_at": "2026-07-14T18:22:41.918Z",
"entry_mcap_usd": 12174,
"curve_pct": 71.4,
"score": 92,
"tier": "ELITE",
"high_conviction": true,
"model": { "p_graduate": 0.81, "run_5x": 0.34, "expected_time_min": 26, "risk": "low" },
"smart_money": {
"buys": 5,
"sol_inflow": 41.2,
"kols": [
{ "name": "Ansem", "twitter": "blknoiz06" },
{ "name": "Cupsey", "twitter": null }
]
},
"risk": { "top10_pct": 18.2, "dev_hold_pct": 0, "sniper_pct": 4.1, "bundle_pct": 2.3, "st_score": 2 },
"momentum": { "makers": 61, "vol_5m_usd": 38400, "buy_sell_ratio": 2.41 },
"peak_mult": 35.0,
"peak_mcap_usd": 426192,
"graduated": true,
"seconds_to_grad": 1580,
"chart_url": "https://dexscreener.com/solana/6MPYewsYPK3L1ak68Gpc9ajuRjRRsGpnVd4mPTzWpump",
"links": {
"chart": "https://dexscreener.com/solana/6MPYewsYPK3L1ak68Gpc9ajuRjRRsGpnVd4mPTzWpump",
"pump": "https://pump.fun/coin/6MPYewsYPK3L1ak68Gpc9ajuRjRRsGpnVd4mPTzWpump",
"solscan": "https://solscan.io/token/6MPYewsYPK3L1ak68Gpc9ajuRjRRsGpnVd4mPTzWpump"
},
"attribution": "Called by @PumpbondingBot"
}
]
}Smart-money cluster (webhook example)
Clusters fire as call.new with a cluster_early (4+ distinct smart wallets) or cluster_full (8+) kind. Same envelope as a graduation call — branch on data.kind.
{
"event": "call.new",
"data": {
"id": 84980,
"kind": "cluster_early", // 4+ distinct smart wallets (cluster_full = 8+)
"mint": "9nbZeozHVfdmrqJJ3DEqiPsXhVvmyaq2gpDp4MqFpump",
"symbol": "BULLMAN",
"called_at": "2026-07-15T17:03:11.402Z",
"entry_mcap_usd": 28900,
"curve_pct": 63.2,
"score": 71,
"tier": "WATCH",
"high_conviction": false,
"smart_money": {
"buys": 4,
"sol_inflow": 22.8,
"kols": [ { "name": "Cupsey", "twitter": null } ]
},
"risk": { "top10_pct": 21.5, "dev_hold_pct": 0, "sniper_pct": 6.0, "bundle_pct": 3.1, "st_score": 3 },
"momentum": { "makers": 44, "vol_5m_usd": 19700, "buy_sell_ratio": 1.86 },
"links": { "chart": "…", "pump": "…", "solscan": "…" },
"attribution": "Called by @PumpbondingBot"
}
}Filtering & recommended presets
Your key ships the full firehose — every graduation and every smart-money cluster, at min_score = 0. That's deliberate: you get maximum coverage and decide what to surface, instead of us hiding calls you might have wanted. Filter with query params (REST) or branch on the fields (webhook).
Firehose
default · recommended(no filter)Everything we fire. Best for indexers, backtesting, and terminals that rank/curate on their own UI. The score, tier, and high_conviction fields are on every call — filter in your app.
Balanced
quality floor?min_score=78SOLID tier and up. Trims the noisiest low-conviction calls while keeping most runners. Good default if you surface calls directly to end users with our co-branding.
Conservative
highest conviction?high_conviction=trueOnly the back-tested combo (low entry cap + 70-85% curve + uncrowded smart money) that out-performs the average call. Lowest volume, highest hit-rate.
Why we default to min_score = 0
- Coverage beats curation for data. A suppressed call is optionality we took from you. Some of the biggest runners start as lower-scored early clusters — you can always filter up, but you can't recover a call we never sent.
- The score is a field, not a verdict. We attach
score,tier,high_conviction, smart-money, KOL, risk, and momentum — so your model can weight them however you want. - Clusters score differently than graduations. Early smart-money clusters intentionally fire below the graduation bar; a hard score gate would hide exactly the signal most terminals license us for.
- You can always tighten. Set
min_score,high_conviction,min_peak_mult,kind, or the mcap/curve bands per request — no key change needed.
Filter reference
| Param | What it does |
|---|---|
kind | graduation | cluster_early | cluster_full — restrict to one call type. |
min_score | 0-100 quality floor (default 0 = everything you fire). |
high_conviction | true = only the back-tested combo profile. |
min_peak_mult | Proven-runner floor for /runners + post-entry events. |
min_entry_mcap / max_entry_mcap | Entry market-cap band (USD). |
max_curve_pct | Skip late entries past a curve %. |
min_smart / max_smart | Smart-money wallet-count band. |
graduated | true = only tokens that actually bonded. |
window_hours | Rolling lookback window. |
since / limit | Cursor sync + page size (1-200). |
verified | on /runners: attach realized trader outcomes (still-holding vs sold). |
Ready to wire it up?
Tell us your terminal, expected volume, and latency needs. We'll issue a key, set your webhook, and get you live the same day.

