# AI Visibility Tracker: ChatGPT, Gemini & Google AI Overviews (`wulfcare/ai-visibility-tracker`) Actor

See whether ChatGPT, Gemini and Google AI Overviews recommend your brand or your competitors. Get a visibility score, share of voice, the prompts you're missing from, the sites AI cites, and a white-label HTML report. $0.04 per answer, report free. No API keys.

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

## Pricing

$40.00 / 1,000 ai answers

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, Gemini & Google AI Overviews

**When your customers ask AI "what's the best \_\_\_?", does it recommend you, or your competitors?**

This Actor asks **ChatGPT**, **Google Gemini** and **Google AI Overviews** the questions your buyers ask, and tells you:

- 📈 **Your AI visibility score (0-100)**, overall and per engine: how often AI names you, and how high in its answer
- 🥊 **Share of voice against your competitors**: who AI recommends first in your category, engine by engine
- 🕳 **Gaps**: the exact prompts where AI names your competitors and leaves you out
- 🎯 **Sites to get featured on**: the review sites, directories, listicles and forums AI cites when it recommends competitors instead of you. That's your PR and outreach list
- 🔗 **Which of your own pages AI cites**, and the sources AI relies on most in your niche
- 📅 **Changes over time**: schedule it weekly and see your score trend, plus the prompts you won or lost since last run
- 📄 **A client-ready HTML report**, white-label for agencies ("Prepared by *your agency*", no Apify branding)

Every answer comes from the **real, public, logged-out** ChatGPT, Gemini and Google search, as a new visitor sees them. They are not from an API model that answers differently from the product your customers use. You don't need an OpenAI or Google account or any API key.

### Who it's for

- **Marketing teams and founders** who want to know whether AI search sends buyers to them or to a competitor
- **SEO and GEO / AEO agencies** reporting AI visibility to clients: one scheduled task per client, a branded HTML report each week
- **PR and content teams** who need the list of publications and pages AI trusts in their category
- **Local businesses and franchises**: "best dentist in Brisbane", "plumber near Austin", with the country set to where the customers are

### How to use it

1. **Your brand**: name, other names, website, e.g. `Pipedrive, Pipedrive CRM, pipedrive.com`.
2. **Competitors**: one per line, same format.
3. **What to ask**: type a **category** ("CRM for small business") and the Actor writes the buyer questions for you, or paste **your own prompts**, or both.
4. Pick the **engines** (all three by default) and the **country** your customers are in.
5. Optional: set a **project name** and [schedule](https://docs.apify.com/platform/schedules) the Actor weekly to track changes.
6. Run it. Open the **Visibility report (HTML)** from the Output tab, or use the JSON report and the dataset in your own dashboards via the API, Google Sheets, Zapier or Make.

### The report

| Section | What it tells you |
|---|---|
| **AI visibility score** | 100 if you're the first tracked brand named, 85 second, 70 third, 55 fourth, 40 lower, 0 if not named, averaged over every answer. Overall and per engine |
| **Who AI recommends** | Every tracked brand's score, share of voice, % of answers naming it, % ranked first, average position, % citing its site |
| **Prompt by prompt** | A prompt × engine grid with your position in each answer |
| **Gaps** | Prompts where an engine named competitors but not you, and who it named |
| **Sites to get featured on** | Domains cited in answers that recommended a competitor and not you, with how often and for whom |
| **Your pages AI cites** | Which of your URLs AI uses as a source, and on which engines |
| **Sources AI relies on most** | The top cited domains across all answers |
| **Since the last run / Score over time** | With a project name: score changes and prompts gained or lost |

Prompts that name a tracked brand ("Is HubSpot any good?") are answered and shown, but **left out of the scores**, since an answer to them names the brand whatever its real visibility is.

### Output

**Dataset**: one row per prompt per engine (views: *Brand visibility*, *Answers & sources*, *Every tracked brand*):

```json
{
  "prompt": "What is the best CRM for small business?",
  "engine": "gemini",
  "engineName": "Gemini",
  "status": "answered",
  "brandedPrompt": false,
  "yourBrand": "Pipedrive",
  "yourBrandMentioned": true,
  "yourBrandRank": 2,
  "yourBrandCited": false,
  "brandsMentioned": ["HubSpot", "Pipedrive", "Salesforce"],
  "brands": [
    {
      "brand": "Pipedrive",
      "mentioned": true,
      "mentions": 2,
      "rank": 2,
      "firstMention": "Pipedrive: Best for sales-focused teams who want a clean, visual drag-and-drop pipeline to track deals from initial contact to close.",
      "cited": false,
      "citedUrls": []
    }
  ],
  "answerText": "Choosing the \"best\" CRM for a small business depends heavily on your budget, technical setup, and primary goals...",
  "answer": "(the answer as markdown)",
  "sources": [
    {"title": "Best small business CRM of 2026 - TechRadar", "url": "https://www.techradar.com/best/best-crm-for-small-business",
     "domain": "techradar.com", "siteName": null, "citedInline": true}
  ],
  "sourceCount": 8,
  "citedDomains": ["techradar.com", "pcmag.com", "g2.com", "zendesk.com"],
  "askedAt": "2026-10-01T14:11:36Z",
  "seconds": 13.5,
  "error": null
}
```

`status` is `answered`, `not shown` (Google showed no AI Overview for that search, which is itself useful to know) or `failed` (the engine wouldn't answer after retries). **Only `answered` rows are charged.**

**Key-value store**: `REPORT.html` (the report above) and `REPORT` (the same as JSON: `visibilityScore`, `scoreByEngine`, `brands`, `gaps`, `citationOpportunities`, `yourCitedPages`, `topCitedDomains`, `coverage`, `history`, `trend`).

### Pricing

You pay **per AI answer** delivered. Searches where Google shows no AI Overview, failed prompts and the report are free. Example: 10 prompts on 3 engines is at most 30 answers. Set *Max cost per run* in the run options to cap any run.

### Good to know

- **AI answers vary.** The same question can name different brands each time. For steadier numbers, track 10-30 prompts and/or ask each 2-3 times (*Ask each prompt this many times*).
- **Google AI Overviews** appear only for some searches; the report shows how many did (*coverage*). They're searched for the country you pick.
- **ChatGPT** is asked with web search, from the chosen country. For countries other than the US it goes through Apify residential proxy, which your Apify plan must include.
- **Gemini** answers logged-out visitors from the server's own location (the US). It doesn't localise by country setting.
- **Speed**: about 10 prompts × 3 engines in 3-5 minutes. Google AI Overviews are asked one at a time and slowly, to stay within Google's limits.
- If Google temporarily refuses the server ("unusual traffic"), the Actor pauses that engine and tries again. If it's still refused, the remaining prompts for that engine are marked `failed` and aren't charged.

### FAQ

**Why not use the OpenAI or Gemini API?** API models don't browse the way the consumer apps do, and they recommend different brands. What matters is what your customers see on chatgpt.com, gemini.google.com and google.com, and that's what this Actor reads.

**Can I track several clients?** Yes. Create one [task](https://docs.apify.com/platform/actors/running/tasks) per client with its own project name, agency name and schedule.

**Can I get the data into Looker Studio or Sheets?** The dataset and the JSON report are available through the Apify API and integrations (Google Sheets, Zapier, Make, webhooks).

# Actor input Schema

## `yourBrand` (type: `string`):

Your brand name, then any other names and your website, separated by commas: "Pipedrive, Pipedrive CRM, pipedrive.com". The report scores how often and how high AI recommends you, and whether it cites your site. Leave empty to just see who AI recommends.

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

The brands you compete with, one per line, in the same format: name, other names, website. Their scores and share of voice sit next to yours in the report.

## `category` (type: `string`):

What you sell, the way a customer would put it: "CRM for small business", "dentist in Brisbane", "running shoes for flat feet". The Actor writes the buyer questions people ask AI ("What is the best ...?", "Which ... would you recommend?", "alternatives to <competitor>"). Use it, your own prompts below, or both.

## `promptCount` (type: `integer`):

How many questions to write from the category (1-50). Each is asked once on every engine you pick.

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

Optional. Exact questions to ask, one per line, e.g. "best CRM for a real estate agency". Prompts that name a tracked brand ("Is HubSpot good?") are answered and shown, but left out of the scores, since they name the brand whatever its visibility.

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

Where to ask. Every engine is asked as a new, logged-out visitor, so you see what your customers see, not an API answer.

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

Where your customers are. Google AI Overviews are searched for this country. ChatGPT is asked through a residential IP address in this country when it isn't the US (this uses your Apify residential proxy). Gemini doesn't localise logged-out answers by country.

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

Two-letter language code for Google and the browser (en, de, fr, es, ...). Write your prompts in the same language.

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

AI answers change between askings. Asking each prompt 2-3 times gives steadier scores. Every answer is its own row and its own charge.

## `maxRunMinutes` (type: `integer`):

When time is up, no more prompts are asked and the report is written from the answers so far. Leave empty to ask everything. The run also stops in time before its own timeout.

## `projectName` (type: `string`):

Optional. Give the brand or client a name, e.g. "acme-weekly", and schedule this Actor (weekly is typical). Each run is saved under the name in your account, and the report shows the score trend and the prompts you gained or lost since the last run.

## `reportTitle` (type: `string`):

Optional. Heading of the HTML report (default: "AI Visibility Report: <your brand>").

## `agencyName` (type: `string`):

Optional. Shown on the HTML report as "Prepared by ...", for agencies sending it to clients. The report carries no Apify branding.

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

Leave off: ChatGPT is asked from Apify's servers, and if it ever asks for sign-in the run moves to Apify residential proxy by itself. Set a proxy here to choose one yourself. Google engines always use Apify's servers directly (Google refuses proxy traffic).

## Actor input object example

```json
{
  "yourBrand": "Pipedrive, pipedrive.com",
  "competitors": [
    "HubSpot, hubspot.com",
    "Salesforce, salesforce.com",
    "Zoho CRM, Zoho, zoho.com",
    "monday.com"
  ],
  "category": "CRM for small business",
  "promptCount": 3,
  "engines": [
    "chatgpt",
    "gemini",
    "google_ai_overview"
  ],
  "country": "US",
  "language": "en",
  "repeats": 1,
  "maxRunMinutes": 4,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `report` (type: `string`):

No description

## `reportJson` (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 = {
    "yourBrand": "Pipedrive, pipedrive.com",
    "competitors": [
        "HubSpot, hubspot.com",
        "Salesforce, salesforce.com",
        "Zoho CRM, Zoho, zoho.com",
        "monday.com"
    ],
    "category": "CRM for small business",
    "promptCount": 3,
    "maxRunMinutes": 4,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("wulfcare/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 = {
    "yourBrand": "Pipedrive, pipedrive.com",
    "competitors": [
        "HubSpot, hubspot.com",
        "Salesforce, salesforce.com",
        "Zoho CRM, Zoho, zoho.com",
        "monday.com",
    ],
    "category": "CRM for small business",
    "promptCount": 3,
    "maxRunMinutes": 4,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("wulfcare/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 '{
  "yourBrand": "Pipedrive, pipedrive.com",
  "competitors": [
    "HubSpot, hubspot.com",
    "Salesforce, salesforce.com",
    "Zoho CRM, Zoho, zoho.com",
    "monday.com"
  ],
  "category": "CRM for small business",
  "promptCount": 3,
  "maxRunMinutes": 4,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call wulfcare/ai-visibility-tracker --silent --output-dataset

```

## MCP server setup

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