Get Top Signals
curl --request GET \
--url https://api.shoal.xyz/v1/signal/top \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.shoal.xyz/v1/signal/top"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.shoal.xyz/v1/signal/top', 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.shoal.xyz/v1/signal/top",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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.shoal.xyz/v1/signal/top"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
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.shoal.xyz/v1/signal/top")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.shoal.xyz/v1/signal/top")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_bodySignal
Get Top Signals
Get the highest-scoring signal events
GET
/
v1
/
signal
/
top
Get Top Signals
curl --request GET \
--url https://api.shoal.xyz/v1/signal/top \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.shoal.xyz/v1/signal/top"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.shoal.xyz/v1/signal/top', 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.shoal.xyz/v1/signal/top",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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.shoal.xyz/v1/signal/top"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
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.shoal.xyz/v1/signal/top")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.shoal.xyz/v1/signal/top")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_bodyReturns the highest-scoring signal events, sorted by
Events are sorted by
signal score descending. Use this to quickly surface the most important events without fetching and sorting the full signal feed yourself. Great for headline widgets, alert summaries, or “top stories” sections.
Query Parameters
limit(integer, default: 10, max: 50)
Request
cURL
curl -X GET "https://api.shoal.xyz/v1/signal/top?limit=10" \
-H "Authorization: Bearer YOUR_API_KEY"
Response (200)
{
"limit": 10,
"data": [
{
"id": 707,
"title": "Event Title",
"eventCategory": "partnership",
"eventSubcategory": "acquisition",
"globalSummary": "Summary of the event.",
"bulletSummary": ["Bullet point 1.", "Bullet point 2."],
"eventOwner": [
{
"id": 965,
"label": "Organization Name",
"type": "project",
"aliases": []
}
],
"eventParticipants": [],
"posts": [
{
"id": 46970,
"content": "Post content",
"url": "https://x.com/...",
"timestamp": "2026-02-28T06:18:44+00:00"
}
],
"latestPostTimestamp": "2026-02-28T06:18:44.000Z",
"signal": 12.45
}
]
}
signal score descending. Use this to surface the most important events in a single call instead of fetching all signals and sorting client-side.⌘I