# AI Brand Visibility Tracker: ChatGPT Mentions, Rank & Citations (`swillz/ai-brand-visibility-tracker`) Actor

See whether ChatGPT recommends your brand. Ask your buyers' prompts with live web search and get mention rate, rank, share of voice vs competitors, sentiment and cited URLs. Official OpenAI API, no key needed, from $0.04 per check.

- **URL**: https://apify.com/swillz/ai-brand-visibility-tracker.md
- **Developed by:** [William Jin](https://apify.com/swillz) (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 $40.00 / 1,000 brand 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 Brand Visibility Tracker: ChatGPT Mentions, Rank & Citations

**Does ChatGPT recommend your brand?** Give this Actor your brand, your competitors and the questions your buyers ask. It asks each question to ChatGPT **with live web search** through the official OpenAI API and tells you, for every answer:

- whether your brand is **mentioned**, in what **order** (rank among tracked brands) and at which **list position**
- whether ChatGPT **cites your website** and which domains it cites instead
- the **sentiment** and whether the answer **recommends** you
- which **competitors** and **other brands** show up

Then it rolls everything up into a **share-of-voice leaderboard**: mention rate, average rank, first-place count, citation rate and sentiment per brand, per-prompt results, and the most-cited domains (the sites you need to be on).

No OpenAI key needed. **$0.04-0.05 per check** (one prompt asked once, depending on your Apify plan), or **$0.01 per check with your own OpenAI key**.

**When to use:** you want to know whether ChatGPT mentions, ranks, cites and recommends a brand versus its competitors.
**Input:** a brand and buyer questions, e.g. `{"brand":"Notion","prompts":["Best wiki tool for a startup?"],"competitors":["Coda | coda.io"]}`.
**Output:** one row per prompt check with mentioned, rank, cited, sentiment and competitors mentioned, plus a share-of-voice summary. From $0.04 per check ($0.01 with your own OpenAI key).

### Use cases

- **GEO / AI SEO**: measure your visibility in AI answers and track it weekly with an Apify schedule.
- **Competitor benchmarking**: see who ChatGPT recommends for "best X for Y" prompts in your category.
- **Content and PR targeting**: the *top cited domains* list shows which review sites, blogs and docs feed the AI answers.
- **Agencies**: run the same prompt set for many clients and export to Sheets, Looker Studio or your BI tool.

### Input

| Field | Example | Notes |
|---|---|---|
| Your brand | `Notion` | Companies and products only, not private people |
| Your website domain | `notion.com` | Detects citations of your site |
| Other names | `Notion AI` | Also count as a mention |
| Competitors | `Coda \| coda.io` | One per line, domain optional, up to 20 |
| Prompts | `What is the best wiki tool for a small startup?` | Up to 100 |
| Samples per prompt | `1`-`5` | AI answers vary; more samples give a steadier rate |
| Country | `US` | Localizes the web search |

```json
{
  "brand": "Notion",
  "brandDomain": "notion.com",
  "competitors": ["Coda | coda.io", "Confluence | atlassian.com", "ClickUp | clickup.com"],
  "prompts": ["What is the best wiki tool for a small startup?", "Best alternatives to Confluence for documentation"],
  "samplesPerPrompt": 1,
  "country": "US"
}
```

### Output

**Dataset: one row per check**

```json
{
  "engine": "chatgpt", "model": "gpt-6-luna", "prompt": "What is the best wiki tool for a small startup?", "sample": 1, "country": "US",
  "brand": "Notion", "brandMentioned": true, "brandRank": 1, "brandListPosition": 1, "brandCited": true,
  "brandSentiment": "positive", "brandRecommended": true,
  "competitorsMentioned": ["Confluence"], "mentionedOrder": ["Notion", "Confluence"],
  "entities": [{ "name": "Notion", "role": "brand", "mentioned": true, "mentionCount": 3, "rank": 1, "listPosition": 1, "cited": true, "citedUrls": ["https://www.notion.com/product/wikis"], "sentiment": "positive", "recommended": true }],
  "citations": [{ "url": "https://www.notion.com/product/wikis", "title": "Wikis | Notion", "domain": "notion.com", "kind": "cited" }],
  "citedDomains": ["notion.com", "support.atlassian.com"],
  "otherBrandsMentioned": ["Slab", "Slite"],
  "searchQueries": ["best wiki tool small startup 2026"],
  "answer": "1. **Notion** - ...", "status": "ok", "checkedAt": "2026-10-23T17:00:00.000Z"
}
```

**Summary (key-value store `OUTPUT`)**: `brandMentionRate`, `brandShareOfVoice`, `brandAvgRank`, a `leaderboard` (mentions, mentionRate, shareOfVoice, avgRank, firstPlace, citationRate, recommended, sentiment per brand), per-prompt results, `topCitedDomains` and `otherBrandsMentioned`.

### Pricing

| Apify plan | Check with the built-in AI (web search included) | Check with your own OpenAI key |
|---|---|---|
| Free | **$0.05** | **$0.01** (+ your OpenAI usage, about $0.01-0.02 per check on the default model) |
| Starter | **$0.05** | **$0.01** |
| Scale | **$0.045** | **$0.01** |
| Business and up | **$0.04** | **$0.01** |

Prices drop on bigger Apify plans (Starter = Bronze tier, Scale = Silver, Business and up = Gold).

Failed checks are not charged. Example: 10 prompts x 3 samples = 30 checks = $1.50 on Starter ($1.20 on Business). Set *Max checks* or the run's maximum cost to cap spend. On the Apify free plan, the built-in AI runs up to 10 checks per run; add your own OpenAI key, or use any paid Apify plan, for bigger runs.

### How it works and limitations

- Uses the **official OpenAI Responses API with the web search tool**. It does **not** scrape chatgpt.com, so it never logs in and does not break when the UI changes.
- API answers are close to, but **not identical to**, what a logged-in ChatGPT user sees (no personalization or memory). Treat results as a consistent benchmark, not a screenshot.
- AI answers are non-deterministic: use *samples per prompt* and track trends over time.
- Mentions are matched on the names and aliases you provide (whole words, case-insensitive). Rank = order of first mention among the brands you track.
- **Privacy**: query strings are stripped from every URL (some sites put tracking IDs or e-mail addresses in them), and e-mail addresses and phone numbers in answers are removed. Track brands, not people.
- Coming next: Perplexity, Gemini and Google AI Overviews engines.

### How to track AI visibility every week

1. Run it once with your brand, competitors and 10-30 buyer prompts, then **Save as task**.
2. In **Schedules**, run the task weekly (same prompts every time, so the numbers are comparable).
3. Send each run's `OUTPUT` summary to a Google Sheet, Slack or a webhook. You get a share-of-voice trend line per brand.

### Use with AI agents (MCP, ChatGPT, Claude, Cursor, n8n)

AI agents can find and run this Actor through the [Apify MCP server](https://mcp.apify.com). Add it to Claude Desktop, Cursor, VS Code or any MCP client:

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

Or run it locally: `npx -y @apify/actors-mcp-server --tools swillz/ai-brand-visibility-tracker` with `APIFY_TOKEN` set. In n8n or Make, use the Apify node with Actor `swillz/ai-brand-visibility-tracker`.

Example prompts:

- "Does ChatGPT recommend Notion for startup wikis, and who beats it?"
- "Track our share of voice vs Coda and ClickUp weekly"
- "Which sources does ChatGPT cite when it answers "best CRM for small business"?"

Minimal input:

```json
{"brand": "Notion", "prompts": ["What is the best wiki tool for a small startup?"], "competitors": ["Coda | coda.io"]}
```

**Keep it fast:** Start with 3–5 prompts and `samplesPerPrompt` 1. If the user gave no prompts, write 3–5 realistic buyer questions for the brand's category. Skipped or capped checks are explained in a free status row.

**Cap the cost:** pass `maxTotalChargeUsd` ("Maximum cost per run") when you call the Actor. The run stops cleanly at the cap, keeps the results so far, and says why in the status message and the OUTPUT record.

### Integrations and API

- **Make, n8n and Zapier:** use the official Apify app or node, choose *Run Actor* and pick `swillz/ai-brand-visibility-tracker`.
- **API:** `POST https://api.apify.com/v2/acts/swillz~ai-brand-visibility-tracker/run-sync-get-dataset-items?token=YOUR_TOKEN` with the input JSON returns one row per check.
- **AI agents (MCP):** add `https://mcp.apify.com?tools=swillz/ai-brand-visibility-tracker` to Claude, Cursor or any MCP client and ask "how often does ChatGPT recommend us vs Coda for wiki prompts?".
- **Looker Studio or BI:** export the dataset as CSV or JSON, or append it to a sheet on every run.

### AI Brand Visibility Tracker vs alternatives

| | This Actor | GEO SaaS dashboards | Asking ChatGPT by hand |
|---|---|---|---|
| Price | $0.04-0.05 per check, no subscription | Typically a monthly subscription | Your time |
| Raw data (answers, citations, ranks) | ✅ JSON / CSV / Sheets | Varies | ❌ |
| Competitor share of voice | ✅ up to 20 competitors | ✅ | ❌ |
| Scheduling and API | ✅ Apify schedules, API, MCP | Varies | ❌ |
| Reproducible benchmark | ✅ same prompts, samples per prompt | ✅ | ❌ |

### FAQ

**Can I schedule it?** Yes. Save your input as a task and add an Apify schedule (e.g. weekly). Each run's summary makes a clean time series.

**Which model is used?** `gpt-6-luna` with web search by default. With your own key you can choose any web-search-capable OpenAI model.

**Is it legal?** It only sends your prompts to OpenAI's public API under OpenAI's terms and returns the answers. No website is scraped.

### Related tools

More tools from the same developer, built to work together:

- [Career Site Jobs Scraper](https://apify.com/swillz/career-site-jobs-scraper): jobs from Greenhouse, Lever, Ashby, Workable and Recruitee boards, with salary fields, as a jobs API or CSV.
- [Workday Jobs Scraper](https://apify.com/swillz/workday-jobs-scraper): every job from any myworkdayjobs.com career site, past the 2,000-result cap.
- [Company Website Enrichment](https://apify.com/swillz/company-website-enrichment): turn a list of domains into company name, emails, phones, social links and tech stack.
- [AI Extract](https://apify.com/swillz/ai-extract): structured JSON from any web page with a plain-English prompt or a JSON schema. AI included.
- [Google Sheets Import & Export](https://apify.com/swillz/google-sheets-import-export): send any Apify dataset to a Google Sheet (append, replace or dedupe) or read a sheet as JSON.
- [XML Sitemap URL Extractor & Sitemap to CSV](https://apify.com/swillz/sitemap-url-extractor): every URL from a website's sitemap, with lastmod, HTTP status and new-page monitoring.
- [Email Provider Detector](https://apify.com/swillz/email-provider-detector): bulk check whether domains use Google Workspace, Microsoft 365, Proofpoint or Mimecast, plus SPF, DMARC and DKIM.
- [Hiring Signals by Company Domain](https://apify.com/swillz/hiring-signals-by-domain): from a list of company domains, find which ATS each uses and how many open roles, by department and location.
- [EU VAT Number Validator (VIES)](https://apify.com/swillz/eu-vat-validator): bulk check EU VAT numbers against official VIES, with company name and address.
- [EORI Number Validator](https://apify.com/swillz/eori-validator): bulk check EU and UK EORI numbers for customs, with trader name where published.
- [LEI Lookup (GLEIF)](https://apify.com/swillz/lei-lookup): find a company's Legal Entity Identifier, legal name, address, status and parent from official GLEIF data.
- [Sanctions Screener](https://apify.com/swillz/sanctions-screener): screen company and person names against official OFAC, UN, EU and UK sanctions lists with fuzzy matching.

**Popular workflows**

- **Weekly AI-visibility report:** schedule this Actor weekly and append each run's share of voice to a sheet with [Google Sheets Import & Export](https://apify.com/swillz/google-sheets-import-export).

Source code: https://github.com/williamjin02/apify-actors/tree/main/actors/ai-brand-visibility-tracker. Issues and feature requests are welcome in the Issues tab.

# Actor input Schema

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

Required. String: the brand or product to track, as people write it, e.g. "Notion". Track companies and products, not private individuals.

## `brandDomain` (type: `string`):

Optional string: your website domain, used to detect when ChatGPT cites your site, e.g. "notion.com".

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

Optional array of strings: other spellings or product names that also count as a mention, e.g. \["Notion AI"].

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

Optional array of strings, up to 20. Add the domain after a bar to also track citations, e.g. \["Coda | coda.io","ClickUp | clickup.com"].

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

Required. Array of strings: questions your buyers ask ChatGPT, e.g. \["What is the best wiki tool for a startup?"]. Each prompt x sample is one paid check. Agents: if the user didn't give prompts, write 3–5 realistic buyer questions for the brand's category.

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

AI answers vary. Ask each prompt this many times to get a steadier mention rate (each sample is one check).

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

2-letter country code for localized web search results, e.g. "US", "GB", "DE". Leave empty for no location.

## `analyzeSentiment` (type: `boolean`):

Adds positive/neutral/negative and "recommended" per mentioned brand, plus other brands the answer names. Included in the price.

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

Keep ChatGPT's answer (links are cleaned of tracking parameters) in each row.

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

Safety cap on checks per run (prompts x samples, default 50). Checks over the cap are skipped and reported in a free status row.

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

How many prompts to ask at the same time (default 3).

## `openaiApiKey` (type: `string`):

Optional: your own OpenAI key. Checks then cost $0.01 each instead of $0.04–$0.05, and OpenAI bills you for the AI usage (about $0.01–0.02 per check on the default model). Stored encrypted.

## `model` (type: `string`):

Defaults to "gpt-6-luna". Any web-search-capable model works with your own key; the built-in key allows gpt-6-luna, gpt-5-nano, gpt-4o-mini and gpt-5.6-luna.

## Actor input object example

```json
{
  "brand": "Notion",
  "brandDomain": "notion.com",
  "competitors": [
    "Coda | coda.io",
    "Confluence | atlassian.com",
    "ClickUp | clickup.com"
  ],
  "prompts": [
    "What is the best wiki tool for a small startup?",
    "Best alternatives to Confluence for documentation"
  ],
  "samplesPerPrompt": 1,
  "country": "US",
  "analyzeSentiment": true,
  "includeAnswerText": true,
  "maxChecks": 50,
  "maxConcurrency": 3
}
```

# Actor output Schema

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

Example: {"prompt":"Best wiki tool for a startup?","sample":1,"brandMentioned":true,"brandRank":2,"brandCited":false,"brandSentiment":"positive","competitorsMentioned":\["Coda","Confluence"],"citedDomains":\["zapier.com"],"status":"ok"}. Status row: {"status":"stopped","error":"Stopped: Reached your maximum cost per run…"}.

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

JSON: brandMentionRate, leaderboard (mentions, citations, sentiment per brand), checksRequested, checksRun, charged, truncated, freePlanLimited, notice and stoppedReason.

# 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",
    "brandDomain": "notion.com",
    "competitors": [
        "Coda | coda.io",
        "Confluence | atlassian.com",
        "ClickUp | clickup.com"
    ],
    "prompts": [
        "What is the best wiki tool for a small startup?",
        "Best alternatives to Confluence for documentation"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("swillz/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": "Notion",
    "brandDomain": "notion.com",
    "competitors": [
        "Coda | coda.io",
        "Confluence | atlassian.com",
        "ClickUp | clickup.com",
    ],
    "prompts": [
        "What is the best wiki tool for a small startup?",
        "Best alternatives to Confluence for documentation",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("swillz/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": "Notion",
  "brandDomain": "notion.com",
  "competitors": [
    "Coda | coda.io",
    "Confluence | atlassian.com",
    "ClickUp | clickup.com"
  ],
  "prompts": [
    "What is the best wiki tool for a small startup?",
    "Best alternatives to Confluence for documentation"
  ]
}' |
apify call swillz/ai-brand-visibility-tracker --silent --output-dataset

```

## MCP server setup

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