# AI Brand Visibility Tracker - ChatGPT & Google AI Overviews (`oswaldocarabano/ai-brand-visibility-tracker`) Actor

Track how ChatGPT and Google AI Overviews mention your brand. Real answers read from a real browser, not an LLM API: mention, position, share of voice vs competitors, sentiment, cited sources with real URLs and a brand report. Pay only for answers.

- **URL**: https://apify.com/oswaldocarabano/ai-brand-visibility-tracker.md
- **Developed by:** [Oswaldo Carabano](https://apify.com/oswaldocarabano) (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

from $20.00 / 1,000 google ai overview checkeds

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 Brand Visibility Tracker — ChatGPT & Google AI Overviews

Find out whether **Google AI Overviews** and **ChatGPT** recommend your brand when customers ask about your category. The actor asks your prompts in a **real browser**, exactly as a visitor sees them — the AI Overview on the Google results page and, as a beta option, ChatGPT without login, with its live web search — and measures your **brand visibility**: mention, rank among all brands named, share of voice against your competitors, tone, and whether your own website is **cited as a source**. Every cited link is resolved to its real URL.

- **Real answers, not an LLM API.** Most AI visibility trackers send your prompt to a model API, which has no live web search and no AI Overview. This actor reads the answers your customers actually get.
- **43 fields per row:** full answer text and markdown, every cited source (URL, domain, title, publisher, snippet), the brands the engine itself recognized with their websites, your brand's position, context and sentiment, competitors named and not named, and more.
- **Brand report per run:** mention rate, average position, share of voice per engine, most cited domains, prompts where you are missing, and **changes since your previous run**.
- **Pay only for answers:** a check that fails, or a Google search that shows no AI Overview, costs nothing.

> **ChatGPT is in beta.** Google AI Overviews is the default engine and is fast and reliable. ChatGPT is an explicit option: from Apify's servers it currently accepts only some browser sessions. On 14 Oct 2026, **158 of 488 ChatGPT attempts (32 %)** were accepted in 50 test runs; retries still returned an answer for 158 of 162 ChatGPT checks, but a check can take several minutes, and runs limited to 5 minutes got a ChatGPT answer in 8 of 10. A ChatGPT check without an answer is never charged.

### Who uses it

- **SEO and GEO teams (generative engine optimization):** track whether ChatGPT and Google's AI answers mention your brand for "best X", "X alternatives" and "X vs Y" questions, and which sites they cite so you know where to get featured.
- **Marketing and brand managers:** share of voice in AI search against named competitors, by engine and country, with a monthly or weekly trend from scheduled runs.
- **Agencies:** one run per client with the client's prompts, brand aliases and competitors; export JSON, CSV or Excel, or call it from the Apify API.
- **Product and PR teams:** see the exact sentences AI engines write about your product, their tone, and the sources they rely on.

### How it compares (measured 14 Oct 2026)

We read the published input and output schemas of the AI-visibility and AI-answer actors in Apify Store through the Apify API, and measured our own success rate on the Apify platform. No third-party actor was run.

| | **This actor** | LLM-API brand trackers | ChatGPT / AI Overview answer scrapers |
|---|---|---|---|
| Source of the answer | Real Google results page and ChatGPT (beta) in a browser | Model API (no live web search, no AI Overview) | Real answer |
| Brand metrics (mention, position, share of voice, sentiment) | Yes, per row and in a run report | Yes | No |
| Cited sources with real URLs | Yes: median 18 per ChatGPT answer, 7 per AI Overview (13–14 Oct, n=261 and 145) | Some | Some |
| Brands the engine itself recognized | Yes, with their websites | No | Only one of them |
| Country and language | 5 countries, 3 languages | Missing in 2 of the 5 most used | Partly |
| Output fields declared in the schema | 43 | 0–20 (7 of 11 actors declare none) | 0–18 |
| Fields filled per row (measured) | **36** per row (median of 306 answers, 14 Oct 2026) | at most 20 (all declared fields; not measured, no public sample) | at most 18 |
| Price of the main event | **$0.02** per AI Overview; $0.083 per ChatGPT answer (beta) | $0.05–$0.30 per check | $0.20 per ChatGPT answer; $0.003 per AI Overview without brand metrics |
| Failed checks charged | Never | Varies | Varies |

In 50 test runs on the Apify platform with varied inputs (5 countries, 3 languages, 1 to 48 checks per run, 14 Oct 2026) **50 of 50 runs succeeded**, charges matched the delivered answers in all 50, no row was duplicated, and 315 of 319 checks returned a result (306 answers plus 9 Google searches that showed no AI Overview; the other 4 were refused by the source after every retry and were not charged). In the morning of the same day, before ChatGPT's acceptance rate dropped, **95–100 %** of ChatGPT checks returned an answer (n=20 per proxy route, three routes) and **60 of 60** Google checks were read, 95 % of them with an AI Overview. The brand mentioned in the prompt was found in 89 % of ChatGPT answers and 92 % of AI Overviews; a made-up control brand was found in **0 of 407** answers.

### What you get

| Group | Fields |
|---|---|
| Check | `rowType`, `checkId` (stable across runs), `engine`, `prompt`, `country`, `language`, `repetition`, `checkedAt`, `billable`, `attempts`, `responseMs` |
| Answer | `answerText`, `answerMarkdown` (ChatGPT), `answerLength`, `answerSource`, `aiOverviewPresent` and `aiOverviewLabel` (Google), `answerFormat`, `imageCount`, `citeMarkerCount` |
| Your brand | `brandMentioned`, `brandMentionCount`, `brandPosition`, `brandContext`, `brandSentiment`, `brandShareOfVoice`, `brandInEntities`, `brandEntityCategory`, `brandCitedAsSource`, `brandCitations` |
| Competitors | `competitorsMentioned` (position, mentions, context, sentiment), `competitorsNotMentioned`, `competitorsCitedAsSource`, `brandsRanking` (every brand named, in order), `totalBrandsMentioned` |
| Sources | `citations` (position, url, domain, title, publisher, snippet, kind), `citationCount`, `citedDomains`, `hiddenSourceCount` (Google "+N"), `links` written in the answer (ChatGPT) |
| Entities | `entities`: brands, products and organizations the engine recognized, with category and website |
| Errors | `error` with a code (`blocked`, `no-answer`, `source-changed`, `timeout`, `input`) and a plain-English message; error rows are never charged |

Every row has every field; a value the engine did not give is `null`, never missing. The **brand report** is saved as `BRAND_REPORT` in the run's key-value store, and checks that could not be completed are listed in `ERRORS`.

### Pricing

Pay per event:

| Event | Price |
|---|---|
| Google AI Overview checked | **$0.02** (not charged when Google shows no AI Overview) |
| ChatGPT answer checked (beta) | $0.083 (not charged when ChatGPT gives no answer) |
| Brand report (once per run, only if at least one answer was read) | $0.10 |
| Actor start | $0.00005 per GB of memory ($0.0001 per run at the default 2 GB) |

Example: 20 prompts on Google AI Overviews in 1 country with the report = **$0.50** at most; adding ChatGPT for the same 20 prompts adds up to $1.66. Failed checks, duplicates and Google pages without an AI Overview are never charged. If you set a maximum cost per run, the actor checks the budget before opening each browser and stops cleanly when it is reached.

### How to use it

1. Enter **your brand** and, optionally, aliases and your own website domains.
2. Paste the **prompts** your customers ask, one per line ("best crm for small business", "HubSpot alternatives", "HubSpot vs Salesforce").
3. Add **competitors** (optional aliases after a vertical bar: `Salesforce | Sales Cloud`).
4. Pick the **engines** and **countries** and run. The default run (1 prompt on Google AI Overviews) took a median of 16 seconds on the Apify platform and finished within 2 minutes in 8 of 8 runs, the slowest in 41 seconds (n=8, 14 Oct 2026). Each check runs in a real browser, 2 at a time by default. With ChatGPT (beta) selected, a run can take several minutes: give it a timeout of at least 15 minutes.
5. Schedule the same input weekly: the report shows the changes since the previous run.

#### Input example

```json
{
  "brand": "HubSpot",
  "brandDomains": ["hubspot.com"],
  "prompts": ["best crm for small business", "HubSpot alternatives", "HubSpot vs Salesforce"],
  "competitors": ["Salesforce", "Zoho", "Pipedrive"],
  "engines": ["google-aio", "chatgpt"],
  "countries": ["us", "gb"],
  "runsPerPrompt": 1,
  "includeReport": true
}
```

#### Output example (abridged)

```json
{
  "rowType": "prompt-check",
  "engine": "chatgpt",
  "prompt": "best crm for small business",
  "country": "us",
  "billable": true,
  "brandMentioned": true,
  "brandPosition": 1,
  "brandSentiment": "neutral",
  "brandShareOfVoice": 0.3,
  "brandInEntities": true,
  "brandCitedAsSource": true,
  "competitorsMentioned": [{ "name": "Zoho", "position": 2, "mentionCount": 4 }, { "name": "Pipedrive", "position": 3, "mentionCount": 3 }],
  "competitorsNotMentioned": ["Salesforce"],
  "entities": [{ "name": "HubSpot CRM", "category": "software", "position": 1, "url": "https://www.hubspot.com/products/crm" }],
  "citationCount": 29,
  "citedDomains": ["bestcrmpick.com", "fitsmallbusiness.com", "hubspot.com", "techradar.com", "zoho.com"]
}
```

### Good to know

- **Engines:** Google AI Overviews (default) and ChatGPT (beta: public, without login, with web search; see the note at the top for its measured answer rate). Google AI Mode, Gemini, Copilot and Perplexity are not included: the last two require an account, and the actor never logs in anywhere.
- **Countries:** United States, United Kingdom, Mexico, Spain and Germany, in English, Spanish or German. The country sets Google's country and language and the browser's locale and time zone; ChatGPT answers follow the language of your prompt.
- **AI answers vary.** The same prompt can name different sources on different days. In our tests the brand-mention verdict for the same ChatGPT prompt matched 93 % of the time while the cited domains changed a lot; use **Repetitions per prompt** (2–3) for steadier citation data.
- **Sentiment** is a word-list heuristic in English, Spanish and German. Use it as a signal, not as a verdict.
- **Google does not show an AI Overview for every search.** Those rows are delivered with `aiOverviewPresent: false` so you can see it, and are not charged.
- **No CAPTCHA solving:** when an engine asks for a verification, the actor drops that connection and retries with a fresh one; it never solves or bypasses challenges.
- **Timeouts:** the actor stops before your run timeout and keeps everything delivered; resurrect the run to finish the remaining checks without paying twice.

### FAQ

**Does it use the OpenAI API?** No. It reads the public ChatGPT page in a real browser, so you see the same answer, sources and recommended brands as a visitor.

**Why is a check not charged?** Errors, empty answers and Google searches without an AI Overview are free. Only rows with `billable: true` are charged.

**Can I compare runs over time?** Yes. `checkId` is stable for the same prompt, engine, country and language, and the brand report includes the changes since your previous run with the same brand, engines and countries.

# Actor input Schema

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

The brand to track, as people write it (e.g. "HubSpot"). Matched as a whole word, case-insensitive.

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

Questions or searches your customers type, one per line (up to 200). Each prompt is checked on every selected engine and country.

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

Competitor brands, one per line (up to 30). Optional aliases after a vertical bar: "Salesforce | Sales Cloud, SFDC". Used for share of voice and competitor mentions.

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

Google AI Overview (default): the AI summary on the Google results page, with its cited sources resolved to real URLs; fast and reliable. ChatGPT (beta): the public ChatGPT answer without login, with its web search, cited links and recognized brands. From Apify's servers ChatGPT currently accepts only some browser sessions: on 14 Oct 2026, 158 of 488 attempts were accepted (32%) in 50 test runs, so a ChatGPT check can take several minutes and runs limited to 5 minutes got a ChatGPT answer in 8 of 10. A check without an answer is never charged.

## `countries` (type: `array`):

Countries to check. Sets Google's country and language and the browser locale and time zone. ChatGPT answers follow the language of the prompt.

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

Interface language. "auto" uses the main language of each country (en for US/UK, es for Mexico/Spain, de for Germany).

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

Other names of your brand that count as a mention (e.g. product names), one per line.

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

Your own domains (e.g. "hubspot.com"), one per line. A cited source on these domains counts as your brand cited as a source. If empty, domains that match the brand name are used.

## `runsPerPrompt` (type: `integer`):

Ask each prompt this many times (1-3). AI answers vary: in our tests the same ChatGPT prompt gave the same brand-mention verdict 93% of the time but different cited domains, so 2-3 repetitions give steadier citation data. Each repetition is a separate charged check.

## `includeReport` (type: `boolean`):

Build a brand report for the run (mention rate, average position, share of voice per engine, most cited domains, prompts where you are missing, and changes since your previous run). Saved as BRAND_REPORT in the run's key-value store; charged once per run when at least one answer was read.

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

Upper limit of checks (prompt × engine × country × repetition) in this run. Protects your budget when you paste long prompt lists.

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

How many real browsers run at the same time. 2 fits the default 2 GB of memory (measured peak about 1.1 GB in 50 test runs, 14 Oct 2026); use 3-4 only with 4 GB. More browsers finish long lists sooner at the same price per check.

## Actor input object example

```json
{
  "brand": "HubSpot",
  "prompts": [
    "best crm for small business",
    "HubSpot alternatives"
  ],
  "competitors": [
    "Salesforce",
    "Zoho",
    "Pipedrive"
  ],
  "engines": [
    "google-aio"
  ],
  "countries": [
    "us"
  ],
  "language": "auto",
  "brandAliases": [],
  "brandDomains": [],
  "runsPerPrompt": 1,
  "includeReport": true,
  "maxChecks": 100,
  "maxConcurrency": 2
}
```

# Actor output Schema

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

Every checked answer: brand mention, position, sentiment, share of voice, competitors, cited sources and the full answer text.

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

Run summary: mention rate, average position, share of voice per engine, most cited domains, prompts without a mention and changes since the previous run.

## `errors` (type: `string`):

Checks that failed after all retries (never charged), with the reason.

# 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": "HubSpot",
    "prompts": [
        "best crm for small business",
        "HubSpot alternatives"
    ],
    "competitors": [
        "Salesforce",
        "Zoho",
        "Pipedrive"
    ],
    "engines": [
        "google-aio"
    ],
    "countries": [
        "us"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("oswaldocarabano/ai-brand-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": "HubSpot",
    "prompts": [
        "best crm for small business",
        "HubSpot alternatives",
    ],
    "competitors": [
        "Salesforce",
        "Zoho",
        "Pipedrive",
    ],
    "engines": ["google-aio"],
    "countries": ["us"],
}

# Run the Actor and wait for it to finish
run = client.actor("oswaldocarabano/ai-brand-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": "HubSpot",
  "prompts": [
    "best crm for small business",
    "HubSpot alternatives"
  ],
  "competitors": [
    "Salesforce",
    "Zoho",
    "Pipedrive"
  ],
  "engines": [
    "google-aio"
  ],
  "countries": [
    "us"
  ]
}' |
apify call oswaldocarabano/ai-brand-visibility-tracker --silent --output-dataset

```

## MCP server setup

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