Signals History
curl --request GET \
--url https://api.cabalspy.xyz/v1/signals/historyimport requests
url = "https://api.cabalspy.xyz/v1/signals/history"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.cabalspy.xyz/v1/signals/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/signals/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/signals/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/signals/history")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cabalspy.xyz/v1/signals/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": {
"blockchain": "solana",
"wallet_types": ["kol"],
"days": 7,
"filters": {
"min_win_rate": null,
"include_wallets": null,
"exclude_wallets": null
},
"signals": [
{
"mint": "3Pkrq4MmLvDXyn1fa3sz5MekKRkZkc1iLDcz5AzWpump",
"token_name": "invisibull",
"token_supply": 1000000000,
"signal_type": "cluster",
"signal_strength": "strong",
"wallet_count": 5,
"by_type": { "kol": 5 },
"total_invested": 12.4,
"total_invested_usd": 1021.4,
"currency": "SOL",
"triggered_at": "2026-07-04T16:25:34Z",
"day": "2026-07-04",
"window": "1d",
"would_have_fired": true
}
]
},
"meta": {
"request_id": "req_5162c7cf7f87",
"cached": false,
"cache_age_seconds": 0,
"version": "1.0.0",
"timestamp": "2026-07-06T11:01:57Z"
}
}
Signals
Signals History
Historical cluster signals that would have fired on past days, useful for backtesting a KOL cluster strategy against real outcomes.
GET
/
v1
/
signals
/
history
Signals History
curl --request GET \
--url https://api.cabalspy.xyz/v1/signals/historyimport requests
url = "https://api.cabalspy.xyz/v1/signals/history"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.cabalspy.xyz/v1/signals/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/signals/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/signals/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/signals/history")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cabalspy.xyz/v1/signals/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": {
"blockchain": "solana",
"wallet_types": ["kol"],
"days": 7,
"filters": {
"min_win_rate": null,
"include_wallets": null,
"exclude_wallets": null
},
"signals": [
{
"mint": "3Pkrq4MmLvDXyn1fa3sz5MekKRkZkc1iLDcz5AzWpump",
"token_name": "invisibull",
"token_supply": 1000000000,
"signal_type": "cluster",
"signal_strength": "strong",
"wallet_count": 5,
"by_type": { "kol": 5 },
"total_invested": 12.4,
"total_invested_usd": 1021.4,
"currency": "SOL",
"triggered_at": "2026-07-04T16:25:34Z",
"day": "2026-07-04",
"window": "1d",
"would_have_fired": true
}
]
},
"meta": {
"request_id": "req_5162c7cf7f87",
"cached": false,
"cache_age_seconds": 0,
"version": "1.0.0",
"timestamp": "2026-07-06T11:01:57Z"
}
}
The historical counterpart to Signals. Returns cluster signals that would have fired on past days, so you can backtest a strategy. Each entry marks the token, how many wallets clustered, how much they invested, and when the signal triggered.
Use it to answer questions like how often did a three KOL cluster precede a move, or to replay signals for a given day.
Look back with days. Each signal carries would_have_fired and the day it belongs to, along with triggered_at, so you can line signals up against price history from your own source.
Query Parameters
string
required
Chain. One of solana, bnb, base, eth.
string
required
Wallet category kol, smart or whale.
integer
How many past days to include.
integer
default:"3"
Minimum wallets that must have clustered for a historical signal.
integer
Maximum number of signals to return.
string
required
Your API key. Alternatively pass it as an Authorization Bearer header.
Usage Example
curl "https://api.cabalspy.xyz/v1/signals/history?blockchain=solana&type=kol&days=7&api_key=YOUR_KEY"
import requests
params = {"blockchain": "solana", "type": "kol", "days": 7, "api_key": "YOUR_KEY"}
r = requests.get("https://api.cabalspy.xyz/v1/signals/history", params=params)
for s in r.json()["data"]["signals"]:
print(s["day"], s["token_name"], "wallets", s["wallet_count"], "invested", s["total_invested"])
const p = new URLSearchParams({
blockchain: "solana", type: "kol", days: "7", api_key: "YOUR_KEY",
});
const res = await fetch(`https://api.cabalspy.xyz/v1/signals/history?${p}`);
const { data } = await res.json();
data.signals.forEach(s => console.log(s.day, s.token_name, s.wallet_count));
Response
boolean
True on success.
object
Show data
Show data
string
Requested chain.
array
The wallet types included.
integer
The number of past days included.
object
Applied filters (min_win_rate, include_wallets, exclude_wallets).
array
Show historical signal
Show historical signal
string
Token mint.
string
Token name.
number
Total supply.
string
cluster.
string
strong or medium.
integer
How many wallets clustered.
object
Wallet counts split by type.
number
Total invested in the cluster (native).
number
Total invested in USD, or null if no price was available.
string
Native currency.
string
When the first buy of the cluster happened.
string
The day this signal belongs to.
string
The aggregation window, 1d.
boolean
Whether the signal would have fired under the thresholds.
{
"success": true,
"data": {
"blockchain": "solana",
"wallet_types": ["kol"],
"days": 7,
"filters": {
"min_win_rate": null,
"include_wallets": null,
"exclude_wallets": null
},
"signals": [
{
"mint": "3Pkrq4MmLvDXyn1fa3sz5MekKRkZkc1iLDcz5AzWpump",
"token_name": "invisibull",
"token_supply": 1000000000,
"signal_type": "cluster",
"signal_strength": "strong",
"wallet_count": 5,
"by_type": { "kol": 5 },
"total_invested": 12.4,
"total_invested_usd": 1021.4,
"currency": "SOL",
"triggered_at": "2026-07-04T16:25:34Z",
"day": "2026-07-04",
"window": "1d",
"would_have_fired": 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 | 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

