# AI Search Visibility Tracker — AEO / GEO (`bovi/ai-search-visibility-tracker`) Actor

Track a brand's visibility in Google AI search. Per query: AI Overview cited sources, is the brand cited or mentioned, organic rank, the query fan-out, and a 0-100 visibility score. Optional AI sentiment add-on. Pay per query.

- **URL**: https://apify.com/bovi/ai-search-visibility-tracker.md
- **Developed by:** [Vitalii Bondarev](https://apify.com/bovi) (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 $4.37 / 1,000 visibility-results

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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 Search Visibility Tracker — AEO / GEO

Track how visible a brand is in **Google's AI-era search** — the layer your
classic rank tracker and Search Console cannot see. Give it a list of queries and
your brand identity; for every query it returns one structured, pipeable row.

Traffic arriving from AI answers converts far better than a blue-link click — the
visitor has already compared options. But ~85% of brand mentions in AI search come
from **external** domains, so the actionable question isn't "do I rank" — it's
**"who gets cited, and am I one of them?"** This actor answers that, per query.

### What you get per query

| Field | Meaning |
|---|---|
| `ai_overview_present` | Did Google render an AI Overview for this query |
| `ai_overview_sources` | The **cited source** URLs + domains (the crown jewel of AEO) |
| `brand_in_ai_overview` / `brand_ai_overview_via` | Is your brand cited (`source`), named (`mention`), `both`, or absent |
| `brand_cited_domains` | Which of your domains the AI cited |
| `competitor_domains_in_ai_overview` | Everyone else the AI cited — your AEO competitive set |
| `brand_organic_rank` | Classic organic position of your domain (or null) |
| `brand_in_featured_snippet` | Do you own the featured snippet |
| `fan_out_queries` | The **query fan-out** — Google's own sub-questions (People-Also-Ask + related). A blueprint of the content to create |
| `top_organic_domains` | The competitive landscape |
| `visibility_score` | A deterministic 0–100 roll-up, so rows sort without any AI |

### Optional AI add-on (`enrichWithAI`)

Turn it on to add `brand_sentiment`, `brand_prominence` and a one-line
`brand_recommendation` per row. Bring your own OpenAI key (`openaiApiKey`, you pay
the tokens) or leave it empty for a free deterministic pass — the actor always
returns the fields either way.

### Why re-run it

AI answers are volatile: **40–60% of AI citations change month-to-month**. A
one-time snapshot goes stale fast — schedule it weekly/monthly and watch the
trend. AI answers also differ by region, so set `countryCode` / `languageCode`
per market.

### Access & pricing

A protected target — runs through the Apify **GOOGLE\_SERP** proxy for reliable
access (proxy from the first byte). Pay per query row (PPE). Honest limit: Google
AI Overview is JS-injected and does not render for every query/region; when it is
absent we return `ai_overview_present: false` and still deliver the fan-out,
organic rank, featured snippet and competitive landscape.

# Actor input Schema

## `queries` (type: `array`):

The searches to audit AI visibility for (e.g. 'best crm for startups').

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

Brand name to detect in AI answers (text mentions).

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

Your domains, to detect when the brand is cited as a source or ranks organically (e.g. 'asana.com').

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

Alternate brand spellings/product names to also match in AI-answer text.

## `countryCode` (type: `string`):

Two-letter country for localized results (AI answers differ by region).

## `languageCode` (type: `string`):

Two-letter UI language.

## `renderJs` (type: `boolean`):

Render each SERP in a real browser to capture the JS-gated AI Overview / AI Mode. Keep ON for AI visibility; turn off for a faster organic-only run.

## `enrichWithAI` (type: `boolean`):

Add brand sentiment + prominence + a one-line recommendation per row. Uses your OpenAI key if provided, otherwise a free deterministic pass.

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

Bring your own key for the AI add-on — you pay the tokens directly. Leave empty to use the deterministic pass.

## `aiModel` (type: `string`):

Chat model for the AI add-on (e.g. gpt-4o-mini, gpt-5-nano).

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

Apify proxy. RESIDENTIAL is required for the browser-render path that captures AI Overview / AI Mode.

## Actor input object example

```json
{
  "queries": [
    "best project management software",
    "best crm for startups"
  ],
  "countryCode": "us",
  "languageCode": "en",
  "renderJs": true,
  "enrichWithAI": false,
  "aiModel": "gpt-4o-mini",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

Dataset of per-query AI-visibility rows.

# 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 = {
    "queries": [
        "best project management software",
        "best crm for startups"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("bovi/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 = { "queries": [
        "best project management software",
        "best crm for startups",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("bovi/ai-search-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 '{
  "queries": [
    "best project management software",
    "best crm for startups"
  ]
}' |
apify call bovi/ai-search-visibility-tracker --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/fPgy6bcJKYvNb6uXG/builds/SjBFeu64XdPcy7cYE/openapi.json
