I run MadeOnSol, a Solana tool directory. Over the past few months I built infrastructure that tracks 946 KOL (Key Opinion Leader) wallets in real-time and monitors 6,700+ Pump.fun token deployers. I packaged all of it into a public API with a TypeScript SDK.
The free tier gives you 100 calls/day, no credit card. Here's what you can build with it.
Install
npm install madeonsol
import { MadeOnSol } from "madeonsol";
const client = new MadeOnSol({
apiKey: process.env.RAPIDAPI_KEY!,
});
Get your key from the MadeOnSol API page on RapidAPI.
What's in the API
Three product lines:
KOL Tracker — Real-time trades from 946 tracked Solana influencer wallets. Sub-3-second detection via dual gRPC streams (Frankfurt + New York).
Deployer Hunter — Reputation data for 6,700+ Pump.fun token deployers. Tier classification (elite/good/moderate/rising/cold) based on bonding rates and deployment history.
Tools Directory — 1,000+ Solana tools and dApps, searchable by name or category.
Use case 1: KOL trade alert bot
Track what Solana KOLs are buying in real-time and alert yourself when someone drops serious SOL on a token.
async function pollKolBuys() {
const { trades } = await client.kol.feed({ limit: 10, action: "buy" });
for (const trade of trades) {
if (trade.sol_amount > 5) {
console.log(
`${trade.kol_name} bought $${trade.token_symbol} for ${trade.sol_amount} SOL`
);
// Send to Telegram, Discord, etc.
}
}
}
setInterval(pollKolBuys, 30_000);
pollKolBuys();
You could pipe this into a Telegram bot, Discord webhook, or just log to CSV for later analysis.
Rate limit note: 30-second polling = ~2,880 calls/day. Free tier is 100/day, so increase the interval to 5 minutes for testing, or use a paid plan ($49/mo for 10K calls/day) for production.
Use case 2: Check a deployer before you ape
Before buying a freshly launched Pump.fun token, check if the deployer has a history of tokens that actually bond to Raydium — or if they're a serial rugger.
async function checkDeployer(wallet: string) {
const { deployer } = await client.deployer.profile(wallet);
console.log(`Tier: ${deployer.tier}`);
console.log(`Bond rate: ${(deployer.bonding_rate * 100).toFixed(1)}%`);
console.log(`Total deployed: ${deployer.total_tokens_deployed}`);
console.log(`Total bonded: ${deployer.total_bonded}`);
if (deployer.tier === "elite" || deployer.tier === "good") {
console.log("Solid track record");
} else {
console.log("Proceed with caution");
}
}
checkDeployer("7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU");
The tier system:
- Elite — consistently creates tokens that graduate to Raydium
- Good — above-average bonding rate
- Moderate/Rising — mixed or new, not a strong signal either way
- Cold — low bonding rate, most tokens die on the curve
One API call per token. 100 free calls = 100 deployer checks per day.
Use case 3: Multi-KOL convergence scanner
When 3+ KOLs buy the same token within hours, that's a different signal than one influencer shilling their bags. The coordination endpoint finds these patterns.
async function findConvergence() {
const { tokens } = await client.kol.coordination({
period: "24h",
min_kols: 3,
});
for (const token of tokens) {
const direction = token.net_flow > 0 ? "accumulating" : "distributing";
console.log(
`${token.token_symbol}: ${token.kol_count} KOLs, ${direction}`
);
}
}
findConvergence();
Filter for only accumulating tokens and sort by KOL count:
const accumulating = tokens
.filter((t) => t.net_flow > 0)
.sort((a, b) => b.kol_count - a.kol_count);
Chain them together
The real value is combining all three. Find convergence signals, check deployer reputation, output a ranked list:
async function fullScan() {
const { tokens } = await client.kol.coordination({
period: "4h",
min_kols: 3,
});
const results = [];
for (const token of tokens.filter((t) => t.net_flow > 0)) {
if (token.deployer_wallet) {
const { deployer } = await client.deployer.profile(
token.deployer_wallet
);
results.push({
symbol: token.token_symbol,
kolCount: token.kol_count,
deployerTier: deployer.tier,
bondRate: deployer.bonding_rate,
});
}
}
const tierOrder = { elite: 4, good: 3, average: 2, poor: 1 };
results.sort((a, b) => {
const diff =
(tierOrder[b.deployerTier] || 0) - (tierOrder[a.deployerTier] || 0);
return diff !== 0 ? diff : b.kolCount - a.kolCount;
});
for (const r of results) {
console.log(
`${r.symbol} — ${r.kolCount} KOLs, deployer: ${r.deployerTier} (${(r.bondRate * 100).toFixed(1)}% bond rate)`
);
}
}
fullScan();
Each token in the results triggers a deployer lookup, so a scan with 10 tokens = 11 API calls total.
Error handling
try {
const { deployer } = await client.deployer.profile(wallet);
} catch (error) {
if (error.status === 404) {
console.log("Deployer not in database");
} else if (error.status === 429) {
console.log("Rate limited — back off and retry");
} else {
console.error("Error:", error.message);
}
}
Full endpoint list
KOL Tracker:
-
client.kol.feed()— real-time trade feed -
client.kol.leaderboard()— PnL rankings -
client.kol.wallet(address)— individual KOL stats -
client.kol.coordination()— multi-wallet convergence -
client.kol.tokenFlow(mint)— KOL flow per token
Deployer Hunter:
-
client.deployer.stats()— global stats -
client.deployer.leaderboard()— ranked deployers -
client.deployer.profile(wallet)— deployer details (Pro) -
client.deployer.tokens(wallet)— token history (Pro) -
client.deployer.alerts()— new launch alerts -
client.deployer.alertStats()— alert performance -
client.deployer.bestTokens()— top performers -
client.deployer.recentBonds()— recent graduations
Tools:
-
client.tools.search()— search 1,000+ tools
Pricing
| Plan | Price | Daily limit |
|---|---|---|
| Basic | Free | 100 |
| Pro | $49/mo | 10,000 |
| Ultra | $149/mo | 100,000 |
Links
If you build something with it, I'd love to see it. Drop a comment or find me on Twitter.
Top comments (0)