AI Brand Monitor & Visibility — Perplexity, Gemini, ChatGPT
Pricing
from $50.00 / 1,000 citation record delivereds
AI Brand Monitor & Visibility — Perplexity, Gemini, ChatGPT
A single AI answer is not repeatable: ask again and the sources change. This tool asks repeatedly and scores how stable each cited source is. No key needed for Perplexity (24 languages), Google AI Overviews (English) and Gemini; ChatGPT and Claude use yours.
AI Search Visibility Tracker — ChatGPT, Perplexity, Gemini, Google AIO
See which sources ChatGPT, Perplexity and Gemini actually read when someone asks about your category, and where your competitor is cited and you are not. Across 24 languages, with weekly diff alerts and a stability score that filters one-off hallucinations.
Knowing whether you appear is the thermometer. The useful part is the map underneath it.
Every answer comes back with the full source list the model pulled from. Ask "best CRM for small business" and you get the actual domains it cited: G2, a Capterra listing, a Reddit thread, two vendor blogs. That list is a work list. You cannot edit an LLM, but you can get reviews onto G2, get listed on Capterra, and show up in that Reddit conversation. Those are the pages the model reads next month.
The second thing you get is an argument rather than a metric: your competitor is cited in 6 of 10 answers, you are in 1. That is the slide an agency puts in front of a client, and it is why most of the people paying for this category are agencies rather than the brands themselves.
Be clear about the limits before you buy. Nobody reliably knows how to force a citation yet; the source list is the best available lever, not a guaranteed one. LLM answers vary between runs, which is what the stability score is for, so a single measurement means little. AI referral traffic is still small next to Google for most businesses, and no tracker can attribute a sale to an AI mention.
Three things here that the alternatives do not have, and you can check each one against their input schema rather than taking our word for it.
1. It runs in your market's language. Semrush states US-English only; Profound and Otterly are English-first; the most-used Apify alternative has no language parameter at all. That is not a small gap: the same intent surfaces a completely different source set per language. In the run below, the German prompt returns 5 of 7 sources from .de/.at/.ch and the English one 0 of 11. If you sell in Germany, Poland or Hungary, an English-only tracker is measuring somebody else's market.
2. It tells you what is real and what was a one-off. Set samplesPerQuery above 1 and every query runs several times, and each source gets a stability score. A domain cited once in five runs is noise; one cited five times out of five is the model's settled answer. Trackers that ask once cannot tell those apart, and neither can you from a single screenshot.
3. It shows the change, not just the state. Pass last week's dataset ID and you get gained and lost citations per query. A monthly report needs a delta, and "you dropped out of 3 answers since last month" is the line that gets read.
No API key needed, in any of the 24 languages. The default engine asks Perplexity on our key, so you can run it on your brand right now with nothing to sign up for. Free Apify plans get 12 calls per run included; paid plans get 200. Bring your own key to add ChatGPT, Gemini or Claude, and you pay those vendors directly with no markup: this actor charges for the analysis, not for reselling API calls, so you see every underlying cost and pick your own model.
⭐ If this actor saves you time, please rate it on Apify. Reviews raise its Store visibility and help the next person find it.
Table of contents
- Why this actor
- What it does
- Quick start ($0/month)
- Comparison vs Otterly / Profound / Peec / Semrush
- Engine support — Gemini, ChatGPT, Perplexity, Claude
- Output schema
- Stability score — filter out hallucinations
- Delta mode — week-over-week diff
- Recipes
- Use cases by persona
- Pricing
- FAQ
- Troubleshooting
- Local development
- Architecture
- Limitations / honest disclosure
- Roadmap
Why this actor
The Generative Engine Optimization (GEO) tracker market in 2026 is dominated by enterprise tools — Otterly ($29–489/mo), Profound ($99–2k+/mo, no free trial), Peec AI (€89–199/mo), Semrush AI Toolkit ($99–549/mo), Ahrefs Brand Radar ($328+/mo). They share three blind spots:
- Pricing locks out indie SEOs and small agencies — the cheapest viable tier is $29/mo for 15 prompts.
- Multilingual coverage is shallow — Semrush admits "US English only," Profound and Otterly are English-first.
- No bring-your-own-key option — you pay them, they pay the LLM vendors, and you can't see the underlying call.
This actor flips all three:
- $0/month entry point in every language — the default engine needs no key from you at all, in all 24 languages. A free Apify plan covers 12 calls per run, a paid plan 200. Add your own key only when you want a second opinion from ChatGPT, Gemini or Claude.
- 24 languages — Hungarian, German, French, Spanish, Italian, Polish, Czech, Romanian, Turkish, Japanese, Korean, Russian, Ukrainian, and 11 more.
- BYOK transparency — your OpenAI / Perplexity / Anthropic keys, your bills, your data. The actor never proxies your traffic through our account.
What it does
Given a list of queries (e.g. "best CRM for small business", "top fogorvosok Budapesten") and one or more domains you care about, the actor:
- Fans out each query to every selected engine: Perplexity (included, no key, all 24 languages), Google AI Overview (no key, English only), Gemini, ChatGPT (gpt-4o-mini-search-preview), Anthropic Claude with web_search.
- Captures the answer text plus the full source list the model read (URL + title + snippet). This is the part you act on: the domains here are where the model looks for your category, so they are where you need to exist.
- Detects whether each tracked domain appears — via citation OR via brand mention in the answer text.
- Computes citation share-of-voice across your domains and competitor domains.
- Optionally runs each query N times and reports a stability score (how consistently each source is cited — useful for filtering one-shot hallucinations).
- Optionally diffs against a previous run and surfaces gained/lost citations per query (delta mode).
Quick start ($0/month)
Any language: no key, no setup, no signup
The default engine, perplexity-agent, asks Perplexity your question and returns the answer plus every source behind it. It needs no API key from you. Just run it:
{"queries": ["legjobb CRM kisvállalkozásoknak"],"brandDomains": ["yourcompany.hu"],"engines": ["perplexity-agent"],"language": "hu"}
The answer comes back in the language you asked in, and it cites that market's sources. Measured 2026-08-23 on a Hungarian query: 15 sources, 8 of them .hu. Typical run: about 8 seconds per query.
What is included. The calls run on our Perplexity key, so there is a per-run allowance: 12 calls on a free Apify plan, 200 on a paid one. One call is one query on one engine, one sample — so 12 covers 12 queries once each, or 4 queries at 3 samples for a stability score. Go past it and the extra queries come back as not_measured records, unbilled, with a note telling you which options lift the limit.
The keyless English alternative
google-aio reads Google's own AI Overview and the sources it cites, also with no key from anyone:
{"queries": ["best CRM for small business"],"brandDomains": ["yourcompany.com"],"engines": ["google-aio"],"serpCountry": "us"}
It is English-only, and that will not change. Measured 2026-08-04: hl=en completes in ~9 s, while hl=de and hl=hu never finish at all — Google serves the page but withholds the locale bundle that renders the overview to anything it identifies as automated. Seven workarounds were tried and documented in src/engines/google-aio.js; none of them work. For any other language use the default engine, which has no such limit.
Bring your own key for a second opinion
The included engines tell you what Perplexity and Gemini say. To compare that against ChatGPT or Claude, add the matching key:
- Get a free Gemini key: https://aistudio.google.com/apikey (Google account, no credit card, about two minutes).
- Paste it into
geminiApiKeyand add"gemini"toengines.
Your key, your quota, your model choice, and you pay the vendor directly with no markup from us. A run with your own key is not subject to the included-call allowance.
Be realistic about the free Google tier: measured against the live API on 2026-08-02 it is 20 requests per day per model, not the 250-1000 that older versions of this README quoted. The cap is per model, so gemini-2.5-flash and gemini-2.5-flash-lite have separate allowances. That is enough to track a handful of prompts daily at zero cost. For a real portfolio, enable billing on your Google account or add a key for another engine.
Comparison vs Otterly / Profound / Peec / Semrush
| Feature | This actor | Otterly | Profound | Peec AI | Semrush AI | Ahrefs Brand Radar |
|---|---|---|---|---|---|---|
| Entry price | $0/mo (keyless English runs) | $29/mo | $99/mo | €89/mo | $99/mo | $328/mo |
| Pay-per-query option | ✅ $0.05/query | ❌ | ❌ | ❌ | ❌ | ❌ |
| Bring-your-own-key | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| 24-language support | ✅ | ⚠️ EN-default | ⚠️ EN-default | ⚠️ partial | ❌ US-EN only | ⚠️ EN-default |
| Local-CC TLD source surfacing | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Stability score across N samples | ✅ | ⚠️ | ✅ | ❌ | ❌ | ❌ |
| Week-over-week delta diff | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Free trial / no monthly minimum | ✅ | ⚠️ 15 prompts max | ❌ no free trial | ⚠️ | ⚠️ | ❌ |
| CSV export | ✅ via Apify | ✅ | ✅ | ✅ | ✅ | ✅ |
| Apify integration / programmatic API | ✅ native | ❌ | ❌ | ❌ | ❌ | ❌ |
| Open architecture (you see the prompts) | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
Bottom line: if you're an indie SEO, an agency running multi-country campaigns, or a B2B SaaS marketer in a non-English market, the wedge here is real. If you need an enterprise UI with 50 stakeholder seats, look at Profound.
Engine support — Gemini, ChatGPT, Perplexity, Claude
| Engine | Key needed | Approx cost / query | Daily cap | Languages |
|---|---|---|---|---|
| Perplexity (default, included) | ❌ none | $0 to you | 12 calls/run free plan, 200 paid | all 24 |
| Google AI Overview | ❌ none | $0 | none | English only |
| Google Gemini (included) | ❌ none | $0 to you | shared pool: 25 queries/run, 1 sample; your own key lifts both | all 24 |
| OpenAI / ChatGPT | https://platform.openai.com/api-keys | ~$0.025 | vendor limits | all 24 |
| Perplexity Sonar | https://www.perplexity.ai/settings/api | ~$0.005–0.015 | vendor limits | all 24 |
| Anthropic Claude | https://console.anthropic.com/ | ~$0.01–0.02 | vendor limits | all 24 |
The short version: the 20/day cap is not this actor's limit. It is Google's quota on a free Gemini API key, and it only applies if you choose the Gemini engine with a free key. The default engine needs no key from you and has no vendor bill; its limit is the per-run allowance above, not a daily cap. If you track a market at volume, either run on a paid Apify plan or bring your own key.
A single query across all four BYOK engines costs you ~$0.075–0.10 in third-party API fees. You pay them directly. The default engine, perplexity-agent, and the keyless google-aio have no third-party fee for you at all. The actor itself charges $0.05 per citation record on the Apify Store (PAY_PER_EVENT).
Output schema
Each engine call writes one record to the dataset:
{"type": "citation","engine": "gemini","model": "gemini-2.5-flash","query": "best CRM for small business","language": "en","answerText": "...","citationCount": 7,"citations": [{"url": "https://hubspot.com/", "host": "hubspot.com", "registrable": "hubspot.com", "title": "HubSpot CRM"}],"brandMatches": {"yourcompany.com": {"cited": true, "viaCitation": true, "viaText": false, "matchedUrls": ["https://yourcompany.com/pricing"]}},"competitorMatches": {"competitor.com": {"cited": false, "viaCitation": false, "viaText": false, "matchedUrls": []}},"citationShare": {"yourcompany.com": {"hits": 1, "sharePct": 14.3},"competitor.com": {"hits": 0, "sharePct": 0}},"latencyMs": 2104}
The actor also writes one stability record per (query, engine) when samplesPerQuery > 1, one delta record when previousRunDatasetId is set, and a final summary record closing every run.
Two record types mark work that produced nothing, so an incomplete run is never mistaken for a complete one. Neither is billed:
type | When it appears |
|---|---|
empty | The engine answered with no text and no citations. Carries a reason — most often google-aio on a non-English query. |
not_measured | The query was past the included-call allowance and was never sent. Carries a reason naming the allowance and the ways to lift it. |
Stability score — filter out hallucinations
AI answers are not deterministic. Run the same query twice and you'll often get a different set of citations — Gemini and ChatGPT both vary 60–87% per run depending on the model.
The stability score solves this. Set samplesPerQuery: 3 (or 5 for high-confidence work) and the actor:
- Runs the query N times against each engine.
- Counts how many of the N samples cite each domain.
- Reports a
stabilityvalue: 1.0 = cited every time, 0.5 = half the time, 0.2 = one-shot.
Recommended filter: ignore citations with stability < 0.5. These are likely hallucinations rather than real AI rankings. The actor never auto-filters — it surfaces the score so you decide.
{"type": "stability","engine": "gemini","query": "best email marketing platform for SaaS startups","samples": 5,"stability": {"custify.com": {"occurrences": 5, "samples": 5, "stability": 1.0},"sequenzy.com": {"occurrences": 5, "samples": 5, "stability": 1.0},"securemailmerge.com": {"occurrences": 4, "samples": 5, "stability": 0.8},"encharge.io": {"occurrences": 4, "samples": 5, "stability": 0.8},"ventureharbour.com": {"occurrences": 3, "samples": 5, "stability": 0.6},"memberspace.com": {"occurrences": 1, "samples": 5, "stability": 0.2}}}
Delta mode — week-over-week diff
The delta mode makes monitoring meaningful. Two runs alone tell you a snapshot — what matters is what changed.
Pass the previous week's dataset ID as previousRunDatasetId in the input, and the actor writes a delta record:
{"type": "delta","previousRunDatasetId": "5sxIJEsBKrwa0gDgc","gained": {"best CRM for SMB": ["hubspot.com", "pipedrive.com"],"DACH-region B2B SaaS": ["sevdesk.de", "crm-software.at"]},"lost": {"best CRM for SMB": ["salesforce.com"],"top PM tools 2026": ["monday.com"]},"unchangedQueryCount": 7}
A single run with delta mode gives you both today's snapshot AND the diff vs last week — perfect for weekly Slack alerts ("salesforce.com dropped out of 'best CRM' citations this week").
Ask Claude or ChatGPT to run it for you
This actor is callable as a tool by AI assistants through Apify's MCP gateway. Add this URL as a custom connector / MCP server:
https://mcp.apify.com/?tools=highbrow_fame/ai-search-visibility-tracker
The assistant then sees one tool, highbrow_fame--ai-search-visibility-tracker, carrying this
actor's own input fields, so "check whether hubspot.com gets cited for 'best CRM for small
business'" is enough to start a run and read the answer back. There is a neat symmetry to it:
you are asking an AI assistant to go measure what the AI engines say about your brand. Runs
started this way bill to your own Apify account at the normal per-record rate, and the default
engine still needs no API key from you.
Verified against the live gateway on 2026-08-27. Comma-separate to add more:
?tools=highbrow_fame/ai-search-visibility-tracker,highbrow_fame/google-maps-email-extractor.
Recipes
Daily monitoring with weekly diff
Schedule the actor daily via Apify schedules. Pass last week's defaultDatasetId as previousRunDatasetId to get a weekly diff alongside today's snapshot.
{"queries": ["best CRM for small business", "top SaaS marketing tools"],"brandDomains": ["yourcompany.com"],"competitorDomains": ["competitor1.com", "competitor2.com"],"engines": ["gemini"],"geminiApiKey": "AIza...","samplesPerQuery": 3,"previousRunDatasetId": "<paste-from-last-weeks-run>"}
Multilingual brand share-of-voice
Set language: "hu" (or de, fr, …) and Gemini will reply in that language and prefer same-language sources. Especially useful for European B2B SaaS, agencies running multi-country pipelines, or local SEO consultants.
{"queries": ["legjobb CRM kis vállalkozásoknak", "top projektmenedzsment szoftver"],"brandDomains": ["yourcompany.com"],"engines": ["gemini"],"geminiApiKey": "AIza...","language": "hu","samplesPerQuery": 3}
Stability filter for hallucinations
Set samplesPerQuery: 3 and ignore citations whose stability < 0.5 — these are likely one-shot hallucinations rather than reliable AI rankings.
Multi-engine consensus tracking
To find sources cited consistently across all 4 engines (the strongest signal), select all 4 engines and look for citations that appear in every engine's record:
{"queries": ["best open-source web scraping framework"],"brandDomains": ["yourcompany.com"],"engines": ["gemini", "openai", "perplexity", "anthropic"],"geminiApiKey": "AIza...","openaiApiKey": "sk-...","perplexityApiKey": "pplx-...","anthropicApiKey": "sk-ant-..."}
Use cases by persona
SEO agency lead (10–50-person shop)
You manage GEO for 5–30 client brands. Otterly's $189/mo plan caps you at 100 prompts (~3 prompts per client). Profound and Peec scale linearly with cost.
With this actor: pay-per-query at $0.05 with white-label CSV export. 30 clients × 50 prompts/month = 1,500 queries × $0.05 = $75/month total. Charge each client $50–100 for the report — that's $1,425–2,925/month margin.
In-house SEO at B2B SaaS
Your CMO asks weekly: "Are we showing up in ChatGPT?" You don't need a $499/mo dashboard — you need a daily snapshot dropped into Slack.
With this actor: schedule the actor daily, parse the delta record, fire a Slack webhook on lost citations. Total tooling cost: $75–225/month for 50 prompts × 30 days × $0.05 (up to 3 samples for stability).
PR / Comms team
Crisis-monitoring AI search results — "are negative articles getting cited when people ask about us?"
With this actor: run nightly with a sentiment-pass downstream (any LLM you wire up). Pay-per-query is perfect for the bursty workload.
Indie SEO / consultant
You charge clients $300–600/month for SEO consulting. GEO is the new add-on. Otterly Lite is $29 for 15 prompts — barely enough for one client.
With this actor: $0.05/prompt, and English runs need no AI key at all — the default google-aio engine has no vendor cost and no per-key daily cap. Mark up the actor cost 10× and you've added $150/client/month with no tool overhead.
Hungarian / German / French / Polish B2B brand
The Otterly/Profound/Peec stack treats your market as an afterthought. Same prompt in your language surfaces a completely different set of sources — and that's the rendering your prospects see.
With this actor: run all your queries in your language, surface .hu/.de/.fr/.pl sources, build a positioning brief that matches your local prospect's actual search experience.
Pricing
The actor uses PAY_PER_EVENT pricing on the Apify Store:
| Event | Charge | Description |
|---|---|---|
apify-actor-start | $0.0001 | Per run start. Tiny platform overhead. |
citation-record | $0.05 | Per citation record delivered (one engine × one query × one sample). |
error / stability / delta / summary | $0 | Not billed. |
Your true cost per query depends on which engines you select:
- Perplexity (default, included, no key) → $0 LLM for you + $0.05 actor = $0.05/query
- Google AI Overview (no key, English) → $0 LLM + $0.05 actor = $0.05/query
- Gemini, free tier (20 requests/day per model) → $0 LLM + $0.05 actor = $0.05/query
- Gemini, paid tier → ~$0.035 LLM (grounded search is billed per request, not per token) + $0.05 actor = ~$0.085/query
- All four BYOK engines paid → ~$0.075–0.10 LLM + $0.20 actor (one citation record per engine) = ~$0.275–0.30/query
For comparison, Otterly's effective per-prompt rate is $1.93 (= $29/15 prompts on the Lite plan). This actor is 95–99% cheaper.
FAQ
Q: Do I have to use Gemini? Can I run only on ChatGPT?
A: Yes. You can supply only the OpenAI key and select engines: ["openai"]. The actor will skip Gemini gracefully. Same for any engine combo — if a key is missing, the engine is skipped with a warning.
Q: Is my API key safe?
A: Yes. The Apify input-schema marks all key fields as isSecret: true. They're encrypted at rest and never logged. You can also store the key in your Apify account's secret store and reference it via {{secrets.geminiApiKey}} in the input.
Q: How is this different from running ChatGPT manually? A: Three things: (1) automated scheduled runs with diff alerts; (2) consistent multi-engine + multilingual coverage; (3) structured dataset output you can pipe into your BI / CRM / SEO dashboard.
Q: Why doesn't it scrape ChatGPT.com directly?
A: Two reasons. First, OpenAI's ToS forbids automated extraction. Second, the official Responses API with the web_search_preview tool returns the same answer quality plus structured citations — and is BYOK-compliant.
Q: Does this cover Google AI Overviews?
A: Yes. Set engines: ["google-aio"] and it reads Google's own result page through Apify's SERP proxy, extracting the AI Overview text plus the sources behind it — no API key needed from anyone. It is English-only: Google does not serve the language JS bundle through the SERP proxy, so non-English AI Overviews never render. That is why the default engine is perplexity-agent, which has no such limit and also needs no key from you.
Q: How do I track citations from Bing Chat / Copilot / Grok?
A: Not in v0.1. The architecture supports adding engines (one file under src/engines/); roadmap items.
Q: Will this work for Hungarian / Polish / Turkish keywords?
A: Yes. Set language: "hu" (or pl, tr, …). Gemini, ChatGPT, Perplexity all handle these languages natively. The citation-parser is language-agnostic — it works on URLs and domains, not text.
Q: What if a query returns no citations?
A: The record is still written with citationCount: 0 and citations: []. The brand-matching logic also checks the answer text for the brand name, so you'll still see viaText: true/false even when no URLs are returned.
Q: How do I export to CSV?
A: From the Apify dataset UI: open the run → Storage → Export → CSV. Or via API: https://api.apify.com/v2/datasets/<id>/items?format=csv.
Q: Can I run this on a schedule? A: Yes. Apify schedules are free up to 100 schedules per account. Set up a daily/weekly cron in the Apify Console.
Q: Why is the GEO/AEO market so crowded if multilingual is unsolved? A: Most enterprise tooling vendors are based in the US — their default assumption is English-default. The European market is small enough that the dominant US players don't prioritize it, but big enough that an indie tool can carve a niche. That's the wedge.
Q: Will the actor still work after Gemini changes its model names?
A: Yes. The default model is configurable via geminiModel input. If gemini-2.5-flash is renamed, you set geminiModel: "gemini-3-flash" (or whatever) without a code change. Same for OpenAI / Perplexity / Anthropic models.
Q: Does it support paid Gemini tiers (gemini-2.5-pro, gemini-3-flash-preview)?
A: Yes. Set geminiModel: "gemini-2.5-pro" or any model accessible to your key. The free Gemini tier covers gemini-2.5-flash and gemini-2.5-flash-lite only — paid models require billing enabled on your Google AI Studio account.
Q: What exactly am I charged, and when did that change? A: $0.05 per citation record from 10 August 2026. Before that date the rate was $0.02, and before 14 May 2026 the actor was free while Apify's mandatory 14-day price-change notice ran. You are never charged for the AI vendor's API calls — those go to your own key, billed by them directly.
Troubleshooting
Problem: All citations return google.com host.
Cause: Old build. Gemini's grounding API returns redirect URLs that look like vertexaisearch.cloud.google.com/grounding-api-redirect/.... v0.1.1+ extracts the real source from the web.title field. Make sure you're running the latest build.
Problem: "Quota exceeded for metric: generativelanguage.googleapis.com/generate_content_free_tier_requests"
Cause: You're hitting Gemini's free-tier daily limit. Measured 2026-08-02: 20 requests per day, per model on both gemini-2.5-flash and gemini-2.5-flash-lite — Google has tightened this considerably, so check the current limits before planning around any number. Since the cap is per model, switching geminiModel gets you a fresh allowance. Other solutions: (a) wait for the daily reset, (b) enable billing on your Google AI Studio account, (c) supply an OpenAI/Perplexity/Anthropic key as fallback.
The actor tells these apart for you: a per-minute limit is retried automatically with backoff, while a spent daily quota fails immediately with a message saying so, instead of stalling the run on a window that won't reopen.
Problem: Citations vary on every run.
Cause: AI answers are non-deterministic. This is expected. Solution: set samplesPerQuery: 3 (or 5) and use the stability score to filter out one-shot citations.
Problem: "Engine 'X' selected but no API key supplied — skipping."
Cause: You selected an engine in engines but didn't provide its API key. Add the key, or remove the engine from the selection.
Problem: "Invalid value provided in updatedActor: description must be at most 300 characters long." Not a runtime issue — this is an Apify Store metadata constraint. Doesn't affect actor execution.
Problem: Run succeeds but the dataset is empty.
Cause: All engine calls failed silently (likely all keys missing or invalid). Check the run log — error records should still be in the dataset, and the summary record's stats.failed field tells you the error count.
Problem: 503 errors on Gemini. Cause: Vendor-side overload. This is transient. The actor doesn't auto-retry on 503 in v0.1 — re-run the same input after a few minutes.
Problem: Apify Store page shows old README / icon. Cause: Apify Store CDN cache — typically 10–30 minutes after a build. Hard-refresh the public page or wait.
Local development
# install depsnpm install# unit tests on pure-JS utils (no API keys, no network)npm test# end-to-end smoke test against real enginesGEMINI_API_KEY=AIza... npm run smoke
scripts/test-utils.js validates the citation parser, brand-detector, share-of-voice math, stability computation and delta diff with hand-crafted fixtures — runs in under 100ms with no network.
scripts/smoke.js calls each engine for which a key is set and prints a compact citation report. Useful for verifying the adapters still work after API surface changes.
scripts/test-comprehensive.js is a 6-phase live integration runner that verifies all engine adapters with billing-aware error handling. Used to certify each release.
Architecture
.├── .actor/ Apify actor metadata (actor.json, input_schema.json)├── src/│ ├── main.js entry point — reads input, fans out, writes dataset│ ├── utils.js pure helpers (no I/O): canonicalHost, citation parsing, share-of-voice, delta diff│ └── engines/│ ├── gemini.js Gemini 2.5 Flash + google_search grounding (free tier)│ ├── openai.js Responses API + web_search_preview tool│ ├── perplexity.js Chat completions + sonar model│ └── anthropic.js Messages API + web_search tool├── scripts/│ ├── test-utils.js offline assertions for utils.js│ ├── smoke.js live-network smoke test for the engine adapters│ ├── test-comprehensive.js 6-phase integration runner (multi-model, multilingual, stability, delta, edge cases)│ ├── cloud-run.js REST-API trigger + status poll for cloud verification│ └── update-actor-metadata.js applies Store metadata via API (idempotent)└── INPUT_SCHEMA.json legacy top-level schema (also at .actor/input_schema.json)
The four engine adapters share the same return shape so main.js doesn't care which engine produced a record. Adding a new engine = one file under src/engines/ plus one entry in engineAdapters in main.js.
Limitations / honest disclosure
- AI answers are non-deterministic. A single sample of a single query can miss citations that appear most of the time — that's why we expose
samplesPerQueryand a stability score. Don't make business decisions on asamplesPerQuery: 1snapshot; use 3+ for monitoring you trust. - The free Gemini tier is small, and got smaller. Measured against the live API on 2026-08-02: 20 requests per day, per model on both
gemini-2.5-flashandgemini-2.5-flash-lite, plus a per-minute limit on top. Earlier versions of this README quoted 250/day and ~1000/day — those numbers were accurate when written and are not any more, which is the honest lesson: treat any published quota as a snapshot. The cap is per model, sogemini-2.5-flashandgemini-2.5-flash-litehave separate allowances. For sustained monitoring, enable billing on your Google account or bring a key for another engine. - Google AI Overview capture is English-only. The default
google-aioengine reads the literal AI Overview block, but only in English: the language JS bundle is blocked through the SERP proxy, so a German or Hungarian query renders a header and never finishes. This is bot detection, not a language bug — seven fixes were attempted and all failed. For non-English markets use Gemini grounding, which queries the same search index. - Engines may shift their APIs. OpenAI's
web_search_previewand Anthropic'sweb_search_20250305are explicitly versioned tools. We pin sensible defaults; if a vendor breaks compatibility, the relevant adapter file is the only file that needs to change. - Only
gemini-2.5-flashandgemini-2.5-flash-liteare truly free despite Gemini's API listing 38 models. The rest require billing enabled on your Google account — the adapter dispatches the request correctly but the vendor returns 429. - No SEO ranking guarantees. This actor measures what AI engines cite — not what to do about it. If the data shows you don't appear, the next steps (improve content, build links, target citation-friendly keywords) are still SEO 101.
Roadmap
- v0.2 — Google AI Overview capture via the existing
apify/google-search-scraperactor (chained, BYOK Apify proxy). - v0.3 — Slack / Discord / webhook alerting on citation gains/losses (delta mode hooks).
- v0.4 — White-label CSV export with agency branding and per-client dashboards.
- v0.5 — Public weekly leaderboards (e.g. "Top 50 brands cited in ChatGPT for project management software, EN/DE/HU") generated from aggregated runs of consenting users — distribution / SEO play.
- v0.6 — Sentiment classification on the answer text (positive / neutral / negative mentions).
- v0.7 — Microsoft Copilot, You.com, Grok engine adapters.
License
ISC. Use it, fork it, ship it. Pull requests welcome — see https://github.com/highbrow_fame/ai-search-visibility-tracker if you'd like to contribute (TODO: open-source the repo).