If you're building a trading terminal, bot, dashboard, or AI agent on Solana, the memecoin-intelligence layer — KOL flow, deployer reputation, coordination signals, a MEV-stripped DEX firehose — is the part that's painful to build in-house. This is the builder's guide to embedding it instead: what the data is, how to access it (REST, WebSocket, webhooks, MCP, SDKs), and when to white-label it under your own brand.
Copy-trading tools promise to mirror smart wallets for you — for a fee, on their rules, with their wallet list. But the logic underneath is simple enough to own: watch labeled smart-money wallets, open when they open, close when they close, measure whether following them would actually have made money. That last part is the point of this tutorial.
You'll run the open-source kol-copytrade-bot-starter (MIT, ~300 lines, one dependency): a paper-trading bot that follows trades from 1,100+ active Solana KOL wallets and tracks virtual PnL from indexed market-cap data. No funds are executed by the starter, so there is no real-capital execution risk — but data quality and strategy/model risk still exist. The goal is an evidence-based answer to "is this KOL worth copying?" before a single lamport moves.
Data only: MadeOnSol never executes trades or touches funds, and neither does this starter. It's a measurement instrument you can later fork into whatever you want.
What you'll build
MadeOnSol KOL paper-trader · key tier: BASIC · paper size 0.5 SOL · min KOL buy 1 SOL
Mode: REST polling every 480s (tier BASIC).
🟢 OPEN $WIF 0.500 SOL @ MC $2.31M (copying Ansem)
🟣 CLOSE $WIF 1.84x → +0.420 SOL (Ansem exited)
📊 realized +0.420 SOL · 1 closed · 3 open
Every position opens at the market cap the KOL actually entered at (indexed at the moment of the swap, not when your poll happened to run) and closes at the multiple when they exit. Positions persist across restarts in a local JSON file.
Step 1 — Clone and run
git clone https://github.com/madeonsol/kol-copytrade-bot-starter
cd kol-copytrade-bot-starter
npm install
# Free key (200 req/day, no payment): https://madeonsol.com/pricing
export MADEONSOL_API_KEY=msk_your_key_here
node index.mjs
The bot detects your key tier with one GET /me call and picks its data mode automatically:
| Key | Mode | Latency |
|---|
| Free (BASIC) | Polls GET /kol/feed at a rate-limit-safe interval | feed data intentionally delayed 5 min; polling adds up to one interval |
| PRO / ULTRA / BUSINESS | Real-time paid feed / kol:trades WebSocket | no intentional MadeOnSol delay |
Same engine, same logic in both modes — upgrading changes delivery freshness and transport. The free feed is useful for research and paper measurement, but its intentional five-minute delay means it should not be treated as an execution edge.
Step 2 — Decide who you're copying
Copying all 1,100+ active Solana KOL wallets is a firehose, and most KOLs are not worth following — a suspiciously perfect win rate is usually a red flag. Two ways to narrow it:
- Explicit list:
FOLLOW_WALLETS=wallet1,wallet2 copies only those wallets. Pick candidates from the live KOL leaderboard — sort by 30d PnL and win rate — or programmatically via GET /kol/leaderboard.
- Quality filters in code: every feed row carries
kol_winrate_7d and the token's deployer_tier, so a two-line filter like "only copy KOLs above 60% win rate into tokens from non-trash deployers" is already possible with the data on hand.
The other knobs are environment variables: PAPER_SOL (virtual size per position), MIN_KOL_SOL (ignore small KOL buys — a 0.2 SOL nibble is not conviction), MAX_POSITIONS.
Step 3 — Read the engine
All trading logic lives in lib.mjs as pure functions — entry rules, exit matching, PnL math, filters — with a unit-test suite that runs without network access (node test.mjs also adds live shape-tests against production when a key is set). The separation is deliberate: when you fork this into something bigger, the engine is the part you keep and the I/O is the part you replace.
Step 4 — Ask better questions than "did it profit?"
Once it has run for a few days, the positions file is a dataset. The questions that separate a real edge from noise:
- Multi-KOL confirmation — does requiring 2+ tracked wallets in the same token before entering beat single-wallet copying?
GET /kol/coordination gives you the cluster data directly; our own signal scorecard tracks how coordination density performs out-of-sample.
- Risk-gated entries — how much PnL do you save by skipping tokens that fail a rug check?
GET /tokens/{mint}/risk (PRO) returns a 0–100 score with named factors, the same scoring used in the rug-check Telegram bot tutorial.
- Exit discipline — KOLs often exit in tranches. Copying the first sell versus the last sell produces very different curves; the feed gives you every partial.
From paper to product
The starter is a measurement tool, but the same API powers real products — trading terminals, alert services, agent frameworks. If you're building something users will pay for, the builder's guide to embedding Solana memecoin intelligence covers the four integration paths (REST, WebSocket, webhooks, MCP) and when white-labeling makes sense. If the product is a bot that acts on KOL buys as they happen, see which channels and payloads to wire up in live data feeds for a Solana trading bot. If you would rather have the server match trades against your rule than filter the feed yourself, see how KOL copy-trade signals are delivered by rule, with a suggested position size on each signal and execution left to you.
Full endpoint reference: madeonsol.com/api-docs. Free key and plans: madeonsol.com/pricing.
September 2026 refresh
The starter walkthrough now uses the current Solana population (1,100+ active KOL wallets) and the actual free-tier freshness contract: live feeds are intentionally delayed 5 minutes on BASIC, while paid plans have no intentional MadeOnSol feed delay and can use the KOL WebSocket. The old generic “under 3 seconds” promise was removed, and the paper-trading language now distinguishes no real-funds execution from strategy/data risk.