# AI Brand Monitoring - Track Mentions & Citations | 30% Off (`winningsolutions/llm-mentions-index`) Actor

AI brand monitoring for indexed LLM answers. Enter domain or keyword targets and get flat mention rows with question, answer, platform, sources, and citations. One dataset row per mention, not a nested report. Index lookup only. No live prompts.

- **URL**: https://apify.com/winningsolutions/llm-mentions-index.md
- **Developed by:** [Winning Solutions](https://apify.com/winningsolutions) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.75 / 1,000 mention rows

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#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 Brand Mention Tracker - Mentions and Citations Lookup

**AI brand monitoring** from indexed LLM answers at scale. Enter **domain targets** or **keyword targets** with market and platform settings. The Actor turns that input into structured mention rows automatically.

It returns **structured JSON** with **question**, **answer**, **platform**, **sources**, **search results**, and index metadata on every row.

Designed for **SEO teams, brand managers, and developers**, the Actor returns one filterable row per mention. Index lookup only. No live prompts.

> ## Launch price: 30% OFF until 8 November 2026
>
> **Now $2.75 / 1,000 mention rows ($0.00275 each).** Regular rate is $4.00 / 1,000 from 8 November 2026.
>
> A default run with 100 mentions costs about $0.27505 plus actor start.

> ## One Row per Mention
>
> **Reports? Not here.**
>
> Enter domain or keyword targets with location and language. Each dataset row is one mention with question text, answer text, sources, and timestamps. **Filter and export mentions in the first minute.**

### Use Cases

- Look up **brand mentions** for a domain or keyword target
- Read **citations** in indexed LLM answers with full question and answer text
- Export **mention rows** to spreadsheets or data pipelines
- Compare **ChatGPT and Google** index mentions for United States English markets
- Run recurring **mention lookups** for up to 10 targets per run

### Index

- [Release Notes](#release-notes)
- [AI Brand Monitoring by Keyword](#ai-brand-monitoring-by-keyword)
- [Features](#features)
- [Use Cases](#use-cases)
- [Pricing](#pricing)
- [Input](#input)
- [Input Example (Domain targets)](#input-example-domain-targets)
- [Input Example (Keyword targets)](#input-example-keyword-targets)
- [API and MCP usage](#api-and-mcp-usage)
- [Output Structure](#output-structure)
- [Output Example](#output-example)

### Release Notes

#### v0.0 - Initial public release

- **One row per mention:** Each dataset row is one mention with question, answer, platform, and sources
- **Domain and keyword targets:** Up to 10 combined targets per run with market and platform filters
- **Linear per-row pricing:** Pay per mention row written with `resultCharged` true

### AI Brand Monitoring by Keyword

Pass **keywords** instead of domains when your target is a brand name or term. The Actor sends keyword objects to the mention index. Default match type is `word_match`. Keyword-only runs accept `searchScope` values `any`, `question`, `answer`, `brand_entities`, and `fan_out_queries`.

Each mention row written costs **mention-row** at the launch rate ($2.75 / 1,000 mention rows, 30% off).

### Features

📄 **One row per mention:** Primary output is a flat mention row, not a nested report.

🔍 **Domain and keyword targets:** Combine up to 10 domain and keyword entries in one run.

🌐 **ChatGPT and Google platforms:** Query both indexes where available, or restrict to one platform.

📎 **Sources on each row:** `sources` and `search_results` stay on the same mention row.

🔄 **Include or exclude filter:** Keep mentions that hit your targets, or rows that miss them.

📊 **Index total count:** Every row carries `index_total_count` from the index, even when caps stop early.

🛑 **Page and result caps:** `maxResults` and `maxPages` stop the search before the full index is fetched.

📋 **Metadata on every row:** `_metadata.resultCharged` shows billing status. Diagnostic rows use `_metadata.error`.

### Pricing

#### Launch pricing: 30% off (until 2026-11-08)

| Cost item | Rate |
| --------- | ---- |
| Mention row (1 mention) | $0.00275 |
| Per 1,000 mention rows | $2.75 / 1,000 mentions |
| Actor start | $0.00005 (infrequent) |
| Apify platform compute (RAM/time) | Billed by Apify platform pricing |

#### Regular pricing (from 2026-11-08)

| Cost item | Rate |
| --------- | ---- |
| Mention row (1 mention) | $0.004 |
| Per 1,000 mention rows | $4.00 / 1,000 mentions |
| Actor start | $0.00005 (infrequent) |
| Apify platform compute (RAM/time) | Billed by Apify platform pricing |

> **Launch is 30% off: ~$0.00275 per mention.** Default run with 100 mentions costs about $0.27505 including actor start.

You pay only for mention rows written with `resultCharged` true. Diagnostic rows and deduplicated skips are not charged.

#### Free plan limit

Runs from Apify free plan accounts are limited to 100 mention rows and 1 index page per run.
The run finishes normally at that point and keeps every result already written.

#### Cost Examples

Based on the launch prices above (30% off).

**Scenario A: Default run (100 mentions)**

- Actor start: $0.00005
- 100 mentions: $0.275
- **Total: ~$0.27505**

**Scenario B: Full index page (1,000 mentions)**

- Actor start: $0.00005
- 1,000 mentions: $2.75
- **Total: ~$2.75005**

**Scenario C: Maximum run (5,000 mentions)**

- Actor start: $0.00005
- 5,000 mentions: $13.75
- **Total: ~$13.75005**

### Input

The Actor accepts the following input parameters (see the **Input** tab in the Apify Console for the full, interactive schema):

| Parameter | Type | Required | Default | Description |
| --------- | ---- | -------- | ------- | ----------- |
| `domains` | array of string | when combined with keywords | `[]` | Domains to look up in the mention index. One hostname per entry, not a full URL. Example: apple.com. After cleanup the two lists together must have 1-10 targets. |
| `keywords` | array of string | when combined with domains | `[]` | Brand or term targets in the mention index. One term per entry. After cleanup the two lists together must have 1-10 targets. |
| `location` | string | no | `United States` | Geographic market of the indexed answers. Example: United States. Must match a known market name. A typo fails. |
| `language` | string | no | `en` | Language code of the indexed answers. Example: en. Must be valid for the chosen location. Names such as English fail. |
| `platform` | string (enum) | no | `both` | Which index platform to query. Values: `both`, `chat_gpt`, `google`. ChatGPT index is available for United States and English only. |
| `searchFilter` | string (enum) | no | `include` | `include` keeps mentions that hit the targets. `exclude` keeps mentions that miss the targets. |
| `searchScope` | string (enum) | no | `any` | Where the target must appear. Domain-only runs accept `any`, `sources`, `search_results`. Keyword-only runs accept `any`, `question`, `answer`, `brand_entities`, `fan_out_queries`. Mixed targets accept `any` only. |
| `includeSubdomains` | boolean | no | `false` | When true, the lookup includes subdomains of domain targets. Ignored when the run has no domain target. |
| `matchType` | string (enum) | no | `word_match` | How keywords match. `word_match` treats the keyword as a whole word. `partial_match` treats it as a substring. Ignored when the run has no keyword. |
| `maxResults` | integer | no | `100` | Maximum mention rows to write. Range 1-5000. Apify Free plan: 100 mention rows per run. |
| `maxPages` | integer | no | `5` | Maximum index pages to fetch. Range 1-10. Stops the search even if fewer mention rows exist. Apify Free plan: 1 page. |

#### Input Example (Domain targets)

```json
{
  "domains": ["apple.com"],
  "location": "United States",
  "language": "en",
  "platform": "both",
  "maxResults": 100
}
```

#### Input Example (Keyword targets)

```json
{
  "keywords": ["Apple"],
  "location": "United States",
  "language": "en",
  "platform": "both",
  "matchType": "word_match",
  "maxResults": 100
}
```

### API and MCP usage

Runs write **one dataset row per mention**. Fetch rows from the default dataset after the run succeeds (or use the synchronous endpoint below).

**REST (sync, returns dataset items):** replace `YOUR_USERNAME`, `YOUR_API_TOKEN`, and use the same JSON body as in [Input Example](#input-example-domain-targets).

```bash
curl "https://api.apify.com/v2/acts/YOUR_USERNAME~llm-mentions-index/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \
  -X POST \
  -H "Content-Type: application/json" \
  -d '{"domains":["apple.com"],"location":"United States","language":"en","maxResults":100}'
```

**JavaScript (`apify-client`):**

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const input = {
  domains: ['apple.com'],
  location: 'United States',
  language: 'en',
  maxResults: 100,
};
const run = await client.actor('YOUR_USERNAME~llm-mentions-index').call(input);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

**Apify MCP server (AI agents):** configure your MCP client with URL `https://mcp.apify.com?tools=YOUR_USERNAME~llm-mentions-index` (you can combine multiple tools per [Apify MCP docs](https://docs.apify.com/platform/integrations/mcp)). Pass the API token via your client (for example an `Authorization: Bearer ...` header), not inside the Actor input JSON.

### Output Structure

The Actor writes one dataset row per mention. The table below lists every field.

The Output tab has two tables. Overview shows question, platform, model, sources, and timestamps. Mentions adds the full answer plus citation arrays. JSON export contains every field.

| Field | Type | Description | Example Value |
| ----- | ---- | ----------- | ------------- |
| `question` | string | Indexed user question for this mention | `"What is Apple?"` |
| `answer` | string | Indexed model answer text | `"Apple is a technology company."` |
| `platform` | string | Index platform for this mention | `"chat_gpt"` |
| `model_name` | string | null | Model name when present | `"gpt-4o"` |
| `location_code` | number | null | Numeric location code from the index | `2840` |
| `language_code` | string | Language code of the mention | `"en"` |
| `first_response_at` | string | null | First indexed response timestamp | `"2026-01-15 12:00:00 +00:00"` |
| `last_response_at` | string | null | Last indexed response timestamp | `"2026-08-01 12:00:00 +00:00"` |
| `sources` | array | Source objects with name, title, domain, and url | `[{"source_name":"Apple","title":"Apple","domain":"apple.com","url":"https://www.apple.com/"}]` |
| `search_results` | array | Search result objects linked to the mention | `[{"title":"Apple","domain":"apple.com","url":"https://www.apple.com/"}]` |
| `domains` | array of string | Echo of cleaned domain targets from input | `["apple.com"]` |
| `keywords` | array of string | Echo of cleaned keyword targets from input | `[]` |
| `location` | string | Echo of input location name | `"United States"` |
| `language` | string | Echo of input language code | `"en"` |
| `platformRequested` | string | Echo of input platform enum | `"both"` |
| `index_total_count` | number | Total mentions in the index for this query | `40723` |
| `ai_search_volume` | number | null | Raw index field, not a volume product | `1200` |
| `monthly_searches` | object | null | Raw monthly object with YYYY-MM keys | `{"2026-08": 1200}` |
| `fan_out_queries` | array of string | Related queries on the mention | `["apple iphone"]` |
| `brand_entities` | array | Brand entities with title and category | `[{"title":"Apple","category":"brand"}]` |
| `_metadata.resultCharged` | boolean | Whether this row was charged | `true` |
| `_metadata.error` | string | null | Present on failure or empty diagnostic rows | *(varies)* |
| `_metadata.errorContext` | string | null | Extra error context when `error` is set | *(varies)* |

Multiple targets in one run form one combined set, not separate brand reports. `ai_search_volume` and `monthly_searches` are raw columns on each row, not a separate volume export. `fan_out_queries` and `brand_entities` stay on the same mention row.

#### Output Example

```json
{
  "question": "What is Apple?",
  "answer": "Apple is a technology company known for iPhone, Mac, and services.",
  "platform": "chat_gpt",
  "model_name": "gpt-4o",
  "location_code": 2840,
  "language_code": "en",
  "first_response_at": "2026-01-15 12:00:00 +00:00",
  "last_response_at": "2026-08-01 12:00:00 +00:00",
  "sources": [
    {
      "source_name": "Apple",
      "title": "Apple",
      "domain": "apple.com",
      "url": "https://www.apple.com/"
    }
  ],
  "search_results": [],
  "domains": ["apple.com"],
  "keywords": [],
  "location": "United States",
  "language": "en",
  "platformRequested": "both",
  "index_total_count": 40723,
  "ai_search_volume": null,
  "monthly_searches": null,
  "fan_out_queries": [],
  "brand_entities": [],
  "_metadata": {
    "resultCharged": true,
    "error": null,
    "errorContext": null
  }
}
```

# Actor input Schema

## `domains` (type: `array`):

Domains to look up in the mention index. One hostname per entry, not a full URL. Example: apple.com. Combine with keywords. After cleanup the two lists together must have 1-10 targets.

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

Brand or term targets in the mention index. Not a live prompt. One term per entry. Combine with domains. After cleanup the two lists together must have 1-10 targets.

## `location` (type: `string`):

Geographic market of the indexed answers. Example: United States. Must match a known market name. A typo fails. Default United States.

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

Language code of the indexed answers. Example: en. Must be valid for the chosen location. Names such as English fail. Default en.

## `platform` (type: `string`):

Which index platform to query. both uses every platform available for the location and language. chat\_gpt is available for United States and English only. Other markets use google.

## `searchFilter` (type: `string`):

include keeps mentions that hit the targets. exclude keeps mentions that miss the targets. This is still a mention lookup, not a competitor report.

## `searchScope` (type: `string`):

Where the target must appear in the mention. any searches all allowed fields. Domain-only runs accept any, sources, search\_results. Keyword-only runs accept any, question, answer, brand\_entities, fan\_out\_queries. Mixed targets accept any only.

## `includeSubdomains` (type: `boolean`):

When true, the lookup includes subdomains of the domain targets. Default is off. The Actor does not add www or other variants itself. Ignored when the run has no domain target.

## `matchType` (type: `string`):

How keywords match. word\_match treats the keyword as a whole word. partial\_match treats it as a substring. Domain matching stays unchanged. Ignored when the run has no keyword.

## `maxResults` (type: `integer`):

Maximum mention rows to write. Range 1-5000. Default 100. Apify Free plan: 100 mention rows per run.

## `maxPages` (type: `integer`):

Maximum index pages to fetch. Range 1-10. Default 5. Stops the search even if fewer mention rows exist. Apify Free plan: 1 page.

## Actor input object example

```json
{
  "domains": [
    "apple.com"
  ],
  "keywords": [
    "Apple"
  ],
  "location": "United States",
  "language": "en",
  "platform": "both",
  "searchFilter": "include",
  "searchScope": "any",
  "includeSubdomains": false,
  "matchType": "word_match",
  "maxResults": 100,
  "maxPages": 5
}
```

# Actor output Schema

## `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 = {
    "domains": [
        "apple.com"
    ],
    "keywords": [],
    "location": "United States",
    "language": "en"
};

// Run the Actor and wait for it to finish
const run = await client.actor("winningsolutions/llm-mentions-index").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 = {
    "domains": ["apple.com"],
    "keywords": [],
    "location": "United States",
    "language": "en",
}

# Run the Actor and wait for it to finish
run = client.actor("winningsolutions/llm-mentions-index").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 '{
  "domains": [
    "apple.com"
  ],
  "keywords": [],
  "location": "United States",
  "language": "en"
}' |
apify call winningsolutions/llm-mentions-index --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,winningsolutions/llm-mentions-index"
        }
    }
}
```

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/sVSyLEgSLZnqtqqGc/builds/PCB5pOBVOpEKeYHN1/openapi.json
