# AI Brand Visibility — ChatGPT, Gemini & Perplexity (`scrape.badger/ai-brand-visibility-scraper`) Actor

Measure how often ChatGPT, Gemini and Perplexity mention your brand: mention count, first position, share of voice against named competitors, whether your domain is cited and at what rank. Answer-engine optimisation (AEO) tracking in one actor.

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

## Pricing

from $6.40 / 1,000 premium calls

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

### What does AI Brand Visibility do?

**AI Brand Visibility** extracts structured data from [the AI answer engines](https://scrapebadger.com) and delivers it as clean JSON — no proxies, browsers or anti-bot handling on your side. It is a practical **the AI answer engines API** alternative for teams who need the AI answer engines data on a schedule rather than a one-off export.

It covers 3 different the AI answer engines surfaces behind a single **Mode** dropdown, so one Actor replaces a rack of single-purpose scrapers.

### Why scrape the AI answer engines?

- **Every surface in one place** — pick a mode, fill two fields, run.
- **Anti-bot handled upstream** — residential proxy rotation, TLS and browser fingerprinting, and CAPTCHA solving happen inside the ScrapeBadger API.
- **Pay per call, not per row** — a page of results costs the same as one lookup, so bulk work stays cheap.
- **Runs on the Apify platform** — scheduling, monitoring, webhooks, the [API](https://docs.apify.com/api/v2), and integrations with Make, Zapier, Google Sheets, Slack and Airtable all work out of the box.
- **Partial results are kept** — a transient upstream failure ends the run cleanly instead of discarding what you already paid for.

### What data can AI Brand Visibility extract?

Every record is pushed to the dataset as its own row. The most useful fields are below; the full record carries considerably more.

| Field | Type | Description |
| --- | --- | --- |
| `brand` | string | Brand name |
| `mentioned` | boolean | Whether the brand appeared in the answer at all |
| `mention_count` | number | How many times the brand was mentioned |
| `first_position` | number | Position of the first brand mention in the answer |
| `share_of_voice_pct` | number | Share of voice against the named competitors |
| `cited` | boolean | Whether the brand's own domain was cited |
| `citation_rank` | number | Citation rank |

### the AI answer engines scraping modes

Pick one **Mode**; the input form marks the fields it needs.

| Mode | What it returns | Charged as |
| --- | --- | --- |
| **ChatGPT Visibility** | Brand mentions, position, share of voice and citations in a ChatGPT answer. | `premium-call` |
| **Gemini Visibility** | The same measurement against a Google Gemini answer. | `premium-call` |
| **Perplexity Visibility** | The same measurement against a Perplexity answer. | `premium-call` |

### How to scrape the AI answer engines

1. Click **Try for free** and sign in to Apify.
2. Open **Settings → Environment variables** and add `SCRAPEBADGER_API_KEY` with your key from [scrapebadger.com](https://scrapebadger.com), ticking **Secret**.
3. Choose a **Mode** from the dropdown.
4. Fill in the fields that mode needs — the description on each field says which modes use it.
5. Set **Max items** to cap the run.
6. Press **Start** and watch the dataset fill up.
7. Export as JSON, CSV, Excel or XML, or pull it from the **API** tab.

### How much will it cost to scrape the AI answer engines?

This Actor is **pay per event**: one event per API call, whatever that call returns. Fetching a page of 100 records costs the same as fetching one record, so larger pages are cheaper per row.

| Event | Price per event | What triggers it |
| --- | --- | --- |
| `premium-call` | $0.0080 | A premium call — an LLM answer or brand-visibility measurement. |

Apify also charges its standard **$0.001 actor start fee** per run. ScrapeBadger credits are consumed on your own account on top of this.

### Input

See the **Input** tab for every option with inline documentation. A minimal run looks like this:

```json
{
  "mode": "ChatGPT Visibility",
  "prompt": "What are the best web scraping APIs?",
  "brand": "ScrapeBadger",
  "domain": "scrapebadger.com",
  "competitors": [
    "Bright Data",
    "Oxylabs",
    "Apify"
  ],
  "max_items": 100
}
```

**Max items** caps the run; the Actor pages until it reaches that number or the AI answer engines runs out of results.

### Output

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel, or read it straight from the Apify API. Each record is one row:

```json
{
  "brand": "<brand>",
  "mentioned": true,
  "mention_count": 1234,
  "first_position": 1234,
  "share_of_voice_pct": 1234,
  "cited": true
}
```

### What can you do with the AI answer engines data?

A few things teams actually build with this Actor.

#### Run answer-engine optimisation (AEO) as a weekly report

Pick the 50 prompts your buyers would actually type, run them across ChatGPT, Gemini and Perplexity on a schedule, and chart mention rate, first position and share of voice. That report is the AEO equivalent of a rank tracker.

#### Prove the ROI of a content push

Set a baseline before you publish, then re-run the same prompt set a month later. Movement in share of voice against named competitors is the cleanest evidence that content changed what the assistants say.

#### Find where competitors own the answer

The competitor list drives the share-of-voice calculation. Prompts where a rival takes most of the voice are exactly the topics to attack next — and the citation ranks tell you which pages to beat.

#### Catch a reputation problem early

Mention count without citation usually means the models are talking about you using someone else's framing. Watching that gap is an early warning for reviews, comparison pages or news you have not seen yet.

### Tips for faster, cheaper runs

- Raise the page-size field (`count`, `limit`, `per_page` — whichever the mode exposes) before raising **Max items**. Fewer, bigger calls cost less.
- Use the cheap reference and autocomplete modes to resolve IDs before spending on the expensive detail modes.
- Schedule incremental runs with a low **Max items** rather than one huge sweep; you get fresher data and a smaller bill.
- Chain Actors with webhooks to push new rows straight into your warehouse.

### Requirements

This Actor calls the ScrapeBadger API on your behalf, so it needs your key:

1. Get one at [scrapebadger.com](https://scrapebadger.com) — there is a free tier.
2. In **Settings → Environment variables**, add `SCRAPEBADGER_API_KEY` with your `sb_live_…` key and tick **Secret**.

Credits are consumed on your ScrapeBadger account in addition to the Apify event price.

### Frequently asked questions

#### Is it legal to scrape the AI answer engines?

Scraping publicly available data from the AI answer engines is generally legal, and this Actor only ever reads pages a logged-out visitor could see. What you then do with the data is what matters — read the disclaimer below before collecting anything that could be personal data.

#### Do I need my own proxies?

No. Proxy rotation, browser fingerprinting and anti-bot handling all happen upstream in the ScrapeBadger API, so there is nothing to configure here.

#### Do I need a ScrapeBadger account?

Yes. The Actor calls the ScrapeBadger API on your behalf, so it needs your API key in the `SCRAPEBADGER_API_KEY` environment variable. There is a free tier at [scrapebadger.com](https://scrapebadger.com) — see Requirements below.

#### How many results can I get in one run?

Set **Max items** to whatever you need. The Actor keeps paging until it hits that number or the AI answer engines runs out of results, and stops cleanly either way.

#### How much does one run cost?

Events start at $0.0080 and are charged once per API call, not per row — so a page of 100 results costs the same as a single lookup. Apify adds its standard $0.001 actor start fee per run.

#### What happens if the run fails halfway through?

Whatever was already scraped stays in the dataset. The run ends with a status message explaining where it stopped instead of throwing your results away.

#### Can I run this on a schedule or from my own code?

Yes. Use the **Schedules** tab for recurring runs, or the **API** tab to start runs and read the dataset from your own application.

#### How is share of voice calculated?

Your brand's mentions are measured against the competitors you name in the input, within the same answer. Naming a realistic competitor set is what makes the number meaningful — leave it empty and there is nothing to compare against.

#### What do aliases do?

Aliases catch alternative spellings and spacings of your brand so a mention of 'Scrape Badger' still counts as a mention of 'ScrapeBadger'. Add every form you have seen in the wild.

#### Does this use the official API?

No — and that is the point. It reads the answer the public web interface gives a normal visitor, which is what your customers actually see. API answers differ from web answers because the web product runs its own retrieval and grounding.

#### Will the same prompt give the same answer twice?

No. These models are non-deterministic and their retrieval changes constantly. That is why the useful pattern is to run the same prompt on a schedule and track the trend, rather than reading a single answer as fact.

### Is scraping the AI answer engines reliable?

Anti-bot interstitials are a fact of life on the AI answer engines. A blocked call is retried four times with exponential backoff against fresh exits, and if a run dies partway it keeps everything already scraped rather than throwing the dataset away. Upstream availability is monitored continuously.

### Your feedback and support

Found a bug, missing a field, or need a mode that is not here? Open a ticket on the **Issues** tab, or email <support@scrapebadger.com>. The **API** tab has everything you need to run this Actor programmatically.

### Disclaimer

Our Actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our Actors, when used for ethical purposes by Apify users, are safe. However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

### Notes on the AI answer engines

Run the same prompt on a schedule to watch your share of voice move. `aliases` catches alternative spellings; `competitors` sets the denominator for share of voice.

# Actor input Schema

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

Which the AI answer engines call to run. Each mode uses a different subset of the fields below — the run tells you if a required one is missing.

## `prompt` (type: `string`):

The prompt to send. Maximum 4096 characters. <b>Required for:</b> ChatGPT Visibility, Gemini Visibility, Perplexity Visibility.

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

The brand name to look for in the answer. <b>Required for:</b> ChatGPT Visibility, Gemini Visibility, Perplexity Visibility.

## `domain` (type: `string`):

The brand's domain, used to detect brand citations.

## `aliases` (type: `array`):

Other spellings of the brand that should count as mentions.

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

Competitor names to measure share of voice against.

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

ISO-3166 alpha-2 egress country. Defaults to "US".

## `web_search` (type: `string`):

Whether ChatGPT should browse — "auto", "force", or "off". Defaults to "force". <b>Used by:</b> ChatGPT Visibility, Gemini Visibility.

## `max_items` (type: `integer`):

Stop after this many records. The actor keeps paging until it hits this number or the site runs out of results. Each page is one charged event.

## Actor input object example

```json
{
  "mode": "ChatGPT Visibility",
  "prompt": "What are the best web scraping APIs?",
  "brand": "ScrapeBadger",
  "domain": "scrapebadger.com",
  "competitors": [
    "Bright Data",
    "Oxylabs",
    "Apify"
  ],
  "country": "US",
  "web_search": "force",
  "max_items": 100
}
```

# Actor output Schema

## `dataset` (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 = {
    "prompt": "What are the best web scraping APIs?",
    "brand": "ScrapeBadger",
    "domain": "scrapebadger.com",
    "competitors": [
        "Bright Data",
        "Oxylabs",
        "Apify"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrape.badger/ai-brand-visibility-scraper").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 = {
    "prompt": "What are the best web scraping APIs?",
    "brand": "ScrapeBadger",
    "domain": "scrapebadger.com",
    "competitors": [
        "Bright Data",
        "Oxylabs",
        "Apify",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("scrape.badger/ai-brand-visibility-scraper").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 '{
  "prompt": "What are the best web scraping APIs?",
  "brand": "ScrapeBadger",
  "domain": "scrapebadger.com",
  "competitors": [
    "Bright Data",
    "Oxylabs",
    "Apify"
  ]
}' |
apify call scrape.badger/ai-brand-visibility-scraper --silent --output-dataset

```

## MCP server setup

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

```

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/lEL7jXd14Oe5yommF/builds/hVdg2dvGTidZF9EbV/openapi.json
