# AI Search Visibility Tracker: ChatGPT, Perplexity (`adyg/ai-search-visibility-tracker`) Actor

Track brand mentions, share of voice and cited URLs in ChatGPT, Perplexity, Gemini, Google AI Overviews, AI Mode and Claude. Per prompt x engine: full answer, mention rank, sentiment, citations, your domain cited or not. Monitoring mode flags gained/lost mentions. GEO/AEO rank tracker.

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

## Pricing

from $28.00 / 1,000 prompt checks

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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: brand mentions in ChatGPT, Perplexity, Gemini & Google AI Overviews

**AI Search Visibility Tracker** shows whether **ChatGPT, Perplexity, Gemini, Google AI Overviews, Google AI Mode and Claude** mention your brand when buyers ask them for recommendations. For every prompt and engine you get the full AI answer, whether your brand and each competitor is mentioned, the **rank of the first mention**, a **sentiment** snippet, every **cited URL**, and whether **your domain is cited**. Each run ends with **share of voice, mention rate and citation rate** per engine and brand. Turn on **monitoring mode** and schedule it to get alerts on gained and lost AI mentions. It's a GEO / AEO rank tracker that works without proxies, logins or API keys.

### What does AI Search Visibility Tracker do?

Enter your brand, your domain, a few competitors and the questions your customers ask, or just a product category, and pick the AI engines. For each **prompt x engine** you get one row:

- 🤖 **Full answer text** (markdown) from the real ChatGPT Search, Gemini, Google AI Overview and AI Mode answers, plus Perplexity Sonar and Claude
- ✅ **Brand mentioned?** for your brand and every competitor, with mention count
- 🥇 **Rank of first mention** among tracked brands (1 = mentioned first) and how early in the answer it appears
- 🙂 **Sentiment** (positive / neutral / negative / mixed) and the sentence that mentions you
- 🔗 **Cited URLs and domains**, and whether **your domain is cited**
- 🔍 **Fan-out queries**: the web searches ChatGPT ran to build its answer
- 📊 **Summary rows**: share of voice, mention rate, average rank and citation rate per engine and per brand
- 🔔 **Monitoring mode**: gained/lost mentions, citations and rank changes compared with your previous run

### Why track AI search visibility?

More and more buyers ask ChatGPT, Perplexity or Google's AI Overviews "what's the best ... ?" instead of clicking ten blue links. If the AI doesn't name you, you're invisible in that conversation. This Actor turns that into numbers you can track, report and improve:

- **All major AI engines in one run.** Six engines in one dataset, with the same metrics for each.
- **Real answers, localized.** ChatGPT, Gemini, AI Overviews and AI Mode come from the actual consumer products for the country you choose (190+ countries).
- **Built for comparison.** Competitors, share of voice and rank are part of every run, not an extra.
- **Monitoring built in.** Schedule it weekly and every row tells you what changed since the last run.
- **Reliable and fast.** It uses a licensed AI-answer data API, so there are no browsers, proxies or CAPTCHAs and runs rarely fail. Failed checks are free.
- **Clean JSON for agents and dashboards.** Small, flat rows that work in Google Sheets, Looker Studio, n8n, Make, Zapier or an AI agent.

### Use cases

- **GEO / AEO tracking**: measure how generative engines rank your brand for your money keywords.
- **Competitor benchmarking**: see who ChatGPT recommends first and which sources it trusts.
- **Content & PR planning**: find the domains (review sites, listicles, Reddit, YouTube) that AI engines cite, then get featured there.
- **Agency reporting**: share of voice per engine and per client, every week.
- **Brand monitoring**: get flagged when an engine stops mentioning you or starts describing you negatively.

### How to track your brand in AI search

1. Enter **Your brand(s)** (add spelling variants after `|`, e.g. `HubSpot | HubSpot CRM`) and **Your domain(s)**.
2. Add **Competitors** (optional): `Salesforce | salesforce.com`.
3. Add **Prompts** (the questions buyers ask), or **Seed topics** such as `CRM software` to generate buyer-intent prompts automatically.
4. Pick **AI engines** and the **Country**.
5. Optional: turn on **Monitoring mode** and give the project a **Tracking ID**, then schedule the Actor.
6. Click **Start** and export the results as Excel, CSV or JSON, or fetch them through the API.

#### Input example

```json
{
    "brands": ["HubSpot"],
    "domains": ["hubspot.com"],
    "competitors": ["Salesforce | salesforce.com", "Pipedrive | pipedrive.com", "Zoho CRM | Zoho | zoho.com"],
    "prompts": ["What is the best CRM for a small business?"],
    "seedTopics": ["CRM software"],
    "promptsPerTopic": 3,
    "engines": ["chatgpt", "perplexity", "gemini", "google_ai_overview", "google_ai_mode", "claude"],
    "country": "United States",
    "language": "English",
    "monitoringMode": true,
    "trackingId": "hubspot-us"
}
```

| Field | Description |
| --- | --- |
| `brands` | Your brand name(s). Variants after `\|`. A domain-looking token becomes your domain. |
| `domains` | Your domain(s), for the "is my site cited?" check. Subdomains count. |
| `competitors` | `Name \| variant \| domain.com`, one per line. |
| `prompts` | Questions to ask (max 500 characters each). |
| `seedTopics` | Product categories to generate buyer-intent prompts from. |
| `promptsPerTopic` | Prompts per seed topic (1-10, default 3). |
| `promptGeneration` | `templates` (default, stable wording, best for monitoring) or `ai` (natural questions written by an AI model, free). |
| `engines` | `chatgpt`, `perplexity`, `gemini`, `google_ai_overview`, `google_ai_mode`, `claude`. Default: ChatGPT, Perplexity, AI Overviews. |
| `country` / `language` | e.g. `Germany` / `German`, or `DE` / `de`. Default: United States / English. |
| `monitoringMode` | Compare with the previous run that has the same `trackingId`. |
| `trackingId` / `monitoringStoreName` | Project name and named key-value store that keep the previous results. |
| `maxChecks` | Cap on prompt x engine checks per run (default 200). |
| `chatgptWebSearch` | Force ChatGPT to search the web and cite sources (default on). |
| `caseSensitive` | Count only capitalized mentions (for brands that are common words). |

#### Output example (one check)

```json
{
    "type": "check",
    "prompt": "What is the best CRM for a small business?",
    "engine": "chatgpt",
    "engine_name": "ChatGPT",
    "model": "gpt-5-6",
    "country": "United States",
    "status": "ok",
    "brand": "HubSpot",
    "brand_mentioned": true,
    "brand_position": 1,
    "brand_mention_count": 9,
    "brand_sentiment": "positive",
    "brand_snippet": "If you mean the best CRM for a typical small business in 2026, my pick is HubSpot.",
    "your_domain_cited": true,
    "your_cited_urls": ["https://www.hubspot.com/pricing/sales", "https://www.hubspot.com/products/crm"],
    "competitors_mentioned": ["Pipedrive", "Zoho CRM"],
    "first_mentioned_brand": "HubSpot",
    "cited_domains": ["hubspot.com", "zoho.com", "stackbytrade.com"],
    "citations_count": 4,
    "fan_out_queries": ["best CRM for small business 2026 HubSpot Zoho Pipedrive Freshsales pricing features"],
    "brand_results": [
        { "name": "HubSpot", "is_yours": true, "mentioned": true, "mention_count": 9, "position": 1,
          "sentiment": "positive", "cited": true, "cited_urls": ["https://www.hubspot.com/products/crm"] },
        { "name": "Salesforce", "is_yours": false, "mentioned": false, "mention_count": 0, "position": null,
          "sentiment": null, "cited": false, "cited_urls": [] }
    ],
    "citations": [{ "url": "https://www.hubspot.com/pricing/sales", "domain": "hubspot.com", "title": "Sales Software Pricing | HubSpot" }],
    "answer_text": "If you mean **the best CRM for a typical small business in 2026**, my pick is **HubSpot**. ...",
    "change_status": "first_check",
    "checked_at": "2026-10-08T15:14:10Z"
}
```

#### Summary rows (share of voice)

After the checks, the dataset gets one `"type": "summary"` row per engine (plus `"engine": "all"`) and brand:

| Brand | Mention rate | Share of voice | Avg. rank | Citation rate |
| --- | --- | --- | --- | --- |
| HubSpot | 100% | 30% | 1.17 | 33% |
| Zoho CRM | 100% | 30% | 2.17 | 67% |
| Pipedrive | 100% | 30% | 3.0 | 0% |
| Salesforce | 33% | 10% | 3.0 | 17% |

*(1 prompt on all 6 engines, United States, October 2026.)*

- **Mention rate** = checks that mention the brand / completed checks.
- **Share of voice** = the brand's mentions / mentions of all tracked brands.
- **Avg. rank** = average rank among tracked brands when mentioned (1 = named first).
- **Citation rate** = checks citing the brand's domain / completed checks.

The dataset has **Visibility**, **Share of voice**, **Full answers**, **Citations** and **Changes** views. The `SUMMARY` record holds the run statistics. In monitoring mode, the `CHANGES` record lists every prompt x engine that changed.

#### Monitoring mode

With `monitoringMode: true`, results are saved in the named key-value store `ai-visibility-monitor` (in your account) under your `trackingId`. Each new run compares every prompt x engine with the last time it was checked:

- `change_status`: `gained_mention`, `lost_mention`, `gained_citation`, `lost_citation`, `position_changed`, `competitors_changed`, `unchanged` or `first_check`
- `brands_gained` / `brands_lost`, `position_change` (+ = moved up), `previous_checked_at`
- Summary rows get `mention_rate_change`, `share_of_voice_change` and `citation_rate_change`.

Schedule the Actor weekly and connect a webhook or the Slack/email integration to get notified.

### Pricing

This Actor uses **pay-per-event** pricing: you pay per **prompt check**, meaning one prompt answered by one AI engine. Checks that fail are free.

| Event | Price |
| --- | --- |
| Prompt check (`prompt-check`) | **$0.04** per prompt × engine |

| Example run | Checks | Cost |
| --- | --- | --- |
| 1 prompt on ChatGPT + Google AI Mode | 2 | $0.08 |
| 10 prompts on ChatGPT, Perplexity, AI Overviews | 30 | $1.20 |
| 25 prompts on all 6 engines (weekly monitoring) | 150 | $6.00 |

To control spend, set **Maximum cost per run** in the run options, or `maxChecks`. The Actor works out how many checks fit before it starts and stops cleanly at the limit. **Free Apify plan:** runs are limited to 10 checks.

### Related tools

Pair AI visibility with classic SEO data: keyword volume, authority, traffic and competitor ads.

- [Keyword Search Volume (Google Keyword Planner)](https://apify.com/adyg/keyword-search-volume): search volume, CPC and keyword ideas in bulk
- [Domain Authority & Traffic Checker](https://apify.com/adyg/domain-authority-traffic-checker): bulk domain authority, backlinks and organic traffic
- [Google Ads Transparency Scraper](https://apify.com/adyg/google-ads-transparency-scraper): see competitors' Google, YouTube and Shopping ads
- [Google Trends Scraper](https://apify.com/adyg/google-trends-scraper): interest over time, by region, related queries and Trending Now

All of these are maintained by the same developer and export flat JSON, CSV or Excel, so you can feed one tool's dataset into the next.

### FAQ

**Where does the data come from?**
From a licensed AI-answer data provider. ChatGPT (with web search), Gemini, Google AI Overviews and Google AI Mode are collected from the live consumer products for your country. Perplexity uses the Sonar model with web search. Claude uses Claude Haiku without web search, so Claude rows have no citations.

**Why does the same prompt give different answers on different runs?**
AI engines aren't deterministic. Answers change with time, location and model updates. That's why share of voice over many prompts and repeated runs is more reliable than a single answer. Use monitoring mode to track the trend.

**What does `no_answer` mean?**
The engine didn't show an AI answer, most often because Google showed no AI Overview for that query. That's still a valid visibility result (your brand isn't visible), so it counts as a completed check.

**How is the rank calculated?**
By order of first mention among your brand and the competitors you entered: 1 = named first. ChatGPT rows also include `position_among_all_brands` when ChatGPT marks brand entities.

**How is sentiment detected?**
With a fast word-list model applied to the sentences that mention the brand. It flags clear praise ("best", "easy", "recommended") or criticism ("expensive", "limited", "clunky"). Read `brand_snippet` for context.

**My brand name is a common word. Will it over-count?**
Turn on **Case-sensitive brand matching** and add precise variants (e.g. `Monday.com | monday CRM`).

**Can I use it through the API, on a schedule or from an AI agent?**
Yes. Use the Apify API, schedules, webhooks, or integrations like Make, Zapier, n8n and Google Sheets. The small JSON rows also work well for MCP and AI agents.

**Is this affiliated with OpenAI, Google, Perplexity or Anthropic?**
No. ChatGPT, Gemini, Google, Perplexity and Claude are trademarks of their owners.

**Found a problem or need another engine?**
Open an issue on the Issues tab with your run ID.

### Acceptable use

- This Actor is an independent tool. It is not affiliated with, endorsed by or sponsored by Google, DataForSEO, OpenAI, Perplexity or Anthropic.
- Don't use the data to build a competing search engine, or otherwise to compete with or harm the search engines and AI assistants the data comes from.
- The Actor may not be used from, or for people or organizations in, Russia, Belarus, Cuba, Iran, Syria, Myanmar, North Korea, Crimea or the Russian-occupied territories of Ukraine.
- You are responsible for using the results lawfully, including privacy laws such as GDPR for any personal data they contain.

# Actor input Schema

## `brands` (type: `array`):

Your brand name, one per line. Add spelling variants after a <code>|</code>, e.g. <code>HubSpot | HubSpot CRM</code>. A token that looks like a domain (<code>hubspot.com</code>) is used as your domain. Matching is case-insensitive and whole-word.

## `domains` (type: `array`):

Your website domain(s), e.g. <code>hubspot.com</code>. Used to check whether AI answers <b>cite</b> your site (subdomains count). Writing the domain in the answer text also counts as a mention.

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

Competitor brands to compare with, one per line: <code>Name | variant | domain.com</code>. Used for share of voice, rank and citation comparisons.

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

Questions your buyers ask AI assistants, one per line, e.g. <code>What is the best CRM for a small business?</code>. Max 500 characters each. Every prompt is checked on every selected engine (1 prompt x 3 engines = 3 checks). Leave empty if you use seed topics.

## `seedTopics` (type: `array`):

Optional: product categories such as <code>CRM software</code> or <code>running shoes for flat feet</code>. The Actor generates buyer-intent questions ("What is the best ...", "alternatives to <competitor>", ...) for each topic and checks them too.

## `promptsPerTopic` (type: `integer`):

How many questions to generate per seed topic.

## `promptGeneration` (type: `string`):

<b>Templates</b>: proven buyer-intent question patterns (stable from run to run, best for monitoring). <b>AI-written</b>: an AI model writes natural, varied buyer questions for each topic (at no extra charge; up to 20 topics).

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

Engines to check every prompt on. Each prompt x engine is one check. ChatGPT, Gemini, Google AI Overviews and Google AI Mode are the real consumer answers (localized); Perplexity and Claude come from their official models.

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

Where the questions are asked from: country name (<code>Germany</code>), 2-letter code (<code>DE</code>) or location code (<code>2276</code>). 190+ countries.

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

Language name (<code>German</code>) or code (<code>de</code>). Write your prompts in this language.

## `monitoringMode` (type: `boolean`):

Save results to a named key-value store and compare each prompt x engine with the previous run: flags gained/lost mentions, citations and rank changes, and adds share-of-voice changes to the summary. Schedule the Actor (e.g. weekly) to track AI visibility over time.

## `trackingId` (type: `string`):

Name of this tracking project, e.g. <code>hubspot-us</code>. Runs with the same ID are compared with each other. Default: derived from your brand, country and language.

## `monitoringStoreName` (type: `string`):

Named key-value store (in your Apify account) that keeps the previous results.

## `maxChecks` (type: `integer`):

Upper limit of prompt x engine checks per run (cost control). The run also stops cleanly at your Maximum cost per run.

## `chatgptWebSearch` (type: `boolean`):

Ask ChatGPT to search the web (like ChatGPT Search) so answers cite sources. Turn off to see what ChatGPT says from memory.

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

Save the complete AI answer (markdown) in each row.

## `caseSensitive` (type: `boolean`):

Turn on for brand names that are also common words (e.g. <code>Notion</code>, <code>Monday</code>) to count only capitalized mentions.

## `maxConcurrency` (type: `integer`):

How many checks run at the same time.

## Actor input object example

```json
{
  "brands": [
    "HubSpot"
  ],
  "domains": [
    "hubspot.com"
  ],
  "competitors": [
    "Salesforce | salesforce.com",
    "Pipedrive | pipedrive.com"
  ],
  "prompts": [
    "What is the best CRM for a small business?"
  ],
  "promptsPerTopic": 3,
  "promptGeneration": "templates",
  "engines": [
    "chatgpt",
    "google_ai_mode"
  ],
  "country": "United States",
  "language": "English",
  "monitoringMode": false,
  "monitoringStoreName": "ai-visibility-monitor",
  "maxChecks": 200,
  "chatgptWebSearch": true,
  "includeAnswerText": true,
  "caseSensitive": false,
  "maxConcurrency": 5
}
```

# Actor output Schema

## `checks` (type: `string`):

No description

## `shareOfVoice` (type: `string`):

No description

## `answers` (type: `string`):

No description

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

No description

## `changes` (type: `string`):

No description

# 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 = {
    "brands": [
        "HubSpot"
    ],
    "domains": [
        "hubspot.com"
    ],
    "competitors": [
        "Salesforce | salesforce.com",
        "Pipedrive | pipedrive.com"
    ],
    "prompts": [
        "What is the best CRM for a small business?"
    ],
    "engines": [
        "chatgpt",
        "google_ai_mode"
    ],
    "country": "United States"
};

// Run the Actor and wait for it to finish
const run = await client.actor("adyg/ai-search-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 = {
    "brands": ["HubSpot"],
    "domains": ["hubspot.com"],
    "competitors": [
        "Salesforce | salesforce.com",
        "Pipedrive | pipedrive.com",
    ],
    "prompts": ["What is the best CRM for a small business?"],
    "engines": [
        "chatgpt",
        "google_ai_mode",
    ],
    "country": "United States",
}

# Run the Actor and wait for it to finish
run = client.actor("adyg/ai-search-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 '{
  "brands": [
    "HubSpot"
  ],
  "domains": [
    "hubspot.com"
  ],
  "competitors": [
    "Salesforce | salesforce.com",
    "Pipedrive | pipedrive.com"
  ],
  "prompts": [
    "What is the best CRM for a small business?"
  ],
  "engines": [
    "chatgpt",
    "google_ai_mode"
  ],
  "country": "United States"
}' |
apify call adyg/ai-search-visibility-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,adyg/ai-search-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/UwnNd58oE1KHfw9E7/builds/eh9hiGApPOVL5L3SA/openapi.json
