K
KOLQUEST
Leaderboard
All KOLs ranked by profit
Top Win Rate
Best win rate KOLs
Most Profitable
Highest profit KOLs
Solana Wallets
Smart money on Solana
BSC Wallets
Smart money on BNB Chain
X Tracker
10K+ crypto X accounts
Polymarket
Prediction market top traders
Feed
Live wallet activity
Monitor
GMGN-style live wallet monitor
Track
New tokens from tracked wallets
Wallet Tracker
Your tracked wallet portfolio
PortfolioBETA
Multi-chain wallet analyzer
All Solana
Combined deduplicated Solana wallets
All Wallets
Every source in one view — Solana + BSC + Polymarket
DocsAPICommunityFeedback

KolScan

LeaderboardAll KOLs ranked by profitTop Win RateBest win rate KOLsMost ProfitableHighest profit KOLs

GMGN

Solana WalletsSmart money on SolanaBSC WalletsSmart money on BNB ChainX Tracker10K+ crypto X accountsPolymarketPrediction market top traders

Tools

FeedLive wallet activityMonitorGMGN-style live wallet monitorTrackNew tokens from tracked walletsWallet TrackerYour tracked wallet portfolioAll SolanaCombined deduplicated Solana walletsAll WalletsEvery source — Solana + BSC + Polymarket
DocsAPI & data documentationCommunitySubmit WalletAdd a wallet to trackFeedbackSubmit feedback or request removal
GMGNPadreGitHub
Sign in
SubmitSign in
KOLQUEST
LeaderboardSolanaBSCDocsFeedbackGitHub

© 2026 KolQuest

Back to home
Documentation

KolQuest Docs

REST API reference, MCP server integration, and the technical writeup on how we reverse-engineered KolScan.

Getting StartedAuthenticationRate LimitsPlaygroundEndpointsError CodesMCP ServerTechnical Writeup

Getting Started

KolQuest provides a unified API for crypto wallet intelligence — KOL tracking, smart money analysis, and token data.

🌐

Base URL

https://kol.quest/api

All endpoints are relative to this base URL.

📦

Response Format

All responses are JSON with consistent structure.

Content-Type: application/json

Quick Example

# Get trending tokens
curl "https://kol.quest/api/trending?chain=sol&limit=10"

# Search wallets
curl "https://kol.quest/api/wallets?search=cented&limit=5"

# Get wallet details
curl "https://kol.quest/api/wallets/CyaE1Vxv..."
📄

OpenAPI Specification

Full OpenAPI 3.0 spec available at /api/openapi.json — import into Postman, Insomnia, or generate client SDKs.

Authentication

Most read endpoints are public. Write operations and user-specific features require authentication.

🔓

Public Endpoints

Wallet listings, trending tokens, search, and token data are publicly accessible without authentication.

🔐

Authenticated Endpoints

Watchlist, submissions, vouching, and admin features require a valid session cookie from signing in.

Session-Based Auth

KolQuest uses session cookies for authentication. Sign in via the web UI using Solana wallet, Ethereum (SIWE), or email/password.

Check sessionBash
# The session cookie is automatically sent by browsers
# For programmatic access, include credentials:

curl -X GET "https://kol.quest/api/watchlist" \
  -b "session=your-session-cookie"
🔑

API Keys (Coming Soon)

API key authentication for external integrations and bots is on the roadmap. Keys will be managed from your profile dashboard.

Rate Limits

Requests are rate-limited to ensure fair usage and service stability.

TierLimitNotes
Anonymous60 req/minPer IP address
Authenticated120 req/minPer user account
Search30 req/minSearch endpoints only

Rate Limit Headers

Check response headers to monitor your rate limit status.

Bash
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 45
X-RateLimit-Reset: 1712678400
⚠️

429 Too Many Requests

If you exceed the rate limit, you'll receive a 429 response. Wait for the reset time before retrying.

API Playground

Try the API live. Pick an endpoint, customize parameters, and send requests directly from your browser.

GET http://kol.quest/api/leaderboard?timeframe=1&limit=5

API Endpoints

Complete endpoint reference. Click an endpoint to expand details, parameters, and code examples.

Wallets

KOL and smart money wallet data from KolScan and GMGN.

Tokens

Token data — trending, security analysis, smart money activity.

Trades

Real-time trade feed from tracked smart money wallets.

Social

X/Twitter integration for KOL tracking.

User (Authenticated)

Authenticated user features — requires session cookie.

Community

Community wallet submissions and vouching.

System

Health and status endpoints.

Error Codes

Standard HTTP status codes with consistent error response format.

CodeNameDescription
400Bad RequestInvalid request parameters or malformed JSON
401UnauthorizedAuthentication required or invalid credentials
403ForbiddenInsufficient permissions for this resource
404Not FoundResource not found
429Too Many RequestsRate limit exceeded — slow down
500Internal ErrorServer error — try again later
502Bad GatewayUpstream API error
503Service UnavailableService temporarily unavailable

Error Response Format

JSON
{
  "error": "RATE_LIMITED",
  "message": "Too many requests. Please slow down.",
  "retryAfter": 30
}

MCP Server

Expose wallet intelligence via the Model Context Protocol for use in AI assistants (Claude, Copilot, Cursor, etc.). Communicates over JSON-RPC via stdio.

# Run the MCP server
bun mcp/index.ts

# Claude Desktop config (~/.config/claude/claude_desktop_config.json)
{
  "mcpServers": {
    "kolquest": {
      "command": "bun",
      "args": ["mcp/index.ts"],
      "cwd": "/path/to/kol-quest"
    }
  }
}

Available Tools

Each tool is callable by the AI assistant through the MCP protocol.

Toolkolscan_leaderboard

Get KolScan KOL leaderboard. Returns wallets ranked by profit, win rate, or other metrics.

ParamTypeDescriptionRequired
timeframenumber1 (daily), 7 (weekly), 30 (monthly)—
sortstringprofit, wins, losses, winrate, name—
orderstringasc or desc—
limitnumberMax results (1-100)—
searchstringSearch by name or wallet address—
Toolkolscan_wallet

Get detailed KolScan data for a specific wallet — stats, rankings, and PnL across all timeframes.

ParamTypeDescriptionRequired
addressstringWallet address to look up✓
Toolgmgn_wallets

Get GMGN smart money wallets. Supports Solana and BSC with category filtering.

ParamTypeDescriptionRequired
chainstringsol or bsc—
categorystringsmart_degen, kol, snipe_bot, launchpad_smart, fresh_wallet, etc.—
sortstringSort field—
orderstringasc or desc—
limitnumberMax results (1-100)—
searchstringSearch by name, address, or twitter—
Toolgmgn_wallet_detail

Get detailed GMGN data for a specific wallet — profit, trades, win rates, tags, and category.

ParamTypeDescriptionRequired
addressstringWallet address to look up✓
Toolwallet_stats

Aggregate statistics across all data sources — total wallets, top performers, category breakdowns.

Toolsearch_wallets

Search across all data sources (KolScan + GMGN Solana + GMGN BSC) by name, address, or twitter.

ParamTypeDescriptionRequired
querystringSearch query✓
limitnumberMax results—

Technical Writeup

How we scraped 472 Solana KOL wallets from kolscan.io by reverse-engineering their Next.js app, discovering a hidden POST API, and using Playwright to bypass session protection.

1,304 entries472 wallets3 timeframesNext.jsPOST APIPlaywright

Data Schema

Each entry in the scraped dataset contains these fields.

FieldTypeDescription
wallet_addressstringSolana wallet address
namestringKOL display name
twitterstring|nullTwitter/X profile URL
telegramstring|nullTelegram channel URL
profitnumberProfit in SOL
winsnumberWinning trades
lossesnumberLosing trades
timeframenumber1 = Daily, 7 = Weekly, 30 = Monthly
📦

GMGN.ai Import Ready

All 472 wallets are pre-formatted for GMGN bulk import. Paste the JSON from output/gmgn-import.json.

[
  { "address": "CyaE1Vxv...", "name": "Cented", "emoji": "🐋" },
  { "address": "Bi4rd5FH...", "name": "theo",   "emoji": "💰" },
  ...
]
🐋 100+ SOL🔥 50+💰 20+✅ positive📉 negative

The Process

Step-by-step reverse engineering, from initial recon to full data extraction.

1

Initial Recon — What framework is this?

First step: fetch the raw HTML and identify the tech stack.

curl -s 'https://kolscan.io/leaderboard' -o page.html
head -100 page.html

Found /_next/static/chunks/ script tags — confirming it's a Next.js application with App Router.

2

Hunting for API Endpoints

Tried common REST patterns with GET requests:

curl -s -o /dev/null -w "%{http_code}" 'https://kolscan.io/api/leaderboard'  → 400
curl -s -o /dev/null -w "%{http_code}" 'https://kolscan.io/api/kols'          → 400
curl -s -o /dev/null -w "%{http_code}" 'https://api.kolscan.io/'              → 401

400 means the endpoints exist but reject GET requests. 401 on the API subdomain means auth required.

3

Identifying JavaScript Bundles

Extracted all script chunk URLs from the page source:

curl -s 'https://kolscan.io/leaderboard' \
  | grep -oE '"[^"]*/_next/static/chunks/[^"]*"'

Found key chunks including:

  • app/leaderboard/page-939ad755c42d8b9d.js — the leaderboard page
  • 184-3d6ce3be6906820b.js — shared API helper chunk
4

Finding the API Call in Source Code

Searched each JS chunk for /api/ paths:

for chunk in 341-*.js 184-*.js 255-*.js; do
  curl -s "https://kolscan.io/_next/static/chunks/${chunk}" \
    | grep -oP '"/api/[^"]*"'
done

Chunk 184 contained the gold: /api/trades, /api/tokens, /api/leaderboard, /api/data

5

Extracting the Exact Fetch Signature

Pulled the surrounding code context to see the full fetch call:

curl -s '.../184-*.js' | grep -oP '.{0,200}/api/leaderboard.{0,200}'

Revealed the exact implementation:

fetch("/api/leaderboard", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ timeframe: e, page: t, pageSize: n })
})

Key discovery: POST not GET. Parameters: timeframe (1/7/30), page (0-indexed), pageSize (50).

6

Direct POST Attempt — Blocked

curl -s -X POST 'https://kolscan.io/api/leaderboard' \
  -H 'Content-Type: application/json' \
  -d '{"timeframe":1,"page":0,"pageSize":50}'
→ Forbidden

Forbidden — The API requires a valid browser session. Cookie/session-based protection prevents direct curl access.

7

SSR Data Extraction — Partial Success

Discovered the page server-renders initial data via the initLeaderboard React prop:

curl -s 'https://kolscan.io/leaderboard' \
  | grep -oP '\{[^}]*wallet_address[^}]*\}' | head -5

Extracted 616 entries from the HTML — but only the first page per timeframe, and many had missing fields due to regex limits.

8

Understanding the Scroll Mechanism

By reading the full page chunk (~14KB), we found:

  • Uses react-infinite-scroll-component
  • Scroll target: scrollableTarget: "mainScroll" (not window!)
  • Page size hardcoded at 50
  • Timeframes: [1, 7, 30] → Daily / Weekly / Monthly
9

Playwright Headless Browser — First Fail

Installed Playwright to get a real browser session. First attempt scrolled window — captured 0 results.

// ❌ Wrong — infinite scroll listens on #mainScroll, not window
window.scrollTo(0, document.body.scrollHeight);

The infinite scroll component only triggers when #mainScroll is scrolled.

10

The Fix — Scroll the Right Container

// ✅ Correct — scroll the actual container
const el = document.getElementById('mainScroll');
if (el) el.scrollTop = el.scrollHeight;

Combined with intercepting POST responses and clicking between Daily/Weekly/Monthly tabs, this captured all 1,304 entries across 472 unique wallets.

11

Final Result

Daily:   434 entries (9 pages × 50 + 34)
Weekly:  435 entries (8 pages × 50 + 35)
Monthly: 435 entries (8 pages × 50 + 35)
─────────────────────────────────────────
Total:   1,304 entries
Unique:  472 wallets

Full data saved to JSON with GMGN-compatible import format generated automatically.

Key Takeaways

Check the HTTP method

This API only accepts POST, not GET

Read the JS source

Minified code still reveals exact API signatures

Protected APIs need browsers

Headless browsers bypass cookie/session protection

Scroll containers matter

Infinite scroll often binds to a specific element

SSR data is free

Next.js embeds initial page data in HTML as React props

Shared chunks hold API helpers

Look in numbered chunks (184-*.js) for fetch calls