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

GEO and AEO tracker: see whether ChatGPT, Perplexity, Claude and Grok mention and cite your brand for the prompts your customers ask. AI share of voice vs competitors, brand rank, LLM citations, and change over time. Official APIs with your own key; demo without one.

- **URL**: https://apify.com/stellalytics/ai-search-visibility-tracker.md
- **Developed by:** [Abir Riahi](https://apify.com/stellalytics) (community)
- **Categories:** AI, SEO tools, Marketing
- **Features:** Limited permissions
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.00 / 1,000 answer analyzeds

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 Search Visibility Tracker: brand mentions, citations and AI share of voice in ChatGPT, Perplexity, Claude & Grok

**Find out whether ChatGPT, Perplexity, Claude and Grok recommend your brand, and track it over time.** A generative engine optimization (GEO, also called AEO or LLM SEO) tracker for marketers, SEO agencies and founders. Give it the questions your customers ask AI assistants. For every answer, it reports whether your brand is mentioned, where it ranks against competitors, whether your website is cited as a source, and your share of voice.

It uses each provider's **official API with your own API key**. No scraping of chat apps, no shared accounts, no proxies. That makes it reliable. Requests run under your own provider account, so your provider's terms and usage policies apply to your prompts and to how you use the answers.

### What you get

For each prompt × engine × run, one row:

| Field | Example | Meaning |
| --- | --- | --- |
| `prompt` | What is the best project management tool for a small team? | The question asked |
| `engine` | `openai` | `openai`, `perplexity`, `anthropic` or `xai` (Grok) |
| `brandMentioned` | `true` | Your brand or an alias appears in the answer |
| `brandRank` | `2` | Position of your brand among all tracked brands, in order of first mention |
| `brandsMentionedInOrder` | `["Asana", "Trello", "ClickUp"]` | Every tracked brand, in the order the AI named them |
| `brandCited` | `true` | The answer cites a page on your domain |
| `brandCitationPosition` | `3` | Position of your first cited page among the answer's sources |
| `shareOfVoice` | `0.5` | Your mentions ÷ mentions of all tracked brands |
| `competitors` | `[{"name": "Asana", "mentioned": true, "rank": 1, "cited": true}]` | The same metrics for each competitor |
| `citations` | `["https://trello.com/guide", …]` | URLs the AI cited |
| `answer` | Full answer text | Optional |

A **SUMMARY** record in the run's key-value store gives, per engine: mention rate, citation rate, average rank, average share of voice and each competitor's mention rate. With **Compare with previous runs** on, it also shows `changeSincePrevious`, such as `"mentionRate": 0.2` (up 20 points since the last run).

#### Sample output

The shape of one row, from the free demo run (shortened). The demo answer is illustrative sample text written for the demo, not a live AI answer; with your key, each row is the engine's real answer:

```json
{
  "prompt": "What is the best project management tool for a small team?",
  "engine": "openai",
  "brand": "ClickUp",
  "brandMentioned": true,
  "brandRank": 4,
  "brandsMentionedInOrder": [
    "Trello",
    "Asana",
    "monday.com",
    "ClickUp"
  ],
  "brandCited": false,
  "shareOfVoice": 0.2,
  "competitors": [
    {
      "name": "Trello",
      "mentioned": true,
      "mentionCount": 2,
      "rank": 1,
      "cited": true
    },
    {
      "name": "Asana",
      "mentioned": true,
      "mentionCount": 1,
      "rank": 2,
      "cited": true
    }
  ],
  "citations": [
    "https://asana.com/compare",
    "https://trello.com/en/guide"
  ]
}
```

### Use cases

- **Brand monitoring in AI answers:** see how often AI assistants recommend you for "best X for Y" questions, and which competitors they name instead.
- **GEO / AEO reporting for clients:** run one tracker per client on a weekly schedule and export the trend to Google Sheets or a dashboard.
- **Content and PR impact:** check whether a new comparison page, review or press mention changes your mention rate and citations a few weeks later.
- **Citation gap analysis:** the `citations` field lists every page the AI cited, so you can see which third-party sites (review sites, listicles, forums) shape the answer and target them.
- **Competitor benchmarking:** share of voice and rank against the competitors you name, per engine.

### How to use it

1. Enter your **brand**, its **domain**, and a few **competitors**.
2. Add 5 to 50 **prompts** your customers would ask, such as "best CRM for a 10-person agency" or "alternatives to Asana".
3. Add an API key for at least one engine: [OpenAI](https://platform.openai.com/api-keys), [Perplexity](https://www.perplexity.ai/settings/api) or [Anthropic](https://console.anthropic.com/settings/keys) or [xAI](https://console.x.ai). Keys are stored encrypted by Apify and used only to call that provider.
4. Optionally set a **country** (for example `US` or `CA`) to localize web search. xAI's API has no location option, so Grok answers are not localized.
5. Run it. For tracking, add a **schedule** (daily or weekly) in Apify Console. Each run is compared with the previous one.

**Tip:** AI answers vary between runs. Set **Runs per prompt** to 3 to 5 for a reliable mention rate.

### Pricing

You pay two things, and both are low:

- **This Actor:** a small fee per analyzed answer (see the Pricing tab), plus Apify's standard start fee of $0.00005 per run. Failed answers are never charged.
- **The AI provider:** billed directly to your own API account at their standard rates. The cost per answer depends on the engine, the model you pick and how much web content the search pulls in, plus each provider's web-search fee. Smaller models (for example `gpt-4.1-mini`, `sonar`, or a Claude Haiku or Sonnet model) cost much less than the largest ones. Check your provider's pricing page and start with a small run.

Set a **maximum cost per run** in Apify, and the Actor stops cleanly when it is reached.

### Automate it: schedules and integrations

- **Weekly tracking:** in Apify Console, open **Schedules**, create a weekly schedule and add this Actor (or a saved task) to it. Every run is compared with the previous one, and the change appears in the `SUMMARY` record.
- **Send results where your team works:** under the Actor's **Integrations** tab you can connect Google Sheets, Slack, email, Make, Zapier, n8n or a webhook, so each finished run lands in a spreadsheet or channel without code.
- **API:** start runs and download results with the Apify API or the official Python and JavaScript clients. The **API** tab shows ready-to-copy examples.
- **AI agents (MCP):** connect Claude, Cursor or any MCP client to Apify's MCP server at `https://mcp.apify.com?tools=stellalytics/ai-search-visibility-tracker` and ask it to check your brand.

### Related Actors

[Tech Stack & Domain Lookup](https://apify.com/stellalytics/website-domain-intelligence) shows whether a site's robots.txt blocks GPTBot, ClaudeBot or PerplexityBot and whether it publishes an llms.txt file, for your site and your competitors'. If an AI engine can't read your pages, it is less likely to cite them.

[Bulk PageSpeed & Core Web Vitals Checker](https://apify.com/stellalytics/core-web-vitals-pagespeed-checker) bulk-tests your pages with Google PageSpeed Insights and shows whether real visitors pass Core Web Vitals, with a 6-month trend.

### Why this instead of a chat scraper?

| | This Actor | Chat-app scrapers |
| --- | --- | --- |
| Data source | Official APIs | Automating the consumer chat website |
| Reliability | No CAPTCHAs, no login, no layout changes | Breaks when the site changes |
| Cost | Small fee + your API usage | Per-answer fee, no key needed |

**One honest limitation:** the Actor asks each provider's API, not the consumer apps. The apps can use a different model than the one you pick here (the OpenAI default, `gpt-4.1-mini`, is chosen for low cost and is not the ChatGPT app's model), and they add their own search settings, personalization and memory. Treat results as a consistent, repeatable benchmark of what these AI engines answer, not an exact copy of one person's screen. Pick a larger model in the input to get closer to the apps.

### FAQ

**Can I try it without an API key?** Yes. Run it with no key and it switches to demo mode: it analyzes illustrative sample answers (written for the demo, not live AI output) for your brand, marks every row with `"demo": true` and a note, and charges no answer fees (only Apify's $0.00005 start fee). Add a key for live results.

**Which models are used?** By default `gpt-4.1-mini` with web search, Perplexity `sonar`, `claude-sonnet-5-5` with web search, and `grok-4.3` with xAI's web search. You can change each model in the input.

**Does it store my API keys?** No. Keys are secret input fields that Apify stores encrypted. The Actor sends each key only to its own provider, never writes it to the log or the dataset, and removes anything that looks like an API key from provider error messages before logging them.

**Is personal data collected?** The Actor doesn't look for personal data. It sends your prompts to the providers you choose and saves their answers, which can name people if a prompt asks about them. Don't put personal information in prompts. Your provider's data policies apply to what you send.

**Can I show the answers to my clients?** Yes, but keep the sources. OpenAI and Anthropic require that answers based on web search are shown with their citations, so when you display `answer` to anyone, show the `citations` links with it.

**What terms apply to Grok answers?** Your own agreement with xAI and its Acceptable Use Policy, because the Actor calls the API with your key. Answers stay in your Apify account; the Actor does not share, pool or resell them.

**Is this affiliated with OpenAI, Perplexity, Anthropic or xAI?** No. ChatGPT, Perplexity, Claude and Grok are trademarks of their owners and are named only to say which APIs the Actor calls.

**Can I track several prompt sets for the same brand?** Yes. Give each tracker a different **History name**.

**What happens if one key is wrong?** That engine is skipped with a clear error in the log, and the other engines still run.

**What if a run is about to hit its timeout?** The Actor stops starting new answers a few minutes before the run timeout, saves the SUMMARY and history, and says so in the status message and in `SUMMARY` (`stoppedBeforeTimeout`, `notProcessed`). An answer still waiting for the provider at the last minute is dropped and not charged. For large runs, raise the timeout in the run options.

### Support

Open an issue on the Issues tab. Fixes for broken runs are a priority.

# Actor input Schema

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

The brand name to look for in AI answers.

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

Alternative names that also count as a mention, such as a product name or domain.

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

Used to detect when the AI cites your site as a source, for example trello.com. Subdomains count.

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

Competitor names to compare against. Use plain names, or objects like {"name": "Asana", "domain": "asana.com", "aliases": \["Asana app"]}.

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

Questions your customers might ask an AI assistant. Each prompt is sent to every selected engine.

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

Which AI engines to check. An engine is used only if you add its API key below.

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

Your own OpenAI API key. Requests are billed to your OpenAI account. Stored encrypted by Apify.

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

Your own Perplexity API key. Requests are billed to your Perplexity account. Stored encrypted by Apify.

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

Your own Anthropic API key for Claude. Requests are billed to your Anthropic account. Stored encrypted by Apify.

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

Your own xAI API key for Grok. Requests are billed to your xAI account. Stored encrypted by Apify.

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

Two-letter country code to localize web search, for example US, CA or FR. Leave empty for no location.

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

AI answers vary. Ask each prompt several times to measure how often your brand appears (1 to 10).

## `openaiModel` (type: `string`):

Any OpenAI model that supports the web search tool in the Responses API.

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

Perplexity Sonar model, for example sonar or sonar-pro.

## `anthropicModel` (type: `string`):

Claude model to use with web search. The default, claude-sonnet-5-5, costs half as much per token as claude-opus-5-5; claude-haiku-5-5 costs the least. The search fee is the same for every model.

## `xaiModel` (type: `string`):

Any Grok model that supports xAI's web search tool, for example grok-4.3 or grok-4.7.

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

Save the full AI answer and all sources with each result.

## `trackHistory` (type: `boolean`):

Save each run's summary and show the change since the last run with the same brand, country and engines. Best with a daily or weekly schedule.

## `historyName` (type: `string`):

Optional name for the history, to keep separate trackers for the same brand (for example different prompt sets).

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

Lower this if your API account has low rate limits.

## Actor input object example

```json
{
  "brand": "Trello",
  "brandAliases": [
    "trello.com"
  ],
  "brandDomain": "trello.com",
  "competitors": [
    {
      "name": "Asana",
      "domain": "asana.com"
    },
    {
      "name": "monday.com",
      "domain": "monday.com"
    },
    "ClickUp"
  ],
  "prompts": [
    "What is the best project management tool for a small team?"
  ],
  "engines": [
    "openai",
    "perplexity",
    "anthropic",
    "xai"
  ],
  "runsPerPrompt": 1,
  "openaiModel": "gpt-4.1-mini",
  "perplexityModel": "sonar",
  "anthropicModel": "claude-sonnet-5-5",
  "xaiModel": "grok-4.3",
  "includeAnswerText": true,
  "trackHistory": true,
  "maxConcurrency": 3
}
```

# Actor output Schema

## `results` (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": "Trello",
    "brandAliases": [
        "trello.com"
    ],
    "brandDomain": "trello.com",
    "competitors": [
        {
            "name": "Asana",
            "domain": "asana.com"
        },
        {
            "name": "monday.com",
            "domain": "monday.com"
        },
        "ClickUp"
    ],
    "prompts": [
        "What is the best project management tool for a small team?"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("stellalytics/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": "Trello",
    "brandAliases": ["trello.com"],
    "brandDomain": "trello.com",
    "competitors": [
        {
            "name": "Asana",
            "domain": "asana.com",
        },
        {
            "name": "monday.com",
            "domain": "monday.com",
        },
        "ClickUp",
    ],
    "prompts": ["What is the best project management tool for a small team?"],
}

# Run the Actor and wait for it to finish
run = client.actor("stellalytics/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": "Trello",
  "brandAliases": [
    "trello.com"
  ],
  "brandDomain": "trello.com",
  "competitors": [
    {
      "name": "Asana",
      "domain": "asana.com"
    },
    {
      "name": "monday.com",
      "domain": "monday.com"
    },
    "ClickUp"
  ],
  "prompts": [
    "What is the best project management tool for a small team?"
  ]
}' |
apify call stellalytics/ai-search-visibility-tracker --silent --output-dataset

```

## MCP server setup

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