PnL Calendar
curl --request GET \
--url https://api.cabalspy.xyz/v1/wallet/pnl_calendarimport requests
url = "https://api.cabalspy.xyz/v1/wallet/pnl_calendar"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.cabalspy.xyz/v1/wallet/pnl_calendar', 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/wallet/pnl_calendar",
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/wallet/pnl_calendar"
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/wallet/pnl_calendar")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cabalspy.xyz/v1/wallet/pnl_calendar")
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": {
"wallet": "7j7AA3HZR2zEjwAQEKPFh2qucLY4fqZpB9iodf39w8xW",
"profile": {
"name": "Maze",
"image_url": "https://cabalspy.xyz/images/7j7AA3HZR2zEjwAQEKPFh2qucLY4fqZpB9iodf39w8xW.png",
"twitter": "https://x.com/MazeCCC",
"telegram": "",
"blockchain": "solana",
"currency": "SOL",
"type": "kol"
},
"months": [
{
"dates": [
{
"date": "04-07-26",
"realized_pnl": 12.4,
"realized_pnl_usd": 1020.6,
"buy_txn": 6,
"sell_txn": 5,
"txn_total": 11,
"tokens_traded": 4,
"volume": 88.5,
"total_buy": 50.25,
"total_buy_usd": 4137.6,
"total_sell": 38.25,
"total_sell_usd": 3150.4
}
],
"month": {
"month": 7,
"year": 2026,
"positive_streak": 3,
"negative_streak": 1,
"realized_pnl": 48.2,
"realized_pnl_usd": 3968.6,
"volume": 312.5,
"buy_txn": 22,
"sell_txn": 18,
"txn_total": 40,
"tokens_traded": 23,
"total_buy": 180.25,
"total_buy_usd": 14840.6,
"total_sell": 132.25,
"total_sell_usd": 10890.65
}
}
],
"dates": [],
"month": {}
},
"meta": {
"request_id": "req_5162c7cf7f87",
"cached": false,
"cache_age_seconds": 0,
"version": "1.0.0",
"timestamp": "2026-07-06T11:01:57Z"
}
}
Wallet data
PnL Calendar
Day by day realized PnL calendar for a wallet, grouped by month, with per day profit and loss, volume, trade counts and win loss streaks.
GET
/
v1
/
wallet
/
pnl_calendar
PnL Calendar
curl --request GET \
--url https://api.cabalspy.xyz/v1/wallet/pnl_calendarimport requests
url = "https://api.cabalspy.xyz/v1/wallet/pnl_calendar"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.cabalspy.xyz/v1/wallet/pnl_calendar', 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/wallet/pnl_calendar",
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/wallet/pnl_calendar"
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/wallet/pnl_calendar")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cabalspy.xyz/v1/wallet/pnl_calendar")
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": {
"wallet": "7j7AA3HZR2zEjwAQEKPFh2qucLY4fqZpB9iodf39w8xW",
"profile": {
"name": "Maze",
"image_url": "https://cabalspy.xyz/images/7j7AA3HZR2zEjwAQEKPFh2qucLY4fqZpB9iodf39w8xW.png",
"twitter": "https://x.com/MazeCCC",
"telegram": "",
"blockchain": "solana",
"currency": "SOL",
"type": "kol"
},
"months": [
{
"dates": [
{
"date": "04-07-26",
"realized_pnl": 12.4,
"realized_pnl_usd": 1020.6,
"buy_txn": 6,
"sell_txn": 5,
"txn_total": 11,
"tokens_traded": 4,
"volume": 88.5,
"total_buy": 50.25,
"total_buy_usd": 4137.6,
"total_sell": 38.25,
"total_sell_usd": 3150.4
}
],
"month": {
"month": 7,
"year": 2026,
"positive_streak": 3,
"negative_streak": 1,
"realized_pnl": 48.2,
"realized_pnl_usd": 3968.6,
"volume": 312.5,
"buy_txn": 22,
"sell_txn": 18,
"txn_total": 40,
"tokens_traded": 23,
"total_buy": 180.25,
"total_buy_usd": 14840.6,
"total_sell": 132.25,
"total_sell_usd": 10890.65
}
}
],
"dates": [],
"month": {}
},
"meta": {
"request_id": "req_5162c7cf7f87",
"cached": false,
"cache_age_seconds": 0,
"version": "1.0.0",
"timestamp": "2026-07-06T11:01:57Z"
}
}
A day by day realized PnL calendar for a wallet, grouped by month. Each day carries the realized PnL, volume, buy and sell counts and how many distinct tokens were traded. Each month adds a summary with totals and the longest winning and losing day streaks.
Use it to render a heatmap style trading calendar on a wallet profile, the kind that shows green and red days at a glance. Months are returned oldest first, and the current month updates continuously.
The response includes months, an array of all months oldest first, plus dates and month for the current month at the top level for convenience. Each day date uses the format DD-MM-YY, for example 04-07-26.
Query Parameters
string
required
Chain of the wallet. One of solana, bnb, base, eth.
string
required
The wallet address whose calendar you want.
string
required
Your API key. Alternatively pass it as an Authorization Bearer header.
Usage Example
curl "https://api.cabalspy.xyz/v1/wallet/pnl_calendar?blockchain=solana&address=7j7AA3HZR2zEjwAQEKPFh2qucLY4fqZpB9iodf39w8xW&api_key=YOUR_KEY"
import requests
params = {
"blockchain": "solana",
"address": "7j7AA3HZR2zEjwAQEKPFh2qucLY4fqZpB9iodf39w8xW",
"api_key": "YOUR_KEY",
}
r = requests.get("https://api.cabalspy.xyz/v1/wallet/pnl_calendar", params=params)
d = r.json()["data"]
for month in d["months"]:
m = month["month"]
print(m["year"], m["month"], "pnl", m["realized_pnl"], "streak", m["positive_streak"])
for day in month["dates"]:
print(" ", day["date"], day["realized_pnl"])
const p = new URLSearchParams({
blockchain: "solana",
address: "7j7AA3HZR2zEjwAQEKPFh2qucLY4fqZpB9iodf39w8xW",
api_key: "YOUR_KEY",
});
const res = await fetch(`https://api.cabalspy.xyz/v1/wallet/pnl_calendar?${p}`);
const { data } = await res.json();
data.months.forEach(month =>
month.dates.forEach(day => console.log(day.date, day.realized_pnl)));
Response
boolean
True on success.
object
Show data
Show data
string
The wallet address.
object
Wallet profile (name, image_url, twitter, telegram, blockchain, currency, type).
array
Show month
Show month
array
Show day
Show day
string
Day in the format DD-MM-YY, for example 04-07-26.
number
Realized PnL for the day (native). Positive is a green day, negative a red day.
number
Realized PnL for the day in USD.
integer
Number of buys that day.
integer
Number of sells that day.
integer
Total transactions that day.
integer
Distinct tokens traded that day.
number
Buy plus sell volume that day (native).
number
Total bought that day (native).
number
Total bought that day in USD.
number
Total sold that day (native).
number
Total sold that day in USD.
object
Show month summary
Show month summary
integer
Month number 1 to 12.
integer
Year.
integer
Longest run of consecutive profitable days in the month.
integer
Longest run of consecutive losing days in the month.
number
Total realized PnL for the month (native).
number
Total realized PnL for the month in USD.
number
Total volume for the month (native).
integer
Total buys in the month.
integer
Total sells in the month.
integer
Total transactions in the month.
integer
Distinct tokens traded in the month.
number
Total bought in the month (native).
number
Total bought in the month in USD.
number
Total sold in the month (native).
number
Total sold in the month in USD.
array
Convenience copy of the current month dates array (same shape as months dates).
object
Convenience copy of the current month summary (same shape as months month).
{
"success": true,
"data": {
"wallet": "7j7AA3HZR2zEjwAQEKPFh2qucLY4fqZpB9iodf39w8xW",
"profile": {
"name": "Maze",
"image_url": "https://cabalspy.xyz/images/7j7AA3HZR2zEjwAQEKPFh2qucLY4fqZpB9iodf39w8xW.png",
"twitter": "https://x.com/MazeCCC",
"telegram": "",
"blockchain": "solana",
"currency": "SOL",
"type": "kol"
},
"months": [
{
"dates": [
{
"date": "04-07-26",
"realized_pnl": 12.4,
"realized_pnl_usd": 1020.6,
"buy_txn": 6,
"sell_txn": 5,
"txn_total": 11,
"tokens_traded": 4,
"volume": 88.5,
"total_buy": 50.25,
"total_buy_usd": 4137.6,
"total_sell": 38.25,
"total_sell_usd": 3150.4
}
],
"month": {
"month": 7,
"year": 2026,
"positive_streak": 3,
"negative_streak": 1,
"realized_pnl": 48.2,
"realized_pnl_usd": 3968.6,
"volume": 312.5,
"buy_txn": 22,
"sell_txn": 18,
"txn_total": 40,
"tokens_traded": 23,
"total_buy": 180.25,
"total_buy_usd": 14840.6,
"total_sell": 132.25,
"total_sell_usd": 10890.65
}
}
],
"dates": [],
"month": {}
},
"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 missing or invalid. |
| 401 | unauthorized | API key missing. |
| 403 | forbidden | API key invalid or credits exhausted. |
| 429 | rate_limited | Rate limit exceeded. |
⌘I

