Leaderboard
curl --request GET \
--url https://api.cabalspy.xyz/v1/wallets/leaderboardimport requests
url = "https://api.cabalspy.xyz/v1/wallets/leaderboard"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.cabalspy.xyz/v1/wallets/leaderboard', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.cabalspy.xyz/v1/wallets/leaderboard",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.cabalspy.xyz/v1/wallets/leaderboard"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.cabalspy.xyz/v1/wallets/leaderboard")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cabalspy.xyz/v1/wallets/leaderboard")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"blockchain": "solana",
"type": "kol",
"period": "7d",
"currency": "SOL",
"pagination": {
"total": 342,
"limit": 20,
"next_cursor": "8CvFWU1Hfmy7HkS7eWG2x8EMtQxAzCr7KcukKwspGFwB",
"has_more": true
},
"leaderboard": [
{
"wallet": "7j7AA3HZR2zEjwAQEKPFh2qucLY4fqZpB9iodf39w8xW",
"profile": {
"name": "Maze",
"image_url": "https://cabalspy.xyz/images/7j7AA3HZR2zEjwAQEKPFh2qucLY4fqZpB9iodf39w8xW.png",
"twitter": "https://x.com/MazeCCC",
"telegram": "",
"blockchain": "solana",
"currency": "SOL",
"wallet_type": "kol"
},
"period_stats": {
"period": "7d",
"total_buy": 180.25,
"total_buy_usd": 14840.6,
"total_sell": 132.25,
"total_sell_usd": 10890.65,
"total_volume": 312.5,
"total_volume_usd": 25731.25,
"realized_pnl": 48.2,
"realized_pnl_usd": 3968.6,
"realized_pnl_percentage": 26.74,
"avg_hold_time_minutes": 84.5,
"total_txn": 40,
"buy_txn": 22,
"sell_txn": 18
},
"period_win_rate_distribution": {
"win_count": 14,
"closed_count": 18,
"win_rate_percentage": 77.78
},
"period_history_tokens": {
"total_tokens": 23
}
}
]
},
"meta": {
"request_id": "req_5162c7cf7f87",
"cached": true,
"cache_age_seconds": 42,
"version": "1.0.0",
"timestamp": "2026-07-06T11:01:57Z"
}
}
Wallet data
Leaderboard
Rank tracked KOL, Smart Money and Whale wallets by trading volume for a period, with realized PnL, win rate and trade counts.
GET
/
v1
/
wallets
/
leaderboard
Leaderboard
curl --request GET \
--url https://api.cabalspy.xyz/v1/wallets/leaderboardimport requests
url = "https://api.cabalspy.xyz/v1/wallets/leaderboard"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.cabalspy.xyz/v1/wallets/leaderboard', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.cabalspy.xyz/v1/wallets/leaderboard",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.cabalspy.xyz/v1/wallets/leaderboard"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.cabalspy.xyz/v1/wallets/leaderboard")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cabalspy.xyz/v1/wallets/leaderboard")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"blockchain": "solana",
"type": "kol",
"period": "7d",
"currency": "SOL",
"pagination": {
"total": 342,
"limit": 20,
"next_cursor": "8CvFWU1Hfmy7HkS7eWG2x8EMtQxAzCr7KcukKwspGFwB",
"has_more": true
},
"leaderboard": [
{
"wallet": "7j7AA3HZR2zEjwAQEKPFh2qucLY4fqZpB9iodf39w8xW",
"profile": {
"name": "Maze",
"image_url": "https://cabalspy.xyz/images/7j7AA3HZR2zEjwAQEKPFh2qucLY4fqZpB9iodf39w8xW.png",
"twitter": "https://x.com/MazeCCC",
"telegram": "",
"blockchain": "solana",
"currency": "SOL",
"wallet_type": "kol"
},
"period_stats": {
"period": "7d",
"total_buy": 180.25,
"total_buy_usd": 14840.6,
"total_sell": 132.25,
"total_sell_usd": 10890.65,
"total_volume": 312.5,
"total_volume_usd": 25731.25,
"realized_pnl": 48.2,
"realized_pnl_usd": 3968.6,
"realized_pnl_percentage": 26.74,
"avg_hold_time_minutes": 84.5,
"total_txn": 40,
"buy_txn": 22,
"sell_txn": 18
},
"period_win_rate_distribution": {
"win_count": 14,
"closed_count": 18,
"win_rate_percentage": 77.78
},
"period_history_tokens": {
"total_tokens": 23
}
}
]
},
"meta": {
"request_id": "req_5162c7cf7f87",
"cached": true,
"cache_age_seconds": 42,
"version": "1.0.0",
"timestamp": "2026-07-06T11:01:57Z"
}
}
Rank the wallets CabalSpy tracks by trading volume over a chosen period, each enriched with period statistics such as buy and sell volume, realized PnL, average hold time and a win rate breakdown (how many closed positions were winners).
Use it to surface the hottest traders right now, build a Top KOLs this week board, spot who is rotating capital, or seed a copytrade shortlist. The leaderboard is served from a permanently cached, WebSocket driven store, so reads are fast and consistent (meta.cached tells you the cache age).
Pick the window with period, one of 6h, 1d, 7d or 30d. Without a limit you get the full ranking, set limit and page with cursor (the cursor is a wallet address) for large boards.
Query Parameters
string
required
Chain. One of solana, bnb, base, eth.
string
default:"kol"
Wallet category kol, smart or whale. Availability per chain. Solana has kol, smart, whale. BNB and Base have kol, smart. ETH has kol.
string
default:"1d"
Ranking window, one of 6h, 1d, 7d or 30d.
integer
Maximum wallets per page. Omit to return the full ranking.
string
Cursor for the next page, the pagination.next_cursor (a wallet address) from the previous response.
string
required
Your API key. Alternatively pass it as an Authorization Bearer header.
Usage Example
curl "https://api.cabalspy.xyz/v1/wallets/leaderboard?blockchain=solana&type=kol&period=7d&limit=20&api_key=YOUR_KEY"
import requests
params = {"blockchain": "solana", "type": "kol", "period": "7d", "limit": 20, "api_key": "YOUR_KEY"}
r = requests.get("https://api.cabalspy.xyz/v1/wallets/leaderboard", params=params)
for i, w in enumerate(r.json()["data"]["leaderboard"], 1):
ps = w["period_stats"]
wr = w["period_win_rate_distribution"]["win_rate_percentage"]
print(f'{i:>2}. {w["profile"]["name"] or w["wallet"]:<16} vol {ps["total_volume"]:>8.1f} win {wr:.0f}%')
const p = new URLSearchParams({
blockchain: "solana", type: "kol", period: "7d", limit: "20", api_key: "YOUR_KEY",
});
const res = await fetch(`https://api.cabalspy.xyz/v1/wallets/leaderboard?${p}`);
const { data } = await res.json();
data.leaderboard.forEach((w, i) =>
console.log(`${i + 1}. ${w.profile.name || w.wallet} vol ${w.period_stats.total_volume}`));
Response
boolean
True on success.
object
Show data
Show data
string
Requested chain.
string
Requested wallet type.
string
Ranking window 6h, 1d, 7d or 30d.
string
Native currency of the chain.
object
array
Show entry, sorted by volume highest first
Show entry, sorted by volume highest first
string
Wallet address.
object
object
Show period_stats
Show period_stats
string
The requested window.
number
Buy volume in the period (native).
number
Buy volume in USD.
number
Sell volume in the period (native).
number
Sell volume in USD.
number
Buy plus sell volume (native). This is the ranking key.
number
Buy plus sell volume in USD.
number
Realized PnL in the period (native).
number
Realized PnL in USD.
number
Realized PnL as a percentage of buy volume.
number
Average holding time in minutes.
integer
Total transactions (buys plus sells).
integer
Number of buys.
integer
Number of sells.
object
{
"success": true,
"data": {
"blockchain": "solana",
"type": "kol",
"period": "7d",
"currency": "SOL",
"pagination": {
"total": 342,
"limit": 20,
"next_cursor": "8CvFWU1Hfmy7HkS7eWG2x8EMtQxAzCr7KcukKwspGFwB",
"has_more": true
},
"leaderboard": [
{
"wallet": "7j7AA3HZR2zEjwAQEKPFh2qucLY4fqZpB9iodf39w8xW",
"profile": {
"name": "Maze",
"image_url": "https://cabalspy.xyz/images/7j7AA3HZR2zEjwAQEKPFh2qucLY4fqZpB9iodf39w8xW.png",
"twitter": "https://x.com/MazeCCC",
"telegram": "",
"blockchain": "solana",
"currency": "SOL",
"wallet_type": "kol"
},
"period_stats": {
"period": "7d",
"total_buy": 180.25,
"total_buy_usd": 14840.6,
"total_sell": 132.25,
"total_sell_usd": 10890.65,
"total_volume": 312.5,
"total_volume_usd": 25731.25,
"realized_pnl": 48.2,
"realized_pnl_usd": 3968.6,
"realized_pnl_percentage": 26.74,
"avg_hold_time_minutes": 84.5,
"total_txn": 40,
"buy_txn": 22,
"sell_txn": 18
},
"period_win_rate_distribution": {
"win_count": 14,
"closed_count": 18,
"win_rate_percentage": 77.78
},
"period_history_tokens": {
"total_tokens": 23
}
}
]
},
"meta": {
"request_id": "req_5162c7cf7f87",
"cached": true,
"cache_age_seconds": 42,
"version": "1.0.0",
"timestamp": "2026-07-06T11:01:57Z"
}
}
Errors
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_parameter | blockchain, type or period missing or invalid (for example an unknown period, or eth with whale). |
| 401 | unauthorized | API key missing. |
| 403 | forbidden | API key invalid or credits exhausted. |
| 429 | rate_limited | Rate limit exceeded. |
⌘I

