curl --request POST \
--url https://www.trysignalbase.com/api/v2/webhooks \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"endpoint_url": "https://example.com/hooks/signalbase",
"event_types": [
"funding.created",
"hiring.created"
],
"filters": {
"countries": "US,GB"
}
}
'import requests
url = "https://www.trysignalbase.com/api/v2/webhooks"
payload = {
"endpoint_url": "https://example.com/hooks/signalbase",
"event_types": ["funding.created", "hiring.created"],
"filters": { "countries": "US,GB" }
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
endpoint_url: 'https://example.com/hooks/signalbase',
event_types: ['funding.created', 'hiring.created'],
filters: {countries: 'US,GB'}
})
};
fetch('https://www.trysignalbase.com/api/v2/webhooks', 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/webhooks",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'endpoint_url' => 'https://example.com/hooks/signalbase',
'event_types' => [
'funding.created',
'hiring.created'
],
'filters' => [
'countries' => 'US,GB'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://www.trysignalbase.com/api/v2/webhooks"
payload := strings.NewReader("{\n \"endpoint_url\": \"https://example.com/hooks/signalbase\",\n \"event_types\": [\n \"funding.created\",\n \"hiring.created\"\n ],\n \"filters\": {\n \"countries\": \"US,GB\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://www.trysignalbase.com/api/v2/webhooks")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"endpoint_url\": \"https://example.com/hooks/signalbase\",\n \"event_types\": [\n \"funding.created\",\n \"hiring.created\"\n ],\n \"filters\": {\n \"countries\": \"US,GB\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.trysignalbase.com/api/v2/webhooks")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"endpoint_url\": \"https://example.com/hooks/signalbase\",\n \"event_types\": [\n \"funding.created\",\n \"hiring.created\"\n ],\n \"filters\": {\n \"countries\": \"US,GB\"\n }\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"id": "b1f2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
"endpoint_url": "https://example.com/hooks/signalbase",
"event_types": [
"funding.created",
"hiring.created"
],
"filters": {
"countries": "US,GB"
},
"active": true,
"created_at": "2026-05-29T10:30:00.000Z",
"updated_at": "2026-05-29T10:30:00.000Z",
"last_modified_by": "user_2a9f8c7b6d5e4f3a",
"last_modified_via": "api",
"secret": "3f9a1c7e-2b4d-4e6a-9f1b-8c2d3e4f5a6b",
"stats": {
"total_deliveries": 0,
"successful_deliveries": 0,
"failed_deliveries": 0,
"last_success_at": null,
"last_failure_at": null,
"consecutive_failures": 0
}
},
"meta": {
"endpoint": "webhooks.create",
"creditsUsed": 0
}
}{
"success": false,
"error": "Webhook URL must be a public address",
"code": "bad_request"
}{
"success": false,
"error": "Invalid API key. No key found.",
"code": "invalid_api_key"
}{
"success": false,
"error": "Subscription expired. Please upgrade your subscription: https://www.trysignalbase.com/#pricing",
"code": "subscription_expired"
}{
"success": false,
"error": "Too many requests. Please upgrade your plan or slow down.",
"code": "rate_limited",
"retryAfter": 60
}{
"success": false,
"error": "An unknown error occurred",
"code": "internal_error"
}Create Webhook
Create a webhook subscription for the authenticated team. The full signing secret is returned exactly once in this response — store it now, because every later read returns only a 4-character preview. Creating a webhook is free (0 API credits). A team may have at most 10 active webhooks.
curl --request POST \
--url https://www.trysignalbase.com/api/v2/webhooks \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"endpoint_url": "https://example.com/hooks/signalbase",
"event_types": [
"funding.created",
"hiring.created"
],
"filters": {
"countries": "US,GB"
}
}
'import requests
url = "https://www.trysignalbase.com/api/v2/webhooks"
payload = {
"endpoint_url": "https://example.com/hooks/signalbase",
"event_types": ["funding.created", "hiring.created"],
"filters": { "countries": "US,GB" }
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
endpoint_url: 'https://example.com/hooks/signalbase',
event_types: ['funding.created', 'hiring.created'],
filters: {countries: 'US,GB'}
})
};
fetch('https://www.trysignalbase.com/api/v2/webhooks', 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/webhooks",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'endpoint_url' => 'https://example.com/hooks/signalbase',
'event_types' => [
'funding.created',
'hiring.created'
],
'filters' => [
'countries' => 'US,GB'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://www.trysignalbase.com/api/v2/webhooks"
payload := strings.NewReader("{\n \"endpoint_url\": \"https://example.com/hooks/signalbase\",\n \"event_types\": [\n \"funding.created\",\n \"hiring.created\"\n ],\n \"filters\": {\n \"countries\": \"US,GB\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://www.trysignalbase.com/api/v2/webhooks")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"endpoint_url\": \"https://example.com/hooks/signalbase\",\n \"event_types\": [\n \"funding.created\",\n \"hiring.created\"\n ],\n \"filters\": {\n \"countries\": \"US,GB\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.trysignalbase.com/api/v2/webhooks")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"endpoint_url\": \"https://example.com/hooks/signalbase\",\n \"event_types\": [\n \"funding.created\",\n \"hiring.created\"\n ],\n \"filters\": {\n \"countries\": \"US,GB\"\n }\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"id": "b1f2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
"endpoint_url": "https://example.com/hooks/signalbase",
"event_types": [
"funding.created",
"hiring.created"
],
"filters": {
"countries": "US,GB"
},
"active": true,
"created_at": "2026-05-29T10:30:00.000Z",
"updated_at": "2026-05-29T10:30:00.000Z",
"last_modified_by": "user_2a9f8c7b6d5e4f3a",
"last_modified_via": "api",
"secret": "3f9a1c7e-2b4d-4e6a-9f1b-8c2d3e4f5a6b",
"stats": {
"total_deliveries": 0,
"successful_deliveries": 0,
"failed_deliveries": 0,
"last_success_at": null,
"last_failure_at": null,
"consecutive_failures": 0
}
},
"meta": {
"endpoint": "webhooks.create",
"creditsUsed": 0
}
}{
"success": false,
"error": "Webhook URL must be a public address",
"code": "bad_request"
}{
"success": false,
"error": "Invalid API key. No key found.",
"code": "invalid_api_key"
}{
"success": false,
"error": "Subscription expired. Please upgrade your subscription: https://www.trysignalbase.com/#pricing",
"code": "subscription_expired"
}{
"success": false,
"error": "Too many requests. Please upgrade your plan or slow down.",
"code": "rate_limited",
"retryAfter": 60
}{
"success": false,
"error": "An unknown error occurred",
"code": "internal_error"
}Authorizations
Signalbase API key. Include as a Bearer token in the Authorization header.
Body
Field names accept snake_case (canonical) or camelCase (endpointUrl, eventTypes).
Destination URL. Must be a valid http/https URL of at most 500 characters. In production, localhost and private/link-local addresses are rejected.
500"https://example.com/hooks/signalbase"
Event types to subscribe to. Duplicates are removed.
Event type a subscription can register for. system.test is accepted but only ever delivered by the Send Test Event endpoint; it never fires automatically.
funding.created, acquisition.created, job_change.created, hiring.created, new_company.created, investor.created, system.test ["funding.created", "hiring.created"]
Optional string key/value filters that narrow which events are delivered. Recognized keys: countries, jobCountries, categories, search, teamSize, dateFrom, dateTo, funding, roundFlavor, fundingAmount, acquisitionAmount, healthScore. Unrecognized keys are silently ignored — note the round-type key is funding, not round. For hiring.created events countries matches the job listing country OR the company HQ country (same as the REST hiring endpoint), and jobCountries matches the job listing country only; jobCountries never matches non-hiring events. For investor.created events only countries and search apply. See the Webhooks overview 'Filters' section for value formats.
Show child attributes
Show child attributes
{
"countries": "US,GB",
"funding": "seed,series a"
}
Response
Webhook created. data includes the full signing secret (shown only on create).
