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

Measure a brand's AI-search visibility — citations across ChatGPT, Gemini, Perplexity, Copilot, Grok & Google AI Overviews, plus top-cited domains, pages, topics, and a monthly trend. No account needed.

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

## Pricing

from $10.00 / 1,000 brand trackeds

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## AI Visibility Tracker

Measure any brand's **AI-search visibility** — how often it's cited across **ChatGPT, Gemini, Perplexity, Copilot, Grok, and Google AI Overviews / AI Mode** — plus the **top domains and pages** that cite it, the **topics** it's cited for, and a **6-month trend**. One call per brand, no account, no login. JSON/CSV/Excel out.

![How the AI Visibility Tracker works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-ai-visibility.png)

### Why use the AI Visibility Tracker?

- **All AI engines in one call.** ChatGPT, Gemini, Perplexity, Copilot, Grok, Google AI Overviews & AI Mode — one request per brand, not one per prompt.
- **Real citation volume at index scale.** Total AI citations, broken down per model, from a large citation index — not a handful of live prompts.
- **See *who* cites you.** Top-cited domains and your own top-cited pages, so you know where your AI visibility comes from.
- **Track topics & trend.** The topics you're cited for, and a 6-month per-model timeline to see momentum.
- **No account, no keys.** Runs out of the box; the captcha is solved for you.
- **Bulk & comparable.** Track many brands in one run and compare them side by side.

### What is AI visibility (GEO / AEO)?

As buyers move from Google to AI assistants, **being cited by ChatGPT, Perplexity, and Google AI Overviews** matters as much as ranking. This actor quantifies that "generative-engine optimization" (GEO) footprint for any brand: how visible you (or a competitor) are across AI answers, which sources feed those answers, and how it's trending.

### Supported inputs

- **Brands** — any brand or entity name (e.g. `Notion`, `Apify`, `Slack`). Add several to compare them in one run.

### Use cases

- **GEO / AEO monitoring** — track your brand's citation share across AI engines over time.
- **Competitive benchmarking** — compare your AI visibility against rivals in one run.
- **Content strategy** — see which topics and pages AI engines cite, and double down.
- **PR & digital-footprint** — find which third-party domains (Reddit, review sites, docs) drive your AI mentions.
- **Reporting** — feed a clean per-brand, per-model dataset into dashboards for clients.

### How it works

1. **Input** — provide one or more brand names and pick which datasets you want.
2. **Processing** — each worker solves the captcha automatically, makes a single request that covers every AI engine, and rotates residential proxies.
3. **Output** — the response is flattened into one row per data point (overview, per-model, top-domain, top-page, topic, monthly), ready to export.

### Input configuration

| Field | Type | Description |
|---|---|---|
| `brands` | array | Brand / entity names to track. |
| `includeModels` | boolean | Per-model citation breakdown. On by default. |
| `includeTopDomains` | boolean | Top domains that cite the brand. On by default. |
| `includeTopPages` | boolean | The brand's own top-cited pages. On by default. |
| `includeTopics` | boolean | Top topics the brand is cited for. On by default. |
| `includeMonthlyTimeline` | boolean | 6-month per-model trend (many extra rows). Off by default. |
| `maxItems` | integer | Hard cap on total output rows. |
| `maxConcurrency` | integer | Parallel workers (default 3). |
| `proxy` | object | Proxy configuration (default Apify Residential, US). |

#### Example input

```json
{
  "brands": ["Notion", "Apify"],
  "includeModels": true,
  "includeTopDomains": true,
  "includeTopPages": true,
  "includeTopics": true,
  "includeMonthlyTimeline": false
}
````

### Output overview

Each data point is a flat row tagged with a `rowType`:

`ai_visibility_overview` · `ai_model_citations` · `ai_top_domain` · `ai_top_page` · `ai_topic` · `ai_model_month`

### Output samples

**Overview** (`rowType: "ai_visibility_overview"`)

```json
{ "rowType": "ai_visibility_overview", "brand": "Notion", "totalAiCitations": 839537, "modelsTracked": 9 }
```

**Per-model citations** (`rowType: "ai_model_citations"`)

```json
{ "rowType": "ai_model_citations", "brand": "Notion", "model": "Chatgpt", "citations": 47468 }
```

**Top cited domain** (`rowType: "ai_top_domain"`)

```json
{ "rowType": "ai_top_domain", "brand": "Notion", "domain": "www.reddit.com", "mentions": 57088 }
```

**Top topic** (`rowType: "ai_topic"`)

```json
{ "rowType": "ai_topic", "brand": "Notion", "topic": "project management software", "aiResponses": 684 }
```

**Monthly timeline** (`rowType: "ai_model_month"`)

```json
{ "rowType": "ai_model_month", "brand": "Notion", "model": "Chatgpt", "date": "2026-01-01T00:00:00Z", "citations": 29 }
```

### Key output fields

| Field | Appears in | Meaning |
|---|---|---|
| `totalAiCitations` | overview | Total times the brand is cited across all tracked AI engines. |
| `model` / `citations` | ai\_model\_citations, ai\_model\_month | The AI engine and its citation count. |
| `domain` / `mentions` | ai\_top\_domain | A domain cited alongside the brand and how often. |
| `url` / `mentions` | ai\_top\_page | The brand's own page and how often it's cited. |
| `topic` / `aiResponses` | ai\_topic | A topic the brand is cited for and the number of AI responses. |
| `date` / `citations` | ai\_model\_month | A month in the per-model citation trend. |

### FAQ

**Do I need an account or API keys?** No. It runs out of the box; the captcha is solved for you.

**Where does the data come from?** Ahrefs' public AI-visibility tool, which aggregates brand citations across major AI engines. It reflects that index's coverage.

**How is it different from prompt-based trackers?** Prompt-based tools send a handful of live prompts to each model. This returns aggregate citation volume across engines from a large index in a single call — broader coverage, one price per brand.

**How is it billed?** Per brand tracked (one flat charge per brand), regardless of how many datasets you enable. See the Pricing tab.

**Can I track many brands at once?** Yes — pass a list of brands; they're processed in parallel.

### Support

Found a bug or want a field added? Open an issue on the actor's **Issues** tab in Apify Console.

### Explore more scrapers

- **Ahrefs Scraper** — DR, backlinks, traffic, keywords, SERP & AI visibility.
- **SemRush / SimilarWeb / Ubersuggest / Moz Scrapers** — the rest of the SEO-data suite.

### ⚠️ Disclaimer

This actor extracts data made publicly available by Ahrefs' free AI-visibility tool. It does not access any account-gated or paid data, and it is not affiliated with, endorsed by, or sponsored by Ahrefs, OpenAI, Google, Perplexity, or any AI provider. Product and brand names are used only to describe the data. Use the output in compliance with the source's terms and applicable law.

### SEO keywords

AI visibility tracker, AI search visibility, GEO tracker, generative engine optimization, answer engine optimization, AEO, ChatGPT citations, Perplexity citations, Gemini citations, Google AI Overview tracking, brand mentions in AI, LLM visibility, AI brand monitor, AI citation tracking, share of voice AI, AI SEO, brand visibility ChatGPT, Grok citations, Copilot citations, AI search monitoring.

# Actor input Schema

## `brands` (type: `array`):

Brand or entity names to measure AI-search visibility for, e.g. `Notion`, `Apify`, `Slack`. Add multiple to compare them in one run.

## `includeModels` (type: `boolean`):

Citation counts per AI engine — ChatGPT, Gemini, Perplexity, Copilot, Grok, Google AI Overviews, Google AI Mode.

## `includeTopDomains` (type: `boolean`):

The domains most often cited alongside the brand in AI answers (with mention counts).

## `includeTopPages` (type: `boolean`):

The brand's own pages that AI engines cite most (with mention counts).

## `includeTopics` (type: `boolean`):

The topics / prompts the brand is most cited for, with the number of AI responses.

## `includeMonthlyTimeline` (type: `boolean`):

A 6-month per-model citation trend (one row per model per month). Adds many rows — off by default.

## `maxItems` (type: `integer`):

Hard cap on the total number of rows across all brands.

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

How many brands are processed in parallel. Each worker solves its own captcha and uses its own residential exit IP.

## `proxy` (type: `object`):

Residential proxies distribute the calls across exit IPs. Defaults to Apify Residential, US.

## Actor input object example

```json
{
  "brands": [
    "Notion",
    "Apify"
  ],
  "includeModels": true,
  "includeTopDomains": true,
  "includeTopPages": true,
  "includeTopics": true,
  "includeMonthlyTimeline": false,
  "maxItems": 10000,
  "maxConcurrency": 3,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# 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 = {
    "brands": [
        "Notion",
        "Apify"
    ],
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/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 = {
    "brands": [
        "Notion",
        "Apify",
    ],
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/ai-visibility-tracker").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "brands": [
    "Notion",
    "Apify"
  ],
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call memo23/ai-visibility-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=memo23/ai-visibility-tracker",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "AI Visibility Tracker — ChatGPT, Gemini, Perplexity & Google AI",
        "description": "Measure a brand's AI-search visibility — citations across ChatGPT, Gemini, Perplexity, Copilot, Grok & Google AI Overviews, plus top-cited domains, pages, topics, and a monthly trend. No account needed.",
        "version": "0.0",
        "x-build-id": "aBc7XGhTynBP6bYGJ"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/memo23~ai-visibility-tracker/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-memo23-ai-visibility-tracker",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/memo23~ai-visibility-tracker/runs": {
            "post": {
                "operationId": "runs-sync-memo23-ai-visibility-tracker",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/memo23~ai-visibility-tracker/run-sync": {
            "post": {
                "operationId": "run-sync-memo23-ai-visibility-tracker",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "brands": {
                        "title": "Brands",
                        "type": "array",
                        "description": "Brand or entity names to measure AI-search visibility for, e.g. `Notion`, `Apify`, `Slack`. Add multiple to compare them in one run.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "includeModels": {
                        "title": "Per-model citations",
                        "type": "boolean",
                        "description": "Citation counts per AI engine — ChatGPT, Gemini, Perplexity, Copilot, Grok, Google AI Overviews, Google AI Mode.",
                        "default": true
                    },
                    "includeTopDomains": {
                        "title": "Top cited domains",
                        "type": "boolean",
                        "description": "The domains most often cited alongside the brand in AI answers (with mention counts).",
                        "default": true
                    },
                    "includeTopPages": {
                        "title": "Top cited pages",
                        "type": "boolean",
                        "description": "The brand's own pages that AI engines cite most (with mention counts).",
                        "default": true
                    },
                    "includeTopics": {
                        "title": "Top topics",
                        "type": "boolean",
                        "description": "The topics / prompts the brand is most cited for, with the number of AI responses.",
                        "default": true
                    },
                    "includeMonthlyTimeline": {
                        "title": "Monthly timeline",
                        "type": "boolean",
                        "description": "A 6-month per-model citation trend (one row per model per month). Adds many rows — off by default.",
                        "default": false
                    },
                    "maxItems": {
                        "title": "Maximum output rows",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Hard cap on the total number of rows across all brands.",
                        "default": 10000
                    },
                    "maxConcurrency": {
                        "title": "Parallel workers",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "How many brands are processed in parallel. Each worker solves its own captcha and uses its own residential exit IP.",
                        "default": 3
                    },
                    "proxy": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Residential proxies distribute the calls across exit IPs. Defaults to Apify Residential, US.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ],
                            "apifyProxyCountry": "US"
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
