Months are ordered oldest first. The current month is also returned on its own as month, with its days in dates, so a calendar for this month needs no extra work.
Query Parameters
string
required
Chain of the wallet. One of solana, bnb, base, eth, rh.
string
required
A wallet verified on this chain by one of your users.
string
default:"instance"
global allows any CabalSpy ID wallet. Enterprise plan only.string
Your Instance ID. Only needed when your account has several instances.
string
required
Your API key. Alternatively pass it as an Authorization Bearer header.
Usage Example
curl "https://api-id.cabalspy.xyz/v1/wallets/pnl_calendar?blockchain=solana&address=7j7AA3HZR2zEjwAQEKPFh2qucLY4fqZpB9iodf39w8xW" \
-H "Authorization: Bearer YOUR_KEY"
import requests
params = {"blockchain": "solana", "address": "7j7AA3HZR2zEjwAQEKPFh2qucLY4fqZpB9iodf39w8xW"}
r = requests.get("https://api-id.cabalspy.xyz/v1/wallets/pnl_calendar", params=params,
headers={"Authorization": "Bearer YOUR_KEY"})
for m in r.json()["data"]["months"]:
print(m["year"], m["month"], m["realized_pnl"], "best streak", m["positive_streak"])
const p = new URLSearchParams({
blockchain: "solana",
address: "7j7AA3HZR2zEjwAQEKPFh2qucLY4fqZpB9iodf39w8xW",
});
const res = await fetch(`https://api-id.cabalspy.xyz/v1/wallets/pnl_calendar?${p}`, {
headers: { Authorization: "Bearer YOUR_KEY" },
});
const { data } = await res.json();
data.dates.forEach(d => console.log(d.date, d.realized_pnl));
Response
boolean
True on success.
object
Show data
Show data
string
The wallet address.
array
Show month
Show month
integer
Month, 1 to 12.
integer
Year.
array
Days with trades in this month, see day below.
number
Realized PnL in the month (native).
number
Realized PnL in USD.
number
Buy plus sell volume (native).
number
Bought (native).
number
Bought in USD.
number
Sold (native).
number
Sold in USD.
integer
Buys.
integer
Sells.
integer
All trades.
integer
Distinct tokens traded in the month.
integer
Longest run of consecutive trading days in profit.
integer
Longest run of consecutive trading days at a loss.
integer
Current month only: the running profit streak.
integer
Current month only: the running loss streak.
array
Show day
Show day
string
UTC day as dd-mm-yy.
number
Realized PnL of the day (native), sells minus buys.
number
Realized PnL in USD.
integer
Buys.
integer
Sells.
integer
All trades.
integer
Distinct tokens traded.
number
Buy plus sell volume (native).
number
Bought (native).
number
Sold (native).
number
Bought in USD.
number
Sold in USD.
object
The current month, the same shape as an entry of months, or null when the wallet has no trades this month.
{
"success": true,
"data": {
"wallet": "7j7AA3HZR2zEjwAQEKPFh2qucLY4fqZpB9iodf39w8xW",
"profile": {
"csid_id": "0b7c4a52-3f1e-4f43-9d0a-2b5e7c1d9a11",
"username": "MazeCCC",
"name": "Maze",
"image_url": "https://pbs.twimg.com/profile_images/.../photo.jpg",
"twitter": "https://x.com/MazeCCC",
"telegram": "",
"blockchain": "solana",
"currency": "SOL",
"type": "csid",
"kol": true,
"active_hours": "",
"profile_url": "https://id.cabalspy.xyz/u/MazeCCC"
},
"months": [
{
"month": 10,
"year": 2026,
"dates": [
{
"date": "12-10-26",
"realized_pnl": 4.12,
"realized_pnl_usd": 339.21,
"buy_txn": 6,
"sell_txn": 5,
"txn_total": 11,
"tokens_traded": 4,
"volume": 30.5,
"total_buy": 13.19,
"total_sell": 17.31,
"total_buy_usd": 1086.1,
"total_sell_usd": 1425.31
}
],
"realized_pnl": 4.12,
"realized_pnl_usd": 339.21,
"volume": 30.5,
"total_buy": 13.19,
"total_buy_usd": 1086.1,
"total_sell": 17.31,
"total_sell_usd": 1425.31,
"buy_txn": 6,
"sell_txn": 5,
"txn_total": 11,
"tokens_traded": 4,
"positive_streak": 1,
"negative_streak": 0,
"current_positive_streak": 1,
"current_negative_streak": 0
}
],
"dates": [
{
"date": "12-10-26",
"realized_pnl": 4.12,
"realized_pnl_usd": 339.21,
"buy_txn": 6,
"sell_txn": 5,
"txn_total": 11,
"tokens_traded": 4,
"volume": 30.5,
"total_buy": 13.19,
"total_sell": 17.31,
"total_buy_usd": 1086.1,
"total_sell_usd": 1425.31
}
],
"month": { "month": 10, "year": 2026, "...": "same as months[-1]" }
},
"meta": {
"request_id": "req_5162c7cf7f87",
"cached": false,
"cache_age_seconds": 0,
"version": "v1",
"timestamp": "2026-10-13T08:04:11Z"
}
}
Errors
| Status | Code | Meaning |
|---|---|---|
| 400 | missing_parameter | blockchain or address is missing. |
| 400 | invalid_parameter | blockchain or address invalid. |
| 401 | missing_api_key | API key missing. |
| 403 | invalid_api_key | API key invalid or not enabled for CabalSpy ID. |
| 403 | scope_not_allowed | scope=global needs the Enterprise plan. |
| 404 | wallet_not_found | The wallet is not verified on this chain by one of your users. |
| 429 | rate_limit_exceeded | Rate limit exceeded. |

