# 🔍 AI Citation Monitor — Brand Visibility in AI Search (`upstanding_biobot/ai-citation-monitor`) Actor

Track brand visibility in AI search. Send queries, detect brand mentions, competitor mentions, sentiment, position. AEO monitoring tool.

- **URL**: https://apify.com/upstanding\_biobot/ai-citation-monitor.md
- **Developed by:** [Alexander Maksimchuk](https://apify.com/upstanding_biobot) (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

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-usage

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 Citation Monitor — Brand Visibility in AI Search

Track whether your brand appears in AI model responses. Sends queries to LLM APIs, detects brand mentions, checks if your website is cited, benchmarks against competitors, and analyzes sentiment.

### 📋 Table of Contents

- [What is this?](#-what-is-this)
- [How to use](#-how-to-use)
- [Input](#-input)
- [Output](#-output)
- [JSON output example](#-json-output-example)
- [How much does it cost?](#-how-much-does-it-cost)
- [Use cases](#-use-cases)
- [Integrations](#-integrations)
- [Is it legal?](#-is-it-legal)
- [Troubleshooting](#-troubleshooting)
- [FAQ](#-faq)
- [Tech stack](#-tech-stack)
- [Feedback & issues](#-feedback--issues)

### 🤔 What is this?

AI models are becoming primary discovery channels. If your brand isn't mentioned in AI responses, you're invisible to a growing segment of users who skip Google and go straight to AI tools.

This Actor:
1. **Sends queries** to AI language models using natural questions your customers ask
2. **Detects brand mentions** — checks if your brand name appears in AI responses
3. **Checks website mentions** — verifies if your website URL or domain is referenced
4. **Tracks competitors** — checks if competitor brands are mentioned alongside yours
5. **Analyzes sentiment** — positive, neutral, or negative context around your brand mention
6. **Scores** — mention rate, average position, per-competitor comparison

### 🚀 How to use

#### Step 1: Enter your brand

Provide your brand name exactly as it would appear in AI responses (e.g., "Acme Corp", not "acmecorp").

#### Step 2: Enter your website URL

Used to detect if your site is mentioned as a source in AI responses.

#### Step 3: Add queries

Enter search queries your customers would ask AI tools. These should be natural questions:
- "best electrician in Austin"
- "who offers ADA compliance scanning"
- "alternatives to [competitor product]"

#### Step 4: Add competitors (optional)

Enter competitor brand names to track alongside yours.

#### Step 5: Run

Click **Start**. Results appear in dataset + key-value store.

### 📥 Input

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `brand` | string | **required** | Your brand name |
| `website` | string | — | Your website URL (for source mention check) |
| `keywords` | array | **required** | Search queries to send to AI models |
| `competitors` | array | — | Competitor brand names to track |

### 📤 Output

| Field | Type | Description |
|-------|------|-------------|
| `totalQueries` | integer | Total queries sent |
| `totalMentions` | integer | Times brand was mentioned |
| `mentionRate` | number | Percentage of queries where brand was mentioned |
| `avgPosition` | number | Average position of brand mention in response (1-10) |
| `websiteMentionRate` | number | Percentage where your website was mentioned |
| `positiveSentimentRate` | number | Percentage of mentions with positive sentiment |
| `competitorResults` | array | Per-competitor: mention rate + avg position |
| `results` | array | Per-query: brandMentioned, websiteMentioned, sentiment, excerpt, recommendations |

### 📄 JSON output example

```json
{
  "brand": "Example Brand",
  "website": "https://example.com",
  "scannedAt": "2026-07-04T04:30:00.000Z",
  "totalQueries": 6,
  "totalMentions": 2,
  "mentionRate": 33.3,
  "avgPosition": 4.5,
  "websiteMentionRate": 16.7,
  "positiveSentimentRate": 50.0,
  "competitorResults": [
    { "name": "Competitor A", "mentionRate": 50.0, "avgPosition": 3.0 },
    { "name": "Competitor B", "mentionRate": 16.7, "avgPosition": 7.0 }
  ],
  "results": [
    {
      "query": "best alternatives to X",
      "brandMentioned": true,
      "brandContext": "...Example Brand is a solid choice for...",
      "brandPosition": 4,
      "websiteMentioned": true,
      "competitorMentions": [
        { "name": "Competitor A", "mentioned": true, "position": 2 },
        { "name": "Competitor B", "mentioned": false, "position": 0 }
      ],
      "responseLength": 2840,
      "responseExcerpt": "When looking for alternatives to X, several options stand out...",
      "sentiment": "positive",
      "categories": ["alternatives", "recommendation"],
      "recommendations": [],
      "timestamp": "2026-07-04T04:30:15.000Z"
    }
  ]
}
````

### 💰 How much does it cost?

**$0.50 per query.** No subscription. Pay only for results returned.

#### Cost examples

| Use case | Queries | Cost |
|----------|---------|------|
| Quick check | 3 | $1.50 |
| Standard monitor | 5 | $2.50 |
| Monthly tracking | 10 | $5.00/mo |
| Agency (5 brands × 10 queries) | 50 | $25.00 |

### 🎯 Use cases

- **AEO monitoring** — Track AI search visibility over time (like rank tracking for AI)
- **Competitive intelligence** — See which competitors AI models recommend
- **Content optimization** — Identify queries where your brand isn't mentioned → create content targeting those queries
- **Agency reporting** — Add AI visibility metrics to monthly SEO reports
- **Brand monitoring** — Detect when AI models start/stop mentioning your brand
- **Pre-launch research** — Check if competitors have AI visibility before entering a market

### 🔗 Integrations

#### Chain with llms.txt Generator

If your mention rate is low, use our [llms.txt Generator](https://apify.com/upstanding_biobot/llms-txt-generator) to improve AI discoverability. Then re-run citation monitoring to measure improvement.

#### Automation

- **Zapier** — Monthly AI citation report → email to marketing team
- **Make** — Schedule weekly checks → Slack alert if mention rate drops
- **Custom** — Apify webhooks for automated reporting

### ⚖️ Is it legal?

**Yes.** This Actor sends queries to AI language model APIs and analyzes the responses. It does not scrape websites, bypass authentication, or violate Terms of Service. All queries are sent through official API channels.

### 🔧 Troubleshooting

| Problem | Cause | Fix |
|---------|-------|-----|
| **0 mentions** | Brand genuinely not in AI responses, or query too broad | Try more specific queries including your brand category |
| **All queries fail** | API connectivity issue | Check Actor logs for error messages. Retry in a few minutes |
| **Competitor not tracked** | Brand name mismatch | Ensure competitor names match exactly how they'd appear in text |
| **Slow response** | Many queries with long responses | Reduce query count or run in batches |

### ❓ FAQ

<details>
<summary><strong>How does this differ from traditional rank tracking?</strong></summary>

Traditional rank tracking checks where you appear in Google search results. This Actor sends queries to AI language models and checks whether your brand appears in the responses. AI-assisted search is a growing channel — users ask AI tools "what's the best X" instead of Googling. If AI doesn't know you, you're invisible to that audience.

</details>

<details>
<summary><strong>How accurate is brand detection?</strong></summary>

Brand detection uses case-insensitive matching in AI response text. For brands with common words (e.g., "Apple"), there may be false positives. For unique brand names, accuracy is near 100%. The `brandContext` field shows the surrounding text so you can verify.

</details>

<details>
<summary><strong>Can I track multiple brands?</strong></summary>

Yes. Run the Actor multiple times with different brand names, or use the `competitors` field to track competing brands in the same queries.

</details>

<details>
<summary><strong>How often should I run this?</strong></summary>

Weekly or monthly. AI responses change as models update. Track trends over time — week-over-week mention rate is more meaningful than single snapshots.

</details>

### 🛠️ Tech stack

- **[Apify SDK](https://docs.apify.com/sdk/js/)** — Platform integration, dataset, key-value store
- **AI search APIs** — Query processing and response generation

### 🔧 Companion Actors

Complete your AI visibility pipeline with these related tools:

| Actor | What it does | Price |
|-------|-------------|-------|
| [Website Health Check](https://apify.com/upstanding_biobot/website-health-check) | 9-in-1 audit: accessibility + security + SSL + broken links + SEO + performance | $3/URL |
| [ADA Compliance Checker](https://apify.com/upstanding_biobot/ada-wcag-compliance-scan) | Scan any website for WCAG accessibility violations | $2/scan |
| [ADA Fix-It Report](https://apify.com/upstanding_biobot/ada-remediation-report) | Developer-ready remediation reports with code fixes + cost estimates | $5/page |
| [llms.txt Generator](https://apify.com/upstanding_biobot/llms-txt-generator) | Generate llms.txt + check AI bot access. Boost AI search visibility | FREE |

#### Recommended workflow

1. **[Health Check](https://apify.com/upstanding_biobot/website-health-check)** — Run broad 9-check audit first ($3/URL)
2. **[ADA Scanner](https://apify.com/upstanding_biobot/ada-wcag-compliance-scan)** — Deep-dive accessibility violations ($2/scan)
3. **[Fix-It Report](https://apify.com/upstanding_biobot/ada-remediation-report)** — Generate developer-ready remediation plan ($5/page)
4. **[llms.txt Generator](https://apify.com/upstanding_biobot/llms-txt-generator)** — Ensure AI search engines can find your site (FREE)
5. **AI Citation Monitor** (this Actor) — Track whether AI models mention your brand ($0.50/query)

### 💬 Feedback & issues

- **Apify Console** — Issues tab on this Actor's page
- **Review** — Rate on Store page

# Actor input Schema

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

Your brand name to track in AI responses.

## `website` (type: `string`):

Your website URL (used to detect if your site is mentioned as source).

## `keywords` (type: `array`):

Search queries to send to AI engines. These should be questions your customers ask.

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

Competitor brands to track alongside yours.

## Actor input object example

```json
{
  "brand": "Example Brand",
  "website": "https://example.com",
  "keywords": [
    "best alternatives to X",
    "what is the best Y tool",
    "how to choose Z"
  ],
  "competitors": [
    "Competitor A",
    "Competitor B"
  ]
}
```

# 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": "Example Brand",
    "website": "https://example.com",
    "keywords": [
        "best alternatives to X",
        "what is the best Y tool",
        "how to choose Z"
    ],
    "competitors": [
        "Competitor A",
        "Competitor B"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("upstanding_biobot/ai-citation-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": "Example Brand",
    "website": "https://example.com",
    "keywords": [
        "best alternatives to X",
        "what is the best Y tool",
        "how to choose Z",
    ],
    "competitors": [
        "Competitor A",
        "Competitor B",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("upstanding_biobot/ai-citation-monitor").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 '{
  "brand": "Example Brand",
  "website": "https://example.com",
  "keywords": [
    "best alternatives to X",
    "what is the best Y tool",
    "how to choose Z"
  ],
  "competitors": [
    "Competitor A",
    "Competitor B"
  ]
}' |
apify call upstanding_biobot/ai-citation-monitor --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "🔍 AI Citation Monitor — Brand Visibility in AI Search",
        "description": "Track brand visibility in AI search. Send queries, detect brand mentions, competitor mentions, sentiment, position. AEO monitoring tool.",
        "version": "1.0",
        "x-build-id": "nlCT7WidKWlsKHm1c"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/upstanding_biobot~ai-citation-monitor/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-upstanding_biobot-ai-citation-monitor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/upstanding_biobot~ai-citation-monitor/runs": {
            "post": {
                "operationId": "runs-sync-upstanding_biobot-ai-citation-monitor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/upstanding_biobot~ai-citation-monitor/run-sync": {
            "post": {
                "operationId": "run-sync-upstanding_biobot-ai-citation-monitor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "brand",
                    "keywords"
                ],
                "properties": {
                    "brand": {
                        "title": "Brand name",
                        "type": "string",
                        "description": "Your brand name to track in AI responses."
                    },
                    "website": {
                        "title": "Your website URL",
                        "type": "string",
                        "description": "Your website URL (used to detect if your site is mentioned as source)."
                    },
                    "keywords": {
                        "title": "Keywords / queries",
                        "type": "array",
                        "description": "Search queries to send to AI engines. These should be questions your customers ask.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "competitors": {
                        "title": "Competitor brands (optional)",
                        "type": "array",
                        "description": "Competitor brands to track alongside yours.",
                        "items": {
                            "type": "string"
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
