Holders
curl --request GET \
--url https://api.cabalspy.xyz/v1/tokens/holdersimport requests
url = "https://api.cabalspy.xyz/v1/tokens/holders"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.cabalspy.xyz/v1/tokens/holders', 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/tokens/holders",
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/tokens/holders"
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/tokens/holders")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cabalspy.xyz/v1/tokens/holders")
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": {
"token": {
"mint": "3Pkrq4MmLvDXyn1fa3sz5MekKRkZkc1iLDcz5AzWpump",
"token_name": "invisibull",
"blockchain": "solana",
"currency": "SOL",
"token_supply": 1000000000,
"token_decimals": 6,
"market_cap": 40.08,
"market_cap_usd": 3301.2,
"market_cap_currency": "SOL",
"price": 4.008e-8,
"price_usd": 3.3e-6,
"sol_price_usd": 82.36
},
"total_holders": {
"kol_count": 1,
"smart_count": 0,
"whale_count": 0,
"still_holding_count": 1
},
"holders": [
{
"profile": {
"name": "Maze",
"image_url": "https://cabalspy.xyz/images/7j7AA3HZR2zEjwAQEKPFh2qucLY4fqZpB9iodf39w8xW.png",
"twitter": "https://x.com/MazeCCC",
"telegram": "",
"blockchain": "solana",
"currency": "SOL",
"type": "kol"
},
"holdings": {
"token_amount": 22113972.03,
"token_amount_peak": 22113972.03,
"supply_pct": 2.211397,
"supply_pct_peak": 2.211397,
"bag_pct": 100.0,
"still_holding": true,
"unrealized_pnl_sol": -0.099817,
"unrealized_pnl_usd": -8.22,
"unrealized_pnl_pct": -10.12,
"remaining_sol": 0.886537,
"remaining_usd": 73.02,
"entry_market_cap": 44.6,
"entry_market_cap_usd": 3673.2
}
}
]
},
"pagination": {
"limit": 50,
"total": 1,
"has_more": false,
"next_cursor": null
},
"meta": {
"request_id": "req_5162c7cf7f87",
"cached": false,
"cache_age_seconds": 0,
"version": "1.0.0",
"timestamp": "2026-07-06T11:01:57Z"
}
}
Tokens
Holders
The tracked wallets holding a token, ranked by amount held, each with live position, unrealized PnL, remaining value and entry market cap.
GET
/
v1
/
tokens
/
holders
Holders
curl --request GET \
--url https://api.cabalspy.xyz/v1/tokens/holdersimport requests
url = "https://api.cabalspy.xyz/v1/tokens/holders"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.cabalspy.xyz/v1/tokens/holders', 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/tokens/holders",
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/tokens/holders"
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/tokens/holders")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cabalspy.xyz/v1/tokens/holders")
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": {
"token": {
"mint": "3Pkrq4MmLvDXyn1fa3sz5MekKRkZkc1iLDcz5AzWpump",
"token_name": "invisibull",
"blockchain": "solana",
"currency": "SOL",
"token_supply": 1000000000,
"token_decimals": 6,
"market_cap": 40.08,
"market_cap_usd": 3301.2,
"market_cap_currency": "SOL",
"price": 4.008e-8,
"price_usd": 3.3e-6,
"sol_price_usd": 82.36
},
"total_holders": {
"kol_count": 1,
"smart_count": 0,
"whale_count": 0,
"still_holding_count": 1
},
"holders": [
{
"profile": {
"name": "Maze",
"image_url": "https://cabalspy.xyz/images/7j7AA3HZR2zEjwAQEKPFh2qucLY4fqZpB9iodf39w8xW.png",
"twitter": "https://x.com/MazeCCC",
"telegram": "",
"blockchain": "solana",
"currency": "SOL",
"type": "kol"
},
"holdings": {
"token_amount": 22113972.03,
"token_amount_peak": 22113972.03,
"supply_pct": 2.211397,
"supply_pct_peak": 2.211397,
"bag_pct": 100.0,
"still_holding": true,
"unrealized_pnl_sol": -0.099817,
"unrealized_pnl_usd": -8.22,
"unrealized_pnl_pct": -10.12,
"remaining_sol": 0.886537,
"remaining_usd": 73.02,
"entry_market_cap": 44.6,
"entry_market_cap_usd": 3673.2
}
}
]
},
"pagination": {
"limit": 50,
"total": 1,
"has_more": false,
"next_cursor": null
},
"meta": {
"request_id": "req_5162c7cf7f87",
"cached": false,
"cache_age_seconds": 0,
"version": "1.0.0",
"timestamp": "2026-07-06T11:01:57Z"
}
}
List the tracked wallets holding a token, ranked by how much they hold. Each holder carries its profile and a live position with bag percentage, unrealized PnL, remaining value and the market cap at which it first entered. The token block carries the current market cap.
This is the data behind a holder table, the classic view that shows which KOLs and smart money are sitting in a token and whether they are up or down on the position.
The live position fields (unrealized PnL, remaining value, entry market cap) are Solana only and null on other chains. entry_market_cap is null for positions that were opened before entry tracking started. Holders are sorted by amount held, highest first, and the list is paginated with limit.
Query Parameters
string
required
Chain of the token. One of solana, bnb, base, eth.
string
required
The token mint or contract address.
string
Optional wallet category kol, smart or whale. Omit to include all categories.
integer
Maximum number of holders to return.
string
required
Your API key. Alternatively pass it as an Authorization Bearer header.
Usage Example
curl "https://api.cabalspy.xyz/v1/tokens/holders?blockchain=solana&mint=3Pkrq4MmLvDXyn1fa3sz5MekKRkZkc1iLDcz5AzWpump&limit=50&api_key=YOUR_KEY"
import requests
params = {
"blockchain": "solana",
"mint": "3Pkrq4MmLvDXyn1fa3sz5MekKRkZkc1iLDcz5AzWpump",
"limit": 50, "api_key": "YOUR_KEY",
}
r = requests.get("https://api.cabalspy.xyz/v1/tokens/holders", params=params)
d = r.json()["data"]
print("market cap", d["token"]["market_cap"])
for h in d["holders"]:
pos = h["holdings"]
print(h["profile"]["name"], "bag", pos["bag_pct"], "uPNL", pos.get("unrealized_pnl_sol"))
const p = new URLSearchParams({
blockchain: "solana",
mint: "3Pkrq4MmLvDXyn1fa3sz5MekKRkZkc1iLDcz5AzWpump",
limit: "50", api_key: "YOUR_KEY",
});
const res = await fetch(`https://api.cabalspy.xyz/v1/tokens/holders?${p}`);
const { data } = await res.json();
data.holders.forEach(h => console.log(h.profile.name, h.holdings.bag_pct));
Response
boolean
True on success.
object
Show data
Show data
object
Show token
Show token
string
Token mint or contract address.
string
Token name.
string
Chain.
string
Native currency.
number
Total supply.
integer
Token decimals.
number
Current market cap in native currency. Solana only, null otherwise.
number
Current market cap in USD. Solana only, null otherwise.
string
Currency of the market cap value (SOL), or null.
number
Current token price in native currency. Solana only.
number
Current token price in USD. Solana only.
number
SOL price in USD used for USD conversions. Solana only.
object
array
Show holder, sorted by amount held highest first
Show holder, sorted by amount held highest first
object
Wallet profile (name, image_url, twitter, telegram, blockchain, currency, type).
object
Show holdings
Show holdings
number
Tokens currently held.
number
Peak tokens held.
number
Percent of supply held.
number
Peak percent of supply held.
number
Percent of peak holding still held.
boolean
Whether the holder still holds.
number
Unrealized PnL on the remaining bag (native). Solana only. Frozen to 0 once fully sold.
number
Unrealized PnL in USD. Solana only.
number
Unrealized PnL percentage. Solana only.
number
Current value of the remaining bag (native). Solana only.
number
Current value of the remaining bag in USD. Solana only.
number
Market cap in SOL when the wallet first bought, frozen. Solana only, null for older positions.
number
Entry market cap in USD, frozen at buy time. Solana only, null for older positions.
{
"success": true,
"data": {
"token": {
"mint": "3Pkrq4MmLvDXyn1fa3sz5MekKRkZkc1iLDcz5AzWpump",
"token_name": "invisibull",
"blockchain": "solana",
"currency": "SOL",
"token_supply": 1000000000,
"token_decimals": 6,
"market_cap": 40.08,
"market_cap_usd": 3301.2,
"market_cap_currency": "SOL",
"price": 4.008e-8,
"price_usd": 3.3e-6,
"sol_price_usd": 82.36
},
"total_holders": {
"kol_count": 1,
"smart_count": 0,
"whale_count": 0,
"still_holding_count": 1
},
"holders": [
{
"profile": {
"name": "Maze",
"image_url": "https://cabalspy.xyz/images/7j7AA3HZR2zEjwAQEKPFh2qucLY4fqZpB9iodf39w8xW.png",
"twitter": "https://x.com/MazeCCC",
"telegram": "",
"blockchain": "solana",
"currency": "SOL",
"type": "kol"
},
"holdings": {
"token_amount": 22113972.03,
"token_amount_peak": 22113972.03,
"supply_pct": 2.211397,
"supply_pct_peak": 2.211397,
"bag_pct": 100.0,
"still_holding": true,
"unrealized_pnl_sol": -0.099817,
"unrealized_pnl_usd": -8.22,
"unrealized_pnl_pct": -10.12,
"remaining_sol": 0.886537,
"remaining_usd": 73.02,
"entry_market_cap": 44.6,
"entry_market_cap_usd": 3673.2
}
}
]
},
"pagination": {
"limit": 50,
"total": 1,
"has_more": false,
"next_cursor": null
},
"meta": {
"request_id": "req_5162c7cf7f87",
"cached": false,
"cache_age_seconds": 0,
"version": "1.0.0",
"timestamp": "2026-07-06T11:01:57Z"
}
}
Errors
| Status | Code | Meaning |
|---|---|---|
| 400 | missing_parameter | mint is missing. |
| 400 | invalid_parameter | blockchain or type invalid. |
| 401 | unauthorized | API key missing. |
| 403 | forbidden | API key invalid or credits exhausted. |
| 429 | rate_limited | Rate limit exceeded. |
⌘I

