# AI Search Visibility: ChatGPT, Perplexity, Gemini, AI Overviews (`cycha/ai-search-visibility-tracker`) Actor

Check if ChatGPT, Perplexity, Gemini and Google AI Overviews mention your brand: visibility %, position vs competitors, cited sources and share of voice per prompt. GEO/AEO monitoring at $0.004 per answer with your own API keys; AI Overviews need no key.

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

## Pricing

from $4.00 / 1,000 answer with your own api keys

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 Search Visibility Tracker — ChatGPT, Perplexity, Gemini & Google AI Overviews

Find out whether AI assistants recommend your brand. Give it the questions your customers ask ("best CRM for a small agency", "Notion vs Confluence") plus your brand and competitors. It asks **ChatGPT, Perplexity, Gemini and Google AI Overviews** and tells you, for every answer:

- **Is your brand mentioned**, how often, and in **which position** against your competitors (1 = named first)
- **Is your website cited** as a source, and at which position
- **Which competitors** are named instead, and which sites the AI relies on
- Per run: **visibility %**, **share of voice**, **average position** per engine, and the **prompts where you are missing** (your content gaps)

It's built for GEO / AEO (generative engine optimisation) tracking, brand monitoring and competitor research. Schedule it weekly to follow your AI visibility over time.

- **All four engines in one run, one dataset, one report.**
- **$0.004 per answer with your own API keys** for ChatGPT, Perplexity and Gemini. That's about 50× less than single-engine AI answer scrapers at $0.20, and you pay the AI provider directly, usually 1–4¢ per answer.
- **Google AI Overviews need no key.**
- **Live web search answers.** ChatGPT uses OpenAI's web search, Gemini uses Grounding with Google Search, and Perplexity uses Sonar. These are the same search-backed models behind the assistants.
- **Failed answers are free.** You pay only for answers delivered.

> **No API key?** Run it with Google AI Overviews only, or get a free Gemini key at [aistudio.google.com](https://aistudio.google.com) (1,500 free answers a day). Answers on our own keys (no key needed, from $0.02) are coming soon.

### Quick start

```json
{
  "prompts": [
    "best project management software for small teams",
    "what is the best free alternative to Trello"
  ],
  "brand": "Notion | notion.so | notion.com",
  "competitors": ["Asana | asana.com", "Trello | trello.com", "ClickUp | clickup.com", "Monday.com | monday.com | Monday"],
  "engines": ["chatgpt", "perplexity", "gemini", "google_ai_overview"],
  "repetitions": 2
}
```

**Brand format:** `Name | website | other spellings`. The website is how the actor knows whether the AI cites *you*. Add several domains if you have them. Other spellings (e.g. `Monday` for `Monday.com`) also count as mentions. Matching is case-insensitive and on whole words, so "Notion" doesn't match "notionally".

### What you get

**1. A report page** (`REPORT` in the run's key-value store, linked on the Output tab): headline numbers, a brand × engine visibility table, share of voice, the prompts where you're missing with the competitors named instead, and a line per answer.

**2. One dataset row per answer:**

```json
{
  "prompt": "best project management software for small teams",
  "engine": "perplexity",
  "engineName": "Perplexity",
  "model": "sonar",
  "repetition": 1,
  "brand": "Notion",
  "brandMentioned": true,
  "brandMentionCount": 1,
  "brandRank": 3,
  "brandCited": true,
  "brandCitationPosition": 3,
  "competitorsMentioned": ["Monday.com", "Asana"],
  "competitors": [
    {"name": "Asana", "mentioned": true, "mentionCount": 1, "rank": 2, "cited": true, "citationPosition": 2}
  ],
  "trackedBrandsInOrder": ["Monday.com", "Asana", "Notion"],
  "answer": "Popular choices include monday.com for visual workflows [1], Asana [2] and Notion...",
  "sourceCount": 3,
  "citedDomains": ["monday.com", "asana.com", "notion.com"],
  "sources": [{"position": 1, "url": "https://monday.com/blog/pm", "title": "Best PM tools", "domain": "monday.com", "cited": true}],
  "searchQueries": [],
  "usedOwnApiKey": false,
  "checkedAt": "2026-10-23T18:00:00+00:00",
  "error": null
}
```

- `brandRank`: your position among the tracked brands the answer names, by first mention. `null` means not mentioned.
- `brandCited`: `true` or `false` when you gave a website, `null` when you didn't.
- `sources`: the cited sources first, then sources the engine consulted without citing them (`cited: false`; ChatGPT and Perplexity report these).
- `searchQueries`: the web searches the engine ran to answer (ChatGPT, Gemini).

**3. `SUMMARY`** (JSON in the key-value store): the same numbers as the report, overall and per engine, ready for dashboards.

### Pricing

Pay per answer delivered. There is no subscription, and failed or empty answers cost nothing.

| Event | Price |
|---|---|
| ChatGPT, Perplexity or Gemini answer made with **your own** API key | $0.004 |
| Google AI Overview analysed | $0.002 |
| *Coming soon:* answer on our keys (ChatGPT $0.03, Perplexity $0.02, Gemini $0.04) | – |

**Google AI Overviews** are fetched by Apify's official [Google AI Overviews Scraper](https://apify.com/apify/google-ai-overviews-scraper), which runs in your own Apify account. Apify bills that scraper separately at its own price, $0.001–0.003 per overview depending on your plan. Searches that show no AI Overview cost nothing here.

Example: 20 prompts × ChatGPT + Perplexity + Gemini × 2 repetitions with your own keys, plus AI Overviews = 120 × $0.004 + 20 × $0.002 = **$0.52**, plus your AI providers' fees and Apify's AI Overview fee. A single-engine scraper at $0.20 per answer would charge $24 for the same 120 answers.

Set a **maximum cost per run** in the run options. The actor stops asking before it would go over.

### Input

| Field | Default | Description |
|---|---|---|
| `prompts` | required | Questions, one per line. Up to 200 per run. |
| `brand` | required | `Name \| website \| other spellings` |
| `competitors` | – | One per line, same format. Up to 25. |
| `engines` | all four | `chatgpt`, `perplexity`, `gemini`, `google_ai_overview` |
| `repetitions` | 1 | Ask each prompt 1–5 times per engine. AI answers vary, so 2–3 gives a steadier visibility %. |
| `country` | `US` | Location for ChatGPT's web search (two-letter code). |
| `includeAnswerText` | true | Keep the full answer text. |
| `includeSources` | true | Keep the list of sources. |
| `openaiApiKey`, `perplexityApiKey`, `geminiApiKey` | – | Your own keys (stored encrypted), needed for ChatGPT, Perplexity and Gemini. Answers cost $0.004. |
| `chatgptModel`, `perplexityModel`, `geminiModel` | `gpt-5-mini`, `sonar`, `gemini-2.5-flash` | Advanced: any model of that provider with web search. |

### Good to know

- **API answers vs the chat apps.** ChatGPT, Perplexity and Gemini are asked through their official APIs with web search on. Answers come from the same models and search backends, but they can differ from what one logged-in user sees in the app, which is also personalised. Track the trend across runs and repetitions rather than a single answer.
- **AI Overviews don't show for every search.** Those prompts get a row with `noAiOverview: true` and aren't charged.
- **Incomplete AI Overviews are retried.** Google sometimes loads an overview's list or table separately, and the capture then misses the brands in it. The actor retries those searches once. Overviews that stay incomplete get `aiOverviewPartial: true`, are left out of the scores and aren't charged.
- **Country** applies to ChatGPT's search location. Gemini and Perplexity search without a set location, and AI Overviews use Apify's default Google settings.
- **Prompts in any language** work. Write them the way your customers would.

### FAQ

**How is this different from rank tracking?** Search engines rank pages. AI assistants name a few brands and cite a few sources. This actor measures whether you are named and cited, and who is named instead.

**Can I monitor this every week?** Yes. Create a task with your prompts and schedule it. Each run's `SUMMARY` makes a dated data point; send it to Google Sheets or a webhook.

**Do you store my API keys?** No. Keys you enter are encrypted by Apify as secret input and used only for that run's requests.

# Actor input Schema

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

The questions your customers ask AI assistants, one per line. Recommendation questions work best: 'best CRM for a 10-person agency', 'Notion vs Confluence for documentation'.

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

Brand name, optionally followed by its website and other spellings, separated by |. Example: Notion | notion.so | notion.com. The website is used to check whether the AI cites you as a source.

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

One competitor per line, in the same format: name | website | other spellings. Each answer records which competitors are named and in what order.

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

Where to ask. ChatGPT, Perplexity and Gemini answer with live web search through their official APIs, using your API keys below. Google AI Overviews need no key: they are fetched by Apify's own Google AI Overviews Scraper in your account (see pricing).

## `repetitions` (type: `integer`):

AI answers vary from one ask to the next. Ask each prompt 2 to 5 times for a steadier visibility %. Each answer is billed. (Google AI Overviews are fetched once.)

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

Two-letter country code for ChatGPT's web search location, e.g. US, GB, FR, DE. Leave empty for no location.

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

Keep each AI answer in the dataset. Turn off for smaller exports with only the scores.

## `includeSources` (type: `boolean`):

List every source each answer cited (URL, title, domain, position).

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

Used for ChatGPT answers instead of the actor's key.

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

Used for Perplexity answers instead of the actor's key.

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

Used for Gemini answers instead of the actor's key.

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

Default gpt-5-mini. Any Responses API model that supports web search.

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

Default sonar.

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

Default gemini-2.5-flash. Any Gemini model that supports Grounding with Google Search.

## Actor input object example

```json
{
  "prompts": [
    "best project management software for small teams",
    "what is the best free alternative to Trello",
    "which tool should a startup use for team documentation"
  ],
  "brand": "Notion | notion.so | notion.com",
  "competitors": [
    "Asana | asana.com",
    "Trello | trello.com",
    "ClickUp | clickup.com",
    "Monday.com | monday.com | Monday"
  ],
  "engines": [
    "chatgpt",
    "perplexity",
    "gemini",
    "google_ai_overview"
  ],
  "repetitions": 1,
  "country": "US",
  "includeAnswerText": true,
  "includeSources": 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 = {
    "prompts": [
        "best project management software for small teams",
        "what is the best free alternative to Trello",
        "which tool should a startup use for team documentation"
    ],
    "brand": "Notion | notion.so | notion.com",
    "competitors": [
        "Asana | asana.com",
        "Trello | trello.com",
        "ClickUp | clickup.com",
        "Monday.com | monday.com | Monday"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("cycha/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 = {
    "prompts": [
        "best project management software for small teams",
        "what is the best free alternative to Trello",
        "which tool should a startup use for team documentation",
    ],
    "brand": "Notion | notion.so | notion.com",
    "competitors": [
        "Asana | asana.com",
        "Trello | trello.com",
        "ClickUp | clickup.com",
        "Monday.com | monday.com | Monday",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("cycha/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 '{
  "prompts": [
    "best project management software for small teams",
    "what is the best free alternative to Trello",
    "which tool should a startup use for team documentation"
  ],
  "brand": "Notion | notion.so | notion.com",
  "competitors": [
    "Asana | asana.com",
    "Trello | trello.com",
    "ClickUp | clickup.com",
    "Monday.com | monday.com | Monday"
  ]
}' |
apify call cycha/ai-search-visibility-tracker --silent --output-dataset

```

## MCP server setup

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