# AI Visibility Tracker: ChatGPT, Gemini & AI Overviews (`vncntlabs/ai-search-visibility-tracker`) Actor

Track whether your brand is mentioned and cited in ChatGPT, Gemini, Google AI Mode, AI Overviews and Perplexity for any prompt. Position vs competitors, cited sources and share of voice per engine for GEO/AEO and SEO agencies. Pay per answer, no subscription.

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

## Pricing

from $30.00 / 1,000 ai answers

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 Visibility Tracker: brand mentions and citations in ChatGPT, Gemini, Perplexity and Google AI Overviews

**Find out whether your brand shows up in AI answers.** This AI visibility tracker asks ChatGPT, Gemini, Google AI Mode, Google AI Overviews and Perplexity the prompts your buyers ask and reports, for every answer, whether your brand is mentioned, your position versus competitors, whether your site is cited as a source and which domains the AI relies on, with a share-of-voice summary per engine. Built for generative engine optimization (GEO/AEO) and SEO teams; pay per answer, no subscription.

Built for:

- **SEO and GEO agencies**: AI-visibility reports for clients, a baseline before GEO work, and proof of progress after it. Schedule it weekly and chart the trend.
- **Brand and content marketers**: see which competitors AI recommends instead of you, and which sites (reviews, listicles, forums) feed those answers, so you know where to get covered.
- **Founders and product marketers**: check "best X for Y" and "X vs Y" prompts in your category in minutes.

You pay **per answer**. Failed requests are free, and so are prompts where an engine gives no answer (for example, no AI Overview shown).

### What you get

| | Per answer (`type: "answer"`) | Per run (`type: "summary"`, free) |
|---|---|---|
| Brand | `brandMentioned`, `brandMentions`, `brandPosition` (1 = mentioned before every tracked competitor), `brandRankAmongAllBrands` (ChatGPT), `excerpt` around your first mention | `brandMentionRate`, `brandCitationRate`, `avgBrandPosition` per engine and for all engines |
| Citations | `brandCited`, `brandCitationRank`, `brandCitedUrls`, `sources` (rank, url, domain, title), `topCitedDomains`, `competitorsCited` | `citationShare` per brand, `topCitedDomains` across answers |
| Competitors | `competitorsMentioned` (in order of appearance), `competitorMentions` | `shareOfVoice` and `mentionsByBrand` |
| Answer | `answerText` (markdown), `model`, `fanOutQueries` (ChatGPT), `checkUrl`, `scrapedAt` | |
| Google extra | `aiOverviewShown`, `googleOrganicRank` and `googleOrganicUrl` (your classic top-10 rank for the same prompt) | |

**Engines and data source**

| Engine | Data source |
|---|---|
| ChatGPT | answer as shown on chatgpt.com, with web search |
| Gemini | answer as shown on gemini.google.com |
| Google AI Mode | AI Mode answer and its references |
| Google AI Overview | AI Overview on the normal results page, plus the organic top 10 |
| Perplexity | Sonar model with web search |

All answers come through DataForSEO's licensed API.

### Input examples

Basic check (one prompt, all five engines):

```json
{ "brandName": "HubSpot", "brandDomains": ["hubspot.com"], "prompts": ["best crm for small business"] }
```

Agency report: 20 prompts, competitors, each prompt asked twice:

```json
{
  "brandName": "Notion", "brandDomains": ["notion.so", "notion.com"], "brandAliases": ["Notion AI"],
  "competitors": ["Confluence | atlassian.com", "Coda | coda.io", "ClickUp | clickup.com", "Obsidian | obsidian.md"],
  "prompts": ["best note taking app for teams", "notion alternatives", "best wiki software for startups"],
  "engines": ["chatgpt", "gemini", "google_ai_mode", "google_ai_overview", "perplexity"],
  "country": "us", "repeats": 2
}
```

UK, Google only (AI Mode and AI Overviews):

```json
{ "brandName": "Monzo", "brandDomains": ["monzo.com"], "competitors": ["Revolut | revolut.com", "Starling | starlingbank.com"],
  "prompts": ["best bank account for freelancers uk"], "engines": ["google_ai_mode", "google_ai_overview"], "country": "gb" }
```

**Tips**

- Use the prompts your buyers really type: "best X for Y", "X vs Y", "X alternatives", "is X worth it", "how to do Y".
- Add your domains so citations are detected. Subdomains (blog., help.) count.
- Answers vary between runs. Use `repeats: 2–3` for a reliable mention rate. A weekly schedule shows trends.

### Output example (one answer, shortened)

```json
{
  "type": "answer", "status": "ok", "prompt": "best crm for small business", "engine": "chatgpt",
  "engineLabel": "ChatGPT", "model": "gpt-6", "repeat": 1, "brand": "HubSpot", "country": "United States",
  "brandMentioned": true, "brandMentions": 4, "brandPosition": 1, "brandRankAmongAllBrands": 1,
  "brandCited": true, "brandCitationRank": 1, "brandCitedUrls": ["https://www.hubspot.com/products/crm"],
  "competitorsMentioned": ["Zoho CRM", "Pipedrive", "Freshsales"], "competitorsCited": ["Zoho CRM", "Pipedrive"],
  "excerpt": "…My recommendation: Start by comparing HubSpot, Zoho CRM, and Pipedrive…",
  "topCitedDomains": ["hubspot.com", "spotsaas.com", "help.zoho.com"],
  "sources": [{ "rank": 1, "url": "https://www.hubspot.com/products/crm", "domain": "hubspot.com", "title": "..." }],
  "answerText": "…", "checkUrl": "https://chatgpt.com/?q=best%20crm%20for%20small%20business&hints=search",
  "charged": true, "scrapedAt": "2026-10-17T01:48:40Z"
}
```

Summary row (shortened):

```json
{ "type": "summary", "engine": "all", "answers": 5, "brandMentionRate": 1.0, "brandCitationRate": 0.2,
  "avgBrandPosition": 1.4, "shareOfVoice": { "HubSpot": 0.278, "Zoho CRM": 0.278, "Pipedrive": 0.222, "Salesforce": 0.111, "Freshsales": 0.111 } }
```

Ready dataset views: **AI answers**, **Citations** and **Share of voice**. Export to CSV, Excel or JSON, or use the API. Plug it into Looker Studio or Sheets for client reports.

### Pricing (pay per event)

| Event | When it is charged |
|---|---|
| Actor start | once per run |
| `ai-answer` | one engine's answer to one prompt, delivered and analysed |

Each prompt × engine × repeat is one answer. Example: 20 prompts × 5 engines = 100 answers.

You are not charged for:

- prompts where an engine returned no answer, or Google showed no AI Overview (the row is still delivered, with your organic rank);
- failed requests;
- skipped inputs (duplicates, invalid domains, unknown engines);
- summary rows;
- anything beyond your run's maximum charge. The run stops cleanly and lists what it didn't process.

**Apify free plan:** 1 prompt across all selected engines, no repeats, per run. Any paid Apify plan unlocks up to 200 prompts, 3 repeats and 1,000 answers per run.

### Use from AI agents (MCP)

AI assistants such as Claude, ChatGPT and Cursor can run this Actor through [Apify's MCP server](https://docs.apify.com/platform/integrations/mcp) (`https://mcp.apify.com`). The agent can look up the Actor, read its input schema, run it and read the results. Runs use your own Apify account and are charged at the prices on this page.

- **Actor name:** `vncntlabs/ai-search-visibility-tracker`
- **Server URL with only this tool:** `https://mcp.apify.com?tools=vncntlabs/ai-search-visibility-tracker`. The default `https://mcp.apify.com` also works; the agent can then search Apify Store and call the Actor by name.
- **Claude** (desktop app or claude.ai): Settings > Connectors > Add custom connector, paste the server URL, then sign in to Apify.
- **ChatGPT:** turn on Developer mode, then Settings > Apps & Connectors > Create, paste the server URL and choose OAuth.
- **Cursor:** run `/add-plugin apify` in Cursor chat and connect the Apify MCP server under Cursor Settings > Tools & MCPs, or add the server to `mcp.json`:

```json
{ "mcpServers": { "apify": { "url": "https://mcp.apify.com?tools=vncntlabs/ai-search-visibility-tracker" } } }
```

Example prompt: *"Use the Apify Actor vncntlabs/ai-search-visibility-tracker to check whether my brand Acme (acme.com) is mentioned or cited for the prompt "best project management tool for small teams"."*

To cap the cost of an agent's run, it can pass `maxTotalChargeUsd` in the run options.

### FAQ

**How is "position" calculated?** It is the order of first mention among your brand and the competitors you list. 1 means the AI names you before every listed competitor. For ChatGPT, `brandRankAmongAllBrands` also ranks you among every brand ChatGPT itself tagged.

**What about prompts that name my brand ("HubSpot vs Salesforce", "HubSpot alternatives")?** The answer naturally repeats your name, so such rows carry `brandInPrompt: true`. Filter them out for a pure "is AI recommending us" rate, or keep them to see how AI describes you.

**What counts as a mention?** Your brand name or aliases as a whole word (case-insensitive), or your domain written in the text. A link alone doesn't count as a mention; it counts as a citation.

**Why do results differ from what I see?** AI engines personalise and vary their answers. These are logged-out answers for the chosen country and language at `scrapedAt`. Use repeats and schedules for trends.

**Which countries?** 24, including the US, UK, Canada, Australia, India, Germany, France, Spain, Italy, the Netherlands, Brazil, Mexico and Japan. Perplexity answers aren't location-targeted.

**How long does a run take?** ChatGPT and Gemini take about 30 seconds per answer; Google and Perplexity take a few seconds. Answers run in parallel, so 100 answers usually finish in a few minutes.

**Is this affiliated with OpenAI, Google or Perplexity?** No. Data comes from DataForSEO's licensed API. Not affiliated with or endorsed by OpenAI, Google or Perplexity.

# Actor input Schema

## `brandName` (type: `string`):

The brand to look for in AI answers, e.g. <code>HubSpot</code>. Matched as a whole word, case-insensitive.

## `brandDomains` (type: `array`):

Your domains, e.g. <code>hubspot.com</code>. Used to detect when an AI engine <b>cites</b> your site as a source (subdomains count).

## `brandAliases` (type: `array`):

Optional product names or spellings that also count as a mention, e.g. <code>HubSpot CRM</code>, <code>Hub Spot</code> (up to 10).

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

Up to 15. Write <code>Name | domain</code> (e.g. <code>Pipedrive | pipedrive.com</code>), just a name, or just a domain. Used for your position in each answer and share of voice.

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

Questions your buyers ask AI, one per line (up to 200), e.g. <code>best crm for small business</code>, <code>hubspot vs salesforce</code>. Each prompt is asked to every selected engine.

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

Engines to check. Each prompt × engine is one answer (one <code>ai-answer</code> event). Google AI Overview is free when Google shows no AI Overview for the prompt.

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

Location the AI answers are requested from (ChatGPT, Gemini and Google). Perplexity answers are not location-targeted.

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

Optional. Defaults to the country's main language.

## `repeats` (type: `integer`):

AI answers vary from run to run. Ask 2–3 times for a more reliable mention rate (each repeat is charged as an answer).

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

Include the full answer (markdown, up to 20,000 characters). Turn off for lighter datasets; the excerpt around your brand is always included.

## Actor input object example

```json
{
  "brandName": "HubSpot",
  "brandDomains": [
    "hubspot.com"
  ],
  "competitors": [
    "Salesforce | salesforce.com",
    "Zoho CRM | zoho.com",
    "Pipedrive | pipedrive.com"
  ],
  "prompts": [
    "best crm for small business"
  ],
  "engines": [
    "chatgpt",
    "gemini",
    "google_ai_mode",
    "google_ai_overview",
    "perplexity"
  ],
  "country": "us",
  "repeats": 1,
  "includeAnswerText": true
}
```

# Actor output Schema

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

No description

## `citations` (type: `string`):

No description

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

No description

## `all` (type: `string`):

No description

## `run` (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 = {
    "brandName": "HubSpot",
    "brandDomains": [
        "hubspot.com"
    ],
    "competitors": [
        "Salesforce | salesforce.com",
        "Zoho CRM | zoho.com",
        "Pipedrive | pipedrive.com"
    ],
    "prompts": [
        "best crm for small business"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("vncntlabs/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 = {
    "brandName": "HubSpot",
    "brandDomains": ["hubspot.com"],
    "competitors": [
        "Salesforce | salesforce.com",
        "Zoho CRM | zoho.com",
        "Pipedrive | pipedrive.com",
    ],
    "prompts": ["best crm for small business"],
}

# Run the Actor and wait for it to finish
run = client.actor("vncntlabs/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 '{
  "brandName": "HubSpot",
  "brandDomains": [
    "hubspot.com"
  ],
  "competitors": [
    "Salesforce | salesforce.com",
    "Zoho CRM | zoho.com",
    "Pipedrive | pipedrive.com"
  ],
  "prompts": [
    "best crm for small business"
  ]
}' |
apify call vncntlabs/ai-search-visibility-tracker --silent --output-dataset

```

## MCP server setup

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