# AI Brand Visibility & Share of Voice (Beta) (`tgelu/ai-visibility-tracker`) Actor

Beta. See if Google AI Overviews, ChatGPT, Perplexity and Gemini mention or cite your brand vs competitors for the prompts your buyers ask. Rank, citations, sentiment and share of voice per answer. AI Overviews need no key; LLM modes use your own API keys (you pay the providers' fees).

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

## Pricing

Pay per event

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 Brand Visibility & Share of Voice (Beta) – ChatGPT, Perplexity, Gemini & Google AI Overviews

> **Beta.** Google AI Overviews mode was tested live on 32 queries (2 Nov 2026). The bring-your-own-key modes for ChatGPT, Perplexity and Gemini are **beta**: they are built on the official APIs, but they haven't been checked at scale yet. With your own keys, **you pay the AI providers' fees yourself** (billed by OpenAI/Perplexity/Google to your account) on top of this Actor's price. Feedback and issue reports are welcome.

More and more buyers ask an AI assistant instead of Google. **Does it recommend you, or your competitor?** This Actor asks ChatGPT (with web search), Perplexity, Gemini (with Google Search grounding) and Google AI Overviews the questions your customers ask, then measures your brand in every answer.

**Use it for:** GEO / AEO (generative engine optimisation) · brand monitoring · competitor benchmarking · agency client reporting · checking whether content changes help.

### Per answer you get

| Field | Meaning |
|---|---|
| `ownMentioned`, `ownRank` | Mentioned? In what order among all tracked brands? |
| `ownListPosition` | Position in the "top tools" list, if the AI made one |
| `ownCited` | Did the AI cite **your domain** as a source? |
| `ownSentiment` | positive / neutral / negative wording around your mention |
| `shareOfVoicePct` | Your mentions ÷ all tracked-brand mentions |
| `competitors[]` | Same metrics per competitor |
| `citedDomains`, `citations`, `answerText` | Full evidence |

The **REPORT** record has per-engine scores: visibility %, cited %, average rank and competitor mention counts. Ask each prompt 2–5 times (`runsPerPrompt`) for stable numbers, because AI answers vary.

### Modes

- **Bring your own keys** (beta, default): paste OpenAI, Perplexity and/or Gemini keys. Those providers bill you directly for their API usage, and keys are stored as secret input.
- **Demo:** free canned sample answers, so you can see the output without keys.
- **Google AI Overviews** (default engine): no key needed; the GOOGLE_SERP proxy is preselected. Tested live on 22 queries (2 Nov 2026): an overview appeared on 68% of them. Each row has `aiOverviewStatus` = `shown` / `absent` / `deferred` (Google streamed the overview with JavaScript, so it can't be read without a browser; this is not counted as "absent").

Spend cap: `maxAnswers` stops the run (default 50). Failed calls are recorded as errors and never charged.

### Example row (demo mode: canned answer, not a live AI response)

```json
{"prompt":"What is the best project management tool for a small team?","engine":"chatgpt","brand":"Notion","ownMentioned":true,"ownRank":1,"ownListPosition":1,"ownCited":true,"ownSentiment":"positive","shareOfVoicePct":40,"brandsMentioned":4,"competitors":[{"name":"ClickUp","mentioned":true,"rank":2,"cited":true,"sentiment":"negative"}],"citedDomains":["notion.com","clickup.com","g2.com"]}
```

### Pricing

| | Free plan | Starter / Scale | Business / Enterprise |
|---|---|---|---|
| Google AI Overview check (no key needed) | $0.012 | **$0.010** | **$0.009** |
| Answer analysed with your own AI key (beta) | $0.010 | $0.005 | $0.004 |

Platform usage and proxy are included. With your own keys, the AI providers' own fees are extra and billed by them. Demo mode is free, and failed or blocked requests are never charged.

Sentiment is a keyword heuristic, not a model judgement. Treat it as a signal. Not affiliated with OpenAI, Perplexity or Google.

# Actor input Schema

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

Brand name as people write it.

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

Other spellings or product names, e.g. 'Notion AI'.

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

Your websites, to detect when an AI cites you as a source.

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

One per line: 'Name | alias1, alias2 | domain.com'. Aliases and domains are optional.

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

Questions your buyers ask AI assistants.

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

Google AI Overviews (no API key needed; uses the GOOGLE_SERP proxy) and, with your own API keys (beta), ChatGPT with OpenAI web search, Perplexity Sonar and Gemini with Google Search grounding.

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

AI answers vary; ask each prompt 1–5 times for a stable score.

## `mode` (type: `string`):

Bring your own API keys (cheapest), or Demo (free, canned sample answers, no keys needed).

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

For ChatGPT answers. Billed by OpenAI to you.

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

For Perplexity answers. Billed by Perplexity to you.

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

For Gemini answers (Google AI Studio key).

## `openaiModel` (type: `string`):

Model used with the web_search tool.

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

e.g. sonar, sonar-pro.

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

e.g. gemini-2.5-flash.

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

Two-letter country for location-aware search (OpenAI, AI Overviews).

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

Language code for AI Overviews.

## `maxAnswers` (type: `integer`):

Hard stop after this many answers per run (protects your API bill and Apify charges).

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

Store the full AI answer (up to 8,000 chars).

## `proxyConfiguration` (type: `object`):

Only used for Google AI Overviews. GOOGLE_SERP proxy is required for reliable results.

## `debugSaveHtml` (type: `boolean`):

Saves each Google results page to the key-value store (for troubleshooting AI Overview parsing).

## Actor input object example

```json
{
  "brand": "Notion",
  "brandAliases": [],
  "brandDomains": [
    "notion.com",
    "notion.so"
  ],
  "competitors": [
    "ClickUp | | clickup.com",
    "Asana | | asana.com",
    "Trello | | trello.com"
  ],
  "prompts": [
    "best project management software for small teams"
  ],
  "engines": [
    "google-ai-overview"
  ],
  "runsPerPrompt": 1,
  "mode": "byo",
  "openaiModel": "gpt-4.1-mini",
  "perplexityModel": "sonar",
  "geminiModel": "gemini-2.5-flash",
  "country": "us",
  "language": "en",
  "maxAnswers": 50,
  "includeAnswerText": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "GOOGLE_SERP"
    ]
  },
  "debugSaveHtml": false
}
```

# Actor output Schema

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

All result rows in the default dataset (switch views in the Output tab).

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

Run statistics (JSON).

# 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",
    "brandAliases": [],
    "brandDomains": [
        "notion.com",
        "notion.so"
    ],
    "competitors": [
        "ClickUp | | clickup.com",
        "Asana | | asana.com",
        "Trello | | trello.com"
    ],
    "prompts": [
        "best project management software for small teams"
    ],
    "engines": [
        "google-ai-overview"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "GOOGLE_SERP"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("tgelu/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",
    "brandAliases": [],
    "brandDomains": [
        "notion.com",
        "notion.so",
    ],
    "competitors": [
        "ClickUp | | clickup.com",
        "Asana | | asana.com",
        "Trello | | trello.com",
    ],
    "prompts": ["best project management software for small teams"],
    "engines": ["google-ai-overview"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["GOOGLE_SERP"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("tgelu/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",
  "brandAliases": [],
  "brandDomains": [
    "notion.com",
    "notion.so"
  ],
  "competitors": [
    "ClickUp | | clickup.com",
    "Asana | | asana.com",
    "Trello | | trello.com"
  ],
  "prompts": [
    "best project management software for small teams"
  ],
  "engines": [
    "google-ai-overview"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "GOOGLE_SERP"
    ]
  }
}' |
apify call tgelu/ai-visibility-tracker --silent --output-dataset

```

## MCP server setup

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