AI Brand Monitoring API — ChatGPT Mentions
Documentation menu
FetchLayer FetchLayer API

Check brand mentions and citations

Whether named brands appear in one ChatGPT answer, and whether that answer actually cites them. The two are different and both come back: a brand can be recommended in the prose while none of its pages are among the sources (mentioned true, citedAsSource false), and a page can be cited without the brand being recommended. Each target reports mentioned, mentionCount, firstMentionIndex, orderOfFirstMention, contexts (each match with the sentence around it), citedAsSource with sourcePositions into the answer’s sources, and retrieved — one of its domains was among the pages ChatGPT read while searching, even if it cited none. otherBrandsMentioned is the brands the answer itself put forward, each with the rank it gave them: your competitor set for that prompt, as ChatGPT sees it. 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. Answers vary between runs, so a single check is a snapshot; use ai-rank to track a brand over several answers. Billing: 1 credit — one answer.

POST /mentions AI visibility
https://api.fetchlayer.dev/chatgpt/mentions
OpenAPI JSON

Headers

Authorization string required

Bearer token — your FetchLayer API key.

Parameters

prompt string required

The prompt, exactly as a person would type it into ChatGPT (1–4000 characters).

targets array required

The brands to look for, 1–10. 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.

includeAnswer boolean optional

Include the full answer in the response. (default: true)

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

mentions

Check brand mentions and citations

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.

prompt string

The prompt that was asked.

targets object[]

One entry per brand you gave, in the order you gave them.

targets[].name string

The brand name.

targets[].mentioned boolean

Whether the answer text names it.

targets[].mentionCount number

How many times. Overlapping matches count once.

targets[].firstMentionIndex number

Character offset of the first mention in answer.text, or null.

targets[].orderOfFirstMention number

1 for whichever of your targets the answer mentions first, or null when it mentions none.

targets[].contexts object[]

Each match: offset, matched (the text that matched) and snippet (the surrounding sentence). Read it when a brand name is an ordinary word.

targets[].citedAsSource boolean

Whether the answer cites one of its pages. Matched on the cited page’s hostname, where subdomains count and look-alikes do not.

targets[].sourcePositions number[]

Positions in answer.sources that belong to it.

targets[].retrieved boolean

Whether one of its domains was among the pages ChatGPT read while searching, cited or not. null when the answer did not show what it read.

otherBrandsMentioned object[]

The brands the answer itself presents that are none of your targets — the entries of its recommendation list with their rank, and the sites it links by name. Each { name, rank, firstMentionIndex }.

answer.markdown string

The answer as Markdown. Citations appear inline as ([label](url)).

answer.text string

The answer as plain text: no formatting, no citation labels. Every character offset in this response points into this string.

answer.sources object[]

The pages the answer cites, in the order it first cites them.

answer.sources[].position number

1-based position in the citation order.

answer.sources[].url string

The destination URL, with the assistant’s own tracking parameter removed.

answer.sources[].title string

The page title.

answer.sources[].domain string

Hostname of url.

answer.sources[].attribution string

The label shown on the citation, e.g. "Reddit Help".

answer.sources[].publishedAt string

When the page was published, or null when the answer did not show it.

answer.sources[].citedText string

The sentence that first cites this page. null for a page listed only in the answer’s closing "Sources" list, which comes after the cited ones.

answer.sources[].citationCount number

How many citations in the answer point at this page.

answer.inlineCitations object[]

Each citation in the answer: index, citedText (the sentence it is attached to) and sourcePositions (into sources).

answer.searchQueries string[]

The web searches ChatGPT ran for this answer, in order. [] when it did not search, null when the answer did not show them.

answer.retrievedPages object[]

Every page it looked at while searching — url, title, domain, snippet, publishedAt and cited. A page can be read and never cited, which is worth knowing on its own. null when the answer did not show them.

answer.sitesConsulted number

How many sites ChatGPT said it consulted, or null.

answer.usedWebSearch boolean

Whether this answer used the web.

answer.model string

The model the answer reported, or null when it did not say. It is never guessed.

answer.answeredAt string

ISO 8601 timestamp of when the answer finished.

Request

curl -X POST "https://api.fetchlayer.dev/chatgpt/mentions" \
  -H "Authorization: Bearer ss-your-key" \
  -H "Content-Type: application/json" \
  -d '{"prompt":"best reddit api alternatives","targets":[{"name":"FetchLayer","domains":["fetchlayer.dev"]},"Apify"]}'

Response

{
  "resultType": "mentions",
  "provider": "chatgpt",
  "requestedUrl": "https://chatgpt.com/",
  "transport": "chatgpt",
  "notes": [],
  "answersGenerated": 1,
  "pagesScraped": 1,
  "scrapedAt": "2026-09-16T01:57:30.208Z",
  "prompt": "best reddit api alternatives",
  "targets": [
    {
      "name": "FetchLayer",
      "mentioned": false,
      "mentionCount": 0,
      "firstMentionIndex": null,
      "orderOfFirstMention": null,
      "contexts": [],
      "citedAsSource": false,
      "sourcePositions": [],
      "retrieved": true
    },
    {
      "name": "Apify",
      "mentioned": true,
      "mentionCount": 1,
      "firstMentionIndex": 510,
      "orderOfFirstMention": 1,
      "contexts": [
        {
          "offset": 510,
          "matched": "Apify",
          "snippet": "…for production live search without maintaining scrapers; pricing and capabilities vary. Apify Reddit scrapers — useful for extraction jobs and datasets rather than a conventional…"
        }
      ],
      "citedAsSource": false,
      "sourcePositions": [],
      "retrieved": false
    }
  ],
  "otherBrandsMentioned": [
    {
      "name": "Arctic Shift",
      "rank": 1,
      "firstMentionIndex": 60
    },
    {
      "name": "PullPush",
      "rank": 2,
      "firstMentionIndex": 171
    }
  ],
  "answer": {
    "text": "For Reddit API alternatives in 2026, the main options are:\n\nArctic Shift — free historical Reddit dumps; best for bulk research/archive data, not real-time.\nPullPush — Pushshift-compatible historical REST API; useful for older scripts, but community-run and less reliable.\n…",
    "sources": [
      {
        "position": 1,
        "url": "https://www.redditapis.com/blogs/reddit-api-ai-training-data-2026",
        "title": "Arctic Shift for Reddit 2026: AI Training Data, JSONL, APIs",
        "domain": "redditapis.com",
        "attribution": "Reddit APIs",
        "publishedAt": "2026-06-25T00:00:00.000Z",
        "citedText": "Arctic Shift — free historical Reddit dumps; best for bulk research/archive data, not real-time.",
        "citationCount": 2
      }
    ],
    "searchQueries": [
      "Reddit API alternatives Reddit data API Pushshift Arctic Shift PullPush 2026"
    ],
    "sitesConsulted": 8,
    "usedWebSearch": true,
    "model": "gpt-5-6",
    "answeredAt": "2026-09-16T01:57:30.206Z"
  }
}