# AI Brand Visibility Tracker - ChatGPT, Gemini, Perplexity (`cywir/ai-visibility-tracker`) Actor

See whether ChatGPT, Claude, Gemini and Perplexity recommend your brand. Get mention rate, ranking position, share of voice vs competitors, cited sources and the prompts where you're missing.

- **URL**: https://apify.com/cywir/ai-visibility-tracker.md
- **Developed by:** [Daniel Micallef](https://apify.com/cywir) (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

Pay per event

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 Brand Visibility Tracker — ChatGPT, Claude, Gemini & Perplexity

**Find out whether AI assistants recommend your brand — and who they recommend instead.**

More buyers now ask ChatGPT, Gemini, Claude or Perplexity "what's the best tool for X?" before they ever see a search result. If the AI doesn't name you, you don't exist for that buyer. This Actor measures your **AI search visibility** (also called GEO, generative engine optimization, or AEO, answer engine optimization) across the major engines in one run.

### What you get

For every prompt × engine you get the full AI answer plus:

| Metric | What it tells you |
|---|---|
| **Mention rate** | % of answers that name your brand |
| **Position** | Where you appear among the brands mentioned (1 = recommended first) |
| **First-place rate** | How often you're the top recommendation |
| **Share of voice** | Your share of all brand mentions vs competitors |
| **Citation rate** | How often the answer links to your website |
| **Competitors mentioned** | Who the AI names, including brands you didn't list (auto-discovered) |
| **Cited sources** | Which sites the AI relies on, so you know where to earn coverage |
| **Missed prompts** | Questions where you never appear: your highest-priority gaps |

Each run also saves a **shareable HTML report** and a JSON summary (see the *Output* tab).

### How it works

1. You enter your brand, a few competitors (optional), and the questions your customers ask.
2. The Actor asks each AI engine through its **official API**, with web search on by default, so answers reflect what real users see.
3. Each answer is analysed for brand mentions, ranking position and citations. Optional competitor discovery uses AI to pick out every brand recommended.
4. Results are aggregated by engine and by prompt.

No scraping of chat interfaces, no logins, no browser automation: runs are fast and reliable.

### Input example

```json
{
  "brand": "Notion",
  "brandDomain": "notion.com",
  "competitors": ["Evernote", "Obsidian", "Confluence"],
  "prompts": [
    "What is the best note-taking app for a small team?",
    "Best alternatives to Evernote in 2026",
    "Which wiki tool should a startup use?"
  ],
  "engines": ["chatgpt", "claude", "gemini", "perplexity"],
  "runsPerPrompt": 3
}
```

**Tip:** AI answers vary from run to run. Use `runsPerPrompt` of 3–5 for a stable mention rate, and schedule the Actor weekly to track your visibility over time.

### Output example

One dataset item per answer:

```json
{
  "prompt": "What is the best note-taking app for a small team?",
  "engine": "chatgpt",
  "model": "gpt-6-luna",
  "run": 1,
  "brandMentioned": true,
  "brandPosition": 2,
  "brandMentionCount": 3,
  "competitorsMentioned": ["Obsidian", "Evernote", "Bear"],
  "mentions": [
    { "name": "Obsidian", "isBrand": false, "count": 2, "position": 1 },
    { "name": "Notion", "isBrand": true, "count": 3, "position": 2 }
  ],
  "citations": [{ "url": "https://zapier.com/blog/best-note-taking-apps", "domain": "zapier.com", "isBrandDomain": false }],
  "brandCited": false,
  "answer": "For small teams, Obsidian and Notion are the strongest options…",
  "checkedAt": "2026-10-27T12:00:00.000Z"
}
```

### Pricing

Pay per result: you're charged per AI answer delivered, plus a small fee per answer when competitor discovery is on. Failed answers are never charged. If you have your own OpenAI, Anthropic, Gemini or Perplexity API keys, add them in the input to pay a lower price per answer.

### Use cases

- **SEO & content teams:** track GEO/AEO performance alongside classic rankings.
- **Agencies:** run visibility audits for clients and share the HTML report.
- **Product marketing:** see which competitors AI favours and which sources shape its answers.
- **AI agents & automations:** call it via API, MCP, Make, Zapier or n8n and pipe results into dashboards.

### FAQ

**Which models are used?** Current flagship models with web search by default. You can override the model per engine in the *Advanced* section.

**Why does my mention rate change between runs?** AI answers are non-deterministic. Increase `runsPerPrompt` to average it out.

**Does it work for any language or country?** Yes. Write prompts in the language your customers use.

**Is this allowed?** Yes. The Actor uses each provider's official API under its terms.

# Actor input Schema

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

The brand or product name to track, exactly as customers write it.

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

Questions your potential customers ask AI assistants. Write them the way a buyer would, e.g. "What's the best note-taking app for a small team?"

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

Competitor names to compare against. Optional: competitor discovery also finds brands the AI recommends that you didn't list.

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

Alternative spellings or product names that should count as your brand, e.g. "Notion AI".

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

Used to check whether AI answers cite your site, e.g. notion.com.

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

Which AI assistants to ask.

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

AI answers vary between runs. Asking each prompt several times gives a more reliable mention rate.

## `webSearch` (type: `boolean`):

On by default, matching what most users see in ChatGPT, Gemini and Perplexity. Turn off to measure what the model knows from training alone.

## `discoverCompetitors` (type: `boolean`):

Finds every brand the AI recommends in each answer, so you see who is winning the prompts you lose.

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

How many AI requests run at once. Lower it if you use your own API keys with low rate limits.

## `chatgptModel` (type: `string`):

Override the OpenAI model.

## `claudeModel` (type: `string`):

Override the Claude model.

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

Override the Gemini model.

## `perplexityModel` (type: `string`):

Override the Perplexity model.

## `chatgptApiKey` (type: `string`):

Optional. Answers made with your own key are billed at a lower price.

## `claudeApiKey` (type: `string`):

Optional. Also used for competitor discovery.

## `geminiApiKey` (type: `string`):

Optional.

## `perplexityApiKey` (type: `string`):

Optional.

## Actor input object example

```json
{
  "brand": "Notion",
  "prompts": [
    "What is the best note-taking app for a small team?",
    "Best alternatives to Evernote in 2026"
  ],
  "competitors": [
    "Evernote",
    "Obsidian",
    "Confluence"
  ],
  "engines": [
    "chatgpt",
    "claude",
    "gemini",
    "perplexity"
  ],
  "runsPerPrompt": 1,
  "webSearch": true,
  "discoverCompetitors": true,
  "maxConcurrency": 4
}
```

# Actor output Schema

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

No description

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

No description

## `summary` (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 = {
    "brand": "Notion",
    "prompts": [
        "What is the best note-taking app for a small team?",
        "Best alternatives to Evernote in 2026"
    ],
    "competitors": [
        "Evernote",
        "Obsidian",
        "Confluence"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("cywir/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",
    "prompts": [
        "What is the best note-taking app for a small team?",
        "Best alternatives to Evernote in 2026",
    ],
    "competitors": [
        "Evernote",
        "Obsidian",
        "Confluence",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("cywir/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",
  "prompts": [
    "What is the best note-taking app for a small team?",
    "Best alternatives to Evernote in 2026"
  ],
  "competitors": [
    "Evernote",
    "Obsidian",
    "Confluence"
  ]
}' |
apify call cywir/ai-visibility-tracker --silent --output-dataset

```

## MCP server setup

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