History
curl --request GET \
--url https://api.cabalspy.xyz/v1/wallets/historyimport requests
url = "https://api.cabalspy.xyz/v1/wallets/history"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.cabalspy.xyz/v1/wallets/history', 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/history",
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/history"
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/history")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cabalspy.xyz/v1/wallets/history")
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": {
"profile": {
"wallet_address": "7j7AA3HZR2zEjwAQEKPFh2qucLY4fqZpB9iodf39w8xW",
"name": "Maze",
"image_url": "https://cabalspy.xyz/images/7j7AA3HZR2zEjwAQEKPFh2qucLY4fqZpB9iodf39w8xW.png",
"twitter": "https://x.com/MazeCCC",
"telegram": "",
"blockchain": "solana",
"type": "kol",
"currency": "SOL"
},
"lifetime_stats": {
"currency": "SOL",
"buy": 1840.5,
"sell": 2010.75,
"realized_pnl": 170.25,
"realized_pnl_percentage": 9.25,
"buy_txn": 412,
"sell_txn": 388,
"total_tx_count": 800,
"win_rate": 61.34,
"win_count": 138,
"total_sold": 225,
"active_tokens_count": 240,
"largest_buy": 42.0,
"best_trade_pnl": 88.6,
"worst_trade_pnl": -19.4,
"still_holding_count": 15
},
"win_rate_distribution": {
"above_500": 6,
"above_100_to_500": 28,
"above_zero_to_100": 104,
"below_zero": 87
},
"token_overview": [
{
"mint": "3Pkrq4MmLvDXyn1fa3sz5MekKRkZkc1iLDcz5AzWpump",
"token_name": "invisibull",
"invested": 1.66,
"sold": 0.0,
"realized_pnl": -1.66,
"realized_pnl_percentage": -100.0,
"currency": "SOL",
"buy_txn": 1,
"sell_txn": 0,
"first_seen": "2026-07-04T16:25:34Z",
"last_seen": "2026-07-04T16:25:34Z",
"still_holding": true
}
],
"trades": [
{
"tx_signature": "5xr8abc...",
"mint": "3Pkrq4MmLvDXyn1fa3sz5MekKRkZkc1iLDcz5AzWpump",
"token_name": "invisibull",
"transaction_type": "buy",
"value": 1.66,
"currency": "SOL",
"created_at": "2026-07-04T16:25:34Z"
}
],
"pagination": {
"limit": 50,
"next_cursor": "MjAyNi0wNy0wNFQxNjoyNTozNFp8NXhyOGFiYw==",
"has_more": true
}
},
"meta": {
"request_id": "req_5162c7cf7f87",
"cached": false,
"cache_age_seconds": 0,
"version": "1.0.0",
"timestamp": "2026-07-06T11:01:57Z"
}
}
Wallet data
History
Complete lifetime trading history of a wallet, with lifetime stats, win rate distribution, a per token overview and a paginated trade log.
GET
/
v1
/
wallets
/
history
History
curl --request GET \
--url https://api.cabalspy.xyz/v1/wallets/historyimport requests
url = "https://api.cabalspy.xyz/v1/wallets/history"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.cabalspy.xyz/v1/wallets/history', 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/history",
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/history"
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/history")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cabalspy.xyz/v1/wallets/history")
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": {
"profile": {
"wallet_address": "7j7AA3HZR2zEjwAQEKPFh2qucLY4fqZpB9iodf39w8xW",
"name": "Maze",
"image_url": "https://cabalspy.xyz/images/7j7AA3HZR2zEjwAQEKPFh2qucLY4fqZpB9iodf39w8xW.png",
"twitter": "https://x.com/MazeCCC",
"telegram": "",
"blockchain": "solana",
"type": "kol",
"currency": "SOL"
},
"lifetime_stats": {
"currency": "SOL",
"buy": 1840.5,
"sell": 2010.75,
"realized_pnl": 170.25,
"realized_pnl_percentage": 9.25,
"buy_txn": 412,
"sell_txn": 388,
"total_tx_count": 800,
"win_rate": 61.34,
"win_count": 138,
"total_sold": 225,
"active_tokens_count": 240,
"largest_buy": 42.0,
"best_trade_pnl": 88.6,
"worst_trade_pnl": -19.4,
"still_holding_count": 15
},
"win_rate_distribution": {
"above_500": 6,
"above_100_to_500": 28,
"above_zero_to_100": 104,
"below_zero": 87
},
"token_overview": [
{
"mint": "3Pkrq4MmLvDXyn1fa3sz5MekKRkZkc1iLDcz5AzWpump",
"token_name": "invisibull",
"invested": 1.66,
"sold": 0.0,
"realized_pnl": -1.66,
"realized_pnl_percentage": -100.0,
"currency": "SOL",
"buy_txn": 1,
"sell_txn": 0,
"first_seen": "2026-07-04T16:25:34Z",
"last_seen": "2026-07-04T16:25:34Z",
"still_holding": true
}
],
"trades": [
{
"tx_signature": "5xr8abc...",
"mint": "3Pkrq4MmLvDXyn1fa3sz5MekKRkZkc1iLDcz5AzWpump",
"token_name": "invisibull",
"transaction_type": "buy",
"value": 1.66,
"currency": "SOL",
"created_at": "2026-07-04T16:25:34Z"
}
],
"pagination": {
"limit": 50,
"next_cursor": "MjAyNi0wNy0wNFQxNjoyNTozNFp8NXhyOGFiYw==",
"has_more": true
}
},
"meta": {
"request_id": "req_5162c7cf7f87",
"cached": false,
"cache_age_seconds": 0,
"version": "1.0.0",
"timestamp": "2026-07-06T11:01:57Z"
}
}
The full lifetime record of a wallet. Returns aggregate lifetime statistics, a win rate distribution across profit buckets, a per token overview of everything the wallet has traded, and a paginated log of individual trades newest first.
Where the tracker focuses on a single period, history covers the entire life of the wallet. Use it for a complete profile page, tax style trade exports, or deep research on a trader.
The trade log is paginated. Read pagination.next_cursor from the response and pass it back as cursor to fetch the next page. When next_cursor is null you have reached the end.
Query Parameters
string
required
Chain of the wallet. 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.
string
required
The wallet address whose history you want.
integer
default:"50"
Number of trades per page in the trade log.
string
Cursor for the next page of trades, the pagination.next_cursor from the previous response. Empty means from the newest trade.
string
required
Your API key. Alternatively pass it as an Authorization Bearer header.
Usage Example
curl "https://api.cabalspy.xyz/v1/wallets/history?blockchain=solana&type=kol&address=7j7AA3HZR2zEjwAQEKPFh2qucLY4fqZpB9iodf39w8xW&limit=50&api_key=YOUR_KEY"
import requests
params = {
"blockchain": "solana", "type": "kol",
"address": "7j7AA3HZR2zEjwAQEKPFh2qucLY4fqZpB9iodf39w8xW",
"limit": 50, "api_key": "YOUR_KEY",
}
r = requests.get("https://api.cabalspy.xyz/v1/wallets/history", params=params)
d = r.json()["data"]
print("lifetime pnl", d["lifetime_stats"]["realized_pnl"], d["lifetime_stats"]["currency"])
for t in d["trades"]:
print(t["created_at"], t["transaction_type"], t["token_name"], t["value"])
nxt = d["pagination"]["next_cursor"]
if nxt:
params["cursor"] = nxt
const p = new URLSearchParams({
blockchain: "solana", type: "kol",
address: "7j7AA3HZR2zEjwAQEKPFh2qucLY4fqZpB9iodf39w8xW",
limit: "50", api_key: "YOUR_KEY",
});
const res = await fetch(`https://api.cabalspy.xyz/v1/wallets/history?${p}`);
const { data } = await res.json();
data.trades.forEach(t => console.log(t.created_at, t.transaction_type, t.token_name));
Response
boolean
True on success.
object
Show data
Show data
object
object
Show lifetime_stats
Show lifetime_stats
string
Native currency.
number
Total bought over the wallet lifetime (native).
number
Total sold over the wallet lifetime (native).
number
Lifetime realized PnL (native).
number
Lifetime realized PnL percentage.
integer
Total buys.
integer
Total sells.
integer
Total transactions.
number
Win rate as a percentage.
integer
Number of winning positions.
integer
Number of closed positions.
integer
Number of tokens with any activity.
number
Largest single buy (native).
number
Best single trade realized PnL.
number
Worst single trade realized PnL.
integer
Number of positions still open.
object
array
Show token
Show token
string
Token mint.
string
Token name.
number
Total invested in this token (native).
number
Total sold value of this token (native).
number
Realized PnL on this token (native).
number
Realized PnL percentage.
string
Native currency.
integer
Buys on this token.
integer
Sells on this token.
string
ISO timestamp of the first trade on this token.
string
ISO timestamp of the most recent trade on this token.
boolean
Whether the wallet still holds a meaningful position.
array
{
"success": true,
"data": {
"profile": {
"wallet_address": "7j7AA3HZR2zEjwAQEKPFh2qucLY4fqZpB9iodf39w8xW",
"name": "Maze",
"image_url": "https://cabalspy.xyz/images/7j7AA3HZR2zEjwAQEKPFh2qucLY4fqZpB9iodf39w8xW.png",
"twitter": "https://x.com/MazeCCC",
"telegram": "",
"blockchain": "solana",
"type": "kol",
"currency": "SOL"
},
"lifetime_stats": {
"currency": "SOL",
"buy": 1840.5,
"sell": 2010.75,
"realized_pnl": 170.25,
"realized_pnl_percentage": 9.25,
"buy_txn": 412,
"sell_txn": 388,
"total_tx_count": 800,
"win_rate": 61.34,
"win_count": 138,
"total_sold": 225,
"active_tokens_count": 240,
"largest_buy": 42.0,
"best_trade_pnl": 88.6,
"worst_trade_pnl": -19.4,
"still_holding_count": 15
},
"win_rate_distribution": {
"above_500": 6,
"above_100_to_500": 28,
"above_zero_to_100": 104,
"below_zero": 87
},
"token_overview": [
{
"mint": "3Pkrq4MmLvDXyn1fa3sz5MekKRkZkc1iLDcz5AzWpump",
"token_name": "invisibull",
"invested": 1.66,
"sold": 0.0,
"realized_pnl": -1.66,
"realized_pnl_percentage": -100.0,
"currency": "SOL",
"buy_txn": 1,
"sell_txn": 0,
"first_seen": "2026-07-04T16:25:34Z",
"last_seen": "2026-07-04T16:25:34Z",
"still_holding": true
}
],
"trades": [
{
"tx_signature": "5xr8abc...",
"mint": "3Pkrq4MmLvDXyn1fa3sz5MekKRkZkc1iLDcz5AzWpump",
"token_name": "invisibull",
"transaction_type": "buy",
"value": 1.66,
"currency": "SOL",
"created_at": "2026-07-04T16:25:34Z"
}
],
"pagination": {
"limit": 50,
"next_cursor": "MjAyNi0wNy0wNFQxNjoyNTozNFp8NXhyOGFiYw==",
"has_more": true
}
},
"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 | address is missing. |
| 400 | invalid_parameter | blockchain or type missing or invalid. |
| 401 | unauthorized | API key missing. |
| 403 | forbidden | API key invalid or credits exhausted. |
| 429 | rate_limited | Rate limit exceeded. |
⌘I

