curl --request GET \
--url https://api.logo.dev/v2/webhook_endpoints \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.logo.dev/v2/webhook_endpoints', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.logo.dev/v2/webhook_endpoints"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.logo.dev/v2/webhook_endpoints"
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))
}require 'uri'
require 'net/http'
url = URI("https://api.logo.dev/v2/webhook_endpoints")
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<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.logo.dev/v2/webhook_endpoints",
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;
}{
"data": [
{
"object": "webhook_endpoint",
"id": "ep_2mX9kL4pQ7rT1vW3yZ5aB8cD0e",
"url": "https://hooks.example.com/logo-dev",
"description": "Production",
"disabled": false,
"filter_types": [
"brand.updated"
],
"created_at": "2026-09-21T12:00:00Z",
"updated_at": "2026-09-21T12:00:00Z"
}
],
"metadata": {
"request_id": "request_01k6z8m2a4b5c6d7e8f9g0h1j2"
}
}{
"msg": "invalid api token. make sure to use your secret key.",
"docs_url": "https://www.logo.dev/docs/platform/api-keys"
}{
"error": {
"code": "forbidden",
"message": "organization admin role required to change webhooks"
},
"docs_url": "https://www.logo.dev/docs/platform/errors"
}{
"error": {
"code": "internal",
"message": "failed to manage webhook endpoint"
},
"docs_url": "https://www.logo.dev/docs/platform/errors"
}List webhook endpoints
List your team’s webhook endpoints.
curl --request GET \
--url https://api.logo.dev/v2/webhook_endpoints \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.logo.dev/v2/webhook_endpoints', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.logo.dev/v2/webhook_endpoints"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.logo.dev/v2/webhook_endpoints"
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))
}require 'uri'
require 'net/http'
url = URI("https://api.logo.dev/v2/webhook_endpoints")
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<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.logo.dev/v2/webhook_endpoints",
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;
}{
"data": [
{
"object": "webhook_endpoint",
"id": "ep_2mX9kL4pQ7rT1vW3yZ5aB8cD0e",
"url": "https://hooks.example.com/logo-dev",
"description": "Production",
"disabled": false,
"filter_types": [
"brand.updated"
],
"created_at": "2026-09-21T12:00:00Z",
"updated_at": "2026-09-21T12:00:00Z"
}
],
"metadata": {
"request_id": "request_01k6z8m2a4b5c6d7e8f9g0h1j2"
}
}{
"msg": "invalid api token. make sure to use your secret key.",
"docs_url": "https://www.logo.dev/docs/platform/api-keys"
}{
"error": {
"code": "forbidden",
"message": "organization admin role required to change webhooks"
},
"docs_url": "https://www.logo.dev/docs/platform/errors"
}{
"error": {
"code": "internal",
"message": "failed to manage webhook endpoint"
},
"docs_url": "https://www.logo.dev/docs/platform/errors"
}Get your API keys
Authorizations
Your secret key (sk_), as Bearer sk_.... Call the Logo API only from your server.
Response
All endpoints. An empty array when there are none.
Hide child attributes
Hide child attributes
"webhook_endpoint""ep_2mX9kL4pQ7rT1vW3yZ5aB8cD0e"
Empty string when unset.
true when you switched the endpoint off, or when deliveries were stopped after sustained failures.
Event types this endpoint receives. An empty array means all of them.
brand.updated, brand.indexed Hide child attributes
Hide child attributes
Unique id for this request. Also sent as the Request-Id header.
"request_01k6z8m2a4b5c6d7e8f9g0h1j2"
Brand and image lookups only.
Hide child attributes
Hide child attributes
Which identifier the request used.
domain, ticker, isin, crypto, name, brand_id The identifier after normalization: the registrable domain, an upper-cased ticker, and so on.
How the identifier reached the brand. direct is a brand id or a domain that is its own brand; domain went through an alias or redirect; security is a ticker or ISIN; crypto is a crypto token symbol; search is a name lookup. Empty on a cached miss.
direct, domain, security, crypto, search, Reserved for brands involved in a merchant lookup. Always {} today.
202 responses only.
Hide child attributes
Hide child attributes
indexing is a brand's first crawl; resolving means the identifier is still being matched to a brand.
indexing, resolving Wait this long before retrying. Matches the Retry-After header.
30
Stop polling after this long.
300
Whether a brand.indexed webhook event carrying this request's request_id will be sent when the lookup settles.
Present when a brand lookup (GET /v2/brands or GET /v2/brands/{id}) ran the automatic subscribe: webhooks are on for the account, and nosubscribe is not true. See automatic subscriptions.
Hide child attributes
Hide child attributes
subscribed: the account is subscribed to the brand. quota_exceeded: the account is at its plan's subscription limit, so the brand was not subscribed. The lookup is answered and billed either way.
subscribed, quota_exceeded Why the subscribe was refused. Only with quota_exceeded.
Was this page helpful?