Retrieve a Custom Signal Definition
curl --request GET \
--url https://www.trysignalbase.com/api/v2/signals/custom/definitions/{slug} \
--header 'Authorization: Bearer <token>'import requests
url = "https://www.trysignalbase.com/api/v2/signals/custom/definitions/{slug}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://www.trysignalbase.com/api/v2/signals/custom/definitions/{slug}', 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://www.trysignalbase.com/api/v2/signals/custom/definitions/{slug}",
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://www.trysignalbase.com/api/v2/signals/custom/definitions/{slug}"
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://www.trysignalbase.com/api/v2/signals/custom/definitions/{slug}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.trysignalbase.com/api/v2/signals/custom/definitions/{slug}")
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_body{
"success": true,
"data": {
"slug": "first_sales_leader_x7k2",
"name": "First sales leader",
"description": "The author's own company announces its first sales leader (VP Sales, Head of Sales, CRO) or founding sales hire. Not: a sales hire at a company with an existing sales team; a recruiter post about another company.",
"sourceDescription": "The author's own company announces hiring its first sales leader or is building its first sales team: a first VP Sales, Head of Sales, CRO or founding account executive. Exclude ordinary sales hires at companies that already have a sales team, and recruiter posts about other companies.",
"status": "ready",
"scope": "team",
"attributes": [
"role",
"seniority"
],
"keywordCount": 7,
"restricted": false,
"monitorId": null,
"compileError": null,
"test": {
"ranAt": "2026-11-10T09:16:40.000Z",
"mode": "global",
"fetched": 140,
"classified": 140,
"matched": 4,
"companiesChecked": 0,
"leads": [
{
"companyName": "Acme",
"companyLinkedinUrl": "https://www.linkedin.com/company/acme",
"headline": "Acme hires its first VP Sales",
"confidence": 0.91,
"sourceUrl": "https://www.linkedin.com/feed/update/urn:li:activity:7515785729281671168",
"author": "Jane Doe",
"evidenceQuotes": [
"Thrilled to welcome our first ever VP of Sales as we build out the go-to-market team."
],
"attributes": {
"role": "VP Sales",
"seniority": "vp"
},
"postedAt": "2026-11-08T14:02:00.000Z"
}
]
},
"lastRunAt": null,
"lastRunStats": null,
"activatedAt": null,
"createdAt": "2026-11-10T09:12:04.000Z",
"signals30d": 0,
"signalsTotal": 0,
"lastSignalAt": null,
"nextStep": "Compiled and tested. Review test.leads: if they are the kind of post you want, start the definition (active: true). The leads become its first signals."
},
"meta": {
"endpoint": "customSignals.get",
"creditsUsed": 0
}
}{
"success": false,
"error": "description must be 20 to 1500 characters"
}{
"success": false,
"error": "Invalid API key"
}{
"success": false,
"error": "Custom signals are part of the Pro plan."
}{
"success": false,
"error": "Custom signal not found"
}{
"success": false,
"error": "Rate limit exceeded"
}{
"success": false,
"error": "Internal server error"
}Your definitions
Retrieve a Definition
One of your team’s own definitions with its status, the compile error if any, the last test run (counts and the leads it found) and how many signals it has produced. Poll this after creating a definition. Global catalogue definitions are not readable here — see List Custom Signal Definitions. Free (0 credits).
GET
/
signals
/
custom
/
definitions
/
{slug}
Retrieve a Custom Signal Definition
curl --request GET \
--url https://www.trysignalbase.com/api/v2/signals/custom/definitions/{slug} \
--header 'Authorization: Bearer <token>'import requests
url = "https://www.trysignalbase.com/api/v2/signals/custom/definitions/{slug}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://www.trysignalbase.com/api/v2/signals/custom/definitions/{slug}', 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://www.trysignalbase.com/api/v2/signals/custom/definitions/{slug}",
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://www.trysignalbase.com/api/v2/signals/custom/definitions/{slug}"
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://www.trysignalbase.com/api/v2/signals/custom/definitions/{slug}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.trysignalbase.com/api/v2/signals/custom/definitions/{slug}")
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_body{
"success": true,
"data": {
"slug": "first_sales_leader_x7k2",
"name": "First sales leader",
"description": "The author's own company announces its first sales leader (VP Sales, Head of Sales, CRO) or founding sales hire. Not: a sales hire at a company with an existing sales team; a recruiter post about another company.",
"sourceDescription": "The author's own company announces hiring its first sales leader or is building its first sales team: a first VP Sales, Head of Sales, CRO or founding account executive. Exclude ordinary sales hires at companies that already have a sales team, and recruiter posts about other companies.",
"status": "ready",
"scope": "team",
"attributes": [
"role",
"seniority"
],
"keywordCount": 7,
"restricted": false,
"monitorId": null,
"compileError": null,
"test": {
"ranAt": "2026-11-10T09:16:40.000Z",
"mode": "global",
"fetched": 140,
"classified": 140,
"matched": 4,
"companiesChecked": 0,
"leads": [
{
"companyName": "Acme",
"companyLinkedinUrl": "https://www.linkedin.com/company/acme",
"headline": "Acme hires its first VP Sales",
"confidence": 0.91,
"sourceUrl": "https://www.linkedin.com/feed/update/urn:li:activity:7515785729281671168",
"author": "Jane Doe",
"evidenceQuotes": [
"Thrilled to welcome our first ever VP of Sales as we build out the go-to-market team."
],
"attributes": {
"role": "VP Sales",
"seniority": "vp"
},
"postedAt": "2026-11-08T14:02:00.000Z"
}
]
},
"lastRunAt": null,
"lastRunStats": null,
"activatedAt": null,
"createdAt": "2026-11-10T09:12:04.000Z",
"signals30d": 0,
"signalsTotal": 0,
"lastSignalAt": null,
"nextStep": "Compiled and tested. Review test.leads: if they are the kind of post you want, start the definition (active: true). The leads become its first signals."
},
"meta": {
"endpoint": "customSignals.get",
"creditsUsed": 0
}
}{
"success": false,
"error": "description must be 20 to 1500 characters"
}{
"success": false,
"error": "Invalid API key"
}{
"success": false,
"error": "Custom signals are part of the Pro plan."
}{
"success": false,
"error": "Custom signal not found"
}{
"success": false,
"error": "Rate limit exceeded"
}{
"success": false,
"error": "Internal server error"
}