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

See how often ChatGPT, Perplexity, Gemini and Claude mention, rank and cite your brand vs competitors for the questions your customers ask. Visibility score, share of voice, content gaps and a shareable HTML report.

- **URL**: https://apify.com/borjagvo/ai-visibility-tracker.md
- **Developed by:** [Borja GVO](https://apify.com/borjagvo) (community)
- **Categories:** SEO tools, AI, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $100.00 / 1,000 chatgpt answer analyseds

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 (GEO)

Find out whether AI assistants recommend **your brand** or your **competitors**. This Actor asks ChatGPT, Perplexity, Gemini and Claude the questions your customers ask (with live web search on), then measures for every answer:

- ✅ **Are you mentioned?** How many times, and in what context
- 🥇 **Where do you rank?** Order of first mention and position in "top 10" style lists
- 🔗 **Is your website cited** as a source?
- ⚔️ **Which competitors appear** instead of you, and in what order
- 📊 **Share of voice** against the competitors you track
- 📚 **Which sites the AI cites most**: the publications and review sites to target for PR and content

You get a **0–100 AI Visibility Score**, per-engine breakdowns, a competitor leaderboard, a list of **content gaps** (prompts where competitors show up and you don't) and a **shareable HTML report** you can send to a client or your boss.

This is GEO (Generative Engine Optimization), also called AEO (Answer Engine Optimization) or LLM SEO: the new SEO for AI search.

### Who is it for?

- **Marketing & SEO teams** tracking how AI search changes their organic pipeline
- **GEO / SEO agencies** producing monthly AI visibility reports for clients
- **Founders & product marketers** checking whether ChatGPT recommends them or a competitor
- **PR teams** discovering which publications AI engines trust and cite
- **Local businesses** (set a city) checking whether AI suggests them for "best dentist in Madrid"-style questions

### How much does it cost?

Pay only for answers analysed. No subscription.

| Event | Price |
| --- | --- |
| ChatGPT answer analysed | $0.10 |
| Perplexity answer analysed | $0.02 |
| Gemini answer analysed | $0.05 |
| Claude answer analysed | $0.18 |
| Any answer using **your own API key** | $0.005 |
| Visibility report (once per run) | $0.02 |

**Example:** 25 prompts × 4 engines = 100 answers ≈ **$8.77**. Weekly tracking of 25 prompts on ChatGPT + Perplexity costs about **$13/month**, versus $29–$500/month for typical GEO SaaS subscriptions.

Failed or declined answers are never charged. Set **Maximum cost per run** to cap spending; the Actor stops cleanly at the cap.

**Bring your own keys:** add your OpenAI, Perplexity, Google or Anthropic API key in the "Your own API keys" section to pay providers directly and pay only $0.005 per answer for the analysis. On Apify's free plan, Perplexity works out of the box (up to 3 answers per run) and the other engines need your own key.

### How to use

1. Enter **your brand** and your **website domain** (to detect citations).
2. Add **competitors**, one per line, optionally with their domain: `Asana | asana.com`.
3. Add **prompts**: unbranded questions your customers ask, e.g. *"What's the best CRM for a 10-person startup?"*. Not sure what to ask? Enter a **topic** and set **Number of prompts to generate**.
4. Pick the **AI engines**, the **country** (and optionally a city), then click **Start**.
5. Open the **Visibility report (HTML)** from the Output tab, or export the per-answer data as CSV, Excel or JSON.

#### Input example

```json
{
    "brand": "Notion",
    "brandDomains": ["notion.so", "notion.com"],
    "competitors": ["Asana | asana.com", "ClickUp | clickup.com", "Trello | trello.com", "Monday | monday.com"],
    "prompts": [
        "What is the best project management tool for a small team?",
        "Best all-in-one workspace app for startups",
        "Alternatives to Jira for non-technical teams"
    ],
    "engines": ["chatgpt", "perplexity", "gemini", "claude"],
    "country": "US",
    "runsPerPrompt": 1
}
```

### Output

#### Visibility report

The `report.html` record (and its JSON twin `REPORT`) contains:

- **Overall**: visibility score, mention rate, citation rate, average position, share of voice
- **By engine**: the same metrics for ChatGPT, Perplexity, Gemini and Claude
- **Leaderboard**: you vs every competitor, per engine
- **Content gaps**: prompts where competitors are mentioned and you're not
- **Most-cited sources**: the domains AI engines rely on, flagged when it's your site or a competitor's

#### One record per AI answer

```json
{
    "prompt": "What is the best project management tool for a small team?",
    "engine": "chatgpt",
    "model": "gpt-6.1-sol",
    "brand": "Notion",
    "brandMentioned": true,
    "brandMentionCount": 2,
    "brandRank": 2,
    "brandListPosition": 2,
    "brandCited": true,
    "brandCitedUrls": ["https://www.notion.so/product"],
    "brandContext": "1. Asana – great for larger teams. 2. Notion – flexible docs + tasks (notion.so). 3. Trello – simple boards…",
    "shareOfVoice": 0.5,
    "mentionedInOrder": ["Asana", "Notion", "Trello"],
    "competitors": [
        { "name": "Asana", "mentioned": true, "mentionCount": 1, "rank": 1, "listPosition": 1, "cited": false },
        { "name": "ClickUp", "mentioned": false, "mentionCount": 0, "rank": null, "listPosition": null, "cited": false }
    ],
    "citations": [{ "url": "https://www.notion.so/product", "title": "Notion", "domain": "notion.so" }],
    "citedDomains": ["notion.so", "zapier.com"],
    "searchQueries": ["best project management tool small team 2026"],
    "answer": "Here are some of the best options: …",
    "checkedAt": "2026-10-06T19:55:12.000Z"
}
```

### Track your AI visibility over time

AI answers change every week as models update and the web changes. Save your input as a **task**, add a weekly **schedule**, and send results to Google Sheets, Looker Studio, Slack or a webhook through Apify integrations. Use **Runs per prompt: 2–3** for steadier percentages.

### How it works

Each prompt is sent to the official API of each provider with **live web search enabled**: OpenAI's Responses API with web search, Perplexity Sonar, Gemini with Grounding with Google Search, and Claude with Anthropic's web search tool. The Actor then matches your brand, aliases and domains (whole-word, Unicode-aware), detects ranked lists, and resolves citations to domains.

Results closely track what people see in the consumer apps, but they won't be identical: consumer apps add personalization, memory, A/B tests and their own system prompts. For decisions, look at trends across many prompts rather than single answers.

### Tips for good prompts

- Write prompts like a customer who doesn't know you yet: *"best X for Y"*, *"X vs Y"*, *"alternatives to Z"*, *"how do I solve \[problem]"*.
- Mix head prompts (*"best CRM"*) and long-tail prompts (*"CRM for real estate agents in Spain"*).
- Keep the same prompt set over time so trends are comparable.
- If your brand is a common word (Notion, Linear, Monday), enable **case-sensitive matching**.

### FAQ

**Which models are used?**
By default `gpt-6.1-sol` (ChatGPT), `sonar` (Perplexity), `gemini-3.8-flash` (Gemini) and `claude-opus-5-5` (Claude). You can change each model in the "Models" section, for example to `claude-sonnet-5-5` or `sonar-pro`.

**Can I use it for any language or country?**
Yes. Write prompts in any language, set the country code (and optionally a city) to localize web search, and optionally force the answer language.

**Is my API key safe?**
Keys are stored encrypted as secret inputs and are only sent to the provider they belong to.

**Can I call it from my own app or an AI agent?**
Yes: through the Apify API, the JavaScript/Python clients, Make, Zapier, n8n, or the Apify MCP server.

### Support

Questions or feature requests (more engines, sentiment analysis, Looker Studio template)? Open an issue in the **Issues** tab — this Actor is actively maintained.

# Actor input Schema

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

The brand, product or company to track, exactly as people write it (e.g. Notion).

## `brandDomains` (type: `array`):

Used to detect when AI answers cite your site as a source (e.g. notion.so). Subdomains are included automatically.

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

Alternative spellings or product names that should count as a mention (e.g. Notion AI, Notion Labs).

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

One per line. Optionally add the domain and aliases separated by "|": "Asana | asana.com" or "Monday | monday.com | monday.com Work OS".

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

Unbranded questions people ask AI assistants when looking for a solution like yours. 10–50 prompts give a reliable picture.

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

Which AI assistants to check. Each prompt is asked to every selected engine with live web search enabled.

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

Two-letter country code used to localize web search (US, GB, DE, ES, FR, IN…).

## `city` (type: `string`):

Localize answers further, useful for local businesses (e.g. Madrid).

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

ISO code of the language answers should be written in, or "auto" to follow the prompt's language.

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

AI answers vary between runs. Ask each prompt 2–3 times for more stable percentages.

## `topic` (type: `string`):

Describe your category (e.g. "project management software for small teams") to auto-generate realistic prompts.

## `generatePrompts` (type: `integer`):

Generated prompts are added to the ones you entered. Requires a paid Apify plan or your own API key.

## `caseSensitive` (type: `boolean`):

Turn on if your brand is also a common word (e.g. "Linear", "Notion") to only count capitalized mentions.

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

Store each AI answer's full text next to the analysis.

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

How many AI answers to request at the same time.

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

OpenAI model used for the ChatGPT engine.

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

sonar or sonar-pro.

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

Gemini model with Google Search grounding.

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

Anthropic model used for the Claude engine, e.g. claude-opus-5-5, claude-sonnet-5-5 or claude-haiku-4-5.

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

Optional. With your own key you only pay a small analysis fee per answer and API costs go to your OpenAI account.

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

Optional.

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

Optional.

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

Optional.

## Actor input object example

```json
{
  "brand": "Notion",
  "brandDomains": [
    "notion.so",
    "notion.com"
  ],
  "competitors": [
    "Asana | asana.com",
    "ClickUp | clickup.com",
    "Trello | trello.com",
    "Monday | monday.com"
  ],
  "prompts": [
    "What is the best project management tool for a small team?"
  ],
  "engines": [
    "chatgpt",
    "perplexity",
    "gemini",
    "claude"
  ],
  "country": "US",
  "language": "auto",
  "runsPerPrompt": 1,
  "generatePrompts": 0,
  "caseSensitive": false,
  "includeAnswerText": true,
  "maxConcurrency": 4,
  "chatgptModel": "gpt-6.1-sol",
  "perplexityModel": "sonar",
  "geminiModel": "gemini-3.8-flash",
  "claudeModel": "claude-opus-5-5"
}
```

# Actor output Schema

## `reportHtml` (type: `string`):

No description

## `report` (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",
    "brandDomains": [
        "notion.so",
        "notion.com"
    ],
    "competitors": [
        "Asana | asana.com",
        "ClickUp | clickup.com",
        "Trello | trello.com",
        "Monday | monday.com"
    ],
    "prompts": [
        "What is the best project management tool for a small team?"
    ],
    "engines": [
        "chatgpt",
        "perplexity",
        "gemini",
        "claude"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("borjagvo/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",
    "brandDomains": [
        "notion.so",
        "notion.com",
    ],
    "competitors": [
        "Asana | asana.com",
        "ClickUp | clickup.com",
        "Trello | trello.com",
        "Monday | monday.com",
    ],
    "prompts": ["What is the best project management tool for a small team?"],
    "engines": [
        "chatgpt",
        "perplexity",
        "gemini",
        "claude",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("borjagvo/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",
  "brandDomains": [
    "notion.so",
    "notion.com"
  ],
  "competitors": [
    "Asana | asana.com",
    "ClickUp | clickup.com",
    "Trello | trello.com",
    "Monday | monday.com"
  ],
  "prompts": [
    "What is the best project management tool for a small team?"
  ],
  "engines": [
    "chatgpt",
    "perplexity",
    "gemini",
    "claude"
  ]
}' |
apify call borjagvo/ai-visibility-tracker --silent --output-dataset

```

## MCP server setup

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