curl --request GET \
--url https://app.reputably.net/api/entities/BrandTracker \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.reputably.net/api/entities/BrandTracker"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.reputably.net/api/entities/BrandTracker', 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://app.reputably.net/api/entities/BrandTracker",
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://app.reputably.net/api/entities/BrandTracker"
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://app.reputably.net/api/entities/BrandTracker")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.reputably.net/api/entities/BrandTracker")
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[
{
"id": "<string>",
"location_id": "<string>",
"tracker_name": "<string>",
"search_query": "<string>",
"search_keywords": [
"<string>"
],
"exclude_keywords": [
"<string>"
],
"platforms": [
"<string>"
],
"is_active": true,
"last_synced_at": "<string>",
"last_tweet_id": "<string>",
"last_tweet_time": "<string>",
"total_mentions": 123,
"sync_frequency_minutes": 123,
"include_retweets": true,
"auto_archive_irrelevant": true,
"language_filter": [
"<string>"
],
"lookback_hours": 123,
"reddit_search_query": "<string>",
"reddit_subreddits": [
"<string>"
],
"reddit_include_comments": true,
"reddit_last_synced_at": "<string>",
"reddit_last_post_id": "<string>",
"web_monitoring_enabled": true,
"web_search_query": "<string>",
"web_last_synced_at": "<string>",
"news_last_synced_at": "<string>",
"web_sync_frequency_minutes": 123,
"news_sync_frequency_minutes": 123,
"excluded_domains": [
"<string>"
],
"monitored_source_types": [
"<string>"
],
"tracker_type": "brand",
"topic_keywords": [
"<string>"
],
"required_terms": [
"<string>"
],
"geo_inheritance": "inherit",
"geo_scope": "global",
"lead_detection_enabled": true,
"lead_intent_threshold": 123,
"lead_categories": [
"<string>"
],
"lead_notify_max_post_age_days": 123
}
]List brand trackers
Reads brand trackers in the selected workspace. Filter with q, a JSON object of field matches. Reads only: writes through this route are refused for every entity and every credential.
curl --request GET \
--url https://app.reputably.net/api/entities/BrandTracker \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.reputably.net/api/entities/BrandTracker"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.reputably.net/api/entities/BrandTracker', 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://app.reputably.net/api/entities/BrandTracker",
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://app.reputably.net/api/entities/BrandTracker"
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://app.reputably.net/api/entities/BrandTracker")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.reputably.net/api/entities/BrandTracker")
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[
{
"id": "<string>",
"location_id": "<string>",
"tracker_name": "<string>",
"search_query": "<string>",
"search_keywords": [
"<string>"
],
"exclude_keywords": [
"<string>"
],
"platforms": [
"<string>"
],
"is_active": true,
"last_synced_at": "<string>",
"last_tweet_id": "<string>",
"last_tweet_time": "<string>",
"total_mentions": 123,
"sync_frequency_minutes": 123,
"include_retweets": true,
"auto_archive_irrelevant": true,
"language_filter": [
"<string>"
],
"lookback_hours": 123,
"reddit_search_query": "<string>",
"reddit_subreddits": [
"<string>"
],
"reddit_include_comments": true,
"reddit_last_synced_at": "<string>",
"reddit_last_post_id": "<string>",
"web_monitoring_enabled": true,
"web_search_query": "<string>",
"web_last_synced_at": "<string>",
"news_last_synced_at": "<string>",
"web_sync_frequency_minutes": 123,
"news_sync_frequency_minutes": 123,
"excluded_domains": [
"<string>"
],
"monitored_source_types": [
"<string>"
],
"tracker_type": "brand",
"topic_keywords": [
"<string>"
],
"required_terms": [
"<string>"
],
"geo_inheritance": "inherit",
"geo_scope": "global",
"lead_detection_enabled": true,
"lead_intent_threshold": 123,
"lead_categories": [
"<string>"
],
"lead_notify_max_post_age_days": 123
}
]Authorizations
An agent key (rpk_...) created in Settings → API & MCP, sent as Authorization: Bearer rpk_.... Bearer only: a cookie session can never drive this API. An OAuth 2.1 access token obtained from the same host works identically and lands on the same ceiling.
Headers
Which workspace to read. Omit it and you get the account’s home workspace, which on an agency account is often not where the live businesses are. A workspace this credential cannot read is refused with 403 rather than quietly answered from the default.
Query Parameters
JSON filter object, for example {"needs_response":true}.
Field to sort on.
Maximum rows to return.
Rows to skip, for paging.
Response
Matching brand trackers.
Unique id.
'brand' = matches exact brand mentions (existing behavior). 'keyword' = matches topical mentions scoped to the attached BusinessLocation's geography (or globally for online-only businesses).
brand, keyword For tracker_type='keyword' only. Topical phrases to track. Semantically distinct from search_keywords (exact-match brand terms). Example: ['car accident', 'auto collision', 'DUI accident']. Joined as OR on each platform's search syntax.
For tracker_type='keyword' only, opt-in. A fetched post/comment is dropped at sync time unless its text (title + body + subreddit name) contains at least one of these terms, case-insensitive. Fixes the Reddit over-fetch where the partial-match ranker drops the discriminating token from a multi-word keyword ('sell property Kellyville' matching worldwide 'sell property' posts). Empty = filter off. Currently enforced on the Reddit fetch; other platforms rely on the relevance LLM (their fetch text can be a truncated SERP snippet, so a hard drop there would false-positive).
How this tracker derives its geographic search context from the attached business.
inherit, global, custom global, country, state, city, suburb When true, mentions whose intent_score meets lead_intent_threshold are auto-promoted to the /leads kanban as Lead rows in stage=new. Default ON so every tracker contributes to the Leads inbox; users can opt out per-tracker in the wizard.
Minimum intent_score (0-1) from the sentiment LLM for a mention to become a Lead. Lower = more sensitive, higher = stricter.
Recommendation requests for any of these categories qualify. Falls back to BusinessLocation.business_category when empty.
Per-tracker override for how old a post may be and still fire a lead notification. Unset falls back to env LEAD_NOTIFY_MAX_POST_AGE_DAYS, then to 7. 0 or less disables the age gate for this tracker (notify at any age) — it never means 'block everything'. Only affects DELIVERY: leads are created at any age regardless. See lib/notificationChannels.js.