Share of voice across prompts and brands
Share of voice for a set of brands across a set of prompts, in one request: who ChatGPT puts forward for the questions your buyers ask, and how often it cites them. Each target comes back with shareOfVoice — its share of all mentions of the brands you gave, 0–100 — plus mentions and the same aggregate figures as a rank check, and byPrompt breaks mention rate, average rank and citation rate down per prompt per brand. failedRuns counts answers that could not be produced; they are not billed. The size is bounded by answers, not by prompts: prompts × runs must be at most 10, so 10 prompts at 1 run each is allowed and 4 prompts at 3 runs each (12) is a 400. Within that, up to 10 prompts, 5 targets and 3 runs. Targets cost nothing extra: every brand is read out of the same answers, so widening the brand list is free and lengthening the prompt list is not. Timing: every answer is a real ChatGPT session, and a request’s answers are generated alongside each other rather than one after the other — asking for more answers costs credits, not proportionally more time. Measured against the live service, the largest request this route accepts finishes inside a minute. For tracking wider than one request allows, run several smaller requests on a schedule and store the results, rather than trying to fit everything into one call. Billing: 1 credit per answer, so prompts × runs.
/visibility-report Share of voice https://api.fetchlayer.dev/chatgpt/visibility-report Headers
Authorization string required Bearer token — your FetchLayer API key.
Parameters
prompts array required The prompts to ask, 1–10 strings. prompts × runs must be at most 10.
targets array required The brands to compare, 1–5. A brand to look for: a name such as "FetchLayer", or an object { name, aliases[], domains[] }. Names and aliases match on whole words, case-insensitively — "Twenty" matches "twenty's" and "(TWENTY)", not "Twentyfold". Domains match when the answer writes them out, subdomains included and look-alikes excluded. Give aliases and domains when the name is an ordinary word.
runs number optional Answers per prompt, 1–3. More runs steady the figures, at one credit each. (default: 1)
provider string optional The assistant to ask. chatgpt is the only one available today; the field exists so the same request serves further assistants as they are added. (default: chatgpt)
country string optional Two-letter country the answer should come from, such as US, GB or DE. Answers differ by country. When that country cannot be served, the answer comes from the default one and notes says so. (default: us)
language string optional Language of ChatGPT’s own interface, such as en, de or pt-BR. The answer itself follows the language of your prompt. (default: en)
webSearch string optional auto lets ChatGPT decide whether to search the web; on asks it to search before answering, and answer.usedWebSearch reports what it did. There is no "off": an anonymous visitor has no such setting. (default: auto)
format string optional json or markdown. (default: json)
Response Fields
visibility-report
Share of voice across prompts and brands
resultType string ask, mentions, ai-rank, prompt-discovery or visibility-report.
provider string The assistant that was asked. Always "chatgpt" today.
requestedUrl string The assistant page the answers correspond to.
transport string The upstream source. Always "chatgpt".
notes string[] Caveats you can act on — a country that could not be served, runs that could not be completed, details the answer did not show. Empty when there are none. Read it on every call.
answersGenerated number Answers ChatGPT produced for this request.
pagesScraped number Billable units, which is the same number: one credit per answer. An answer that could not be produced is never billed.
scrapedAt string ISO 8601 timestamp of when the data was collected.
prompts string[] The prompts that were asked.
targets object[] One entry per brand, with its figures across every prompt.
targets[].name string The brand name.
targets[].shareOfVoice number Its share of all mentions of the brands you gave, in percent. It is relative to your list, not to every brand that exists.
targets[].mentions number Total mentions across the answers.
targets[].runs number Completed answers the figures are over.
targets[].mentionRate number Percentage of runs that mentioned the brand at all (0–100).
targets[].averageRank number Mean rank over the runs where it was ranked, or null when it never was. Runs where it was not ranked are left out rather than counted as last.
targets[].bestRank number Its best rank across the runs, or null.
targets[].worstRank number Its worst rank across the runs, or null.
targets[].citationRate number Percentage of runs whose answer cited one of its pages (0–100). This is a different measure from mentionRate: an answer can name a brand without citing it, and cite it without recommending it.
targets[].averageCitationRank number Mean position among the cited sources over the runs that cited it, or null.
byPrompt object[] Per prompt: the prompt, and per brand its mentionRate, averageRank and citationRate.
failedRuns number Answers that could not be produced. They are not billed, and notes says what happened.
Request
curl -X POST "https://api.fetchlayer.dev/chatgpt/visibility-report" \
-H "Authorization: Bearer ss-your-key" \
-H "Content-Type: application/json" \
-d '{"prompts":["reddit api alternatives"],"targets":["FetchLayer","Apify"],"runs":1}'Response
{
"resultType": "visibility-report",
"provider": "chatgpt",
"transport": "chatgpt",
"notes": [],
"answersGenerated": 1,
"pagesScraped": 1,
"scrapedAt": "2026-09-16T01:46:30.000Z",
"prompts": [
"reddit api alternatives"
],
"targets": [
{
"name": "FetchLayer",
"shareOfVoice": 0,
"mentions": 0,
"runs": 1,
"mentionRate": 0,
"averageRank": null,
"bestRank": null,
"worstRank": null,
"citationRate": 0,
"averageCitationRank": null
},
{
"name": "Apify",
"shareOfVoice": 100,
"mentions": 1,
"runs": 1,
"mentionRate": 100,
"averageRank": null,
"bestRank": null,
"worstRank": null,
"citationRate": 0,
"averageCitationRank": null
}
],
"byPrompt": [
{
"prompt": "reddit api alternatives",
"targets": [
{
"name": "FetchLayer",
"mentionRate": 0,
"averageRank": null,
"citationRate": 0
},
{
"name": "Apify",
"mentionRate": 100,
"averageRank": null,
"citationRate": 0
}
]
}
],
"failedRuns": 0
}