# AI Search Rank Tracker - ChatGPT & AI Brand Visibility (`signalgrove/ai-search-rank-tracker`) Actor

Track how ChatGPT, Claude, Gemini & Perplexity talk about your brand. Runs your target prompts, scores mentions, recommendations & share-of-voice vs competitors, extracts cited sources, and alerts you via webhook when your AI visibility changes. The rank tracker for AI search (GEO).

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

## Pricing

from $60.00 / 1,000 ai query (built-in keys)s

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/docs.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.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/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 Search Rank Tracker

**Know what ChatGPT, Claude, Gemini, and Perplexity say when your customers ask about your market.**

AI assistants are the new search results page. When someone asks ChatGPT *"what's the best CRM for a small agency?"*, the brands in that answer win the customer — and the brands that aren't mentioned don't even know they lost. This actor measures your brand's AI visibility the way rank trackers measure Google rankings, and alerts you when it changes.

### What it does

For every prompt you define (the questions your customers actually ask), the actor queries up to four AI assistants — **ChatGPT, Claude, Gemini, and Perplexity** — with web-grounded answers where available, then scores each response:

- **Brand mentioned?** How early in the answer? How many times?
- **Recommended** — is your brand endorsed, or just name-dropped?
- **Negative context detection** — flagged when your brand appears near criticism
- **Share of voice** — your mentions vs. each competitor you track
- **Visibility score (0–100)** per answer, per provider, and overall
- **Cited sources** — which domains the AI assistants cite when answering (these are the pages to influence)

Every run produces a clean dataset (one row per prompt × provider, full answer text included) plus an aggregated summary report, and stores history so runs are compared **run-over-run** — with webhook alerts when your visibility moves.

### Why teams run it on a schedule

AI answers drift constantly: models update, grounding sources change, competitors publish. A single snapshot is trivia; a weekly tracked trend is strategy. Schedule this actor weekly (Apify Schedules, two clicks) and you get:

- A time series of your AI visibility per provider
- Alerts the week a competitor displaces you in ChatGPT's recommendations
- The exact cited domains to target with content/PR to improve your AI presence

### Pricing

You pay per event — no subscription: one event per AI query (reduced rate with your own API keys), plus one run-report event per run. A weekly tracking run with 10 prompts × 4 providers is 40 queries + 1 report.

### FAQ

**Which questions should I use as prompts?** The ones your buyers ask: "best X for Y", "X vs Y", "how do I solve Z". Start with 5–10; refine based on which show competitor mentions.

**Do I need my own OpenAI/Anthropic keys?** No — the default mode uses built-in access. Optionally supply your own keys for the reduced BYOK rate.

**Is this SEO?** It's GEO — Generative Engine Optimization. The `citedDomains` field tells you exactly which pages the AIs trust; earning mentions on those pages is how you move these scores.

**Can other tools consume this?** Yes — standard Apify dataset (JSON/CSV/Excel export, API access), webhook alerts for Slack/Zapier/n8n, and the actor works via MCP for AI-agent workflows.

---

Built and maintained by **signalgrove** — small data tools, clean output, honest pricing. Found an issue or want a feature? Open an issue on this actor's page; we respond fast.

---

*Also by signalgrove: [ATS Jobs API](https://apify.com/signalgrove/ats-jobs-api) — job postings from Greenhouse, Lever, Ashby, Workday and 4 more ATSs, with new-job delta mode and webhook alerts.*

# Actor input Schema

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

The brand, product, or company whose AI visibility you want to track (e.g. "Notion").
## `brandAliases` (type: `array`):

Other names the brand goes by (e.g. "Notion HQ", "notion.so"). Mentions of any alias count as brand mentions.
## `competitors` (type: `array`):

Competitor brands to score share-of-voice against (up to 10).
## `prompts` (type: `array`):

The questions a potential customer might ask an AI assistant (e.g. "What is the best note-taking app for teams?"). One query is billed per prompt per provider.
## `providers` (type: `array`):

Which AI assistants to query.
## `enableWebSearch` (type: `boolean`):

Ask providers to use their web search / grounding mode where available. Falls back to plain answers automatically if grounding fails.
## `apiKeys` (type: `object`):

Bring-your-own-keys mode: JSON object with any of "openai", "anthropic", "gemini", "perplexity". Queries made with your keys are billed at the reduced BYOK event rate. Keys are used only for this run and never stored.
## `models` (type: `object`):

JSON object overriding the default model per provider, e.g. {"openai": "gpt-4o-search-preview"}.
## `webhookUrl` (type: `string`):

POSTed a JSON summary after each run, including changes vs the previous run. Use for Slack/Discord/Zapier alerts.
## `alertOnlyOnChange` (type: `boolean`):

If enabled, the webhook fires only when visibility, recommendation status, or share-of-voice moved vs the previous run.
## `trackingId` (type: `string`):

Identifier for run-over-run comparison history. Defaults to a slug of the brand name.
## `maxParallel` (type: `integer`):

How many provider queries to run concurrently.

## Actor input object example

```json
{
  "brandName": "Notion",
  "brandAliases": [],
  "competitors": [],
  "providers": [
    "openai",
    "anthropic",
    "gemini",
    "perplexity"
  ],
  "enableWebSearch": true,
  "alertOnlyOnChange": false,
  "maxParallel": 4
}
````

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("signalgrove/ai-search-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("signalgrove/ai-search-rank-tracker").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 '{}' |
apify call signalgrove/ai-search-rank-tracker --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "AI Search Rank Tracker - ChatGPT & AI Brand Visibility",
        "description": "Track how ChatGPT, Claude, Gemini & Perplexity talk about your brand. Runs your target prompts, scores mentions, recommendations & share-of-voice vs competitors, extracts cited sources, and alerts you via webhook when your AI visibility changes. The rank tracker for AI search (GEO).",
        "version": "0.0",
        "x-build-id": "CleF2FR0hFmc5NBuY"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/signalgrove~ai-search-rank-tracker/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-signalgrove-ai-search-rank-tracker",
                "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/signalgrove~ai-search-rank-tracker/runs": {
            "post": {
                "operationId": "runs-sync-signalgrove-ai-search-rank-tracker",
                "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/signalgrove~ai-search-rank-tracker/run-sync": {
            "post": {
                "operationId": "run-sync-signalgrove-ai-search-rank-tracker",
                "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",
                    "prompts"
                ],
                "properties": {
                    "brandName": {
                        "title": "Brand name",
                        "type": "string",
                        "description": "The brand, product, or company whose AI visibility you want to track (e.g. \"Notion\")."
                    },
                    "brandAliases": {
                        "title": "Brand aliases",
                        "type": "array",
                        "description": "Other names the brand goes by (e.g. \"Notion HQ\", \"notion.so\"). Mentions of any alias count as brand mentions.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "competitors": {
                        "title": "Competitors",
                        "maxItems": 10,
                        "type": "array",
                        "description": "Competitor brands to score share-of-voice against (up to 10).",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "prompts": {
                        "title": "Prompts to test",
                        "minItems": 1,
                        "maxItems": 50,
                        "type": "array",
                        "description": "The questions a potential customer might ask an AI assistant (e.g. \"What is the best note-taking app for teams?\"). One query is billed per prompt per provider.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "providers": {
                        "title": "AI providers",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Which AI assistants to query.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "openai",
                                "anthropic",
                                "gemini",
                                "perplexity"
                            ],
                            "enumTitles": [
                                "ChatGPT (OpenAI)",
                                "Claude (Anthropic)",
                                "Gemini (Google)",
                                "Perplexity"
                            ]
                        },
                        "default": [
                            "openai",
                            "anthropic",
                            "gemini",
                            "perplexity"
                        ]
                    },
                    "enableWebSearch": {
                        "title": "Prefer web-grounded answers",
                        "type": "boolean",
                        "description": "Ask providers to use their web search / grounding mode where available. Falls back to plain answers automatically if grounding fails.",
                        "default": true
                    },
                    "apiKeys": {
                        "title": "Your own API keys (optional)",
                        "type": "object",
                        "description": "Bring-your-own-keys mode: JSON object with any of \"openai\", \"anthropic\", \"gemini\", \"perplexity\". Queries made with your keys are billed at the reduced BYOK event rate. Keys are used only for this run and never stored."
                    },
                    "models": {
                        "title": "Model overrides (optional)",
                        "type": "object",
                        "description": "JSON object overriding the default model per provider, e.g. {\"openai\": \"gpt-4o-search-preview\"}."
                    },
                    "webhookUrl": {
                        "title": "Alert webhook URL (optional)",
                        "type": "string",
                        "description": "POSTed a JSON summary after each run, including changes vs the previous run. Use for Slack/Discord/Zapier alerts."
                    },
                    "alertOnlyOnChange": {
                        "title": "Only call webhook when something changed",
                        "type": "boolean",
                        "description": "If enabled, the webhook fires only when visibility, recommendation status, or share-of-voice moved vs the previous run.",
                        "default": false
                    },
                    "trackingId": {
                        "title": "Tracking ID (optional)",
                        "type": "string",
                        "description": "Identifier for run-over-run comparison history. Defaults to a slug of the brand name."
                    },
                    "maxParallel": {
                        "title": "Max parallel queries",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "How many provider queries to run concurrently.",
                        "default": 4
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
