When 8 KOLs buy the same token, two questions matter: which of them was first, and how good is that first wallet? "First KOL in" is a signal all on its own — those wallets either have bespoke tooling, bespoke info, or both. If the first wallet is also 90th-percentile on win rate, you're looking at someone worth copy-trading by itself.
GET /api/v1/kol/tokens/{mint}/entry-order is the endpoint that answers this. Pass a token mint, get every KOL that bought it ordered by first-buy timestamp, enriched with their strategy tag, winrate, and percentile rank. One call, full timeline.
The call
GET /api/v1/kol/tokens/{mint}/entry-order?limit=50
Authorization: Bearer msk_...
Mint is a standard base58 address. limit accepts 1–100, default 50. Available on every tier.
The endpoint scans kol_trades (180-day retention) for every buy on this mint, keeps the first buy per wallet (ascending by time), and returns them ranked.
The response
{
"token_mint": "26s2aY...pump",
"token_name": "Egg Season",
"token_symbol": "EGG",
"total_kol_buyers": 14,
"first_buy_at": "2026-04-22T19:14:03Z",
"last_buy_at": "2026-04-22T21:47:22Z",
"span_sec": 9199,
"entries": [
{
"rank": 1,
"kol_name": "Publix",
"kol_twitter": "https://x.com/publix",
"wallet": "86AE...EdD",
"strategy_tag": "sniper",
"auto_strategy_tag": "scalper",
"winrate_7d": 0.68,
"winrate_30d": 0.62,
"early_entry_pct_30d": 0.71,
"percentile_pnl_7d": 0.88,
"percentile_winrate_7d": 0.82,
"first_buy_at": "2026-04-22T19:14:03Z",
"seconds_after_first": 0,
"sol_amount": 2.022,
"token_amount": 41562.3,
"tx_signature": "4fG9mK...QpR"
},
{
"rank": 2,
"kol_name": "Clown",
"kol_twitter": "https://x.com/clown",
"wallet": "EDXH...HR8",
"strategy_tag": "smart-money",
"auto_strategy_tag": "day_trader",
"winrate_7d": 0.54,
"winrate_30d": 0.58,
"early_entry_pct_30d": 0.43,
"percentile_pnl_7d": 0.65,
"percentile_winrate_7d": 0.58,
"first_buy_at": "2026-04-22T19:18:42Z",
"seconds_after_first": 279,
"sol_amount": 1.476,
"token_amount": 29840.1,
"tx_signature": "bC7nM...WvT"
}
]
}
Header fields describe the whole cohort; entries[] is the per-KOL timeline.
Header fields
total_kol_buyers — total distinct KOL wallets that bought this token across the retention window. This can exceed limit — the header count is uncapped, the entries array is limit-truncated.
first_buy_at / last_buy_at — timestamps of the first and last KOL entries.
span_sec — seconds between first and last. A 60-second span on 14 KOLs is a coordinated rush. A 48-hour span is organic accumulation.
span_sec is the first shape signal worth checking. Rough calibration for memecoin cohorts:
| Span | Pattern |
|---|
< 60s | Coordinated snipe / tip |
60s – 15min | Fast consensus formation, usually alpha-driven |
15min – 2h | Standard discovery cycle |
> 6h | Slow-burn accumulation or broken thesis |
Per-entry fields
Timing
rank — position in the entry queue. Rank 1 is the first KOL in.
first_buy_at — exact UTC timestamp.
seconds_after_first — delta from rank 1. Makes time-since-start trivially sortable without re-parsing timestamps.
Identity
kol_name — display name.
kol_twitter — Twitter URL (can be null).
wallet — full base58 wallet address.
Strategy
strategy_tag — manual human tag.
auto_strategy_tag — computed tag from mv_kol_scores (scalper / day_trader / swing_trader / hodler / mixed).
Performance
winrate_7d / winrate_30d — fraction in 0.0–1.0 range.
early_entry_pct_30d — what fraction of their 30-day trades they entered early (before peak). A KOL with high early_entry_pct and rank-1 on this token is a strong "sharp alpha" signal.
percentile_pnl_7d / percentile_winrate_7d — where this wallet ranks vs the whole KOL leaderboard. 0.90 means top 10%.
Trade details
sol_amount / token_amount — size of their first buy.
tx_signature — Solana tx signature for reconstruction / linkback.
The first-buyer lens
The endpoint was built primarily to answer "who got in first, and how good are they?" Here's the decision tree:
const { entries, total_kol_buyers, span_sec } = await client.kol.entryOrder({ mint });
const first = entries[0];
// "Is the first wallet in actually good?"
if ((first.percentile_pnl_7d ?? 0) >= 0.85 &&
(first.early_entry_pct_30d ?? 0) >= 0.5) {
// Sharp first-in: someone with edge + a track record of catching tokens early
// Worth following their specific moves on this mint
}
// "Is the group consensus tight?"
if (total_kol_buyers >= 5 && span_sec < 900) {
// 5+ KOLs inside 15 minutes — consensus is forming now
}
// "Did the first wallet have conviction?"
if (first.sol_amount >= 3) {
// Not just a 0.3 SOL test-buy — real size on entry
}
"Follow the sharpest first"
A practical copy-trade heuristic: for every new token appearing in /kol/coordination, call /kol/tokens/{mint}/entry-order?limit=5 and look at rank 1. If rank 1 is a top-decile wallet with high early-entry percentage, scale your position toward their entry — not the 4th or 5th KOL's slower entry. The rank-1 buy is the thesis; subsequent entries are the confirmation.
"Follow-the-money timing gate"
If rank 1's seconds_after_first is 0 (by definition) and rank 2 entered 4 hours later, the cohort is not coordinated — each KOL found the token independently. High-conviction but slow-discovery tokens often have this shape. Different trade than a tight coordination cluster.
Short spans with large volume often reflect tip-based trading; long spans with small volume often reflect organic discovery. Both are valid, but they call for different sizing.
Difference from /tokens/{mint}/cap-table
These two endpoints look similar but answer different questions.
| /tokens/{mint}/cap-table | /kol/tokens/{mint}/entry-order |
|---|
| Scope | All early buyers (any wallet) | KOL wallets only |
| Rank 1 | Second non-deployer buyer | First KOL buyer (can be rank 30 overall) |
| Enrichment | Historical win rate, bundle flags, bot confidence | Winrate, percentiles, strategy tag |
| Use case | Is this launch bundled or organic? | Are the smart-money wallets here early or late? |
| Tier | PRO + ULTRA only | All tiers |
Use cap-table to screen launches; use entry-order to understand KOL positioning once a launch is past the initial filter.
Sequential query — the 5-second workflow
// Fresh pump.fun mint from a stream:
const mint = "26s2aY...pump";
// 1. Screen it (cheap)
const { signal, score } = await client.tokens.buyerQuality({ mint });
if (signal === "negative" || score < 40) return;
// 2. Check KOL positioning
const { entries, total_kol_buyers } = await client.kol.entryOrder({ mint, limit: 10 });
if (total_kol_buyers < 2) return;
// 3. Check the first-KOL sharpness
const first = entries[0];
if ((first.percentile_pnl_7d ?? 0) < 0.7) return;
// Passes: a clean launch where a top-decile KOL got in first