DEV Community

Lambo Poewert
Lambo Poewert

Posted on

I built a free Solana trading API — here's how to use it

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
Enter fullscreen mode Exit fullscreen mode
import { MadeOnSol } from "madeonsol";

const client = new MadeOnSol({
  apiKey: process.env.RAPIDAPI_KEY!,
});
Enter fullscreen mode Exit fullscreen mode

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();
Enter fullscreen mode Exit fullscreen mode

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");
Enter fullscreen mode Exit fullscreen mode

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();
Enter fullscreen mode Exit fullscreen mode

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);
Enter fullscreen mode Exit fullscreen mode

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();
Enter fullscreen mode Exit fullscreen mode

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);
  }
}
Enter fullscreen mode Exit fullscreen mode

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)