List
curl --request GET \
--url https://api.cabalspy.xyz/v1/walletsimport requests
url = "https://api.cabalspy.xyz/v1/wallets"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.cabalspy.xyz/v1/wallets', 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",
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"
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")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cabalspy.xyz/v1/wallets")
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",
"currency": "SOL",
"pagination": {
"total": 342,
"limit": 50,
"next_cursor": "8CvFWU1Hfmy7HkS7eWG2x8EMtQxAzCr7KcukKwspGFwB",
"has_more": true
},
"wallets": [
{
"wallet_address": "7j7AA3HZR2zEjwAQEKPFh2qucLY4fqZpB9iodf39w8xW",
"name": "Maze",
"image_url": "https://cabalspy.xyz/images/7j7AA3HZR2zEjwAQEKPFh2qucLY4fqZpB9iodf39w8xW.png",
"twitter": "https://x.com/MazeCCC",
"telegram": "",
"copytrade_link": "https://t.me/WizGandalfBot?start=r-U7TSHAWUWN-7j7AA",
"blockchain": "solana",
"type": "kol",
"currency": "SOL"
}
]
},
"meta": {
"request_id": "req_5162c7cf7f87",
"cached": false,
"cache_age_seconds": 0,
"version": "1.0.0",
"timestamp": "2026-07-06T11:01:57Z"
}
}
Wallet data
List
Fetch all tracked KOL, Smart Money and Whale wallets on Solana, BNB, Base and ETH with name, avatar, socials and copytrade link.
GET
/
v1
/
wallets
List
curl --request GET \
--url https://api.cabalspy.xyz/v1/walletsimport requests
url = "https://api.cabalspy.xyz/v1/wallets"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.cabalspy.xyz/v1/wallets', 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",
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"
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")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cabalspy.xyz/v1/wallets")
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",
"currency": "SOL",
"pagination": {
"total": 342,
"limit": 50,
"next_cursor": "8CvFWU1Hfmy7HkS7eWG2x8EMtQxAzCr7KcukKwspGFwB",
"has_more": true
},
"wallets": [
{
"wallet_address": "7j7AA3HZR2zEjwAQEKPFh2qucLY4fqZpB9iodf39w8xW",
"name": "Maze",
"image_url": "https://cabalspy.xyz/images/7j7AA3HZR2zEjwAQEKPFh2qucLY4fqZpB9iodf39w8xW.png",
"twitter": "https://x.com/MazeCCC",
"telegram": "",
"copytrade_link": "https://t.me/WizGandalfBot?start=r-U7TSHAWUWN-7j7AA",
"blockchain": "solana",
"type": "kol",
"currency": "SOL"
}
]
},
"meta": {
"request_id": "req_5162c7cf7f87",
"cached": false,
"cache_age_seconds": 0,
"version": "1.0.0",
"timestamp": "2026-07-06T11:01:57Z"
}
}
Return every wallet CabalSpy tracks for a given chain and wallet type. Each entry carries the public profile (display name, avatar, Twitter/Telegram and the copytrade link) so you can label wallets across your terminal.
This is the starting point of most integrations: fetch the list once, cache the profiles, then resolve those addresses against the token and transaction endpoints.
Without a limit you get all wallets in a single response. For paged loading, set limit and walk through pages using the next_cursor from the previous response. Addresses are sorted alphabetically, so pagination stays deterministic.
Query Parameters
string
required
Chain of the wallets. One of solana, bnb, base, eth.
string
required
Wallet category kol, smart or whale. Availability per chain. Solana has kol, smart, whale. BNB and Base have kol, smart. ETH has kol.
integer
Maximum number of wallets per page. Omit to return all wallets in one response.
string
Cursor for the next page, the pagination.next_cursor value from the previous response. Empty means from the start.
string
required
Your API key. Alternatively pass it as an Authorization Bearer header.
Usage Example
curl "https://api.cabalspy.xyz/v1/wallets?blockchain=solana&type=kol&limit=50&api_key=YOUR_KEY"
import requests
params = {"blockchain": "solana", "type": "kol", "limit": 50, "api_key": "YOUR_KEY"}
r = requests.get("https://api.cabalspy.xyz/v1/wallets", params=params)
for w in r.json()["data"]["wallets"]:
print(w["name"] or w["wallet_address"], "->", w["twitter"])
const p = new URLSearchParams({
blockchain: "solana", type: "kol", limit: "50", api_key: "YOUR_KEY",
});
const res = await fetch(`https://api.cabalspy.xyz/v1/wallets?${p}`);
const { data } = await res.json();
data.wallets.forEach(w => console.log(w.name || w.wallet_address, "->", w.twitter));
Response
boolean
True on success.
object
Show data
Show data
string
Requested chain.
string
Requested wallet type.
string
Native currency of the chain (SOL, BNB, ETH).
array
{
"success": true,
"data": {
"blockchain": "solana",
"type": "kol",
"currency": "SOL",
"pagination": {
"total": 342,
"limit": 50,
"next_cursor": "8CvFWU1Hfmy7HkS7eWG2x8EMtQxAzCr7KcukKwspGFwB",
"has_more": true
},
"wallets": [
{
"wallet_address": "7j7AA3HZR2zEjwAQEKPFh2qucLY4fqZpB9iodf39w8xW",
"name": "Maze",
"image_url": "https://cabalspy.xyz/images/7j7AA3HZR2zEjwAQEKPFh2qucLY4fqZpB9iodf39w8xW.png",
"twitter": "https://x.com/MazeCCC",
"telegram": "",
"copytrade_link": "https://t.me/WizGandalfBot?start=r-U7TSHAWUWN-7j7AA",
"blockchain": "solana",
"type": "kol",
"currency": "SOL"
}
]
},
"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 | invalid_parameter | blockchain or type missing, or the combination does not exist (for example eth with whale). |
| 401 | unauthorized | API key missing. |
| 403 | forbidden | API key invalid or credits exhausted. |
| 429 | rate_limited | Rate limit exceeded. |
⌘I

