# AI Visibility Tracker — ChatGPT, Gemini, Perplexity & Claude (`saliga/ai-visibility-tracker`) Actor

Track how often ChatGPT, Claude, Gemini and Perplexity mention and cite your brand vs competitors for the questions your customers ask: mentions, rank, citations, share of voice. Official APIs, no scraping, no API keys.

- **URL**: https://apify.com/saliga/ai-visibility-tracker.md
- **Developed by:** [Salih Küçükkayış](https://apify.com/saliga) (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

from $15.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

Find out how often **ChatGPT, Claude, Gemini and Perplexity** mention your brand when people ask them about your market, where you rank against competitors, and which websites they cite. Ask the questions your customers ask, get one row per answer and a summary with your visibility per model, share of voice and the most cited domains. Uses the models' official APIs (through Apify's OpenRouter Actor), no scraping of chat apps and no API keys of your own.

**$15 per 1,000 checks** (one check = one question asked to one model), plus the model's own cost at OpenRouter's price: with web search about $0.005 per check for Perplexity and Gemini and $0.05-0.09 for ChatGPT and Claude, whose search results add many input tokens. You pay only for answers. No platform usage fees.

### Quick start

Press **Start** with the example input. It asks two questions to four models (8 checks) for Notion against four competitors:

```json
{
  "brand": "Notion | notion.com",
  "competitors": ["Coda | coda.io", "Obsidian | obsidian.md", "Evernote | evernote.com", "Confluence | atlassian.com"],
  "prompts": ["What is the best note-taking app for teams?", "Best alternative to Confluence for a startup wiki"]
}
```

You get one row per question, model and repeat (trimmed here):

```json
{
  "prompt": "What is the best note-taking app for teams?",
  "model": "openai/gpt-6.1-sol",
  "modelLabel": "ChatGPT (OpenAI)",
  "run": 1,
  "brandMentioned": true,
  "brandRank": 1,
  "brandMentions": 10,
  "brandCited": true,
  "competitorsMentioned": [
    "Confluence"
  ],
  "entities": [
    {
      "name": "Notion",
      "isBrand": true,
      "mentioned": true,
      "mentions": 10,
      "cited": true,
      "rank": 1
    },
    {
      "name": "Coda",
      "isBrand": false,
      "mentioned": false,
      "mentions": 0,
      "cited": false,
      "rank": null
    },
    {
      "name": "Obsidian",
      "isBrand": false,
      "mentioned": false,
      "mentions": 0,
      "cited": false,
      "rank": null
    },
    …
  ],
  "citations": [
    {
      "url": "https://www.notion.com/help/collaborate-within-a-workspace?utm_source=openai",
      "title": "Collaborate in a Notion workspace | Notion Help – Notion Help Center",
      "domain": "notion.com"
    },
    {
      "url": "https://www.notion.com/en-gb/pricing/us?utm_source=openai",
      "title": "Notion Pricing Plans: Free, Plus, Business and Enterprise.",
      "domain": "notion.com"
    },
    …
  ],
  "citedDomains": [
    "notion.com",
    "support.microsoft.com",
    "google.com",
    "support.atlassian.com"
  ],
  "answer": "**Notion is my best all-around pick for team note-taking**—especially if you want meeting notes, project information, and a shared knowledge base in one place. …",
  "answerLength": 1944,
  "llmCostUsd": 0.0619505,
  "tokens": 17691
}
```

In this run (October 2026) Notion was mentioned in all 8 answers, named first in 6, and its site was cited in 2 (both ChatGPT).

The **SUMMARY** record has your visibility over the whole run: the share of answers that mention you, your average rank, how often your site is cited, the same per model and per question, share of voice for you and every competitor, and the 25 most cited domains (the sites to get mentioned on).

### What you get

- **Mentioned or not, and where.** For every answer: whether your brand appears (by name, other spellings or website), how many times, and its rank among the brands mentioned (1 = named first).
- **Competitors side by side.** The same for every competitor, so you see who the models recommend instead of you.
- **Citations.** With web search on, the pages the model used, whether your site is among them, and which domains are cited most across all answers.
- **Per model and per question.** Visibility for ChatGPT, Claude, Gemini and Perplexity separately, and for each question.
- **Share of voice:** your mentions against all brand mentions in the run.
- **Answer text and model cost** in every row.

### Typical uses

- **AI search (GEO/AEO) tracking:** schedule a weekly run with the same questions and watch your visibility move.
- **Competitive research:** which competitors the models recommend for your category, and which sources they cite.
- **Content and PR planning:** the most cited domains are where a mention helps you get into AI answers.
- **Agency reporting** for several brands or markets (set `country` and `language`).

### Input

| Field | Default | Meaning |
|---|---|---|
| `brand` | | Your brand: `"Name | website.com | other spelling"`. |
| `competitors` | | One per line, same format. |
| `prompts` | | Questions to ask, one per line. |
| `models` | ChatGPT, Claude, Gemini, Perplexity | OpenRouter model ids (`openai/gpt-6.1-sol`, `anthropic/claude-sonnet-5.5`, `google/gemini-3.8-flash`, `perplexity/sonar`, or any other on openrouter.ai/models). |
| `webSearch` | `true` | Let the models search the web before answering (gives citations). |
| `repeats` | `1` | Ask each question several times per model; answers vary. |
| `maxChecks` | `200` | Safety limit on questions x models x repeats. |
| `country`, `language` | | Optional: where the user is and the answer language. |
| `includeAnswerText` | `true` | Keep the full answer in each row. |

### Output

| Field | Meaning |
|---|---|
| `prompt`, `model`, `modelLabel`, `run` | Question, model id and name, repeat number |
| `brandMentioned`, `brandMentions`, `brandRank`, `brandCited` | Your brand in this answer |
| `competitorsMentioned` | Competitors named, in order of first mention |
| `entities` | Every brand: `mentioned`, `mentions`, `rank`, `cited` |
| `citations`, `citedDomains` | Pages the answer cites |
| `answer`, `answerLength` | The answer text |
| `llmCostUsd`, `tokens` | The model's cost for this answer |
| `error` | Why the check failed (failed checks are free) |

### What it costs

You pay two things: **$0.015 per answered check** to this Actor, and **the model's own cost**, which Apify's [OpenRouter Actor](https://apify.com/apify/openrouter) charges to your Apify account at OpenRouter's price. Both appear on your Apify bill; the model cost of every answer is also in its row (`llmCostUsd`) and in the summary.

Model cost measured on a real run (October 2026, web search on, 2 questions): Perplexity (sonar) $0.005, Gemini (3.8 Flash) $0.006, Claude (Sonnet 5.5) $0.05, ChatGPT (GPT-6.1) $0.06-0.09 per answer. Answers to other questions can be longer or shorter.

| Run | This Actor | Model cost (estimate from the run above) |
|---|---|---|
| 10 questions x 4 default models | $0.60 | about $1.40 |
| 25 questions x 4 models x 3 repeats | $4.50 | about $10 |
| 25 questions x Perplexity + Gemini, weekly for a month | $3.00 | about $1.10 |

On Apify's free plan, Apify's OpenRouter Actor charges 10 times the model price, so a paid plan is much cheaper for regular tracking. The run's spending limit covers this Actor's charges; `maxChecks` keeps the number of model calls in check.

### Good to know

- **Official APIs, not the chat apps.** Answers come from the models' APIs with web search, which is close to, but not exactly, what the ChatGPT, Gemini or Perplexity apps show a signed-in user. Answers also vary between runs; use `repeats` and look at trends.
- **How mentions are found:** whole-word, case-insensitive matches of the name, other spellings you list, and the website. List common spellings (for example "HubSpot | hubspot.com | Hubspot CRM").
- **Rank** is the order in which brands are first named in the answer.
- Questions and answers go through OpenRouter to the model providers; do not put personal or confidential data in the questions.

### FAQ

**Do I need an OpenAI, Anthropic or Google API key?** No. The models are called through Apify's OpenRouter Actor with your run's Apify token, and their cost is charged to your Apify account.

**Which models can I use?** Any chat model on openrouter.ai/models. The defaults stand for the four big assistants.

**Can I track several brands?** Run once per brand (a saved task per brand works well), or add the other brands as competitors.

**Am I charged for failed checks?** No. A check is charged only when the model answered.

### Next steps with your results

- See which keywords you and your competitors rank for in Google with [Competitor Keywords](https://apify.com/saliga/competitor-keywords).
- Compare with classic search: track the Google positions for the same topics with [Google SERP Rank Tracker](https://apify.com/saliga/serp-rank-tracker).
- Check that the pages the models cite load fast and are readable by AI agents with [Lighthouse Bulk Audit](https://apify.com/saliga/lighthouse-bulk-audit).

### More from this developer

- [Google SERP Rank Tracker](https://apify.com/saliga/serp-rank-tracker): Google positions for your keywords by country and device, with AI Overview checks, $2 per 1,000 result pages.
- [Keyword Research](https://apify.com/saliga/keyword-research): keyword ideas with volume, difficulty and search intent, $2 per 1,000 keywords.
- [Competitor Keywords](https://apify.com/saliga/competitor-keywords): every Google keyword a domain or page ranks for, $2 per 1,000 rows.
- [Lighthouse Bulk Audit](https://apify.com/saliga/lighthouse-bulk-audit): PageSpeed Insights scores, Core Web Vitals and AI agent readiness for hundreds of URLs, $4 per 1,000 audits.
- [SEO Site Audit](https://apify.com/saliga/seo-site-audit): crawl a site and get an SEO score and fix list for every page, $3 per 1,000 pages.

Code examples (curl, Python, Node.js, n8n) for this and the other Actors: [github.com/msalihk/apify-actor-examples](https://github.com/msalihk/apify-actor-examples).

Questions or a missing feature: open an issue on the Actor page.

# Actor input Schema

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

Brand name, with its website and other spellings separated by |, for example "Notion | notion.com | Notion AI". The website is used to find citations of your pages.

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

One competitor per line, same format: "Coda | coda.io". Their mentions, rank and citations are reported next to yours.

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

Questions your customers ask AI assistants, one per line. Each question is asked to every model.

## `models` (type: `array`):

OpenRouter model ids. Default: ChatGPT (openai/gpt-6.1-sol), Claude (anthropic/claude-sonnet-5.5), Gemini (google/gemini-3.8-flash) and Perplexity (perplexity/sonar). Any model on openrouter.ai/models works.

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

Let the models search the web before answering, as ChatGPT, Gemini and Perplexity do for most product questions. Gives citations. Adds the provider's search fee to the model cost (about $0.005-0.014 per answer).

## `repeats` (type: `integer`):

Ask each question this many times per model. AI answers vary; 3 gives a steadier picture.

## `maxChecks` (type: `integer`):

Safety limit: questions x models x repeats may not exceed this. Every check also costs the model's own price, billed separately by Apify's OpenRouter Actor. A check is asked again only when the model refused before answering (rate limit, server error), which providers do not bill.

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

Optional: tell the models where the user is, for example "Germany".

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

Optional: answer language, for example "German".

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

Store the full answer in each row.

## `maxAnswerTokens` (type: `integer`):

Longer answers cost more.

## `concurrency` (type: `integer`):

Checks at the same time.

## Actor input object example

```json
{
  "brand": "Notion | notion.com",
  "competitors": [
    "Coda | coda.io",
    "Obsidian | obsidian.md",
    "Evernote | evernote.com",
    "Confluence | atlassian.com"
  ],
  "prompts": [
    "What is the best note-taking app for teams?",
    "Best alternative to Confluence for a startup wiki"
  ],
  "models": [
    "openai/gpt-6.1-sol",
    "anthropic/claude-sonnet-5.5",
    "google/gemini-3.8-flash",
    "perplexity/sonar"
  ],
  "webSearch": true,
  "repeats": 1,
  "maxChecks": 200,
  "includeAnswerText": true,
  "maxAnswerTokens": 1500,
  "concurrency": 4
}
```

# Actor output Schema

## `results` (type: `string`):

One row per question, model and repeat: whether your brand was mentioned, its rank, citations and competitors.

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

Visibility per model and per question, share of voice against competitors, most cited domains and the models' cost.

# 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 | notion.com",
    "competitors": [
        "Coda | coda.io",
        "Obsidian | obsidian.md",
        "Evernote | evernote.com",
        "Confluence | atlassian.com"
    ],
    "prompts": [
        "What is the best note-taking app for teams?",
        "Best alternative to Confluence for a startup wiki"
    ],
    "models": [
        "openai/gpt-6.1-sol",
        "anthropic/claude-sonnet-5.5",
        "google/gemini-3.8-flash",
        "perplexity/sonar"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("saliga/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 | notion.com",
    "competitors": [
        "Coda | coda.io",
        "Obsidian | obsidian.md",
        "Evernote | evernote.com",
        "Confluence | atlassian.com",
    ],
    "prompts": [
        "What is the best note-taking app for teams?",
        "Best alternative to Confluence for a startup wiki",
    ],
    "models": [
        "openai/gpt-6.1-sol",
        "anthropic/claude-sonnet-5.5",
        "google/gemini-3.8-flash",
        "perplexity/sonar",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("saliga/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 | notion.com",
  "competitors": [
    "Coda | coda.io",
    "Obsidian | obsidian.md",
    "Evernote | evernote.com",
    "Confluence | atlassian.com"
  ],
  "prompts": [
    "What is the best note-taking app for teams?",
    "Best alternative to Confluence for a startup wiki"
  ],
  "models": [
    "openai/gpt-6.1-sol",
    "anthropic/claude-sonnet-5.5",
    "google/gemini-3.8-flash",
    "perplexity/sonar"
  ]
}' |
apify call saliga/ai-visibility-tracker --silent --output-dataset

```

## MCP server setup

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