# AI Search Visibility Tracker: ChatGPT & Gemini Brand Mentions (`crunchy_galaxy_qcr/ai-visibility-tracker`) Actor

Track brand mentions in ChatGPT and Gemini. See if AI recommends you or competitors: visibility rate, rank, share of voice, sentiment, cited sources and gap prompts, plus a shareable HTML report. LLM SEO / GEO / AEO tracking from $0.04 per answer.

- **URL**: https://apify.com/crunchy_galaxy_qcr/ai-visibility-tracker.md
- **Developed by:** [Kendall Sorenson](https://apify.com/crunchy_galaxy_qcr) (community)
- **Categories:** AI, SEO tools, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$40.00 / 1,000 ai answer analyzeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## AI Search Visibility Tracker: ChatGPT & Gemini Brand Mentions (LLM SEO, GEO, AEO)

Find out whether **ChatGPT and Gemini mention and recommend your brand**, how you rank against competitors, and which websites AI cites when it answers your buyers' questions. It's an AI visibility and LLM SEO tool for generative engine optimization (GEO) and answer engine optimization (AEO). One run gives you a share-of-voice report. Schedule it weekly to track AI brand mentions over time.

More buyers now ask AI assistants instead of Google. If ChatGPT names three competitors and not you, that's a lost lead you never see in your analytics. This Actor measures it.

**Try it:** the prefilled Notion example (2 buyer prompts × 2 engines × 1 sample = 4 answers) costs $0.16.

### What you get

- **Visibility rate**: % of AI answers that mention your brand.
- **Share of voice**: your mentions vs your competitors'.
- **Rank**: where you appear in the answer (1 = named first), among tracked brands and among all brands the AI names.
- **Sentiment**: positive / neutral / negative / mixed, plus a one-line summary of how the AI describes you.
- **Citations**: which domains ChatGPT cites, and whether your own site is one of them.
- **Gap prompts**: questions where competitors are mentioned and you are not. These are your content priorities.
- **Discovered competitors**: brands the AI recommends that you didn't list.
- **Trend tracking**: give runs a tracking name and the report shows the change since the last run.
- **HTML report** ready to share with your team or client, plus every answer as a dataset row (JSON, CSV, Excel).

### How to use it

1. Enter your brand, optionally with your website: `Notion | notion.com | notion.so`.
2. Add competitors, one per line: `Confluence | atlassian.com`.
3. Add the questions your buyers ask (without your brand name), **or** just describe your category and the Actor writes the questions for you.
4. Run. Open the **REPORT** in the key-value store, or download the dataset.

To track over time, set **Tracking name** (e.g. `notion-weekly`) and add an Apify schedule.

#### Example input

```json
{
  "brand": "Notion | notion.com | notion.so",
  "competitors": ["Confluence | atlassian.com", "Coda | coda.io", "ClickUp | clickup.com"],
  "category": "team wiki and documentation software",
  "autoPromptCount": 10,
  "engines": ["chatgpt-search", "gemini-knowledge"],
  "samplesPerPrompt": 2,
  "trackingName": "notion-weekly"
}
```

#### Example output (one dataset row per answer)

```json
{
  "prompt": "What is the best wiki and docs tool for a remote startup team?",
  "engine": "chatgpt-search",
  "brandMentioned": true,
  "brandRank": 2,
  "brandRankAmongAllBrands": 2,
  "brandSentiment": "positive",
  "brandDescription": "Flexible all-in-one workspace, praised for ease of use",
  "brandCited": false,
  "mentionedInOrder": ["Confluence", "Notion", "Coda"],
  "otherBrands": ["Slab", "Slite"],
  "citedDomains": ["g2.com", "zapier.com", "atlassian.com"],
  "answer": "…full answer text…"
}
```

The run also saves `SUMMARY` (JSON with all metrics, per engine and per prompt) and `REPORT` (HTML) to the key-value store.

### Engines

| Engine | What it measures |
|---|---|
| **ChatGPT with web search** | Answers from OpenAI's API with live web search, the closest equivalent of what ChatGPT says when it searches. Includes the sources it cites. |
| **ChatGPT model knowledge** | What OpenAI's model says without searching: how it perceives your brand from training data. |
| **Gemini model knowledge** | The same for Google's Gemini. |

Answers come from the official APIs, so runs are reliable and never blocked. API answers closely track the consumer apps but are not identical, because the apps add personalization, memory and their own system prompts. Treat results as a consistent benchmark you can compare over time and against competitors.

### Pricing

You pay per AI answer analyzed. Sentiment, brand extraction, prompt generation and the report are included. Failed answers are not charged.

| Run | Answers | Cost at $0.04 per answer |
|---|---|---|
| 10 prompts × 1 engine | 10 | $0.40 |
| 10 prompts × 2 engines | 20 | $0.80 |
| 25 prompts × 2 engines × 2 samples | 100 | $4.00 |
| Weekly tracking of the above for a month | 400 | $16.00 |

Set a spending limit on the run and the Actor stops before exceeding it.

### Tips

- **Write prompts like a buyer**: "best X for Y", "alternatives to \[category]", "which X is cheapest for…". Don't put your brand in the prompt.
- **Use 2–3 samples per prompt.** AI answers vary between runs; more samples give steadier numbers.
- **List every domain you use** in the brand field (e.g. `Notion | notion.com | notion.so`) so the Actor can tell when AI cites your site.
- **Names that are common words** (Monday, Notion, Linear) can match ordinary text. Add the domain as an alias: `Monday | monday.com`.

### FAQ

**Why doesn't this match what I see in ChatGPT?** ChatGPT personalizes answers and changes them between sessions. This Actor asks the same way every time, which makes it a fair benchmark for trends and competitor comparison.

**Which models are used?** A current OpenAI model with web search, and a current Gemini model. You can override both in the Advanced section.

**Why no Gemini web search?** Google's terms for Gemini answers grounded in Google Search restrict storing and analyzing them, so this Actor uses Gemini's model knowledge only.

**Can I call it from code, Make, Zapier or n8n?** Yes, like any Apify Actor: via the API, the official integrations, or as an MCP tool for AI agents.

**Is my data shared?** Your brand, competitors and prompts are sent to the AI providers' APIs to generate answers, and stored in your own Apify storage.

### Use it from AI agents (MCP)

This Actor works with the [Apify MCP server](https://docs.apify.com/mcp). Ask your agent, for example: *"Check how often ChatGPT and Gemini recommend Notion vs Confluence for team-wiki questions."* The agent can find this Actor, read its input schema and run it, with a spending cap set through `maxTotalChargeUsd`.

### FAQ

**What does a run cost?** You pay per AI answer analyzed. A quick 2-prompt × 2-engine check is 4 answers. Set a spending limit on the run and the Actor stops at it.

**Why do results change between runs?** AI answers vary. Set *Samples per prompt* to 2–3 for more stable numbers, and use a *Tracking name* to follow trends.

**Is this GEO / AEO (generative engine optimization)?** Yes. Use the gap prompts and cited domains to decide which content to create and where to get mentioned.

**Something broke?** Open an issue on the Issues tab. We monitor it daily.

### FAQ

**How do I track brand mentions in ChatGPT?** Enter your brand, your competitors and the questions buyers ask. The Actor asks ChatGPT (with web search and from model knowledge) and Gemini, then measures whether, where and how you're mentioned.

**Which AI engines are supported?** ChatGPT with web search, ChatGPT model knowledge and Gemini model knowledge, through the official APIs. Perplexity, Claude and Google AI Overviews are not included.

**Do I need my own OpenAI or Gemini API key?** No. API costs are included in the per-answer price.

**How much does it cost?** $0.04 per AI answer analyzed. Failed answers are free.

### Code examples

Python and Node.js scripts for running this tracker through the API are on GitHub: <https://github.com/kendallcoding202/google-ads-transparency-api-examples>.

### Related

- [Google Ads Transparency Center Scraper](https://apify.com/crunchy_galaxy_qcr/google-ads-transparency-scraper): see every Google ad your competitors run.

# Actor input Schema

## `brand` (type: `string`):

The brand to track. Add every website domain it uses and other spellings after pipes, e.g. <code>Notion | notion.com | notion.so | Notion AI</code>. Domains are how the Actor detects when AI answers cite your site, so list all of them.

## `competitors` (type: `array`):

One per line, same format as the brand: <code>Name | domain.com | alias</code>. Use aliases for names that are common words (e.g. <code>Monday | monday.com</code>).

## `prompts` (type: `array`):

Questions your buyers ask AI assistants. Don't include your brand name in them. Leave empty and fill in <b>Category</b> to generate prompts automatically.

## `category` (type: `string`):

Used only when <b>Prompts</b> is empty. Describe what you sell, e.g. <code>team wiki and documentation software</code>. The Actor writes buyer-style questions without brand names.

## `autoPromptCount` (type: `integer`):

How many prompts to generate from the category.

## `engines` (type: `array`):

<b>ChatGPT with web search</b> answers the way ChatGPT does when it searches the web, with cited sources. <b>Model knowledge</b> engines answer from what the model learned in training, showing how it perceives your brand.

## `samplesPerPrompt` (type: `integer`):

AI answers vary. Asking each prompt 2–3 times gives more stable visibility numbers. Each sample is billed as one answer.

## `trackingName` (type: `string`):

Give the same name on every run (e.g. <code>notion-weekly</code>) and the report shows the trend versus previous runs. Pair with an Apify schedule.

## `country` (type: `string`):

Two-letter country code (e.g. <code>US</code>, <code>GB</code>, <code>DE</code>) to localize ChatGPT web search results.

## `language` (type: `string`):

Language of auto-generated prompts, e.g. <code>German</code>. Defaults to English.

## `audience` (type: `string`):

Optional, e.g. <code>marketing managers at mid-size B2B companies</code>.

## `forceWebSearch` (type: `boolean`):

By default the ChatGPT engine decides itself whether to search, like the real app. Turn on to force a web search on every answer.

## `extractBrands` (type: `boolean`):

Adds sentiment toward your brand, its rank among all brands named, and brands you didn't list. Included in the price.

## `includeAnswerText` (type: `boolean`):

Store each AI answer's full text in the dataset.

## `maxAnswers` (type: `integer`):

Safety cap on answers per run (prompts × engines × samples).

## `concurrency` (type: `integer`):

How many AI requests to run at the same time. Lower it if you hit rate limits.

## `openaiModel` (type: `string`):

Leave empty for the default.

## `geminiModel` (type: `string`):

Leave empty for the default.

## Actor input object example

```json
{
  "brand": "Notion | notion.com | notion.so",
  "competitors": [
    "Confluence | atlassian.com",
    "Coda | coda.io",
    "ClickUp | clickup.com",
    "Obsidian | obsidian.md"
  ],
  "prompts": [
    "What is the best wiki and docs tool for a remote startup team?",
    "Which note-taking app is best for project documentation?"
  ],
  "autoPromptCount": 10,
  "engines": [
    "chatgpt-search",
    "gemini-knowledge"
  ],
  "samplesPerPrompt": 1,
  "forceWebSearch": false,
  "extractBrands": true,
  "includeAnswerText": true,
  "maxAnswers": 300,
  "concurrency": 4
}
```

# Actor output Schema

## `results` (type: `string`):

One row per AI answer: whether the brand was mentioned, rank, sentiment, competitors mentioned, other brands and cited domains.

## `report` (type: `string`):

Shareable visibility report: visibility rate, share of voice, rank, citations, gap prompts and trend versus previous runs.

## `summary` (type: `string`):

All metrics overall, per engine and per prompt, plus top cited domains and discovered brands.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "brand": "Notion | notion.com | notion.so",
    "competitors": [
        "Confluence | atlassian.com",
        "Coda | coda.io",
        "ClickUp | clickup.com",
        "Obsidian | obsidian.md"
    ],
    "prompts": [
        "What is the best wiki and docs tool for a remote startup team?",
        "Which note-taking app is best for project documentation?"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("crunchy_galaxy_qcr/ai-visibility-tracker").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "brand": "Notion | notion.com | notion.so",
    "competitors": [
        "Confluence | atlassian.com",
        "Coda | coda.io",
        "ClickUp | clickup.com",
        "Obsidian | obsidian.md",
    ],
    "prompts": [
        "What is the best wiki and docs tool for a remote startup team?",
        "Which note-taking app is best for project documentation?",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("crunchy_galaxy_qcr/ai-visibility-tracker").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "brand": "Notion | notion.com | notion.so",
  "competitors": [
    "Confluence | atlassian.com",
    "Coda | coda.io",
    "ClickUp | clickup.com",
    "Obsidian | obsidian.md"
  ],
  "prompts": [
    "What is the best wiki and docs tool for a remote startup team?",
    "Which note-taking app is best for project documentation?"
  ]
}' |
apify call crunchy_galaxy_qcr/ai-visibility-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crunchy_galaxy_qcr/ai-visibility-tracker"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/r5fguKH3mxvfARnap/builds/vae3IJ2I7dxrHzUfp/openapi.json
