curl --request GET \
--url https://app.reputably.net/api/entities/Mention/{id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.reputably.net/api/entities/Mention/{id}"
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/Mention/{id}', 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/Mention/{id}",
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/Mention/{id}"
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/Mention/{id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.reputably.net/api/entities/Mention/{id}")
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>",
"tracker_id": "<string>",
"location_id": "<string>",
"platform": "twitter",
"platform_post_id": "<string>",
"platform_post_url": "<string>",
"post_text": "<string>",
"post_language": "<string>",
"posted_at": "<string>",
"author_username": "<string>",
"author_display_name": "<string>",
"author_profile_image_url": "<string>",
"author_followers_count": 123,
"author_is_verified": true,
"is_retweet": true,
"is_reply": true,
"is_quote_tweet": true,
"original_post_url": "<string>",
"like_count": 123,
"retweet_count": 123,
"reply_count": 123,
"quote_count": 123,
"impression_count": 123,
"reach_estimate": 123,
"sentiment": "positive",
"sentiment_score": 123,
"emotion": "joy",
"key_topics": [
"<string>"
],
"media_urls": [
"<string>"
],
"is_flagged": true,
"flag_reason": "<string>",
"is_read": true,
"is_archived": true,
"archive_reason": "<string>",
"mention_location": "<string>",
"geo_match": "in_area",
"is_actioned": true,
"action_note": "<string>",
"priority": "urgent",
"synced_at": "<string>",
"reddit_subreddit": "<string>",
"reddit_post_title": "<string>",
"reddit_post_selftext": "<string>",
"reddit_parent_post_url": "<string>",
"reddit_parent_post_id": "<string>",
"reddit_discovered_via": "comment",
"reddit_post_type": "post",
"reddit_post_score": 123,
"reddit_is_nsfw": true,
"source_domain": "<string>",
"source_name": "<string>",
"source_favicon_url": "<string>",
"page_title": "<string>",
"page_snippet": "<string>",
"google_rank": 123,
"ai_suggested_reply": "<string>",
"reply_text": "<string>",
"reply_status": "draft",
"reply_posted_at": "<string>",
"reply_posted_by": "<string>",
"reply_platform_id": "<string>",
"tracker_type": "brand",
"intent_score": 123,
"intent_reason": "<string>",
"competitors_mentioned": [
{
"name": "<string>",
"sentiment": "<string>"
}
],
"first_run": true,
"is_backlog": true
}Get one brand mention
Reads a single brand mention by id. Ids do not cross workspaces.
curl --request GET \
--url https://app.reputably.net/api/entities/Mention/{id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.reputably.net/api/entities/Mention/{id}"
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/Mention/{id}', 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/Mention/{id}",
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/Mention/{id}"
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/Mention/{id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.reputably.net/api/entities/Mention/{id}")
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>",
"tracker_id": "<string>",
"location_id": "<string>",
"platform": "twitter",
"platform_post_id": "<string>",
"platform_post_url": "<string>",
"post_text": "<string>",
"post_language": "<string>",
"posted_at": "<string>",
"author_username": "<string>",
"author_display_name": "<string>",
"author_profile_image_url": "<string>",
"author_followers_count": 123,
"author_is_verified": true,
"is_retweet": true,
"is_reply": true,
"is_quote_tweet": true,
"original_post_url": "<string>",
"like_count": 123,
"retweet_count": 123,
"reply_count": 123,
"quote_count": 123,
"impression_count": 123,
"reach_estimate": 123,
"sentiment": "positive",
"sentiment_score": 123,
"emotion": "joy",
"key_topics": [
"<string>"
],
"media_urls": [
"<string>"
],
"is_flagged": true,
"flag_reason": "<string>",
"is_read": true,
"is_archived": true,
"archive_reason": "<string>",
"mention_location": "<string>",
"geo_match": "in_area",
"is_actioned": true,
"action_note": "<string>",
"priority": "urgent",
"synced_at": "<string>",
"reddit_subreddit": "<string>",
"reddit_post_title": "<string>",
"reddit_post_selftext": "<string>",
"reddit_parent_post_url": "<string>",
"reddit_parent_post_id": "<string>",
"reddit_discovered_via": "comment",
"reddit_post_type": "post",
"reddit_post_score": 123,
"reddit_is_nsfw": true,
"source_domain": "<string>",
"source_name": "<string>",
"source_favicon_url": "<string>",
"page_title": "<string>",
"page_snippet": "<string>",
"google_rank": 123,
"ai_suggested_reply": "<string>",
"reply_text": "<string>",
"reply_status": "draft",
"reply_posted_at": "<string>",
"reply_posted_by": "<string>",
"reply_platform_id": "<string>",
"tracker_type": "brand",
"intent_score": 123,
"intent_reason": "<string>",
"competitors_mentioned": [
{
"name": "<string>",
"sentiment": "<string>"
}
],
"first_run": true,
"is_backlog": true
}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.
Path Parameters
The brand mention id.
Response
The brand mention.
Unique id.
twitter, reddit, news, social, blog, web, forum, facebook_communities positive, neutral, negative, mixed joy, anger, sadness, fear, surprise, disgust, neutral Why the sync auto-archived this mention (e.g. 'geo_mismatch'). Absent for user archives and pre-existing rows.
The post's resolved place or market from the geo gate (e.g. 'Hangzhou, China', 'US market (Zillow/FHA cues)'). Null when no signal resolved or the tracker has no geo scope.
Geo verdict vs the business service area, set at analysis time for geo-scoped trackers. 'out_of_area' forces is_relevant=false; 'no_signal' blocks Lead promotion at suburb/city/state scope.
in_area, nearby, out_of_area, no_signal urgent, high, medium, low comment post, comment Latest AI-generated draft. Regenerating a draft overwrites this — no history kept. reply_text is the user-edited final version.
The final reply the user actually copied/posted. For YouTube this is what the YouTube Data API comment_threads.insert request carried. For X/Reddit it's what went to the clipboard.
draft = AI draft generated, not posted yet. copied = user clicked Copy for X/Reddit intent flow but hasn't confirmed. posted = sent (API success for YouTube, or user-confirmed for X/Reddit). failed = API post failed and needs retry.
draft, copied, posted, failed Platform-assigned ID of the reply itself (e.g. YouTube comment id returned by commentThreads.insert). Null for draft-assist platforms (X / Reddit).
Denormalized from BrandTracker at sync time. Powers the BrandFeed's tracker-type chip filter without joining.
brand, keyword 0-1 likelihood that the author is asking for a recommendation for this kind of business. Set by the sentiment LLM at sync time. Drives auto-promotion to /leads.
One-line 'why' from the LLM explaining the intent_score. Surfaced as a tooltip on Lead cards.
Other brands named in this post/comment, discovered by the sentiment LLM at sync time (the brand/topic analog of VisibilityRun.competitors_mentioned). sentiment is how THIS post portrays that competitor (positive|neutral|negative|mixed), which may differ from the mention's overall sentiment. Empty for rows synced before this feature and for mentions naming no other brand (the common case on brand trackers).
Show child attributes
Show child attributes
Ingested by the tracker's first-ever sync of this platform, i.e. part of the initial backlog. Leads still get created from these rows, but they never fire a notification — the posts are newly DISCOVERED, not newly posted. Set at ingest rather than derived at delivery time because by then the rows already exist and the fact is unrecoverable; it also has to survive Facebook's sweep promoting a stranded row days later. Distinct from is_backlog: see below.
No known post date, so the leads board sinks the row to the bottom of 'newest' instead of letting it fall back to created_at (~now) and bury genuinely-dated leads. CLEARED the moment a scrape supplies the real date (applyFbScrape) — which is exactly why it cannot double as the notification gate's first-run signal; use first_run for that. Set on any run, not just the first.