# AI Visibility Tracker: ChatGPT, Perplexity, Gemini, Claude,Grok (`agrawals/ai-search-visibility-tracker`) Actor

Track whether ChatGPT, Perplexity, Gemini, Claude and Grok recommend your brand or your competitors. Live web search, visibility score, share of voice, sentiment, cited sources, new competitors and week-over-week changes.

- **URL**: https://apify.com/agrawals/ai-search-visibility-tracker.md
- **Developed by:** [Ajay Agrawal](https://apify.com/agrawals) (community)
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $40.00 / 1,000 ai answer checkeds

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: ChatGPT, Perplexity, Gemini, Claude and Grok

**Find out whether AI assistants recommend your brand, or your competitors, and track it week over week.** Enter your brand, a few competitors and your category. This Actor asks **ChatGPT, Perplexity, Gemini, Claude and Grok** your buyers' questions with **live web search**, several times each, and gives you a visibility score, share of voice, sentiment, the sources AI cites, competitors you didn't know about, and what changed since your last run.

Use it for generative engine optimization (GEO), answer engine optimization (AEO), LLM visibility tracking, AI share of voice and competitor monitoring.

### What you get

- **Visibility score (0–100)** for your brand and every competitor, overall and per AI engine
- **Mention rate with a 95% range**, so you know how much to trust the number
- **Position and prominence**: where your brand appears in each answer, and who is named first
- **Recommended or just mentioned**, plus **positive / neutral / negative sentiment** per brand
- **Share of voice** across all tracked brands
- **Competitors you are not tracking**: other brands the AI recommends in your category
- **What AI says about you**: claims about your pricing, features and fit, to check for accuracy
- **Questions where you are missing**, and who is named first instead
- **Cited sources**: the domains AI relies on for your category, and whether your own site is cited
- **Changes since your last run**: score and mention-rate deltas per brand and engine, new competitors, new or lost sources, new gaps
- **A client-ready HTML report**, plus every answer as a dataset row (JSON, CSV, Excel) with full text, citations and the search queries the AI used
- **Buyer questions written for you** from your category, if you don't have your own

Analysis, question generation, the report and run-over-run tracking are included at no extra charge.

### How to use it

1. Enter **your brand**, any aliases and your website domain.
2. Describe **what you sell** in a few words (for example *"maintenance management software (CMMS)"*).
3. Add **competitors**, one per line. Optional aliases and domain: `Name | alias 1, alias 2 | domain.com`
4. Add your own **buyer questions**, or set **Generate buyer questions** to have up to 20 written for you. Up to 25 questions in total.
5. Pick the **AI engines**, the **buyer country**, and the **runs per question** (3–5 recommended).
6. Run it and open the **report** from the Output tab.

**Track it over time:** schedule the Actor weekly with the same input. Each run is compared with your previous run under the same **tracking ID** (brand + country by default), and the report shows the trend.

### Pricing

You pay only for AI answers collected; failed answers are never charged.

| | Price |
| --- | --- |
| AI answer, built-in API keys (no setup) | **$0.04** |
| AI answer, your own API key for that engine | **$0.01** |
| Analysis, generated questions, report, tracking | Free |

Example: 10 questions × 4 engines × 3 runs = 120 answers = **$4.80** on built-in keys, or **$1.20** with your own keys.

Set a **maximum cost per run** in the run options; the Actor stops cleanly when it is reached and still produces the report. Free Apify plan users can try up to 4 answers per run on the built-in keys; use a paid Apify plan or your own keys for full runs.

### Output example

One dataset row per answer:

```json
{
  "engine": "Perplexity",
  "prompt": "What are good alternatives to Competitor X?",
  "run": 2,
  "brandMentioned": true,
  "brandPosition": 2,
  "firstBrandNamed": "Competitor Y",
  "competitorsMentioned": ["Competitor Y", "Competitor X"],
  "brandSentiment": {"Your Brand": {"sentiment": "positive", "recommended": true}},
  "otherBrandsNamed": ["Brand you didn't list"],
  "claimsAboutBrand": ["Starts at $45 per user per month"],
  "citedDomains": ["g2.com", "reddit.com", "capterra.com"],
  "brandDomainCited": false,
  "answerExcerpt": "Here are some strong alternatives..."
}
```

Plus `SUMMARY` (all metrics and changes as JSON) and `REPORT` (HTML) in the run's key-value store.

### How it works

Each question goes through each provider's **official API** with web search on and the buyer country set as the user's approximate location. A brand counts as named when its name, an alias or its domain appears as a whole word ("Acme" matches "Acme's" but not "Acmeville"). A second, low-cost AI pass reads each answer to record recommendation, sentiment, other brands and claims.

The **visibility score** weights 45% mention rate, 25% prominence (1 ÷ position, 0 when not named), 20% recommendation rate and 10% own-site citation rate. Ranges are 95% Wilson intervals.

Run history is saved in a key-value store named `ai-visibility-history` in your own Apify account. Delete it at any time to reset tracking.

### Limitations

- Answers from the API can differ from what a signed-in consumer sees in the ChatGPT or Gemini apps, which personalise results.
- AI answers vary over time; that's why the Actor samples each question several times and shows ranges.
- The tool measures visibility; it does not change it. Use the gaps, cited sources and claims to decide where to act.

### FAQ

**Is this scraping ChatGPT?** No. It uses each provider's official API with web search, not the consumer apps.

**Which models are used?** Current web-search-capable models from each provider. The exact model for every answer is in the dataset.

**Can I use it from other tools?** Yes: through the Apify API, schedules, webhooks, Make, Zapier, n8n, or as a tool for AI agents through the Apify MCP server.

# Actor input Schema

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

The brand or product to track, exactly as buyers would write it.

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

Other names AI might use for your brand, such as a product line or short name. Matching is case-insensitive and whole-word.

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

Your domain, e.g. example.com. Used to check whether AI cites your own site as a source.

## `category` (type: `string`):

A few words describing your product category, e.g. 'maintenance management software (CMMS)' or 'project management tool for agencies'. Used to generate buyer questions and to spot new competitors.

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

One competitor per line. Optional aliases and domain with this format: Name | alias 1, alias 2 | domain.com

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

The questions your buyers ask AI assistants, one per line. Up to 25 in total, including any generated ones. Leave empty and set 'Generate buyer questions' to have them written for you.

## `autoGeneratePrompts` (type: `integer`):

Number of extra buyer-intent questions to write automatically from your category and competitors. Free. Generated questions are listed in the report.

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

Which AI assistants to test. Each answers with live web search, the way buyers use them.

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

AI answers change from run to run, so each prompt is asked several times; the report shows a 95% range. 3-5 is a good balance. Total answers = prompts x engines x runs.

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

Two-letter country code for where your buyers are (e.g. US, CA, GB, IN). Passed to each engine as the user's approximate location.

## `includeFullAnswers` (type: `boolean`):

Store the full AI answer in each result row. Turn off for smaller datasets; a short excerpt is always kept.

## `aiAnalysis` (type: `boolean`):

For each answer, record whether each brand is recommended or just mentioned, its sentiment, other brands the AI suggests that you didn't list, and claims made about your brand. Free.

## `trackChanges` (type: `boolean`):

Saves a summary of each run in your Apify account and shows what changed since the last run with the same tracking ID: score, mentions per engine, new competitors, new or lost sources.

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

Name for the history this run is compared against. Defaults to brand + country. Use a different ID per client or market.

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

Bring your own key to pay the AI provider directly and get the lower per-answer price. Leave empty to use the built-in key.

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

Leave empty to use the built-in key.

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

Leave empty to use the built-in key.

## `anthropicApiKey` (type: `string`):

Leave empty to use the built-in key.

## `xaiApiKey` (type: `string`):

Leave empty to use the built-in key.

## Actor input object example

```json
{
  "brand": "Notion",
  "brandAliases": [
    "Notion AI"
  ],
  "brandDomain": "notion.com",
  "category": "team knowledge base and wiki software",
  "competitors": [
    "Confluence | Atlassian Confluence | atlassian.com",
    "Coda | | coda.io",
    "Obsidian | | obsidian.md"
  ],
  "prompts": [
    "What's the best knowledge base tool for a 50-person startup?",
    "What are good alternatives to Confluence?"
  ],
  "autoGeneratePrompts": 0,
  "engines": [
    "perplexity",
    "chatgpt"
  ],
  "runsPerPrompt": 1,
  "country": "US",
  "includeFullAnswers": true,
  "aiAnalysis": true,
  "trackChanges": true
}
```

# Actor output Schema

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

No description

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

No description

## `answers` (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",
    "brandAliases": [
        "Notion AI"
    ],
    "brandDomain": "notion.com",
    "category": "team knowledge base and wiki software",
    "competitors": [
        "Confluence | Atlassian Confluence | atlassian.com",
        "Coda | | coda.io",
        "Obsidian | | obsidian.md"
    ],
    "prompts": [
        "What's the best knowledge base tool for a 50-person startup?",
        "What are good alternatives to Confluence?"
    ],
    "engines": [
        "perplexity",
        "chatgpt"
    ],
    "runsPerPrompt": 1,
    "aiAnalysis": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("agrawals/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 = {
    "brand": "Notion",
    "brandAliases": ["Notion AI"],
    "brandDomain": "notion.com",
    "category": "team knowledge base and wiki software",
    "competitors": [
        "Confluence | Atlassian Confluence | atlassian.com",
        "Coda | | coda.io",
        "Obsidian | | obsidian.md",
    ],
    "prompts": [
        "What's the best knowledge base tool for a 50-person startup?",
        "What are good alternatives to Confluence?",
    ],
    "engines": [
        "perplexity",
        "chatgpt",
    ],
    "runsPerPrompt": 1,
    "aiAnalysis": False,
}

# Run the Actor and wait for it to finish
run = client.actor("agrawals/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 '{
  "brand": "Notion",
  "brandAliases": [
    "Notion AI"
  ],
  "brandDomain": "notion.com",
  "category": "team knowledge base and wiki software",
  "competitors": [
    "Confluence | Atlassian Confluence | atlassian.com",
    "Coda | | coda.io",
    "Obsidian | | obsidian.md"
  ],
  "prompts": [
    "What'\''s the best knowledge base tool for a 50-person startup?",
    "What are good alternatives to Confluence?"
  ],
  "engines": [
    "perplexity",
    "chatgpt"
  ],
  "runsPerPrompt": 1,
  "aiAnalysis": false
}' |
apify call agrawals/ai-search-visibility-tracker --silent --output-dataset

```

## MCP server setup

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