# AI Rank Tracker - GEO/AEO: ChatGPT, Claude, Gemini, Perplexity (`santhej/ai-rank-tracker-pro`) Actor

AI rank tracker & GEO/AEO audit tool for 5 AI platforms (Google AI Overview, ChatGPT, Claude, Gemini, Perplexity). Tracks brand visibility, share of voice, citation rank vs competitors. Multi-country, AI Search Volume metric, top cited domains. Half the price of competitors. No API keys.

- **URL**: https://apify.com/santhej/ai-rank-tracker-pro.md
- **Developed by:** [Santhej Kallada](https://apify.com/santhej) (community)
- **Categories:** SEO tools, AI
- **Stats:** 5 total users, 4 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

Pay per event

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

## 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 Rank Tracker - GEO/AEO Audit for ChatGPT, Claude, Gemini, Perplexity & Google AI Overview

> **The cheapest AI rank tracker on Apify.** Track brand visibility, share of voice, citation rank, and competitor mentions across 5 AI search platforms in a single run. Built for Generative Engine Optimization (GEO), Answer Engine Optimization (AEO), and AI search SEO.

### What this AI rank tracker does

For any brand you give it, this actor sends your queries through **5 major AI search platforms** and tells you:

- Whether your brand is **mentioned** in the AI's answer
- Your **share of voice** vs competitors
- The **rank position** of your brand in the answer (first vs seventh = huge difference)
- Whether your **domain is cited as a source URL** (the holy grail for AI search SEO)
- The **sentiment** the AI uses when describing your brand
- **Which other domains are cited** — find guest-post / outreach opportunities
- The **AI Search Volume** for each query (exclusive metric — no other Apify actor has this)
- Cross-platform **top cited domains** and **top cited pages** (aggregated report)

Use it as your weekly AI visibility tracker, ChatGPT SEO audit tool, Google AI Overview rank checker, or as part of a broader Generative Engine Optimization workflow.

### Why this AI visibility tracker beats every paid alternative on Apify

| Feature | This actor | khadinakbar's AI Brand Monitor (the leader) | adityalingwal AI Brand Visibility | doesaiknow analyst tier |
|---|---|---|---|---|
| Platforms covered | **5 — Google AI Overview, ChatGPT, Claude, Gemini, Perplexity** | 4 (no AIO) | 3 | 5 (incl. Copilot, no Claude/Gemini) |
| Price per check | **$0.05** | $0.08-$0.09 | $0.15 effective ($0.30 / ~2 checks) | $0.30/query |
| Real LLM queries | ✅ (no simulation, no scraping) | ✅ direct LLM API | ❌ browser scraping | ❌ browser scraping |
| Google AI Overview tracking | ✅ Yes | ❌ No | ❌ No | ✅ |
| Multi-country AI Overview | ✅ Yes (50+ locations) | ❌ US only | ❌ US only | ❌ |
| AI Search Volume metric | ✅ Exclusive | ❌ | ❌ | ❌ |
| Top cited domains aggregation | ✅ Built-in | ❌ | ❌ | ✅ Pro |
| No API keys required | ✅ | ✅ | ✅ | ✅ |
| Speed (5 platforms × 3 queries) | **~15-25 seconds** | ~22 seconds | ~115 seconds | ~30 seconds |

If you're paying for Profound, Peec AI, Otterly, or any other AI visibility SaaS at $29-$499/month, this actor delivers the same data per-run, pay-as-you-go, no contracts.

### Use cases

- **AI search SEO audits** — weekly brand visibility checks for SEO/GEO/AEO clients
- **ChatGPT SEO tracking** — measure how ChatGPT recommends your brand vs competitors
- **Google AI Overview rank tracking** — see when AIO cites your domain (or doesn't)
- **Perplexity rank tracker** — monitor Perplexity citations and share of voice
- **Claude & Gemini brand monitoring** — track AI-generated recommendations across LLM platforms
- **Generative Engine Optimization (GEO)** — measure GEO content performance pre/post launch
- **Answer Engine Optimization (AEO)** — identify queries where competitors win citations
- **Multi-country AI search visibility** — set `locationCode` to track in India, UK, Germany, etc.
- **AI citation tracker** — see exactly which 3rd-party domains AI cites for your category
- **Top cited domain research** — find guest-post and partnership targets (Aggregated Report add-on)
- **AI search volume research** — see which queries are popular in AI search (DataForSEO exclusive metric per query)
- **Profound / Peec AI / Otterly alternative** — pay-as-you-go alternative to expensive AI visibility SaaS

### Pricing

| Event | Price | When charged |
|---|---|---|
| Actor Start | $0.001 | Once per run |
| **Platform Check** | **$0.05** | Per (query × platform) — you control it via input |
| **Aggregated Report** | **$0.25** | Optional, only when `includeAggregatedMetrics: true` |

**Example runs:**

- 3 queries × 5 platforms = **$0.75 + $0.001 start = $0.751**
- 10 queries × 5 platforms = **$2.50 + $0.001 = $2.501**
- 5 queries × 2 platforms (AIO + ChatGPT only) = **$0.50 + $0.001 = $0.501**
- + Aggregated Report add-on: + $0.25

Minimum 3 queries per run (for batching efficiency).

### Input

#### Required

- `brandName` — Your brand (e.g., `"HubSpot"`)
- `queries` — 3-50 queries to test. Each is one complete prompt (e.g., `"best CRM software"` or `"What CRM should a B2B startup use?"`).

#### Recommended

- `brandDomain` — `"hubspot.com"` for citation detection
- `competitors` — Up to 10 competitor brand names
- `platforms` — Subset of the 5 platforms (default: all 5)

#### Optional

- `brandAliases` — Alternate spellings (case-insensitive matched)
- `competitorDomains` — For competitor citation detection
- `locationCode` — Geographic location (default: 2840 = US). Common: 2356 India, 2826 UK, 2124 Canada, 2036 Australia, 2276 Germany.
- `languageCode` — Default: `"en"`
- `includeAggregatedMetrics` — Set `true` for the bonus aggregated report (extra $0.25)
- `responseFormat` — `"detailed"` (800 chars) or `"concise"` (200 chars)
- `maxBudgetUsd` — Safety cap. Actor refuses to start if estimated cost exceeds this.
- `webhookUrl` — POSTed run summary on completion
- `demoMode` — Set `true` for a free health check

### Output

The actor writes records to the default dataset.

#### `platform_check` records (one per query × platform)

```json
{
  "record_type": "platform_check",
  "scraped_at": "2026-05-14T08:54:29.917Z",
  "platform": "gemini",
  "model_used": "gemini-2.5-flash",
  "data_source": "dataforseo_responses",
  "data_status": "ok",

  "query": "best CRM software",
  "location_code": 2840,
  "language_code": "en",

  "brand_name": "HubSpot",
  "brand_domain": "hubspot.com",
  "brand_mentioned": true,
  "brand_mention_count": 4,
  "brand_share_of_voice": 0.5,
  "mention_position_score": 1,
  "mention_context": "...excerpt around first mention...",

  "sentiment": "positive",

  "is_cited_as_source": false,
  "cited_url": null,
  "cited_urls": ["https://..."],
  "total_sources_cited": 7,

  "competitor_mentions": ["Salesforce", "Pipedrive"],
  "competitor_mention_count": 5,
  "competitor_breakdown": {
    "Salesforce": { "mentioned": true, "count": 3, "position_score": 1 },
    "Pipedrive": { "mentioned": true, "count": 2, "position_score": 3 }
  },

  "ai_search_volume": 4743,
  "monthly_searches": null,

  "ai_response_summary": "...800 chars of the AI's response..."
}
````

**Field reference:**

| Field | Description |
|---|---|
| `data_status` | `ok` = data returned; `no_index_match` = no indexed data for this query (rare; very specific brand-related queries); `fallback_responses` = real-time LLM Responses fallback; `error` = API call failed |
| `mention_position_score` | 1-10. 1 = brand appears in first 10% of the answer (best). Null if not mentioned. |
| `brand_share_of_voice` | `brand_count / (brand_count + sum(competitor_counts))`. 0-1. |
| `ai_search_volume` | Exclusive metric: how often this query is asked in AI search (only populated for AIO + ChatGPT data) |

#### `aggregated_report` record (only if `includeAggregatedMetrics: true`)

One row per run summarizing all platform\_checks plus cross-platform aggregations: top cited domains, top cited pages, competitor summary, platform breakdown, and overall visibility score (0-100).

```json
{
  "record_type": "aggregated_report",
  "summary": {
    "brand_name": "HubSpot",
    "queries_tracked": 3,
    "platforms_queried": 5,
    "total_platform_checks": 15,
    "overall_visibility_score": 78,
    "brand_mention_rate": 0.87,
    "brand_avg_position_score": 2.1,
    "brand_avg_share_of_voice": 0.42,
    "brand_citation_rate": 0.20
  },
  "top_cited_domains": [
    { "domain": "g2.com", "citation_count": 15, "platforms_appearing_on": ["chatgpt", "gemini", "perplexity"] }
  ],
  "top_cited_pages": [ ... ],
  "competitor_summary": [ ... ],
  "platform_breakdown": { ... },
  "ai_search_volume_total": 42400
}
```

**`overall_visibility_score` formula** (0-100):

```
score = round(100 × (
  0.40 × mention_rate +
  0.30 × position_score_normalized +
  0.20 × share_of_voice +
  0.10 × citation_rate
))
```

### How it works under the hood

- **Google AI Overview + ChatGPT** → batched queries against an enterprise AI search index
- **Claude + Gemini + Perplexity** → real-time LLM queries (Claude Haiku 4.5, Gemini 2.5 Flash, Perplexity Sonar)
- **Mention detection** → word-boundary regex matching against brand name + aliases, position scoring 1-10
- **Citation detection** → subdomain-aware URL matching (blog.hubspot.com → matches hubspot.com)
- **Sentiment** → batched LLM classification (single Gemini Flash call per run, regardless of record count)
- **Top domains/pages** → local aggregation across all cited URLs in the run
- **Performance** → 5 platforms × 3 queries usually completes in 15-25 seconds

### When to use this

- **Weekly AI visibility audits** for SEO/GEO/AEO agency clients
- **Pre/post content launches** — measure if your content moved AI rankings
- **Competitor monitoring** — track when competitors are cited but you aren't
- **Multi-country tracking** — use different `locationCode` values to see AI Overview answers in different markets
- **Top-of-funnel SEO research** — see which 3rd-party domains get cited so you can pitch guest posts there
- **AI search volume discovery** — find which queries have the highest AI search demand

### FAQ

**Q: How is this different from a regular SEO rank tracker?**
A: Traditional rank trackers measure where your site appears in Google's blue links. This measures whether AI engines (which 60%+ of consumers now use for product research) actually mention or recommend your brand — a totally different signal that traditional SEO tools miss.

**Q: Why minimum 3 queries?**
A: AI search index queries are batched in groups of up to 10 per API call. Below 3 queries the per-query economics get tight, and we'd have to charge more. Three is the floor for clean margins on our end and value on yours.

**Q: How accurate are the brand mentions?**
A: Detected via word-boundary regex on the full AI response text. Include all your brand aliases (e.g., `"Hub Spot"`, `"HS"`) to catch every variant. Position scoring is based on character position of the first mention.

**Q: Why do some Google AI Overview records show `data_status: no_index_match`?**
A: For very specific or niche queries (e.g., `"HubSpot alternatives for B2B startups with 20 employees"`), there may be no indexed AI Overview data yet. Generic search-style queries (`"best CRM software"`) almost always return data. You're still charged a Platform Check because we made a real API attempt. Switch to generic queries for AIO coverage, or use the other 4 platforms which always return fresh data.

**Q: Does it support Microsoft Copilot or Grok?**
A: Not in v1. Both have very small market share. Will add if user demand picks up.

**Q: Can I run this on a schedule?**
A: Yes — use Apify's built-in Scheduler to run weekly or daily for trend tracking. Combine with the `webhookUrl` input to push results to Make.com, Zapier, n8n, or Slack.

**Q: How does this compare to Profound, Peec AI, Otterly?**
A: Those are full SaaS platforms at $29-$499/month with dashboards. This actor delivers the same underlying data per-run, pay-as-you-go, no contracts. Use it standalone or pipe the JSON output into your own dashboard.

**Q: Will the auto-test run charge me?**
A: Apify auto-tests your actor daily with the default input. Those runs charge against your underlying API budget, not the user-facing pricing events. To minimize, edit the default input to use 1 platform × 3 queries (~$0.001/day).

### Tags

`ai rank tracker` · `ai visibility tracker` · `ai overview tracker` · `chatgpt seo tool` · `chatgpt rank tracker` · `perplexity rank tracker` · `claude brand monitoring` · `gemini ai search` · `generative engine optimization` · `geo audit tool` · `aeo tool` · `answer engine optimization` · `llm visibility` · `llm rank tracker` · `ai search visibility` · `ai search optimization` · `ai citation tracker` · `brand mention ai` · `ai brand monitor` · `share of voice ai` · `profound ai visibility alternative` · `peec ai alternative` · `otterly alternative`

### Author

Built by [santhej](https://apify.com/santhej). Found an issue? Open one on the actor page.

# Actor input Schema

## `brandName` (type: `string`):

The brand you want to track (e.g., 'HubSpot', 'Stripe', 'Notion'). Used to detect text mentions across AI responses.

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

Your brand's primary website domain (e.g., 'hubspot.com'). Used to detect when your brand is cited as a source URL. Without this, only text mentions are tracked.

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

Alternate spellings/names for your brand (e.g., \['Hub Spot', 'HS']). Case-insensitive, word-boundary matched. The primary brandName is always tracked — add aliases for variations like spaces or abbreviations.

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

The prompts/questions to send to each AI platform. Each entry is ONE complete query (e.g., 'best CRM software' or 'What CRM should a B2B SaaS startup use?'). NOT individual keywords. Minimum 3 because the AI search index batches queries for cost efficiency — running fewer than 3 isn't economical. Maximum 50.

## `platforms` (type: `array`):

Which AI platforms to test. Each (query × platform) combination = 1 Platform Check ($0.05). Default is all 5 platforms. You don't need to pick models — that's handled automatically.

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

Competitor brands to detect in AI responses (e.g., \['Salesforce', 'Pipedrive']). Up to 10. The output shows share-of-voice vs these competitors.

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

Competitor website domains for citation detection (e.g., \['salesforce.com', 'pipedrive.com']). Used to track when competitors are cited as sources.

## `locationCode` (type: `string`):

Country for Google AI Overview tracking. Different countries see different AI Overview answers.

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

Language for query handling. Default 'en' (English). Use ISO 639-1 codes.

## `includeAggregatedMetrics` (type: `boolean`):

If checked, emits an additional 'aggregated\_report' record at the end with overall visibility score, top cited domains, top cited pages, and platform breakdown. Charges an extra $0.25.

## `responseFormat` (type: `string`):

How much AI response text to keep per record. 'detailed' keeps 800 chars (best for human review). 'concise' keeps 200 chars (best for AI agents — 3× smaller dataset).

## `maxBudgetUsd` (type: `number`):

Optional safety cap. If set, the actor estimates total cost upfront and refuses to start runs that would exceed this amount. Leave empty for no cap.

## `webhookUrl` (type: `string`):

If provided, the actor POSTs a JSON run summary to this URL on completion. Useful for n8n, Make.com, Zapier, Slack integrations.

## `demoMode` (type: `boolean`):

If checked, runs a health check WITHOUT making DataForSEO API calls. Useful for verifying the actor is configured before consuming credits.

## Actor input object example

```json
{
  "brandName": "HubSpot",
  "brandDomain": "hubspot.com",
  "brandAliases": [],
  "queries": [
    "best CRM software",
    "CRM for small business",
    "HubSpot alternatives 2026"
  ],
  "platforms": [
    "google_aio",
    "chatgpt",
    "claude",
    "gemini",
    "perplexity"
  ],
  "competitors": [
    "Salesforce",
    "Pipedrive",
    "Zoho CRM"
  ],
  "competitorDomains": [],
  "locationCode": "2840",
  "languageCode": "en",
  "includeAggregatedMetrics": false,
  "responseFormat": "detailed",
  "demoMode": false
}
```

# Actor output Schema

## `dataset` (type: `string`):

All platform\_check records and the optional aggregated\_report row.

## `summary` (type: `string`):

High-level run summary including overall visibility score, mention rate, and platform counts.

# 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 = {
    "brandName": "HubSpot",
    "brandDomain": "hubspot.com",
    "brandAliases": [],
    "queries": [
        "best CRM software",
        "CRM for small business",
        "HubSpot alternatives 2026"
    ],
    "competitors": [
        "Salesforce",
        "Pipedrive",
        "Zoho CRM"
    ],
    "competitorDomains": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("santhej/ai-rank-tracker-pro").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 = {
    "brandName": "HubSpot",
    "brandDomain": "hubspot.com",
    "brandAliases": [],
    "queries": [
        "best CRM software",
        "CRM for small business",
        "HubSpot alternatives 2026",
    ],
    "competitors": [
        "Salesforce",
        "Pipedrive",
        "Zoho CRM",
    ],
    "competitorDomains": [],
}

# Run the Actor and wait for it to finish
run = client.actor("santhej/ai-rank-tracker-pro").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 '{
  "brandName": "HubSpot",
  "brandDomain": "hubspot.com",
  "brandAliases": [],
  "queries": [
    "best CRM software",
    "CRM for small business",
    "HubSpot alternatives 2026"
  ],
  "competitors": [
    "Salesforce",
    "Pipedrive",
    "Zoho CRM"
  ],
  "competitorDomains": []
}' |
apify call santhej/ai-rank-tracker-pro --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "AI Rank Tracker - GEO/AEO: ChatGPT, Claude, Gemini, Perplexity",
        "description": "AI rank tracker & GEO/AEO audit tool for 5 AI platforms (Google AI Overview, ChatGPT, Claude, Gemini, Perplexity). Tracks brand visibility, share of voice, citation rank vs competitors. Multi-country, AI Search Volume metric, top cited domains. Half the price of competitors. No API keys.",
        "version": "0.0",
        "x-build-id": "RcJlDZcIm4ufmnv7p"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/santhej~ai-rank-tracker-pro/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-santhej-ai-rank-tracker-pro",
                "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/santhej~ai-rank-tracker-pro/runs": {
            "post": {
                "operationId": "runs-sync-santhej-ai-rank-tracker-pro",
                "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/santhej~ai-rank-tracker-pro/run-sync": {
            "post": {
                "operationId": "run-sync-santhej-ai-rank-tracker-pro",
                "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": [
                    "brandName",
                    "queries"
                ],
                "properties": {
                    "brandName": {
                        "title": "Brand name",
                        "minLength": 1,
                        "maxLength": 100,
                        "type": "string",
                        "description": "The brand you want to track (e.g., 'HubSpot', 'Stripe', 'Notion'). Used to detect text mentions across AI responses."
                    },
                    "brandDomain": {
                        "title": "Brand domain (optional)",
                        "type": "string",
                        "description": "Your brand's primary website domain (e.g., 'hubspot.com'). Used to detect when your brand is cited as a source URL. Without this, only text mentions are tracked."
                    },
                    "brandAliases": {
                        "title": "Brand aliases (optional)",
                        "maxItems": 10,
                        "type": "array",
                        "description": "Alternate spellings/names for your brand (e.g., ['Hub Spot', 'HS']). Case-insensitive, word-boundary matched. The primary brandName is always tracked — add aliases for variations like spaces or abbreviations.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "queries": {
                        "title": "Queries to test",
                        "minItems": 3,
                        "maxItems": 50,
                        "type": "array",
                        "description": "The prompts/questions to send to each AI platform. Each entry is ONE complete query (e.g., 'best CRM software' or 'What CRM should a B2B SaaS startup use?'). NOT individual keywords. Minimum 3 because the AI search index batches queries for cost efficiency — running fewer than 3 isn't economical. Maximum 50.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "platforms": {
                        "title": "AI platforms to query",
                        "minItems": 1,
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Which AI platforms to test. Each (query × platform) combination = 1 Platform Check ($0.05). Default is all 5 platforms. You don't need to pick models — that's handled automatically.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "google_aio",
                                "chatgpt",
                                "claude",
                                "gemini",
                                "perplexity"
                            ],
                            "enumTitles": [
                                "Google AI Overview",
                                "ChatGPT",
                                "Claude",
                                "Gemini",
                                "Perplexity"
                            ]
                        },
                        "default": [
                            "google_aio",
                            "chatgpt",
                            "claude",
                            "gemini",
                            "perplexity"
                        ]
                    },
                    "competitors": {
                        "title": "Competitor brand names",
                        "maxItems": 10,
                        "type": "array",
                        "description": "Competitor brands to detect in AI responses (e.g., ['Salesforce', 'Pipedrive']). Up to 10. The output shows share-of-voice vs these competitors.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "competitorDomains": {
                        "title": "Competitor domains (optional)",
                        "maxItems": 10,
                        "type": "array",
                        "description": "Competitor website domains for citation detection (e.g., ['salesforce.com', 'pipedrive.com']). Used to track when competitors are cited as sources.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "locationCode": {
                        "title": "Location",
                        "enum": [
                            "2840",
                            "2826",
                            "2124",
                            "2036",
                            "2356",
                            "2276",
                            "2250",
                            "2380",
                            "2724",
                            "2528",
                            "2616",
                            "2752",
                            "2208",
                            "2578",
                            "2246",
                            "2056",
                            "2756",
                            "2040",
                            "2372",
                            "2620",
                            "2392",
                            "2410",
                            "2702",
                            "2458",
                            "2360",
                            "2608",
                            "2764",
                            "2704",
                            "2076",
                            "2484",
                            "2032",
                            "2152",
                            "2170",
                            "2554",
                            "2710",
                            "2784",
                            "2682",
                            "2818",
                            "2376"
                        ],
                        "type": "string",
                        "description": "Country for Google AI Overview tracking. Different countries see different AI Overview answers.",
                        "default": "2840"
                    },
                    "languageCode": {
                        "title": "Language code",
                        "type": "string",
                        "description": "Language for query handling. Default 'en' (English). Use ISO 639-1 codes.",
                        "default": "en"
                    },
                    "includeAggregatedMetrics": {
                        "title": "Include Aggregated Report",
                        "type": "boolean",
                        "description": "If checked, emits an additional 'aggregated_report' record at the end with overall visibility score, top cited domains, top cited pages, and platform breakdown. Charges an extra $0.25.",
                        "default": false
                    },
                    "responseFormat": {
                        "title": "Response detail level",
                        "enum": [
                            "detailed",
                            "concise"
                        ],
                        "type": "string",
                        "description": "How much AI response text to keep per record. 'detailed' keeps 800 chars (best for human review). 'concise' keeps 200 chars (best for AI agents — 3× smaller dataset).",
                        "default": "detailed"
                    },
                    "maxBudgetUsd": {
                        "title": "Max budget for this run (USD)",
                        "minimum": 0.1,
                        "type": "number",
                        "description": "Optional safety cap. If set, the actor estimates total cost upfront and refuses to start runs that would exceed this amount. Leave empty for no cap."
                    },
                    "webhookUrl": {
                        "title": "Webhook URL (optional)",
                        "type": "string",
                        "description": "If provided, the actor POSTs a JSON run summary to this URL on completion. Useful for n8n, Make.com, Zapier, Slack integrations."
                    },
                    "demoMode": {
                        "title": "Demo / health check mode",
                        "type": "boolean",
                        "description": "If checked, runs a health check WITHOUT making DataForSEO API calls. Useful for verifying the actor is configured before consuming credits.",
                        "default": false
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
