More buyers now ask an AI assistant "what is the best tool for X" before they ever open a search engine. If your brand is not in that answer, you lose the deal without knowing it happened. Checking by hand means typing the same prompts into three apps, every week, and trying to remember what each one said.
The AI Search Visibility Tracker, published by Hay Equipos on the Apify Store, automates that check. You give it a list of prompts, your brand name and your domain. It sends each prompt to ChatGPT (OpenAI with web search), Perplexity and Gemini (with Google Search grounding), and reports what each answer says about you and your competitors.
What you get back
One row per prompt per engine, plus summary rows per engine and overall. A shortened result row (illustrative values):
{
"recordType": "result",
"prompt": "What are the best invoicing tools for freelancers?",
"engine": "perplexity",
"brandName": "ExampleApp",
"brandMentioned": true,
"brandMentionCount": 2,
"brandRank": 3,
"brandListPosition": 3,
"brandCited": true,
"brandCitationPosition": 4,
"shareOfVoice": 0.25,
"visibilityScore": 72,
"competitorsMentioned": [{ "name": "RivalOne", "rank": 1, "cited": true }],
"citations": [{ "position": 1, "url": "https://rivalone.example/pricing", "domain": "rivalone.example" }]
}
The summary rows give mention rate, citation rate, average visibility score, average rank when mentioned, average share of voice, the competitors named most often and the domains the engines cite most.
The visibility score runs from 0 to 100:
| Part | Points |
|---|---|
| Brand mentioned | 40 |
| Named first, second, third or fourth among tracked brands | 20, 15, 10 or 5 |
| Brand site cited as a source | 30 |
| Citation prominence (first source, then 2 fewer per position) | up to 10 |
brandRank is the order in which your brand first appears among the names you track. brandListPosition is the list item it first appears in, if the answer is a list. shareOfVoice is your mentions divided by all tracked mentions in that answer.
Bring your own API keys
You supply your own OpenAI, Perplexity and Gemini keys. They are secret inputs, stored encrypted by Apify, sent only to the matching provider and never written to the log or the dataset. Each provider bills you directly at its own rates. An engine without a key is skipped. With no keys at all, the actor runs a free demo on bundled sample answers so you can see the output format first.
Step by step in the Apify Console
- Open the actor on the Apify Store and start it in the Console.
- Add your Prompts, one per line (up to 500 per run).
- Enter your Brand name, your Brand domain and any Brand aliases such as product names.
- Add Competitors, each optionally followed by its domain in brackets, like
RivalOne (rivalone.example), so their citations are tracked too. - Choose the Engines and paste the keys for the ones you use.
- Optionally set a two letter Country code for localized search where the engine supports it.
- Click Start. Export the dataset, or read the
SUMMARYrecord in the key value store.
Calling it from code
curl, with keys passed in the input (keep them in environment variables, not in scripts):
curl -X POST \
"https://api.apify.com/v2/acts/pistachio_implementation~ai-search-visibility-tracker/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d "{\"prompts\": [\"What are the best invoicing tools for freelancers?\"], \"brandName\": \"ExampleApp\", \"brandDomain\": \"exampleapp.com\", \"engines\": [\"perplexity\"], \"perplexityApiKey\": \"$PERPLEXITY_API_KEY\"}"
Python with apify-client:
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("pistachio_implementation/ai-search-visibility-tracker").call(
run_input={
"prompts": [
"What are the best invoicing tools for freelancers?",
"Which invoicing app is easiest for a small agency?",
],
"brandName": "ExampleApp",
"brandDomain": "exampleapp.com",
"competitors": ["RivalOne (rivalone.example)", "RivalTwo (rivaltwo.example)"],
"engines": ["openai", "perplexity", "gemini"],
"openaiApiKey": os.environ.get("OPENAI_API_KEY"),
"perplexityApiKey": os.environ.get("PERPLEXITY_API_KEY"),
"geminiApiKey": os.environ.get("GEMINI_API_KEY"),
}
)
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
if row["recordType"] == "summary":
print(row["engine"], row["mentionRate"], row["averageVisibilityScore"])
Leave all keys out and the same call returns the free demo.
Pricing
Pay per event: $0.02 for each prompt answered and analyzed on one engine. Twenty prompts on three engines is 60 analyses, so $1.20 here, plus whatever OpenAI, Perplexity and Google bill you on your own keys. Failed calls, rejected keys, summary rows and demo runs are free. You can cap spend with the run's maximum charge setting.
Limits and what it does not do
- AI answers vary from run to run. Track the same prompts on a schedule and read the trend, not a single run.
- API answers can differ from what a signed in user sees in the ChatGPT, Perplexity or Gemini apps, which add personalization and memory.
- Gemini returns sources as Google redirect links, so the actor reports the source domain only, not the page URL.
- Mentions are matched as whole words, case insensitive. Short or generic brand names can match unrelated uses, so add a distinctive alias.
- Google AI Overviews are not covered, because there is no official API for them.
- The default models are
gpt-4.1-mini,sonarandgemini-2.5-flash; you can change them in the advanced settings. - It is not affiliated with OpenAI, Perplexity or Google.
Try it on the Apify Store: https://apify.com/pistachio_implementation/ai-search-visibility-tracker
Top comments (0)