# AI Visibility Monitor (Google AI Overview + Bing Copilot) (`integrative_cafe_8pc/ai-visibility-monitor`) Actor

Use this Actor when you need to know if a brand shows up in Google AI Overviews or Bing Copilot answers for a list of questions: mention, position, competitors named, cited sources and what changed since the last check. Schedule it daily for alerts.

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

## Pricing

from $5.00 / 1,000 ai answer checks

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 Visibility Monitor

Use this Actor when you need to track whether your brand appears in AI answers (Google AI Overviews and Bing Copilot Search) for the questions your customers ask, and what changed since the last check.

**Schedule it every day and get only what changed:** is your brand in the AI answer, in which position, next to which competitors, and is your site cited?

For each of your questions (the prompts your customers type), the monitor checks the AI answer of **Google AI Overviews** and **Bing Copilot Search**, both without any login, and returns:

- whether your brand is mentioned (name, aliases or domain) and its **position** in the order of first mentions
- which **competitors** appear and in which order
- the **sources the AI cited**, and whether your own domain is one of them
- an answer snippet around your brand, plus the full answer text
- a **change report vs. the previous run** (brand appeared or disappeared, position moved, new or lost competitors, new or lost cited domains) and a rolling history per question

History lives in a named key-value store in your own Apify account, so every scheduled run compares with the last one. Changes can be pushed to Slack, Discord or any webhook.

### Why this one

- **Two engines in one run, one row per question per engine**, with the same fields, ready for a share-of-voice sheet or dashboard.
- **Built as a monitor**, not a one-off scraper: change detection and history are built in, no extra database needed.
- **Runs finish.** Blocked or incomplete answers retry on a fresh residential IP with growing waits. In our launch tests (Oct 2026), 40 of 40 checks on real brand questions came back with an answer (20 on Google AI Overviews, 20 on Bing Copilot), and repeated runs flagged position and competitor changes correctly.
- **Failures are free.** A check that still fails comes back with an `error` field and is not charged.

### How to schedule it

1. Fill in your brand, questions and competitors, save as a task.
2. In Apify Console, open **Schedules**, create one with `@daily` (or `0 8 * * *`) and add the task.
3. Optional: put a Slack or Discord webhook URL in `webhookUrl` to get a message only when something changes. Turn on `onlyChanges` if you want the dataset to hold changes only.

### Input

| Field | What it does |
|---|---|
| `brand` | Your brand name as people write it |
| `brandAliases` | Other names that count as your brand (product names, abbreviations) |
| `brandDomain` | Your domain, like `hubspot.com`; tells whether the AI cites your site |
| `questions` | Questions or prompts, one per line; each is checked on each engine |
| `competitors` | Competitor names to find in the same answers |
| `engines` | `google_ai_overview`, `bing_copilot` (default both) |
| `country`, `language` | Search market, like `us` / `en`, `gb` / `en`, `de` / `de` |
| `monitorId` | Name of the stored history (defaults to the brand); use different names for separate projects |
| `webhookUrl` | Optional; each change is POSTed as JSON with `text` and `content` (Slack and Discord ready) |
| `onlyChanges` | Only write changed checks (and first checks) to the dataset |

### Output

```json
{
  "brand": "HubSpot",
  "question": "best crm for small business",
  "engine": "google_ai_overview",
  "engineName": "Google AI Overview",
  "answered": true,
  "brandMentioned": true,
  "brandPosition": 1,
  "mentionOrder": ["HubSpot", "Zoho", "Pipedrive", "Freshsales"],
  "competitorsMentioned": ["Zoho", "Pipedrive", "Freshsales"],
  "brandCited": true,
  "sources": [{"url": "https://www.uschamber.com/co/start/strategy/low-cost-crm-tools", "domain": "uschamber.com"}],
  "sourceCount": 13,
  "answerSnippet": "Best Free & Inbound Option: HubSpot CRM offers a robust free tier for up to 2 users...",
  "answerText": "The best customer relationship management (CRM) software for small businesses depends on...",
  "checkedAt": "2026-10-26T03:10:00+00:00",
  "change": {
    "status": "changed",
    "summary": "brand position 2 -> 1; new competitors: Freshsales",
    "previousCheckedAt": "2026-10-25T03:10:00+00:00",
    "brandMentionedBefore": true,
    "brandPositionBefore": 2,
    "competitorsAdded": ["Freshsales"],
    "competitorsLost": [],
    "sourceDomainsAdded": ["zapier.com"],
    "sourceDomainsLost": []
  },
  "history": [{"checkedAt": "2026-10-25T03:10:00+00:00", "answered": true, "brandMentioned": true, "brandPosition": 2, "brandCited": true, "competitorsMentioned": ["Zoho", "Pipedrive"]}]
}
```

`change.status` is `first-check`, `changed` or `unchanged`. When Google shows no AI Overview for a question, the row says `answered: false` (that is a real result for visibility tracking, and it is charged as a check).

### Pricing

Pay per event: **$0.01 per check** (one question on one engine). 10 questions on both engines every day is about $6 a month. Failed checks are free.

### Engines

| Engine | Status |
|---|---|
| Google AI Overviews | available |
| Bing Copilot Search | available |
| Perplexity | coming soon (logged-out Perplexity now asks visitors to sign up before answering; we do not bypass login walls) |
| ChatGPT search, Gemini | coming soon |

### Notes

AI answers change between runs even when nothing else changed, so look at the trend in `history`, not at a single run.

Brand and competitor matching is whole-word and ignores case, with one exception: a name you type with a capital letter does not match the same word written all in lowercase, so a brand called "Alto" is not counted when an answer says "alto" (Portuguese for "tall").

Google AI Overviews are read in English, Portuguese, German, Spanish and French. Outside English, Google often builds the overview only after the page loads; when it is still being built, the monitor retries up to three times on a fresh IP and then reports `answered: false`. Expect more `answered: false` rows in those markets than in the US, and use Bing Copilot as the second signal.

# Actor input Schema

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

The brand to look for in the AI answers, as people write it.

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

Other names that count as a mention of your brand (product names, old names, abbreviations).

## `brandDomain` (type: `string`):

Your domain, like hubspot.com. Used to tell whether the AI answer cites your own site.

## `questions` (type: `array`):

Questions your customers ask, one per line. Each question is checked on each engine.

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

Competitor names to find in the same answers. The output says which ones were mentioned and in which order.

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

Which AI answers to check. Both work without any login. Perplexity and ChatGPT are coming soon.

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

Two-letter country code for the search, like us, gb, de, br.

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

Interface language code, like en, de, pt-BR.

## `monitorId` (type: `string`):

Name of the history kept between runs (a named key-value store in your account). Defaults to the brand name. Use different names to track separate projects for the same brand.

## `webhookUrl` (type: `string`):

Optional. Every change since the last run is POSTed here as JSON with 'text' and 'content' fields, so Slack and Discord webhooks work as is.

## `onlyChanges` (type: `boolean`):

If on, the dataset only gets checks whose result changed since the last run (and first checks). History is still updated for every check.

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

How many Bing Copilot answers load at the same time.

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

Proxy for Bing Copilot. Residential is recommended; every blocked attempt retries on a new IP. Google AI Overviews always go through Apify's Google SERP proxy.

## Actor input object example

```json
{
  "brand": "HubSpot",
  "brandAliases": [
    "HubSpot CRM"
  ],
  "brandDomain": "hubspot.com",
  "questions": [
    "best crm for small business",
    "best free crm software"
  ],
  "competitors": [
    "Salesforce",
    "Zoho",
    "Pipedrive",
    "Freshsales",
    "Monday"
  ],
  "engines": [
    "google_ai_overview",
    "bing_copilot"
  ],
  "country": "us",
  "language": "en",
  "onlyChanges": false,
  "maxConcurrency": 3,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `results` (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 = {
    "brand": "HubSpot",
    "brandAliases": [
        "HubSpot CRM"
    ],
    "brandDomain": "hubspot.com",
    "questions": [
        "best crm for small business",
        "best free crm software"
    ],
    "competitors": [
        "Salesforce",
        "Zoho",
        "Pipedrive",
        "Freshsales",
        "Monday"
    ],
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("integrative_cafe_8pc/ai-visibility-monitor").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": "HubSpot",
    "brandAliases": ["HubSpot CRM"],
    "brandDomain": "hubspot.com",
    "questions": [
        "best crm for small business",
        "best free crm software",
    ],
    "competitors": [
        "Salesforce",
        "Zoho",
        "Pipedrive",
        "Freshsales",
        "Monday",
    ],
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("integrative_cafe_8pc/ai-visibility-monitor").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": "HubSpot",
  "brandAliases": [
    "HubSpot CRM"
  ],
  "brandDomain": "hubspot.com",
  "questions": [
    "best crm for small business",
    "best free crm software"
  ],
  "competitors": [
    "Salesforce",
    "Zoho",
    "Pipedrive",
    "Freshsales",
    "Monday"
  ],
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call integrative_cafe_8pc/ai-visibility-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,integrative_cafe_8pc/ai-visibility-monitor"
        }
    }
}
```

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/n7dol70eHtVPnZuf7/builds/CkNtNBQ7c7yMMMz77/openapi.json
