Connections
curl --request GET \
--url https://api.cabalspy.xyz/v1/wallets/connectionsimport requests
url = "https://api.cabalspy.xyz/v1/wallets/connections"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.cabalspy.xyz/v1/wallets/connections', 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/connections",
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/connections"
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/connections")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cabalspy.xyz/v1/wallets/connections")
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_address": "7j7AA3HZR2zEjwAQEKPFh2qucLY4fqZpB9iodf39w8xW",
"blockchain": "solana",
"connections": [
{
"wallet_address": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin",
"name": "Cupsey",
"image_url": "https://cabalspy.xyz/images/9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin.png",
"twitter": "https://x.com/cupseyy",
"type": "kol",
"shared_tokens": 18,
"overlap_score": 0.375
},
{
"wallet_address": "3Cx7Wm8yQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZbXX",
"name": "",
"image_url": "",
"twitter": "",
"type": "kol",
"shared_tokens": 9,
"overlap_score": 0.187
}
]
},
"meta": {
"request_id": "req_5162c7cf7f87",
"cached": true,
"cache_age_seconds": 120,
"version": "1.0.0",
"timestamp": "2026-07-06T11:01:57Z"
}
}
Wallet data
Connections
Find wallets connected to a given wallet by shared token activity, ranked by how many tokens they traded in common over the last 30 days.
GET
/
v1
/
wallets
/
connections
Connections
curl --request GET \
--url https://api.cabalspy.xyz/v1/wallets/connectionsimport requests
url = "https://api.cabalspy.xyz/v1/wallets/connections"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.cabalspy.xyz/v1/wallets/connections', 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/connections",
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/connections"
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/connections")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cabalspy.xyz/v1/wallets/connections")
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_address": "7j7AA3HZR2zEjwAQEKPFh2qucLY4fqZpB9iodf39w8xW",
"blockchain": "solana",
"connections": [
{
"wallet_address": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin",
"name": "Cupsey",
"image_url": "https://cabalspy.xyz/images/9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin.png",
"twitter": "https://x.com/cupseyy",
"type": "kol",
"shared_tokens": 18,
"overlap_score": 0.375
},
{
"wallet_address": "3Cx7Wm8yQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZbXX",
"name": "",
"image_url": "",
"twitter": "",
"type": "kol",
"shared_tokens": 9,
"overlap_score": 0.187
}
]
},
"meta": {
"request_id": "req_5162c7cf7f87",
"cached": true,
"cache_age_seconds": 120,
"version": "1.0.0",
"timestamp": "2026-07-06T11:01:57Z"
}
}
Discover which other tracked wallets trade the same tokens as a given wallet. CabalSpy compares the tokens the wallet traded over the last 30 days against every other tracked wallet of the same type and returns those with overlap, ranked by how many tokens they share.
Use it to map clusters of wallets that move together, spot wallets that shadow a known KOL, or surface a network of related traders around one address.
overlap_score is the share of the source wallet tokens that the other wallet also traded, from 0 to 1. A higher shared_tokens count and a higher overlap_score mean a stronger connection. Results are sorted by shared_tokens, highest first.
Query Parameters
string
required
Chain of the wallet. One of solana, bnb, base, eth.
string
required
The source wallet address to find connections for.
integer
Maximum number of connections to return. Omit to return all.
string
required
Your API key. Alternatively pass it as an Authorization Bearer header.
Usage Example
curl "https://api.cabalspy.xyz/v1/wallets/connections?blockchain=solana&address=7j7AA3HZR2zEjwAQEKPFh2qucLY4fqZpB9iodf39w8xW&limit=20&api_key=YOUR_KEY"
import requests
params = {
"blockchain": "solana",
"address": "7j7AA3HZR2zEjwAQEKPFh2qucLY4fqZpB9iodf39w8xW",
"limit": 20, "api_key": "YOUR_KEY",
}
r = requests.get("https://api.cabalspy.xyz/v1/wallets/connections", params=params)
for c in r.json()["data"]["connections"]:
print(c["name"] or c["wallet_address"], "shared", c["shared_tokens"], "score", c["overlap_score"])
const p = new URLSearchParams({
blockchain: "solana",
address: "7j7AA3HZR2zEjwAQEKPFh2qucLY4fqZpB9iodf39w8xW",
limit: "20", api_key: "YOUR_KEY",
});
const res = await fetch(`https://api.cabalspy.xyz/v1/wallets/connections?${p}`);
const { data } = await res.json();
data.connections.forEach(c =>
console.log(c.name || c.wallet_address, "shared", c.shared_tokens));
Response
boolean
True on success.
object
Show data
Show data
string
The source wallet the connections were computed for.
string
Requested chain.
array
Show connection, sorted by shared_tokens highest first
Show connection, sorted by shared_tokens highest first
string
Address of the connected wallet.
string
Display name of the connected wallet (may be empty).
string
Avatar URL.
string
Twitter or X link.
string
Wallet type kol, smart or whale.
integer
Number of tokens both wallets traded in the last 30 days.
number
Share of the source wallet tokens that the connected wallet also traded, from 0 to 1.
{
"success": true,
"data": {
"wallet_address": "7j7AA3HZR2zEjwAQEKPFh2qucLY4fqZpB9iodf39w8xW",
"blockchain": "solana",
"connections": [
{
"wallet_address": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin",
"name": "Cupsey",
"image_url": "https://cabalspy.xyz/images/9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin.png",
"twitter": "https://x.com/cupseyy",
"type": "kol",
"shared_tokens": 18,
"overlap_score": 0.375
},
{
"wallet_address": "3Cx7Wm8yQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZbXX",
"name": "",
"image_url": "",
"twitter": "",
"type": "kol",
"shared_tokens": 9,
"overlap_score": 0.187
}
]
},
"meta": {
"request_id": "req_5162c7cf7f87",
"cached": true,
"cache_age_seconds": 120,
"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

