AI Share of Voice API — ChatGPT Visibility
Documentation menu
FetchLayer FetchLayer API

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.

POST /visibility-report Share of voice
https://api.fetchlayer.dev/chatgpt/visibility-report
OpenAPI JSON

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
}