# AI Search Visibility Tracker: ChatGPT, Gemini & Google AI Mode (`plainrows/ai-search-brand-visibility`) Actor

Ask ChatGPT, Gemini and Google AI Mode the questions your customers ask and see if your brand is mentioned, your site cited, and which competitors show up. Answers, sources and fan-out queries as clean rows. API-based, no browser or accounts. Pay per answer, plus a small fee per question answered.

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

## Pricing

from $10.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.
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 Search Visibility Tracker: ChatGPT, Gemini & Google AI Mode

Ask **ChatGPT, Gemini and Google AI Mode** the questions your customers ask, and see in one table **whether your brand is mentioned, whether your website is cited, which competitors show up, and which sites the answers rely on**. Each answer comes with its sources, the web searches the engine ran (ChatGPT) and, if you want, the full text.

It calls a commercial data API instead of driving browsers or accounts: **no proxies, no logins, no CAPTCHAs**. Each answer takes about 20 seconds; questions run three at a time. **You only pay for answers returned**: engines that fail, empty answers and questions nobody answered are free.

### Typical uses

- **AI search visibility (GEO / AEO)**: are you recommended when people ask "best CRM for a small agency" or "is Acme reliable?" — and in which position compared with your competitors?
- **Citation tracking**: which pages do the engines cite for your topics, and is your site one of them? Spot the reviews and comparison sites you need to be on.
- **Competitor monitoring**: who gets named instead of you, engine by engine, country by country.
- **Content planning**: the fan-out queries show what ChatGPT searched for to answer; the cited pages show what content wins.
- **Weekly reports and alerts**: schedule a run and send the table to Google Sheets, Looker Studio, Slack, n8n, Make or Zapier.

### What you get for each answer

One row per question and engine:

| Field | Description |
|---|---|
| `prompt`, `engine` | Your question; `chatgpt`, `gemini` or `google_ai_mode` |
| `brandMentioned`, `brandMentionRank` | Your brand appears in the answer; 1 = it is named before your competitors |
| `brandDomainCited`, `brandDomainCitationRank` | Your website is among the sources or links, and at which position |
| `competitorsMentioned`, `competitorDomainsCited` | Competitors named (in order of appearance) and competitor sites cited |
| `citedDomains`, `sources` | Domains and sources (title, domain, URL) the answer cites, in order, up to 20 |
| `fanOutQueries` | Web searches ChatGPT ran to answer |
| `answerText`, `answerLength` | The answer as Markdown (optional) and its length |
| `model` | Model that answered, when the engine reports it |
| `country`, `languageCode`, `checkedAt` | Where and when the question was asked |

Brand and competitor names are matched as whole words, in any case ("Acme" does not match "Acmex"). Images in an answer are not counted as citations. Missing values are `null`, never guessed.

In the run's **Output** tab, the **Cited sources** view lists one row per source (question, engine, domain, title, URL), ready to export to CSV or Google Sheets: see which pages the AI engines rely on for your questions. From the API: `.../items?view=sources`.

### Input

```json
{
  "prompts": ["best standing desk for small spaces", "best electric standing desk under $500"],
  "brandNames": ["FlexiSpot"],
  "brandDomain": "flexispot.com",
  "competitors": ["Uplift", "Desky", "IKEA"],
  "competitorDomains": ["upliftdesk.com"],
  "engines": ["chatgpt", "gemini", "google_ai_mode"],
  "country": "US"
}
```

- **prompts**: up to 200 questions per run, kept as you type them. Each one is asked once to each engine.
- **brandNames** (optional): your brand and its variants. Without it you still get the answers, sources and competitors.
- **brandDomain** (optional): your site; subdomains count, a path is ignored (`acme.com/fr` = `acme.com`). Gemini's sources are mostly Google Shopping and Google Search pages, so Gemini rarely shows your own site as cited.
- **competitors**, **competitorDomains** (optional): up to 10 each.
- **engines**: any of `chatgpt` (ChatGPT with web search), `gemini`, `google_ai_mode`. Default: all three.
- **country**: US, GB, CA, AU, IE, IN, DE, AT, CH, FR, BE, ES, MX, IT, NL, PT, BR, PL, SE, JP. **languageCode** defaults to the country's main language.
- **includeAnswerText** (default true): turn off for lighter rows.

### Output example

Real row from 2026-10-09 (ChatGPT, US; answer text and source links shortened here):

```json
{
  "prompt": "best standing desk for small spaces",
  "engine": "chatgpt",
  "found": true,
  "model": "gpt-6",
  "brandMentioned": true,
  "brandMentionRank": 1,
  "brandDomainCited": false,
  "brandDomainCitationRank": null,
  "competitorsMentioned": [
    "Desky",
    "Uplift"
  ],
  "competitorDomainsCited": [
    "upliftdesk.com"
  ],
  "citedDomains": [
    "staples.com",
    "desky.com",
    "bestbuy.com",
    "wfhworld.com",
    "deskfinds.com",
    "upliftdesk.com"
  ],
  "sources": [
    {
      "title": "Shop at Staples",
      "domain": "staples.com",
      "url": "https://www.staples.com/flexispot-ec2-40-w-electric-rectangular-adjustable-standing-desk-white-ec2w-4024w/product_24686947"
    },
    {
      "title": "Shop at Desky",
      "domain": "desky.com",
      "url": "https://desky.com/products/dual-small-standing-desk"
    }
  ],
  "fanOutQueries": [
    "best compact standing desks for small spaces 2026 reviews dimensions"
  ],
  "answerText": "For a small bedroom, apartment, or home-office corner, I’d look for a standing desk that’s **40–42 inches wide, around 24 inches deep, and electrically height-a…",
  "answerLength": 4846,
  "country": "US",
  "languageCode": "en",
  "checkedAt": "2026-10-09T13:21:40.000Z",
  "schemaVersion": "1.0"
}
```

### Pricing

Two charges, no subscription, no fee per run (see the **Pricing** tab for the current prices):

- **AI answer**: per answer returned (one engine's answer to one question). Three engines and ten questions = up to 30 answers.
- **Question asked**: a small fixed fee once per question that got at least one answer, whatever the number of engines. Each engine asked costs us the same whether it answers or comes back empty; this fee pays for the empty ones, so empty answers themselves are never billed.

Engines that fail, empty answers and questions with no answer at all are never billed (no question fee either). The run never spends more than the maximum cost you set: it asks only the engines the remaining budget can pay for.

**Free Apify plan:** each run asks the first 3 questions, so you can test the output. A paid Apify plan removes this limit.

### Good to know

- AI answers change from one run to the next, even for the same question: track trends over several runs (a weekly schedule), not a single answer.
- Answers are those of a logged-out user in the chosen country and language, not of a personal account with its history.
- In our test on 2026-10-09 (one shopping question), ChatGPT cited 6 sources, Google AI Mode 3, and Gemini's 5 sources were Google Shopping product pages: what counts as a citation differs from one engine to another.
- Not affiliated with OpenAI or Google.

### Run summary

Each run stores a summary in the key-value store (`OUTPUT`): questions run, questions with no answer, answers billed, answers that came back without text (not billed), engines that failed, and anything skipped because of the free-plan or budget limit.

### Use it from code, automations or AI agents

**API (one call, results returned directly):**

```bash
curl -X POST "https://api.apify.com/v2/acts/plainrows~ai-search-brand-visibility/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"prompts": ["best CRM for a small agency"], "brandNames": ["Acme"], "brandDomain": "acme.com"}'
```

**n8n, Make, Zapier:** use the Apify integration, pick `plainrows/ai-search-brand-visibility`, schedule it weekly and send the rows to Google Sheets or Slack.

**AI agents (MCP):** add `https://mcp.apify.com?tools=plainrows/ai-search-brand-visibility` to Claude, Cursor or any MCP client.

### FAQ

**How do I check if ChatGPT recommends my brand?**
Put the questions your customers ask in **prompts**, your brand in **brandNames**, and run. `brandMentioned` and `brandMentionRank` tell you, engine by engine.

**Does it use my ChatGPT account?**
No account is needed or used. Answers come from a commercial data API.

**Which AI engines?**
ChatGPT (with web search), Gemini and Google AI Mode. Perplexity and Claude are not included.

**Why do two runs give different answers?**
AI engines vary their answers. Compare several runs over time.

**How do I also get how often a keyword is used in AI tools?**
[Keyword Search Volume](https://apify.com/plainrows/keyword-search-volume) adds an AI search volume per keyword (from October 24, 2026).

### More PlainRows tools

Same pay-per-result pricing, same clean JSON, built to chain together in n8n, Make, Zapier or AI agents.

- **SEO and keywords:** [Keyword Search Volume, CPC & Difficulty](https://apify.com/plainrows/keyword-search-volume) · [Keyword Ideas Generator](https://apify.com/plainrows/keyword-ideas-generator) · [Google Autocomplete & People Also Ask](https://apify.com/plainrows/google-autocomplete-questions) · [Google Trends Explorer](https://apify.com/plainrows/google-trends-explorer) · [Website Organic Traffic & Top Keywords](https://apify.com/plainrows/domain-seo-overview) · [Bulk Domain Authority Checker](https://apify.com/plainrows/domain-authority-checker) · [Backlink Checker](https://apify.com/plainrows/backlink-checker) · [Broken Link Checker](https://apify.com/plainrows/broken-link-checker)
- **Leads and companies:** [Google Maps Scraper](https://apify.com/plainrows/google-maps-businesses) · [Website Technology Checker](https://apify.com/plainrows/website-tech-stack) · [ATS Jobs Scraper (Greenhouse, Lever, Ashby, SmartRecruiters)](https://apify.com/plainrows/ats-job-postings) · [Google Jobs Scraper](https://apify.com/plainrows/google-jobs-scraper) · [Google Ads Transparency Scraper](https://apify.com/plainrows/google-ads-transparency) · [Company Registry Lookup (SIRENE, LEI, Brreg)](https://apify.com/plainrows/company-registry-lookup) · [Public Tenders Search (EU TED & UK)](https://apify.com/plainrows/public-tenders-search)
- **E-commerce and travel:** [Amazon Product Search Scraper](https://apify.com/plainrows/amazon-product-search) · [Google Shopping Prices Scraper](https://apify.com/plainrows/google-shopping-prices) · [Google Hotels Prices Scraper](https://apify.com/plainrows/google-hotels-prices)
- **Content and media:** [Google News Scraper](https://apify.com/plainrows/google-news-scraper) · [YouTube Search Scraper](https://apify.com/plainrows/youtube-search-scraper) · [Google Images Scraper](https://apify.com/plainrows/google-images-scraper) · [Website Screenshot API](https://apify.com/plainrows/website-screenshot) · [App Reviews Scraper (Google Play & App Store)](https://apify.com/plainrows/app-reviews-scraper)

**Compared with other APIs:** [Is your brand in ChatGPT, Gemini and Google AI Mode answers?](https://nadaho.github.io/plainrows/brand-visibility-in-ai-answers/)

### Support

Missing a field or found a bug? Open an issue on this page. Issues are read and answered.

# Actor input Schema

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

Questions your customers would ask an AI assistant, one per line, as they would type them ("best CRM for a small agency", "is Acme reliable?"). Each question is asked once to each engine. Up to 200 per run.

## `brandNames` (type: `array`):

Your brand name and its variants ("Acme", "Acme CRM"). Matched as whole words, any case. Leave empty to only collect the answers and their sources.

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

Your domain (acme.com): tells whether the answer cites or links your site, and at which position. Subdomains count; a path is ignored. Gemini mostly cites Google pages, so it rarely shows your site as cited.

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

Competitor names to look for in the answers (up to 10).

## `competitorDomains` (type: `array`):

Competitor domains to look for in the cited sources (up to 10).

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

Which engines to ask. Each answer is billed once.

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

Where the question is asked from.

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

Two-letter language code, e.g. "en" or "fr". Leave empty to use the country's main language (for example German for Switzerland, French for Belgium).

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

Adds the answer as Markdown (answerText). Turn off for lighter rows.

## Actor input object example

```json
{
  "prompts": [
    "best standing desk for small spaces",
    "best electric standing desk under $500"
  ],
  "brandNames": [
    "FlexiSpot"
  ],
  "brandDomain": "flexispot.com",
  "competitors": [
    "Uplift",
    "Desky",
    "IKEA"
  ],
  "engines": [
    "chatgpt",
    "gemini",
    "google_ai_mode"
  ],
  "country": "US",
  "includeAnswerText": true
}
```

# Actor output Schema

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

No description

## `sources` (type: `string`):

No description

## `summary` (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 = {
    "prompts": [
        "best standing desk for small spaces",
        "best electric standing desk under $500"
    ],
    "brandNames": [
        "FlexiSpot"
    ],
    "brandDomain": "flexispot.com",
    "competitors": [
        "Uplift",
        "Desky",
        "IKEA"
    ],
    "country": "US"
};

// Run the Actor and wait for it to finish
const run = await client.actor("plainrows/ai-search-brand-visibility").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 = {
    "prompts": [
        "best standing desk for small spaces",
        "best electric standing desk under $500",
    ],
    "brandNames": ["FlexiSpot"],
    "brandDomain": "flexispot.com",
    "competitors": [
        "Uplift",
        "Desky",
        "IKEA",
    ],
    "country": "US",
}

# Run the Actor and wait for it to finish
run = client.actor("plainrows/ai-search-brand-visibility").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 '{
  "prompts": [
    "best standing desk for small spaces",
    "best electric standing desk under $500"
  ],
  "brandNames": [
    "FlexiSpot"
  ],
  "brandDomain": "flexispot.com",
  "competitors": [
    "Uplift",
    "Desky",
    "IKEA"
  ],
  "country": "US"
}' |
apify call plainrows/ai-search-brand-visibility --silent --output-dataset

```

## MCP server setup

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

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/XFyNcAss9MjrWHeBB/builds/LHFOPqNeiYXy59qCu/openapi.json
