List Organizations
cURL
Copy
curl -X GET "https://api.shoal.xyz/v1/organizations/all?limit=5" \
-H "Authorization: Bearer YOUR_API_KEY"
Python
Copy
import os, requests
API_KEY = os.environ.get("SHOAL_API_KEY", "YOUR_API_KEY")
r = requests.get(
"https://api.shoal.xyz/v1/organizations/all",
headers={"Authorization": f"Bearer {API_KEY}"},
params={"limit": 5},
)
print(r.json())
JavaScript
Copy
const API_KEY = process.env.SHOAL_API_KEY || 'YOUR_API_KEY';
const url = new URL('https://api.shoal.xyz/v1/organizations/all');
url.searchParams.set('limit', 5);
const res = await fetch(url, { headers: { Authorization: `Bearer ${API_KEY}` } });
console.log(await res.json());
Get Recent Radar Events
Thesince parameter is required on /radar/all and /signal/all.
cURL
Copy
curl -X GET "https://api.shoal.xyz/v1/radar/all?since=2026-02-01T00:00:00Z&limit=10" \
-H "Authorization: Bearer YOUR_API_KEY"
Python
Copy
requests.get(
"https://api.shoal.xyz/v1/radar/all",
headers={"Authorization": f"Bearer {API_KEY}"},
params={"since": "2026-02-01T00:00:00Z", "limit": 10}
)
JavaScript
Copy
const radarRes = await fetch(
'https://api.shoal.xyz/v1/radar/all?since=2026-02-01T00:00:00Z&limit=10',
{ headers: { Authorization: `Bearer ${API_KEY}` } }
);
Radar by Organization ID
cURL
Copy
curl -X GET "https://api.shoal.xyz/v1/radar/byOrganizationId?id=526" \
-H "Authorization: Bearer YOUR_API_KEY"
Python
Copy
requests.get(
"https://api.shoal.xyz/v1/radar/byOrganizationId",
headers={"Authorization": f"Bearer {API_KEY}"},
params={"id": 526}
)
JavaScript
Copy
const res2 = await fetch(
'https://api.shoal.xyz/v1/radar/byOrganizationId?id=526',
{ headers: { Authorization: `Bearer ${API_KEY}` } }
);
Signal by Category
cURL
Copy
curl -X GET "https://api.shoal.xyz/v1/signal/byCategory?category=partnership" \
-H "Authorization: Bearer YOUR_API_KEY"
Python
Copy
requests.get(
"https://api.shoal.xyz/v1/signal/byCategory",
headers={"Authorization": f"Bearer {API_KEY}"},
params={"category": "partnership"}
)
JavaScript
Copy
const res3 = await fetch(
'https://api.shoal.xyz/v1/signal/byCategory?category=partnership',
{ headers: { Authorization: `Bearer ${API_KEY}` } }
);
Poll for New Signals
Python
Copy
import time
cursor = "2026-02-01T00:00:00Z"
while True:
r = requests.get(
"https://api.shoal.xyz/v1/signal/all",
headers={"Authorization": f"Bearer {API_KEY}"},
params={"since": cursor},
)
data = r.json()["data"]
if data:
cursor = data[0]["latestPostTimestamp"]
for event in data:
print(event["title"], event["signal"])
time.sleep(60)
Batch Brief (Agent Workflow)
Monitor an entire portfolio in one call:cURL
Copy
curl -X GET "https://api.shoal.xyz/v1/brief/batch?ids=526,765,1024&since=2026-02-28T00:00:00Z&compact=true" \
-H "Authorization: Bearer YOUR_API_KEY"
Python
Copy
PORTFOLIO = "526,765,1024,2048"
r = requests.get(
"https://api.shoal.xyz/v1/brief/batch",
headers={"Authorization": f"Bearer {API_KEY}"},
params={"ids": PORTFOLIO, "since": "2026-02-28T00:00:00Z", "compact": "true"},
)
data = r.json()
for org in data["organizations"]:
if org["counts"]["signal"] > 0:
print(f"{org['label']}: {org['counts']['signal']} new signals")
print(f"Credits used: {data['creditCost']}")
JavaScript
Copy
const portfolio = '526,765,1024,2048';
const briefRes = await fetch(
`https://api.shoal.xyz/v1/brief/batch?ids=${portfolio}&since=2026-02-28T00:00:00Z&compact=true`,
{ headers: { Authorization: `Bearer ${API_KEY}` } }
);
const { organizations, creditCost } = await briefRes.json();
organizations
.filter(org => org.counts.signal > 0)
.forEach(org => console.log(`${org.label}: ${org.counts.signal} new signals`));
console.log(`Credits used: ${creditCost}`);
Check Your Usage
cURL
Copy
curl -X GET "https://api.shoal.xyz/v1/usage" \
-H "Authorization: Bearer YOUR_API_KEY"