# AI Rank Tracker GEO/AEO: ChatGPT, Perplexity Brand Mentions (`moggedhq/ai-rank-tracker`) Actor

Track whether ChatGPT, Perplexity, Gemini and Claude mention and rank your brand for buyer questions, e.g. 'best CRM for small business' or 'best running shoes'. About $0.05 per check (one question on one AI). AI search visibility: rank, sentiment, cited sources, competitors, share of voice.

- **URL**: https://apify.com/moggedhq/ai-rank-tracker.md
- **Developed by:** [mogged](https://apify.com/moggedhq) (community)
- **Categories:** SEO tools, AI
- **Stats:** 2 total users, 1 monthly users, 91.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $28.00 / 1,000 ai rank checks

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## AI Rank Tracker GEO/AEO: ChatGPT, Perplexity Brand Mentions

**Track whether ChatGPT, Perplexity, Gemini and Claude mention and rank your brand when people ask buyer questions such as "best CRM for small business" or "best running shoes".**

**For SEO and GEO agencies, marketers and brands who need to know where AI assistants rank them, and who they rank first instead.**

**About $0.05 per check** (one of your questions asked on one AI), AI usage included at Apify's paid-plan rates. Checking 10 buyer questions on all four AIs (40 checks) costs about $2.10. Your first run with the example input (1 question on 4 AIs) costs about $0.21 and takes under a minute.

Give it the questions your buyers ask AI ("best CRM for small business"), your brand and your competitors. It asks each question on ChatGPT, Gemini, Claude and Perplexity with their own live web search and returns one row per question and AI, starting with a plain answer such as *"HubSpot is #1 of 6 options in Gemini's answer. Tone: positive. Your site is cited."* Then come your **rank in the answer's list** (1st, 2nd, 3rd...), whether you are mentioned, how you are described (positive, neutral or negative), every cited source, whether your website is cited, and each competitor's rank. The last row is a **run summary**: *"HubSpot is mentioned in 94% of 16 AI answers, average rank 2.25, ranked #1 in 50%, share of voice 26%..."*, with the numbers per AI.

No login, no API keys, no subscription. You pay per check.

### What you get per check

One check = one question answered by one AI.

| Field | What it holds |
|---|---|
| `verdict` | The result in plain words: your rank, the #1 option, tone, competitors ahead, whether your site is cited |
| `prompt`, `engine`, `model`, `country` | The question, the AI (`chatgpt`, `gemini`, `claude`, `perplexity`), the exact model and the searcher's country |
| `brandRank` | Your position in the answer's list of options: 1 = recommended first. `null` if you are not in the list |
| `brandMentioned`, `brandMentions` | Whether the answer names your brand, and how many times |
| `brandSentiment` | How the answer describes you: `positive`, `neutral` or `negative` |
| `brandContext` | The sentence where the answer first names you |
| `domainCited`, `domainCitedUrls`, `domainCitationPosition` | Whether the answer cites your website, which pages, and the first one's position among the sources |
| `topPick`, `listLength`, `rankedList` | The option ranked #1, how many options the answer lists, and all of them in order (including brands you did not list) |
| `competitors` | Per competitor: `rank`, `mentioned`, `mentions`, `sentiment`, `cited`, `citedUrl` |
| `competitorsAhead` | Competitors ranked above you in this answer |
| `sources`, `citedDomains`, `sourceCount` | Every source the AI used (position, URL, title, domain, cited in the answer or not) and the cited sites in order |
| `answer` | The full answer text |
| `webSearches`, `truncated`, `aiUsageUsd`, `checkedAt` | Searches the AI ran, whether the answer hit the length limit, the AI usage for this check, and the time |

#### The run summary (last row, free)

`rowType: "summary"`, also saved as the `SUMMARY` record in the run's key-value store, and shown as the run's status message:

- `verdict`: the run in two or three plain sentences.
- `overall` and `byEngine`: mention rate, average rank, top-1 and top-3 rates, citation rate of your domain, tone counts and **share of voice** (your share of all mentions of your brand and your competitors, one count per answer).
- `competitors`: the same numbers for each competitor.
- `mostRecommended`: the 25 options AI recommends most often across all answers, with average rank. This shows who AI ranks first when it is not you.
- `topCitedDomains`: the sites the AIs cite most. These are the pages to get your brand onto.
- `brandMissingFrom`: the questions and AIs where you were not mentioned, with who was ranked #1 instead.

### Pricing

**About $0.05 per check on a paid Apify plan**, made of two parts:

- **This Actor: $0.035 per check.** Apify's tier discounts apply: Bronze $0.03325, Silver $0.0315, Gold and above $0.028. Failed checks and the run summary are free.
- **The AI's own usage: about $0.017 per check on average**, billed to your Apify account by Apify's OpenRouter gateway at the AI providers' rates. It depends on the AI:

| AI | AI usage per check (typical) | Full cost per check (about) |
|---|---|---|
| Perplexity | $0.006 | $0.041 |
| Claude | $0.012 | $0.047 |
| ChatGPT | $0.022 | $0.057 |
| Gemini | $0.02 to $0.035 (one or two Google searches) | $0.055 to $0.07 |

The AI figures were measured over 47 test checks and include the small ranking step (about $0.0003). Each row's `aiUsageUsd` shows that check's AI usage.

What typical jobs cost (paid plan, all four AIs unless stated):

| Job | Checks | This Actor | AI usage (about) | Total (about) |
|---|---|---|---|---|
| First run: the example input, 1 question | 4 | $0.14 | $0.07 | $0.21 |
| 10 questions | 40 | $1.40 | $0.70 | $2.10 |
| 50 questions | 200 | $7.00 | $3.40 | $10.40 |
| 100 questions | 400 | $14.00 | $6.80 | $20.80 |
| 25 questions on ChatGPT and Gemini, weekly | 50 a week | $1.75 | $1.30 | $3.05 a week |

No surprise bills: set Apify's maximum cost per run before you start and the run stops cleanly at that amount.

**Apify free plan:** each run checks your first 8 question and AI pairs (two questions on all four AIs), enough to see your ranks. A paid Apify plan removes the limit. The OpenRouter gateway also lists a higher AI rate for free-plan accounts (about 10 times the model price), so a paid plan is much cheaper for this Actor.

### How to use it

1. Add your **prompts**: the questions your buyers type into AI assistants, one per line.
2. Add your **brand** and, if you want the citation check, your **website domain**.
3. Add **competitors** as `Name | domain.com`, a name or a domain.
4. Pick the **engines** (all four by default) and the **country**.
5. Start. Download the rows as JSON, CSV or Excel, or read them through the API.

#### Input example

```json
{
  "prompts": [
    "What are the best CRM tools for a small business?",
    "What are the best HubSpot alternatives?",
    "best free CRM software"
  ],
  "brand": "HubSpot",
  "domain": "hubspot.com",
  "competitors": ["Salesforce | salesforce.com", "Pipedrive | pipedrive.com", "Zoho CRM | zoho.com"],
  "engines": ["chatgpt", "gemini", "claude", "perplexity"],
  "country": "US"
}
```

Optional: `brandAliases` (other names that count as your brand, for example "HubSpot CRM") and `maxConcurrency` (checks at a time, default 8).

#### Output example (one check, shortened)

```json
{
  "verdict": "HubSpot is #1 of 4 options in ChatGPT's answer. Tone: positive. Your site is cited.",
  "rowType": "check",
  "prompt": "What are the best CRM tools for a small business?",
  "engine": "chatgpt",
  "engineName": "ChatGPT",
  "model": "openai/gpt-6-luna",
  "country": "US",
  "brand": "HubSpot",
  "brandRank": 1,
  "brandMentioned": true,
  "brandMentions": 3,
  "brandSentiment": "positive",
  "brandContext": "HubSpot Getting started; sales and marketing together Free plan includes contact management and deal pipelines...",
  "domain": "hubspot.com",
  "domainCited": true,
  "domainCitedUrls": ["https://www.hubspot.com/products/crm"],
  "domainCitationPosition": 1,
  "topPick": "HubSpot",
  "listLength": 4,
  "rankedList": ["HubSpot", "Zoho CRM", "Pipedrive", "Salesforce"],
  "competitors": [
    {"name": "Zoho CRM", "domain": "zoho.com", "rank": 2, "mentioned": true, "mentions": 3, "sentiment": "positive", "cited": true, "citedUrl": "https://www.zoho.com/crm/zohocrm-pricing-calculator.html"},
    {"name": "Pipedrive", "domain": "pipedrive.com", "rank": 3, "mentioned": true, "mentions": 2, "sentiment": "positive", "cited": true, "citedUrl": "https://www.pipedrive.com/en/pricing"},
    {"name": "Salesforce", "domain": "salesforce.com", "rank": 4, "mentioned": true, "mentions": 1, "sentiment": "neutral", "cited": false, "citedUrl": null}
  ],
  "competitorsAhead": [],
  "citedDomains": ["hubspot.com", "zoho.com", "pipedrive.com"],
  "sources": [
    {"position": 1, "title": "Streamline Your Entire Business With a Free CRM | HubSpot", "url": "https://www.hubspot.com/products/crm", "domain": "hubspot.com", "citedInAnswer": true}
  ],
  "sourceCount": 3,
  "answer": "There isn't one best CRM for every small business...",
  "webSearches": 1,
  "status": "ok",
  "checkedAt": "2026-10-13T07:41:21Z"
}
```

### Track your AI rank weekly

AI answers change from week to week, and from run to run. To see the trend:

1. Save your input as a **task** (the Tasks tab, or "Save as a new task" in the input form).
2. Add an **Apify Schedule** to that task, for example every Monday at 08:00.
3. Send each run's rows to Google Sheets, Slack, a webhook, Make, Zapier or n8n through Apify's integrations, or read them through the API.

Compare `byEngine` in each week's summary row to see your share of voice and average rank move.

### Use with AI agents (MCP)

This Actor works as a tool in Apify's MCP server, so Claude, ChatGPT, Cursor or any MCP client can run it. Add the Actor to your Apify MCP server configuration and ask, for example:

> "Use moggedhq/ai-rank-tracker to check where HubSpot ranks against Salesforce and Pipedrive in ChatGPT and Gemini answers to 'best CRM for small business', then tell me which competitor is ranked ahead most often."

The input is plain (`prompts`, `brand`, `domain`, `competitors`, `engines`, `country`) and each row is self-contained, so an agent can read the rank, sentiment and citations without extra parsing. The summary row gives the agent one place to read share of voice and average rank.

### How it works

- Each prompt goes to the engine's model through its official API with the engine's own web search switched on, reached through Apify's OpenRouter gateway: ChatGPT uses OpenAI's web search, Gemini uses Google Search grounding, Claude uses Anthropic's web search and Perplexity uses its Sonar search.
- Models: ChatGPT = OpenAI GPT Luna, Gemini = Gemini Flash, Claude = Claude Haiku, Perplexity = Sonar. The newest release in each family is picked automatically; each row names the exact model.
- Country: ChatGPT, Gemini and Claude are told the user's approximate location and search from that country. Perplexity gets "(I'm searching from ...)" added to the prompt for any country other than the United States, because it builds its search from the prompt.
- Gemini is asked to ground its answer with Google Search and to answer for the user's country, because without that it often answers from memory, with no sources and for the United States.
- Ranking: a small AI model (no web search) reads each answer and lists the options it presents, in order. Rank is the position in the answer's main list or table (item 3 of a numbered list is rank 3); options presented elsewhere follow in the order they are first named. Options grouped in one item ("Nedbank, Standard Bank and FNB") share that item's rank. Names the answer advises against, and the product a prompt asks alternatives to, are mentioned but not ranked. Every rank and mention is checked against the answer text, so a name the answer never uses is never reported.
- Mentions match your brand name, your aliases and your domain as whole words, case-insensitively. Citations count your domain and its subdomains.

### Honest limits

- **Answers come from the models' APIs with web search, not from the chat apps.** They mirror what ChatGPT, Gemini, Claude and Perplexity show (same model families, same search providers), but they are not a copy of the app page: no logged-in history or memory, no shopping cards, maps or ads, and the apps may run a different model from the one used here.
- **Answers vary from run to run.** The same prompt can rank you 2nd today and 4th tomorrow. Track several prompts over several runs and read the averages, not one answer.
- **Rank depends on the answer's format.** Lists and tables rank cleanly. In prose answers, rank is the order in which options are first named. An answer that names you only as the subject ("best HubSpot alternatives") mentions you without ranking you, so `brandRank` is `null` there.
- **Sentiment is coarse.** It is one label for how the whole answer describes you.
- **Some answers have no sources.** Gemini and others sometimes answer without searching; those rows have `status: "no-sources"` and are still charged, because the answer and the ranks are delivered.
- **Common-word brand names** (for example "Close" or "Monday") can be hard to match. Add aliases, and the domain, so the check can tell your brand from the word.
- If a rank cannot be read from an answer, the row falls back to the order of first mention among your brand and competitors (`rankSource: "first-mention"`).

### FAQ

**Is this affiliated with OpenAI, Google, Anthropic or Perplexity?**
No. This Actor is independent and is not affiliated with, sponsored by or endorsed by OpenAI, Google, Anthropic or Perplexity. Their product names are used only to say which AI engine answered.

**Do I need API keys or accounts?**
No. The AI calls go through Apify's OpenRouter gateway with your Apify account; you need nothing else.

**Why is AI usage billed separately?**
Apify's gateway bills each model's actual usage to the account that runs the Actor, at OpenRouter's rates. You see the real cost of each engine (`aiUsageUsd` per row) instead of a padded flat price, and cheaper engines such as Perplexity cost you less.

**How many questions can I check?**
Up to 1,000 questions per run, on up to four AIs (on Apify's free plan, the first 8 checks per run). Checks run 8 at a time by default; 50 prompts on four engines usually finish in about 5 to 10 minutes.

**Can I track several brands?**
Run once per brand, or put the other brands under `competitors`: every competitor gets its own rank, sentiment and citation per answer, and its own line in the summary.

**What does a failed check cost?**
Nothing. If an engine fails after retries, the row says why (`status: "error"`) and is not charged.

**Which countries are supported?**
50 countries, including the United States, United Kingdom, Canada, Australia, Germany, France, India, Brazil and South Africa.

# Actor input Schema

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

The questions your buyers ask AI assistants, one per line, written the way a person would type them, for example 'best CRM for small business'. Each prompt is asked on every engine you pick; one prompt on one engine is one check.

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

Your brand, product or company name as people write it, for example 'HubSpot'.

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

Your website, for example 'hubspot.com', to see whether each answer cites your site (subdomains count). Leave empty to skip the citation check.

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

Competitors to rank next to your brand, one per line, as 'Name | domain.com', a name or a domain. Each gets its own rank, mention, sentiment and citation per answer, and the summary gives share of voice.

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

Which AI assistants to check. Each one answers with its own live web search. Each question on each AI is one check (about $0.05 with AI usage on a paid Apify plan).

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

The searcher's country. Each engine is told the user's approximate location and searches from it, so local prompts get local answers and sources.

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

Other spellings or product names that should count as your brand, for example 'HubSpot CRM' or 'Hub Spot'.

## `maxConcurrency` (type: `integer`):

How many checks run in parallel.

## Actor input object example

```json
{
  "prompts": [
    "What are the best CRM tools for a small business?"
  ],
  "brand": "HubSpot",
  "domain": "hubspot.com",
  "competitors": [
    "Salesforce | salesforce.com",
    "Pipedrive | pipedrive.com",
    "Zoho CRM | zoho.com"
  ],
  "engines": [
    "chatgpt",
    "gemini",
    "claude",
    "perplexity"
  ],
  "country": "US",
  "maxConcurrency": 8
}
```

# Actor output Schema

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

Dataset: one row per check, then the run summary.

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

Share of voice, mention rate and average rank per engine and competitor.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

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

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "prompts": [
        "What are the best CRM tools for a small business?"
    ],
    "brand": "HubSpot",
    "domain": "hubspot.com",
    "competitors": [
        "Salesforce | salesforce.com",
        "Pipedrive | pipedrive.com",
        "Zoho CRM | zoho.com"
    ],
    "engines": [
        "chatgpt",
        "gemini",
        "claude",
        "perplexity"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("moggedhq/ai-rank-tracker").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "prompts": ["What are the best CRM tools for a small business?"],
    "brand": "HubSpot",
    "domain": "hubspot.com",
    "competitors": [
        "Salesforce | salesforce.com",
        "Pipedrive | pipedrive.com",
        "Zoho CRM | zoho.com",
    ],
    "engines": [
        "chatgpt",
        "gemini",
        "claude",
        "perplexity",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("moggedhq/ai-rank-tracker").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "prompts": [
    "What are the best CRM tools for a small business?"
  ],
  "brand": "HubSpot",
  "domain": "hubspot.com",
  "competitors": [
    "Salesforce | salesforce.com",
    "Pipedrive | pipedrive.com",
    "Zoho CRM | zoho.com"
  ],
  "engines": [
    "chatgpt",
    "gemini",
    "claude",
    "perplexity"
  ]
}' |
apify call moggedhq/ai-rank-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,moggedhq/ai-rank-tracker"
        }
    }
}
```

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/xD6cIwHMjfWGrIwk9/builds/8iCTqmmgT79nYDye6/openapi.json
