curl --request GET \
--url https://app.reputably.net/api/entities/VisibilityTracker \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.reputably.net/api/entities/VisibilityTracker"
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/VisibilityTracker', 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/VisibilityTracker",
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/VisibilityTracker"
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/VisibilityTracker")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.reputably.net/api/entities/VisibilityTracker")
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>",
"name": "<string>",
"brand_name": "<string>",
"brand_domain": "<string>",
"brand_aliases": [
"<string>"
],
"competitors": [
{
"name": "<string>",
"domain": "<string>"
}
],
"engines": [
"<string>"
],
"provider": "<string>",
"is_active": true,
"run_frequency_hours": 123,
"last_run_at": "<string>",
"last_scheduled_run_at": "<string>",
"last_run_summary": {}
}
]List AI Visibility trackers
Reads AI Visibility 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/VisibilityTracker \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.reputably.net/api/entities/VisibilityTracker"
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/VisibilityTracker', 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/VisibilityTracker",
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/VisibilityTracker"
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/VisibilityTracker")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.reputably.net/api/entities/VisibilityTracker")
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>",
"name": "<string>",
"brand_name": "<string>",
"brand_domain": "<string>",
"brand_aliases": [
"<string>"
],
"competitors": [
{
"name": "<string>",
"domain": "<string>"
}
],
"engines": [
"<string>"
],
"provider": "<string>",
"is_active": true,
"run_frequency_hours": 123,
"last_run_at": "<string>",
"last_scheduled_run_at": "<string>",
"last_run_summary": {}
}
]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 AI Visibility trackers.
Unique id.
The brand to detect in AI answers. Defaults from the BusinessLocation name.
Bare domain (e.g. 'reputably.net') used to detect when an AI answer CITES the brand's own site.
Other names the business trades as in AI answers — used when the real-world name differs from brand_name (e.g. a domain-named business like 'fibreglasspoolssouthbrisbane.com.au' that answers call 'Fibreglass Pools South Brisbane'). Fed to the analysis prompt so these references count as brand_mentioned instead of being missed or absorbed into a competitor.
Competitor set for share-of-voice. Each carries a name (detected in answer text) and an optional domain (detected in citations).
Show child attributes
Show child attributes
Which AI answer engines to run prompts against. Keys map to server/lib/aiEngines registry (e.g. ['chatgpt','gemini','claude']).
Which backend this tracker runs on.
How often the scheduler runs every active prompt against every enabled engine. peec.ai-style daily cadence by default.
Bumped by manual 'Run now' and by the scheduler — drives the 'last run X ago' UI label.
Owned by the scheduler. Gates the run_frequency_hours cadence independent of manual runs.
Outcome of the most recent run attempt, written by runVisibilityTracker on EVERY exit path (success, partial failure, quota stop, fatal error) so the UI can report what actually happened. Success shape: { at, ran, errors, planned, truncated, quota_used, quota_limit, error_samples? }. Fatal shape: { at, ran: 0, message }.