# AI Visibility Tracker (GEO/AEO): ChatGPT, Perplexity & Claude (`touchrock/ai-share-of-voice`) Actor

AI visibility and rank tracker for GEO/AEO: see how often ChatGPT, Gemini, Perplexity, Claude, Google AI Overviews and AI Mode recommend your brand vs competitors. Real app answers with sources: share of voice, list rank, citations and citation gaps. Pay per check, failed checks free.

- **URL**: https://apify.com/touchrock/ai-share-of-voice.md
- **Developed by:** [Touchrock](https://apify.com/touchrock) (community)
- **Categories:** SEO tools, AI, Marketing
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $30.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.
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 Visibility Tracker (GEO/AEO): Share of Voice in ChatGPT, Perplexity, Claude & Google AI

An **AI visibility tracker** for GEO (generative engine optimization) and AEO. See your **brand visibility in ChatGPT**, Gemini, Perplexity, Claude, Google AI Overviews and AI Mode, next to your competitors. ChatGPT and Gemini answers are captured **from the real apps, as your buyers see them, with their sources**, not guessed from an API model, and Google AI Overviews and AI Mode come from live Google results. Each run gives you your **AI share of voice**, list rank and AI citations per prompt, so you can use it as a ChatGPT rank tracker, a Google AI Overviews tracker or for ongoing LLM brand monitoring.

- **No API keys needed.** Enter your brand, competitors and prompts, and run.
- **Pay per completed check.** Failed checks are free. No subscription.
- **Every engine in one run.** ChatGPT, Gemini, Perplexity, Claude, Google AI Overviews and AI Mode.
- **Try it on the Apify Free plan.** Free-plan runs are limited to 10 prompts and 1 run per prompt, and Claude Premium runs as Claude Standard. These limits are set by the developer of this Actor, not by Apify; any paid Apify plan removes them.

### Who uses it

- **SEO and GEO agencies:** audit a client's AI visibility against its competitors before a pitch, then track it every week.
- **SaaS and e-commerce marketing teams:** find the buyer questions where AI assistants recommend competitors instead of you (lost prompts).
- **PR and content teams:** get the list of sites the AI engines cite when you are not mentioned (citation gaps), your best outreach targets.

### Example report

Each run writes a readable summary to the key-value store (`REPORT`, Markdown) and the same data as JSON (`OUTPUT`). Example (illustrative numbers):

```markdown
## AI Share of Voice: HubSpot

Checks: 30 · Failed: 0 · Engine showed no AI answer: 2

### All engines

| Brand | Share of voice | Mentioned in | Avg. list rank | Cited in |
|---|---|---|---|---|
| **HubSpot** | 34% | 79% | 2.1 | 21% |
| Salesforce | 29% | 68% | 1.6 | 29% |
| Pipedrive | 22% | 50% | 3.4 | 14% |
| Zoho CRM | 15% | 36% | 4.2 | 7% |

### Citation gaps (sites AI cites when you are NOT mentioned)

- g2.com (4 answers)
- reddit.com (3 answers)

### Lost prompts (competitors mentioned, you are not)

- [chatgpt] "Best CRM for real estate teams" → Salesforce, Pipedrive
```

### What you get

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

- **Brand mentioned?** and **list rank** (e.g. #2 in a numbered list)
- **Mention order** vs competitors (who is named first)
- **Brand cited?** whether the engine linked to your domain
- **Competitors mentioned** and **cited domains**

And a summary report, overall and per engine:

- **Share of voice** per brand
- **Mention rate**, **average list rank**, **citation rate**
- **Citation gaps**: sites the AI cites in answers where you are *not* mentioned (your best PR, content and outreach targets)
- **Lost prompts**: questions where competitors are recommended and you are not

### Engines

| Engine | What it measures |
|---|---|
| ChatGPT | Answers as users see them in the ChatGPT app, with web sources |
| Gemini | Answers as users see them in the Gemini app |
| Perplexity | Perplexity answers with their sources |
| Claude | Claude with web search. **Standard** = Claude Sonnet 5 (the default model for Free and Pro claude.ai users). **Premium** = Claude Opus 5.5, Anthropic's most capable model, set to search the web and cite its sources |
| Google AI Overviews | The AI Overview block on Google Search and its references |
| Google AI Mode | Google's AI Mode answer and its references |

### How to use

1. Enter **your brand** and **domain** (e.g. `HubSpot`, `hubspot.com`).
2. Add **competitors**, one per line: `Salesforce (salesforce.com)`. Optional aliases: `Zoho CRM (zoho.com) | Zoho`. Only names and aliases count as mentions (the domain is used for citations), so add the short names AI engines actually use.
3. Add **prompts**: the questions your buyers ask AI assistants.
4. Pick **engines** and a **country**. Run.

Claude checks are processed as a batch, which usually adds a few minutes to runs that include Claude, and up to about 15 minutes when Anthropic's batch queue is busy. A run of 50 prompts × 4 engines including Claude took about 13 minutes in our tests.
AI answers vary between runs: use **Runs per prompt = 2-3** for more stable numbers.
Want to preview the output first? Turn on **Dry run** to get free demo data.

### Pricing

Pay per event, only for completed checks. Failed checks are free.

Price per check by Apify plan:

| Event | Free | Starter | Scale | Business |
|---|---|---|---|---|
| Answer checked (ChatGPT, Gemini, Perplexity, Google AI Overviews, AI Mode) | $0.06 | $0.04 | $0.035 | $0.03 |
| Claude answer checked, Standard (Sonnet 5) | $0.20 | $0.10 | $0.09 | $0.08 |
| Claude answer checked, Premium (Opus 5.5) | not available\* | $0.15 | $0.14 | $0.13 |

\* On the Apify Free plan, runs are limited to 10 prompts, 1 run per prompt, and Claude Premium runs as Claude Standard.

| Example run (Starter plan) | Checks | Cost |
|---|---|---|
| 10 prompts × 3 engines | 30 | **$1.20** |
| 25 prompts × 4 engines | 100 | **$4.00** |
| 50 prompts × 6 engines (incl. Claude Standard) | 300 | **$15.00** |

A "no AI Overview shown" result is a real finding (Google chose not to show one) and counts as a check; an empty or broken answer from a chat engine is a failed check and is free. Dry runs return sample data and are free.

Set **Max cost per run** in the run options: the Actor plans the run to stay within it and skips the last prompts if needed.

### Pay per check vs monthly AI visibility subscriptions

| | Pricing model | Cost of a one-off audit (10 prompts × 3 engines) |
|---|---|---|
| **This Actor** | Pay per check | **$1.20** (Starter) · $1.80 (Free) |
| Otterly.ai | Subscription from $29/month | $29+ |
| Peec AI | Subscription from ~€85/month | ~€85+ |
| Semrush AI visibility | Subscription from ~$99/month | ~$99+ |
| Profound | Subscription from $399/month | $399+ |

Subscription prices as listed by each vendor in September 2026. Those tools include dashboards and alerts; this Actor gives you the raw answers and a report you can schedule and send anywhere.

### Run it weekly

- **Schedule it**: save your input as a Task and run it every week with Apify Schedules. Each run keeps its own dataset, so you can track share of voice over time.
- **Send results anywhere**: Google Sheets, Slack, Make, n8n or Zapier through Apify integrations, or the Apify API.
- **Use it from AI agents** (Claude, Cursor, VS Code or any MCP client) through the Apify MCP server. Add this server to your client and ask, for example, "check how ChatGPT and Perplexity rank my brand against these three competitors":

  ```json
  { "mcpServers": { "ai-visibility": { "url": "https://mcp.apify.com?tools=touchrock/ai-share-of-voice" } } }
  ```

  For quick answers inside an agent, pick ChatGPT, Perplexity and Google AI Overviews; Claude runs as a batch and takes minutes. The agent reads the results from the run's `OUTPUT` record or its dataset.

### Output example

One dataset item per prompt × engine × run:

```json
{
  "prompt": "What is the best CRM for small marketing agencies?",
  "engine": "chatgpt",
  "status": "ok",
  "brandMentioned": true,
  "brandListRank": 2,
  "brandCited": false,
  "competitorsMentioned": ["Pipedrive", "Salesforce"],
  "citedDomains": ["g2.com", "reddit.com", "pipedrive.com"]
}
```

### FAQ

**Is "no AI answer" a failure?** No. Google does not show an AI Overview for every query; those checks are reported as `no_ai_answer` and excluded from rates.

**How is share of voice calculated?** For each answer we count which tracked brands are mentioned. Share of voice = a brand's mentions ÷ all tracked-brand mentions.

**Can I track several markets?** Yes, set the country (e.g. `GB`, `DE`) and language per run.

**What do the error codes mean?** Failed checks are free and show one of these in the `error` field: `engine_busy` (the engine was overloaded or rate-limited; try again later), `engine_timeout` (it did not answer in time), `engine_unavailable` (the engine is temporarily unavailable), `engine_refused` (the AI declined to answer), `empty_answer`, `incomplete_answer` or `answer_cut_off_max_tokens` (the engine returned no usable answer), `empty_ai_overview` or `no_results_page` (Google's results did not load), and `engine_error` (anything else).

# Actor input Schema

## `brandName` (type: `string`):

The brand you want to track, e.g. "HubSpot".

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

Used to detect when AI engines cite your site, e.g. "hubspot.com". It is not used to detect mentions: add every name people use as an alias.

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

Other names AI engines may use for your brand: short names, former names, product names. E.g. for "monday.com" add "Monday" only if AI answers name the tool that way (plain words like "Monday" can also match the weekday). Up to 20.

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

One per line, up to 50. Format: "Name (domain.com)". Aliases after a pipe, separated by ";": "Zoho CRM (zoho.com) | Zoho". Only the name and aliases count as mentions; the domain is used for citations.

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

Questions your buyers ask AI assistants. Each prompt is sent to every selected engine. Max 200 per run (10 on the Apify Free plan), up to 2,000 characters each (Google AI Overviews and AI Mode read the first 700).

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

ChatGPT and Gemini reflect the answers consumers see in the apps. Claude is billed as a separate event (see Claude tier).

## `claudeTier` (type: `string`):

Standard uses Claude Sonnet 5. Premium uses Claude Opus 5.5 with web search (higher price per check); on the Apify Free plan it runs as Standard. Only applies when Claude is selected.

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

Country for localized results.

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

Language code, e.g. en, de, es or pt-BR. Used by ChatGPT, Gemini, Google AI Overviews and AI Mode (Claude and Perplexity answer in the prompt's language).

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

AI answers vary between runs. Use 2-3 runs for more stable share-of-voice numbers (each run is billed). The Apify Free plan runs each prompt once.

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

How many checks run in parallel.

## `dryRun` (type: `boolean`):

Generate synthetic answers without calling any AI engine. Free; useful to preview the output format.

## Actor input object example

```json
{
  "brandName": "HubSpot",
  "brandDomain": "hubspot.com",
  "brandAliases": [
    "HubSpot CRM"
  ],
  "competitors": [
    "Salesforce (salesforce.com)",
    "Pipedrive (pipedrive.com)",
    "Zoho CRM (zoho.com) | Zoho"
  ],
  "prompts": [
    "What is the best CRM for small marketing agencies?",
    "Best free CRM for startups in 2026"
  ],
  "engines": [
    "chatgpt",
    "perplexity",
    "google_ai_overview"
  ],
  "claudeTier": "standard",
  "country": "US",
  "language": "en",
  "runsPerPrompt": 1,
  "maxConcurrency": 4,
  "dryRun": false
}
```

# Actor output Schema

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

Readable summary: share of voice, mention rate, average list rank and citation rate per brand, overall and per engine, plus citation gaps and lost prompts.

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

The same summary as JSON, for integrations and AI agents.

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

One row per prompt, engine and run: status, whether your brand was mentioned, its list rank, whether it was cited, competitors mentioned and cited domains.

# 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 = {
    "brandName": "HubSpot",
    "brandDomain": "hubspot.com",
    "brandAliases": [
        "HubSpot CRM"
    ],
    "competitors": [
        "Salesforce (salesforce.com)",
        "Pipedrive (pipedrive.com)",
        "Zoho CRM (zoho.com) | Zoho"
    ],
    "prompts": [
        "What is the best CRM for small marketing agencies?",
        "Best free CRM for startups in 2026"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("touchrock/ai-share-of-voice").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 = {
    "brandName": "HubSpot",
    "brandDomain": "hubspot.com",
    "brandAliases": ["HubSpot CRM"],
    "competitors": [
        "Salesforce (salesforce.com)",
        "Pipedrive (pipedrive.com)",
        "Zoho CRM (zoho.com) | Zoho",
    ],
    "prompts": [
        "What is the best CRM for small marketing agencies?",
        "Best free CRM for startups in 2026",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("touchrock/ai-share-of-voice").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 '{
  "brandName": "HubSpot",
  "brandDomain": "hubspot.com",
  "brandAliases": [
    "HubSpot CRM"
  ],
  "competitors": [
    "Salesforce (salesforce.com)",
    "Pipedrive (pipedrive.com)",
    "Zoho CRM (zoho.com) | Zoho"
  ],
  "prompts": [
    "What is the best CRM for small marketing agencies?",
    "Best free CRM for startups in 2026"
  ]
}' |
apify call touchrock/ai-share-of-voice --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,touchrock/ai-share-of-voice"
        }
    }
}
```

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/r9lFtl6OM7xiJsc1b/builds/ULQWAdQvQ5C2AlEju/openapi.json
