Signals
curl --request GET \
--url https://api.cabalspy.xyz/v1/signalsimport requests
url = "https://api.cabalspy.xyz/v1/signals"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.cabalspy.xyz/v1/signals', 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",
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"
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")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cabalspy.xyz/v1/signals")
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"],
"currency": "SOL",
"filters": {
"min_win_rate": null,
"include_wallets": null,
"exclude_wallets": null,
"min_token_age_hours": null,
"max_token_age_hours": null
},
"signals": [
{
"token": {
"mint": "3Pkrq4MmLvDXyn1fa3sz5MekKRkZkc1iLDcz5AzWpump",
"token_name": "invisibull",
"blockchain": "solana",
"currency": "SOL",
"token_supply": 1000000000,
"token_decimals": 6
},
"signal_type": "cluster",
"signal_strength": "strong",
"currency": "SOL",
"gate": { "met": true, "wallet_types": ["kol"], "thresholds": { "kol": 3 } },
"window": {
"hours": 1,
"wallet_count": 5,
"by_type": { "kol": 5 },
"total_invested": 12.4,
"total_invested_usd": 1021.4,
"first_buy_at": "2026-07-06T10:20:00Z",
"latest_buy_at": "2026-07-06T10:52:00Z",
"time_span_minutes": 32.0
},
"token_stats": {
"total_buyers": 12,
"still_holding_count": 8,
"active_count": 7,
"total_volume": 44.6,
"total_volume_usd": 3673.2,
"net_flow": 30.1,
"holders_by_type": { "kol_count": 5, "smart_count": 0, "whale_count": 0 },
"first_entry_time": "2026-07-06T09:58:00Z"
},
"wallets": [
{
"profile": {
"name": "Maze",
"image_url": "https://cabalspy.xyz/images/7j7AA3HZR2zEjwAQEKPFh2qucLY4fqZpB9iodf39w8xW.png",
"twitter": "https://x.com/MazeCCC",
"telegram": "",
"blockchain": "solana",
"currency": "SOL",
"type": "kol"
},
"wallet_type": "kol",
"win_rate": null,
"window_invested": 3.2,
"window_invested_usd": 263.6,
"window_buy_txn": 1,
"window_sell_txn": 0,
"sold_in_window": false,
"bought_at": "2026-07-06T10:20:00Z",
"realized_pnl": 0.0,
"realized_pnl_usd": 0.0,
"realized_pnl_percentage": 0.0,
"bag_pct": 100.0,
"supply_pct": 0.32,
"still_holding": true,
"is_active": true
}
]
}
]
},
"pagination": { "limit": 50, "total": 1, "has_more": false, "next_cursor": null },
"meta": {
"request_id": "req_5162c7cf7f87",
"cached": false,
"cache_age_seconds": 0,
"version": "1.0.0",
"timestamp": "2026-07-06T11:01:57Z"
}
}
Signals
Signals
Live trade signals derived from tracked wallet activity, including token clusters where several wallets buy the same token within a time window.
GET
/
v1
/
signals
Signals
curl --request GET \
--url https://api.cabalspy.xyz/v1/signalsimport requests
url = "https://api.cabalspy.xyz/v1/signals"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.cabalspy.xyz/v1/signals', 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",
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"
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")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cabalspy.xyz/v1/signals")
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"],
"currency": "SOL",
"filters": {
"min_win_rate": null,
"include_wallets": null,
"exclude_wallets": null,
"min_token_age_hours": null,
"max_token_age_hours": null
},
"signals": [
{
"token": {
"mint": "3Pkrq4MmLvDXyn1fa3sz5MekKRkZkc1iLDcz5AzWpump",
"token_name": "invisibull",
"blockchain": "solana",
"currency": "SOL",
"token_supply": 1000000000,
"token_decimals": 6
},
"signal_type": "cluster",
"signal_strength": "strong",
"currency": "SOL",
"gate": { "met": true, "wallet_types": ["kol"], "thresholds": { "kol": 3 } },
"window": {
"hours": 1,
"wallet_count": 5,
"by_type": { "kol": 5 },
"total_invested": 12.4,
"total_invested_usd": 1021.4,
"first_buy_at": "2026-07-06T10:20:00Z",
"latest_buy_at": "2026-07-06T10:52:00Z",
"time_span_minutes": 32.0
},
"token_stats": {
"total_buyers": 12,
"still_holding_count": 8,
"active_count": 7,
"total_volume": 44.6,
"total_volume_usd": 3673.2,
"net_flow": 30.1,
"holders_by_type": { "kol_count": 5, "smart_count": 0, "whale_count": 0 },
"first_entry_time": "2026-07-06T09:58:00Z"
},
"wallets": [
{
"profile": {
"name": "Maze",
"image_url": "https://cabalspy.xyz/images/7j7AA3HZR2zEjwAQEKPFh2qucLY4fqZpB9iodf39w8xW.png",
"twitter": "https://x.com/MazeCCC",
"telegram": "",
"blockchain": "solana",
"currency": "SOL",
"type": "kol"
},
"wallet_type": "kol",
"win_rate": null,
"window_invested": 3.2,
"window_invested_usd": 263.6,
"window_buy_txn": 1,
"window_sell_txn": 0,
"sold_in_window": false,
"bought_at": "2026-07-06T10:20:00Z",
"realized_pnl": 0.0,
"realized_pnl_usd": 0.0,
"realized_pnl_percentage": 0.0,
"bag_pct": 100.0,
"supply_pct": 0.32,
"still_holding": true,
"is_active": true
}
]
}
]
},
"pagination": { "limit": 50, "total": 1, "has_more": false, "next_cursor": null },
"meta": {
"request_id": "req_5162c7cf7f87",
"cached": false,
"cache_age_seconds": 0,
"version": "1.0.0",
"timestamp": "2026-07-06T11:01:57Z"
}
}
Live trade signals derived from tracked wallet activity in a recent time window. The main mode, cluster, surfaces tokens where several tracked wallets are buying at once, a strong early signal. Two more modes, entry and exit, return individual buy and sell signals in the feed format.
Use it to drive alerts, for example notify me when three or more KOLs buy the same token within an hour. Signals are derived live from the feed, so they reflect the current window every time.
Choose the mode with mode. cluster groups wallets buying the same token, entry and exit return single buy or sell events. Tune clusters with min_wallets, min_value and hours. An advanced gated mode is available by passing per type filters like kol_min_wallets and smart_min_wallets.
Query Parameters
string
required
Chain. One of solana, bnb, base, eth.
string
required
Wallet category kol, smart or whale.
string
required
Signal mode. One of cluster, entry, exit.
integer
default:"3"
cluster mode. Minimum number of wallets buying the same token to form a cluster.
number
default:"0"
Minimum trade value to consider (native).
number
default:"1"
Time window in hours to look back for signals.
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?blockchain=solana&type=kol&mode=cluster&min_wallets=3&hours=1&api_key=YOUR_KEY"
import requests
params = {
"blockchain": "solana", "type": "kol", "mode": "cluster",
"min_wallets": 3, "hours": 1, "api_key": "YOUR_KEY",
}
r = requests.get("https://api.cabalspy.xyz/v1/signals", params=params)
for s in r.json()["data"]["signals"]:
w = s["window"]
print(s["token"]["token_name"], "wallets", w["wallet_count"], "invested", w["total_invested"])
const p = new URLSearchParams({
blockchain: "solana", type: "kol", mode: "cluster",
min_wallets: "3", hours: "1", api_key: "YOUR_KEY",
});
const res = await fetch(`https://api.cabalspy.xyz/v1/signals?${p}`);
const { data } = await res.json();
data.signals.forEach(s => console.log(s.token.token_name, s.window.wallet_count));
Response
The response shape depends on mode. Below is the cluster mode, the most detailed. entry and exit return individual transactions in the same shape as the transactions feed (with holdings_after).boolean
True on success.
object
Show data
Show data
string
Requested chain.
array
The wallet types included.
string
Native currency.
object
The applied filters (min_win_rate, include_wallets, exclude_wallets, min_token_age_hours, max_token_age_hours).
array
Show signal (cluster)
Show signal (cluster)
object
Token block (mint, token_name, blockchain, currency, token_supply, token_decimals).
string
cluster.
string
strong or medium, based on how many wallets qualified.
string
Native currency.
object
Whether the gate was met and the thresholds used.
object
Show window
Show window
number
The window in hours.
integer
How many wallets bought in the window.
object
Wallet counts split by type.
number
Total invested in the window (native).
number
Total invested in USD.
string
Timestamp of the first buy in the cluster.
string
Timestamp of the latest buy in the cluster.
number
Minutes between first and latest buy.
object
Whole history token stats (total_buyers, still_holding_count, active_count, total_volume, total_volume_usd, net_flow, holders_by_type, first_entry_time).
array
Show wallet in the cluster
Show wallet in the cluster
object
Wallet profile.
string
kol, smart or whale.
number
Lifetime win rate, only when min_win_rate was requested, otherwise null.
number
Invested in the window (native).
number
Invested in the window in USD.
integer
Buys in the window.
integer
Sells in the window.
boolean
Whether the wallet also sold in the window.
string
When the wallet bought.
number
Lifetime realized PnL on this token (native). Present when trader data exists.
number
Realized PnL in USD.
number
Realized PnL percentage.
number
Percent of peak holding still held.
number
Percent of supply held.
boolean
Whether the wallet still holds.
boolean
True when bag_pct is above 1 percent.
object
Standard pagination object.
{
"success": true,
"data": {
"blockchain": "solana",
"wallet_types": ["kol"],
"currency": "SOL",
"filters": {
"min_win_rate": null,
"include_wallets": null,
"exclude_wallets": null,
"min_token_age_hours": null,
"max_token_age_hours": null
},
"signals": [
{
"token": {
"mint": "3Pkrq4MmLvDXyn1fa3sz5MekKRkZkc1iLDcz5AzWpump",
"token_name": "invisibull",
"blockchain": "solana",
"currency": "SOL",
"token_supply": 1000000000,
"token_decimals": 6
},
"signal_type": "cluster",
"signal_strength": "strong",
"currency": "SOL",
"gate": { "met": true, "wallet_types": ["kol"], "thresholds": { "kol": 3 } },
"window": {
"hours": 1,
"wallet_count": 5,
"by_type": { "kol": 5 },
"total_invested": 12.4,
"total_invested_usd": 1021.4,
"first_buy_at": "2026-07-06T10:20:00Z",
"latest_buy_at": "2026-07-06T10:52:00Z",
"time_span_minutes": 32.0
},
"token_stats": {
"total_buyers": 12,
"still_holding_count": 8,
"active_count": 7,
"total_volume": 44.6,
"total_volume_usd": 3673.2,
"net_flow": 30.1,
"holders_by_type": { "kol_count": 5, "smart_count": 0, "whale_count": 0 },
"first_entry_time": "2026-07-06T09:58:00Z"
},
"wallets": [
{
"profile": {
"name": "Maze",
"image_url": "https://cabalspy.xyz/images/7j7AA3HZR2zEjwAQEKPFh2qucLY4fqZpB9iodf39w8xW.png",
"twitter": "https://x.com/MazeCCC",
"telegram": "",
"blockchain": "solana",
"currency": "SOL",
"type": "kol"
},
"wallet_type": "kol",
"win_rate": null,
"window_invested": 3.2,
"window_invested_usd": 263.6,
"window_buy_txn": 1,
"window_sell_txn": 0,
"sold_in_window": false,
"bought_at": "2026-07-06T10:20:00Z",
"realized_pnl": 0.0,
"realized_pnl_usd": 0.0,
"realized_pnl_percentage": 0.0,
"bag_pct": 100.0,
"supply_pct": 0.32,
"still_holding": true,
"is_active": true
}
]
}
]
},
"pagination": { "limit": 50, "total": 1, "has_more": false, "next_cursor": null },
"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, type or mode missing or invalid. |
| 401 | unauthorized | API key missing. |
| 403 | forbidden | API key invalid or credits exhausted. |
| 429 | rate_limited | Rate limit exceeded. |
⌘I

