Brand Visibility
curl --request GET \
--url https://scrapebadger.com/v1/chatgpt/brand-visibility \
--header 'X-API-Key: <x-api-key>'import requests
url = "https://scrapebadger.com/v1/chatgpt/brand-visibility"
headers = {"X-API-Key": "<x-api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<x-api-key>'}};
fetch('https://scrapebadger.com/v1/chatgpt/brand-visibility', 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://scrapebadger.com/v1/chatgpt/brand-visibility",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <x-api-key>"
],
]);
$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://scrapebadger.com/v1/chatgpt/brand-visibility"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<x-api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://scrapebadger.com/v1/chatgpt/brand-visibility")
.header("X-API-Key", "<x-api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://scrapebadger.com/v1/chatgpt/brand-visibility")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<x-api-key>'
response = http.request(request)
puts response.read_body{
"prompt": "<string>",
"brand": "<string>",
"domain": "<string>",
"mentioned": true,
"mention_count": 123,
"first_position": {},
"position_score": 123,
"share_of_voice_pct": 123,
"cited": true,
"cited_urls": [
"<string>"
],
"citation_rank": {},
"competitors": [
{
"name": "<string>",
"mentioned": true,
"mention_count": 123,
"first_position": {},
"cited": true,
"cited_urls": [
"<string>"
]
}
],
"excerpt": {},
"answer": "<string>",
"citations": [
{
"url": {},
"title": {},
"snippet": {},
"domain": {},
"attribution": {},
"pub_date_utc": {},
"published_at": {},
"start_index": {},
"end_index": {},
"matched_text": {}
}
],
"web_search_triggered": true,
"model": {},
"country": "<string>",
"latency_ms": 123,
"created_utc": {},
"created_at": {}
}Brand Visibility
Brand Visibility
Ask ChatGPT a question and get a full AEO/GEO analysis of how your brand appears in the answer — mentions, position, share of voice against competitors, and whether your domain was cited.
GET
/
v1
/
chatgpt
/
brand-visibility
Brand Visibility
curl --request GET \
--url https://scrapebadger.com/v1/chatgpt/brand-visibility \
--header 'X-API-Key: <x-api-key>'import requests
url = "https://scrapebadger.com/v1/chatgpt/brand-visibility"
headers = {"X-API-Key": "<x-api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<x-api-key>'}};
fetch('https://scrapebadger.com/v1/chatgpt/brand-visibility', 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://scrapebadger.com/v1/chatgpt/brand-visibility",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <x-api-key>"
],
]);
$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://scrapebadger.com/v1/chatgpt/brand-visibility"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<x-api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://scrapebadger.com/v1/chatgpt/brand-visibility")
.header("X-API-Key", "<x-api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://scrapebadger.com/v1/chatgpt/brand-visibility")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<x-api-key>'
response = http.request(request)
puts response.read_body{
"prompt": "<string>",
"brand": "<string>",
"domain": "<string>",
"mentioned": true,
"mention_count": 123,
"first_position": {},
"position_score": 123,
"share_of_voice_pct": 123,
"cited": true,
"cited_urls": [
"<string>"
],
"citation_rank": {},
"competitors": [
{
"name": "<string>",
"mentioned": true,
"mention_count": 123,
"first_position": {},
"cited": true,
"cited_urls": [
"<string>"
]
}
],
"excerpt": {},
"answer": "<string>",
"citations": [
{
"url": {},
"title": {},
"snippet": {},
"domain": {},
"attribution": {},
"pub_date_utc": {},
"published_at": {},
"start_index": {},
"end_index": {},
"matched_text": {}
}
],
"web_search_triggered": true,
"model": {},
"country": "<string>",
"latency_ms": 123,
"created_utc": {},
"created_at": {}
}Ask the real
chatgpt.com a buyer-intent question and get back both the
answer and a structured analysis of how your brand fares in it: whether it
was mentioned, how early, how often, how it compares to named competitors, and
whether your domain was cited as a source.
This is the AEO / GEO (Answer Engine / Generative Engine Optimisation)
measurement that vendors like Profound, Otterly, Peec and AthenaHQ sell as a
$99–989/month subscription — here it is one 25-credit call.
Accepts GET (query params) or POST (JSON body).
Credits: 25
Typical latency is 20-25s ungrounded, 30-70s with web search. Set your client timeout to at least 60 s.
Authorization
string
required
Your ScrapeBadger API key.
Query Parameters
string
required
The question to ask ChatGPT — typically a buyer-intent prompt like
best web scraping API for e-commerce. Maximum 4,096 characters.string
required
The brand name to look for in the answer, e.g.
ScrapeBadger.string
Your domain, e.g.
scrapebadger.com. Used to decide cited, cited_urls
and citation_rank.string
Alternate spellings that also count as a mention of
brand — e.g.
Scrape Badger,scrape-badger. Comma-separated on GET; a string[] on
POST.string
Competitor names to measure against, e.g.
Bright Data,Oxylabs,Zyte. Drives
share_of_voice_pct and the competitors array. Comma-separated on GET;
a string[] on POST.string
default:"US"
ISO-3166 alpha-2 egress country. Visibility often differs by market.
string
default:"force"
One of
auto, force, off. Defaults to force here — visibility
tracking usually wants ChatGPT to actually browse. Check
web_search_triggered for what happened.Response
string
Echo of the prompt you sent.
string
Echo of the brand you tracked.
string
Echo of the domain you supplied.
boolean
Whether the brand (or any alias) appears in the answer.
integer
How many times the brand or its aliases appear.
integer | null
Character offset of the first mention in
answer. null when absent.number
How prominently the brand is placed:
1.0 = named at the very start of the
answer, 0.0 = absent. Useful as a single trendable number.number
Brand mentions as a percentage of brand + competitor mentions.
0 when
nobody is mentioned.boolean
Whether the brand’s
domain appears among the answer’s cited sources.string[]
The cited URLs belonging to the brand’s domain.
integer | null
1-based rank of the brand’s first cited URL within the citation list.
null when not cited.CompetitorMention[]
One entry per competitor you named, in the order you supplied them.
string | null
The answer text surrounding the first brand mention — ready to quote in a report.
string
The full answer text.
Citation[]
The sources ChatGPT referenced — same shape as
/ask.Show Citation
Show Citation
string | null
Source URL.
string | null
Page title.
string | null
Retrieved snippet.
string | null
Hostname.
string | null
Publisher/attribution label.
number | null
Publication date as a Unix timestamp.
string | null
Publication date as an ISO-8601 UTC string.
integer | null
Character offset in
answer where the supported span begins.integer | null
Character offset in
answer where the supported span ends.string | null
The substring of
answer this source supports.boolean
Whether ChatGPT actually browsed the web.
string | null
Which model answered, e.g.
gpt-5-5.string
Echo of the egress country used.
integer
End-to-end time in milliseconds.
number | null
Answer creation time as a Unix timestamp.
string | null
Answer creation time as an ISO-8601 UTC string.
Example
curl -G "https://scrapebadger.com/v1/chatgpt/brand-visibility" \
-H "X-API-Key: YOUR_API_KEY" \
--data-urlencode "prompt=What is the best web scraping API for e-commerce data?" \
--data-urlencode "brand=ScrapeBadger" \
--data-urlencode "domain=scrapebadger.com" \
--data-urlencode "aliases=Scrape Badger,scrape-badger" \
--data-urlencode "competitors=Bright Data,Oxylabs,Zyte" \
--data-urlencode "country=US" \
--max-time 60
const res = await fetch(
"https://scrapebadger.com/v1/chatgpt/brand-visibility",
{
method: "POST",
headers: {
"X-API-Key": process.env.SCRAPEBADGER_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
prompt: "What is the best web scraping API for e-commerce data?",
brand: "ScrapeBadger",
domain: "scrapebadger.com",
aliases: ["Scrape Badger", "scrape-badger"],
competitors: ["Bright Data", "Oxylabs", "Zyte"],
country: "US",
}),
signal: AbortSignal.timeout(60_000),
},
);
const data = await res.json();
console.log(
`mentioned=${data.mentioned} sov=${data.share_of_voice_pct}% cited=${data.cited}`,
);
import requests
res = requests.post(
"https://scrapebadger.com/v1/chatgpt/brand-visibility",
headers={"X-API-Key": "YOUR_API_KEY"},
json={
"prompt": "What is the best web scraping API for e-commerce data?",
"brand": "ScrapeBadger",
"domain": "scrapebadger.com",
"aliases": ["Scrape Badger", "scrape-badger"],
"competitors": ["Bright Data", "Oxylabs", "Zyte"],
"country": "US",
},
timeout=60,
)
data = res.json()
print(data["mentioned"], data["share_of_voice_pct"], data["citation_rank"])
Response
{
"prompt": "What is the best web scraping API for e-commerce data?",
"brand": "ScrapeBadger",
"domain": "scrapebadger.com",
"mentioned": true,
"mention_count": 2,
"first_position": 118,
"position_score": 0.72,
"share_of_voice_pct": 33.3,
"cited": true,
"cited_urls": ["https://scrapebadger.com/amazon"],
"citation_rank": 2,
"competitors": [
{
"name": "Bright Data",
"mentioned": true,
"mention_count": 3,
"first_position": 41,
"cited": true,
"cited_urls": ["https://brightdata.com/products/web-scraper"]
},
{
"name": "Oxylabs",
"mentioned": true,
"mention_count": 1,
"first_position": 268,
"cited": false,
"cited_urls": []
},
{
"name": "Zyte",
"mentioned": false,
"mention_count": 0,
"first_position": null,
"cited": false,
"cited_urls": []
}
],
"excerpt": "...for structured e-commerce data specifically, ScrapeBadger offers dedicated Amazon and eBay endpoints with per-request credit pricing, which avoids the proxy-bandwidth billing model...",
"answer": "For e-commerce scraping in 2026 the strongest options are Bright Data, ScrapeBadger and Oxylabs. Bright Data has the widest proxy footprint, but for structured e-commerce data specifically, ScrapeBadger offers dedicated Amazon and eBay endpoints with per-request credit pricing, which avoids the proxy-bandwidth billing model. Oxylabs sits between the two on price.",
"citations": [
{
"url": "https://brightdata.com/products/web-scraper",
"title": "Web Scraper API",
"snippet": "Collect public web data at scale with our unblocking infrastructure...",
"domain": "brightdata.com",
"attribution": "Bright Data",
"pub_date_utc": null,
"published_at": null,
"start_index": 84,
"end_index": 132,
"matched_text": "Bright Data has the widest proxy footprint"
},
{
"url": "https://scrapebadger.com/amazon",
"title": "Amazon Scraper API",
"snippet": "Product search, PDP detail, offers, reviews and bestsellers across 20 marketplaces...",
"domain": "scrapebadger.com",
"attribution": "ScrapeBadger",
"pub_date_utc": null,
"published_at": null,
"start_index": 178,
"end_index": 322,
"matched_text": "ScrapeBadger offers dedicated Amazon and eBay endpoints with per-request credit pricing, which avoids the proxy-bandwidth billing model"
}
],
"web_search_triggered": true,
"model": "gpt-5-5",
"country": "US",
"latency_ms": 27342,
"created_utc": 1754323200.0,
"created_at": "2026-08-04T16:00:00Z"
}
position_score is the single number to trend over time: 1.0 means the
brand was named at the very start of the answer, 0.0 means it was absent.
Combine it with share_of_voice_pct and cited for a full picture.Because ChatGPT is non-deterministic, one call is a sample, not a
measurement. Run the same prompt on a schedule (daily, or several times a day
for competitive prompts) and track the moving average of
position_score and
share_of_voice_pct. Vary country to see how visibility differs by market.
