Most KOL leaderboards rank wallets globally. That's useful for discovery, but it doesn't answer the question you actually have once you've got a shortlist: which of these five wallets should I actually copy, and how much do their trades overlap?
/v1/kol/compare is built for exactly that. You pass up to five wallets (ULTRA tier; PRO gets four, BASIC gets two) via ?wallets=a,b,c, and it returns a full performance profile for each — plus an overlap table listing every token that 2 or more of those wallets bought in the last 30 days. In one request.
This post walks through the response shape, the overlap logic that most users miss, and how to use both together to build a non-redundant copy-trade roster.
The call
GET /v1/kol/compare?wallets=7xK...,DezX...,9vMJ...,HbCz...
Two to five comma-separated wallet addresses. BASIC caps at 2, PRO at 4, ULTRA at 5. If any of the wallets aren't in the MadeOnSol KOL leaderboard, they come back with found: false but don't fail the whole request.
The response splits into two sections.
Section 1: profiles
One object per wallet, containing their scorecard across 7-day and 30-day windows:
{
"wallet": "7xK...",
"found": true,
"name": "Mezoteric",
"twitter_url": "https://x.com/mezoteric",
"strategy_tag": "sniper",
"auto_strategy_tag": "early-entry",
"winrate_7d": 0.71,
"winrate_30d": 0.63,
"avg_roi_7d": 1.42,
"avg_roi_30d": 1.18,
"profit_factor_7d": 2.3,
"profit_factor_30d": 1.9,
"pnl_7d": 84.2,
"pnl_30d": 312.7,
"early_entry_pct_30d": 0.43,
"consistency_7d": 0.88,
"median_hold_minutes_30d": 22,
"closed_positions_7d": 18,
"closed_positions_30d": 96,
"is_heating_up": true,
"is_cold": false,
"percentile_pnl_7d": 0.92,
"percentile_winrate_7d": 0.87,
"percentile_pnl_30d": 0.81,
"percentile_winrate_30d": 0.76,
"percentile_early_entry_30d": 0.68
}
The important distinctions:
strategy_tag vs auto_strategy_tag — the first is a manual human tag (sniper, swing, smart-money, etc). The second is an algorithmically derived tag from the wallet's recent behavior. When they disagree, the auto tag is usually more current.
- 7d vs 30d — huge divergence is the signal. A wallet with
winrate_7d: 0.71 but winrate_30d: 0.45 is in a hot streak. is_heating_up and is_cold are the endpoint's boolean shortcuts for that.
profit_factor — gross wins divided by gross losses. Above 1.5 is healthy, above 2.0 is strong, below 1.0 means they lose money net of fees.
percentile_* fields (PRO+) — where this wallet ranks against the full KOL leaderboard. Useful for spotting wallets that look mediocre in absolute terms but are actually in the 90th percentile of their cohort.
closed_positions_7d/30d — sample size gate. Numbers below 10 are noise. Anything over 30 is statistically meaningful.
Section 2: overlap (PRO+ only)
This is the underrated part of the endpoint. For the provided wallet list, the endpoint queries every KOL buy in the last 30 days and returns the tokens that 2 or more of them bought:
"overlap": [
{
"token_mint": "So11...",
"token_symbol": "CAT",
"token_name": "Schroedinger Cat",
"wallets": ["7xK...", "DezX...", "9vMJ..."],
"buy_count": 8
},
{
"token_mint": "4fG...",
"token_symbol": "PEPE2",
"token_name": "Pepe 2.0",
"wallets": ["7xK...", "DezX..."],
"buy_count": 4
}
]
Each entry tells you: a token, which of your wallets bought it, and the total buy-count across them. Sorted by wallet overlap first (more wallets = higher), then buy count.
This is the part most users ignore, and it's the answer to the real question: how independent are these wallets' plays?
Why overlap matters more than PnL
If you build a copy-trade roster of 5 wallets that each have 70% win rates, you've not built 5 strategies. If those wallets share 60% of their token picks, you've built one strategy with 5x the capital exposure. When that one underlying thesis breaks, every wallet takes the loss at the same time and your "diversified" copy-trade book blows up in a single afternoon.
Overlap tells you how much real diversification you're actually getting.
A quick rule of thumb:
- Overlap count / total tokens < 10% — genuinely independent wallets, true diversification.
- 10–25% — moderate correlation, acceptable for a 3-4 wallet roster, risky for more.
- 25–50% — strongly correlated, you're copying one strategy from multiple angles.
- > 50% — you've accidentally assembled a farm. Collapse to one wallet and pocket the rate-limit savings.
A concrete selection workflow
Here's how the endpoint fits into picking a copy-trade roster:
import { MadeOnSol } from "madeonsol";
const client = new MadeOnSol({ apiKey: process.env.MADEONSOL_API_KEY! });
async function pickCopyTradeRoster(candidates: string[]) {
// 1. Compare in chunks of 5
const chunks: string[][] = [];
for (let i = 0; i < candidates.length; i += 5) {
chunks.push(candidates.slice(i, i + 5));
}
const allProfiles = [];
const allOverlap = [];
for (const chunk of chunks) {
const { profiles, overlap } = await client.kol.compare({ wallets: chunk });
allProfiles.push(...profiles.filter((p) => p.found));
allOverlap.push(...(overlap ?? []));
}
// 2. Gate: must have 30d sample size + positive profit factor
const qualified = allProfiles.filter(
(p) =>
p.closed_positions_30d >= 30 &&
(p.profit_factor_30d ?? 0) >= 1.5 &&
!p.is_cold
);
// 3. Rank by a blended score of winrate + early entry
qualified.sort(
(a, b) =>
((b.winrate_30d ?? 0) * 0.6 + (b.early_entry_pct_30d ?? 0) * 0.4) -
((a.winrate_30d ?? 0) * 0.6 + (a.early_entry_pct_30d ?? 0) * 0.4)
);
// 4. Greedily add wallets to roster, skipping any with >30% overlap against already-picked
const roster: typeof qualified = [];
const rosterOverlapCount = new Map<string, number>();
for (const cand of qualified) {
let overlapScore = 0;
for (const picked of roster) {
const shared = allOverlap.filter(
(o) =>
o.wallets.includes(cand.wallet) && o.wallets.includes(picked.wallet)
).length;
overlapScore += shared;
}
if (roster.length === 0 || overlapScore < cand.closed_positions_30d * 0.3) {
roster.push(cand);
rosterOverlapCount.set(cand.wallet, overlapScore);
}
if (roster.length >= 5) break;
}
return roster;
}
The greedy step is the important one. Without it, you'd pick the 5 highest-winrate wallets and call it a day — and half of them would be copying each other.
Strategy-tag diversity as a shortcut
If you don't want to compute overlap explicitly, a cheap proxy is strategy-tag diversity. Inspect auto_strategy_tag across your profiles — if all five come back as sniper or all five as smart-money-following, you're about to copy-trade the same trade from five angles. A healthy roster has at least 2–3 distinct strategy tags.
This is the same logic that powers /kol/tokens/hot?unique_strategies=true — requiring diversity filters out coordinated noise. The same principle applies to wallet rosters.
Tier considerations
| Feature | BASIC | PRO | ULTRA |
|---|
| Max wallets per call | 2 | 4 | 5 |
overlap section | hidden | truncated wallets | full wallets |