LLM Visibility Monitor: AI Search Brand Audit
Pricing
from $150.00 / 1,000 standard llm samples
LLM Visibility Monitor: AI Search Brand Audit
See whether AI models recommend your brand. Asks real buyer questions (without naming you) to the API models behind ChatGPT, Claude, Gemini, Perplexity and Grok, with or without live web search, and reports mentions, cited sources, competitor share and changes since your last run.
Pricing
from $150.00 / 1,000 standard llm samples
Rating
5.0
(1)
Developer
Omar Eldeeb
Maintained by CommunityActor stats
3
Bookmarked
26
Total users
2
Monthly active users
14 days ago
Last modified
Categories
Share
What does LLM Visibility Monitor do?
LLM Visibility Monitor checks whether AI models recommend your brand when buyers ask about your category. It writes a set of realistic buyer questions for your category with AI ("Which CRM is easiest to set up for a real estate agency?", "What are good alternatives to Salesforce for a startup?"), saves it, and asks the same questions on every run, without ever naming your brand, website, or competitors in the request, to the API models behind ChatGPT, Claude, Gemini, Perplexity, and Grok. It then measures whether your brand is mentioned, whether it makes the top 3, how it is described, which sources are cited, which competitors (including ones you don't track) win instead, and turns that into a 30-day action plan.
It is built for SEO and GEO agencies, brand marketers, and founders who need evidence-backed, repeatable AI visibility reporting: a dataset you can export, a client-ready markdown report, and a week-over-week trend, all runnable on a schedule through the Apify API.
What it is not: every surface is an API-model approximation of a consumer AI product, called through OpenRouter. The model family matches the consumer app, but the answers do not come from the logged-in ChatGPT, Claude, Gemini, or Perplexity apps, and this Actor does not collect Google AI Overviews or Google AI Mode results. Each row says exactly which model answered and whether it used live web search.
Why use LLM Visibility Monitor?
- Unprimed questions. The request contains only the buyer's question and the buyer's country and language. Nothing in the request leads the model toward your brand, so when it names you, it did so on its own.
- AI-written, stable question sets, free. The question set covers the intents buyers actually have (best-for a use case, alternatives to a competitor, comparisons, pricing, "how do I..." problems, local questions) plus a few questions that name your brand. It is written in your language, saved, and reused so week-over-week trends compare the same questions. The generator is never told your brand name, so it cannot tilt the unbranded questions toward your strengths.
- Honest headline numbers. Headline metrics use unbranded questions only. Questions that name your brand ("Is HubSpot worth the price?") are reported separately, to show what AI says about you.
- Per-surface and per-intent breakdown. Mention rate, top-3 rate, average position, sentiment, owned-site citation rate, and consistency for each AI surface, and mention and top-3 rates by buyer intent (for example strong on "best for" questions but invisible on "alternatives to Salesforce").
- Competitors you don't track. Brands the answers keep recommending that are not on your competitor list are listed with the questions where they win.
- 30-day action plan. Up to six ranked, specific actions, each quoting what the run observed (the question, the surfaces, who was named instead, which sources were cited).
- Brand claims to verify. Prices, plans, limits, and company facts the answers state about your brand, quoted by surface, so you can catch outdated or invented facts. The Actor quotes them; it does not judge them true or false.
- Competitors on the same scale. Each competitor's mention rate uses the same questions and denominator as yours.
- Source intelligence. Every cited domain is classified as owned, competitor, review site, Reddit/UGC, news, or other, and ranked. The outreach list shows the third-party sources cited in answers where a competitor appeared and you did not.
- Trend tracking. Each run is compared with your previous run for the same brand, country, and language: questions won, lost, and unchanged.
- You only pay for usable answers. Failed, empty, truncated, or skipped samples are recorded for transparency but never charged, and never counted in any rate.
How to run an AI search visibility audit
- Enter your brand name and website.
- Enter your market category (for example
CRM softwareordentists in Austin). The first run writes a buyer-question set for it with AI and saves it; later runs reuse it. - Add competitors (names, domains, or URLs).
- Pick a preset (Quick, Agency, Deep) or choose surfaces and question counts yourself.
- Optionally set the country and language. Generated questions are written in your language; sentiment and absence detection cover English, Spanish, German, French, Portuguese, Italian, and Arabic.
- Start the run. Open the dataset for per-answer evidence,
AGENCY_REPORT.mdfor the client report (action plan first), andPROMPT_SETfor the questions. - Schedule it weekly to build a trend. Export as JSON, CSV, Excel, or via API.
Want to see the output format first, for free? Turn on Demo mode. It writes clearly labelled fake answers (demo: true on every row, a DEMO banner on the report), calls no AI model, and charges nothing.
AI surfaces
| Surface key | Stands in for | Model (OpenRouter) | Live search | Tier |
|---|---|---|---|---|
chatgpt-free | ChatGPT free-plan default model | ~openai/gpt-luna-latest | Yes (web search) | standard |
chatgpt | ChatGPT paid-plan default model | ~openai/gpt-sol-latest | Yes (web search) | premium |
claude | Claude.ai default model | ~anthropic/claude-sonnet-latest | Yes (web search) | premium |
perplexity | Perplexity default model | perplexity/sonar | Yes (native) | standard |
gemini | Gemini app default model | google/gemini-3.5-flash (reasoning on, low effort) | No (model knowledge) | standard |
grok | Grok | ~x-ai/grok-latest | No (model knowledge) | standard |
openai-mini, claude-haiku, gemini-pro, perplexity-sonar-pro | Older/extra models, not in presets | see the Models view | varies | varies |
Web-search surfaces run at most one search per answer, with a small search context, so costs stay predictable. "Model knowledge" surfaces answer from training data without searching. That is a valid signal (what the model already believes about your market), but it is not live search. Gemini and Grok run this way because their web-search add-on costs several times more per call. Old surface keys (openai-gpt, claude-sonnet, gemini-flash, perplexity-sonar) still work and map to chatgpt, claude, gemini, and perplexity.
Input
The most important fields (see the Input tab for all of them):
brandName(required),websiteUrl,marketCategory,competitors,brandAliases.caseSensitiveBrand: for brands that are ordinary words (Notion, Linear, Monday). "Auto" detects them and only counts the capitalised brand name.prompts: your own questions. Leave empty to use the AI-generated, saved question set. Custom questions replace the generated set; turn onaddGeneratedQuestionsto keep yours first and fill the remaining slots from the generated set.regeneratePrompts: write a new question set (replaces the saved one; trends restart for the new questions).audience,useCases: optional hints for the question generator (used when a new set is written; never sent to the audited surfaces).runPreset,platforms,maxPrompts,samplesPerPrompt.country,language.maxChargeUsd: optional hard ceiling for audit charges.openRouterApiKey: optional bring-your-own-key.dryRun: Demo mode (off by default).
{"brandName": "HubSpot","websiteUrl": "https://www.hubspot.com","marketCategory": "CRM software","competitors": ["Salesforce", "Pipedrive", "Zoho CRM"],"runPreset": "quick"}
Output
You can download the dataset in various formats such as JSON, HTML, CSV, or Excel. One row per question x surface x sample:
{"prompt": "What is the best CRM for a small business with 5 salespeople?","promptType": "unbranded","intent": "best-for","platformLabel": "ChatGPT (GPT Sol, API + web search)","sampleStatus": "ok","brandMentioned": true,"brandPosition": 2,"brandRankOverall": 3,"brandInTop3": true,"sentimentLabel": "neutral","brandExcerpts": ["Confirm the Starter price at checkout; HubSpot’s current pricing materials show differing Starter prices and promotions."],"brandClaims": [{ "category": "plans", "claim": "Its free sales tier supports only two users, so plan on paid seats for five." }],"competitorsMentioned": ["Pipedrive", "Zoho CRM"],"otherBrandsNamed": ["Less Annoying CRM"],"ownedDomainCited": true,"citedSources": [{ "domain": "pipedrive.com", "category": "competitor" }, { "domain": "lessannoyingcrm.com", "category": "other" }, { "domain": "hubspot.com", "category": "owned" }],"changeSinceLastRun": "unchanged","requestedModel": "~openai/gpt-sol-latest","resolvedModel": "openai/gpt-6-sol","generationId": "gen-...","requestSettings": { "model": "~openai/gpt-sol-latest", "webSearch": true, "maxSearches": 1, "searchContextSize": "low", "reasoning": "disabled", "maxTokens": 1200, "userMessage": "What is the best CRM for a small business with 5 salespeople?", "systemPrompt": "You are a helpful assistant. ..." },"providerCostUsd": 0.0555,"chargedEvent": "premium-llm-sample","demo": false}
Data fields
| Field | Description |
|---|---|
prompt, promptType, intent | The exact question sent, whether it names the brand (branded) or not (unbranded), and the buyer intent: best-for, alternatives, comparison, pricing, problem, local, reputation, or competitor-comparison (an unbranded head-to-head between two named vendors, kept out of the headline). Custom questions are classified by keyword rules; other when none applies. |
platform / surface, platformLabel, surfaceName | Which AI surface answered, and what consumer product it stands in for. |
sampleStatus | ok, absent-answer (the AI said it could not find or does not know the brand, which is usable evidence), failed (no usable answer, not charged), truncated (the answer hit the token limit too early to analyse, not charged), skipped (not called, not charged). |
brandMentioned, brandMentionCount, brandPosition | Mentions only count in sentences that describe the brand, not in "I couldn't find information about X". Position is the brand's rank among tracked brands (your brand and listed competitors) in the answer. |
brandRankOverall, brandInTop3 | The brand's rank among every brand the answer names (tracked ones plus other detected brand names), and whether it is in the first three. The top-3 rate in the report uses this. |
otherBrandsNamed | Other brand or product names the answer recommends that are not your brand or a tracked competitor (including tracked names written differently, such as "Dynamics 365" for "Microsoft Dynamics 365"). A name needs brand-like evidence: a matching cited domain, product-style spelling, a list item or table row that describes it, or use as a product ("Attio is...", "such as Copper and Nimble"). Headings and table labels ("Admin Required", "Ease of Use") are ignored. The report only shows names seen in 2 or more answers. |
brandExcerpts | Up to 3 short quotes of what the answer says about the brand. |
brandClaims | Up to 6 factual-sounding statements about the brand (pricing, plans, company, features, numbers), quoted as written. Verify them: the Actor does not check whether they are true. |
sentimentLabel, sentimentScore | Rule-based (word-list) sentiment over the brand's own sentences, with simple negation handling ("not recommended" counts as negative). Directional, not a human read; analysed in English, Spanish, German, French, Portuguese, Italian, and Arabic. not-mentioned when the brand is absent. |
competitorsMentioned, competitorsInPrompt, shareOfVoice | Competitors named in the answer; competitors named in the question itself are listed separately and excluded from competitor rates. |
citedUrls, citedDomains, citedSources, ownedDomainCited | Citations, with each domain classified as owned / competitor / review-site / ugc / news / other. |
changeSinceLastRun | won, lost, unchanged, or new versus the previous run for this brand, country, and language. |
requestedModel, resolvedModel, finishReason, providerCostUsd, promptTokens, completionTokens, generationId | Which model actually answered, why it stopped, and what the call cost, as reported by OpenRouter. |
requestSettings | Everything needed to reproduce the sample: model, system prompt, the question verbatim, whether OpenRouter web search was on (maxSearches = max_uses, searchContextSize, searchCountry) or the model searched natively, reasoning setting, maxTokens, and temperature. |
scrapedAt, source, demo, chargedEvent, warnings | Provenance and billing transparency. |
The key-value store holds RUN_SUMMARY (coverage, per-surface and per-intent metrics, top-3 rate, competitor rates, untracked brands, brand claims, action plan, cited-source classes, outreach list, trend, provider cost including question generation), AGENCY_REPORT.md (the client report), PROMPT_SET (the question set with type, intent, and which questions this run asked, ready to copy into prompts), VISIBILITY_SCORECARD, COMPETITOR_SHARE_OF_VOICE, CITATION_OPPORTUNITIES, and PROMPT_GAPS.
How the questions are chosen
- No custom questions: the first run for a brand + category + country + language makes one call to a low-cost model (GPT Luna via OpenRouter, no web search) that writes about 30 buyer questions across intents. The generator is told the category, competitors, country, language, and your optional
audience/useCaseshints, but not your brand name or website: questions that name your brand are written with a placeholder the Actor fills in. Any unbranded question that still names your brand, an alias, or your domain is dropped; duplicates and questions in the wrong language are dropped too. The set is saved and reused on every later run in the same order (Quick uses the first 5, Agency the first 10, Deep the first 25), so trends compare the same questions. - Generation fails (provider error, malformed output, or not enough time before the run timeout): the run uses the built-in questions instead, says so in the report, and does not save them, so the next run tries again. The run is never failed over it.
- Custom questions always win.
addGeneratedQuestionskeeps yours first and fills the remaining slots from the saved set. - Demo mode uses the built-in questions and makes no AI call.
- Changing competitors or hints does not rewrite a saved set (that would break the trend); the report notes it, and
regeneratePromptswrites a new one.regeneratePromptsis one-shot: left on in a saved task or schedule, it regenerates once for the current inputs and then reuses that set (the report says so), so scheduled trends keep working. - Head-to-heads between two competitors ("Salesforce vs Pipedrive: which is easier?") are a few questions at the end of a generated set. An answer to them has no natural place for your brand, so they are not counted in the headline or as gaps; the report shows them separately, including how often your brand was still named as another option (a bonus signal) and which sources were cited. Comparison questions in the headline name one vendor against "the other options", which leaves room for your brand.
How much does an AI visibility audit cost?
Pay per event:
| Event | Price | When |
|---|---|---|
apify-actor-start | $0.01 | Once per run |
standard-llm-sample | $0.15 | Per usable answer from a standard surface |
premium-llm-sample | $0.35 | Per usable answer from a premium surface (chatgpt, claude) |
byok-llm-sample | $0.05 | Per usable answer when you use your own OpenRouter key |
agency-report | $1.00 | Once, when the run has at least 8 usable answers |
The AI-generated question set is free: it is written once per brand, category, country, and language and reused. (The retired prompt-set-generated event is never charged.)
Typical runs (report included):
| Preset | Shape | Estimated charge | Typical duration |
|---|---|---|---|
| Quick | 5 questions x 4 surfaces (ChatGPT Free, Perplexity, Gemini, Claude) x 1 sample | about $5.01 | ~2 min |
| Agency | 10 questions x 5 surfaces (+ Grok) x 2 samples | about $20.01 | ~8 min |
| Deep | 25 questions x 6 surfaces (+ ChatGPT paid) x 2 samples | about $66.01 | ~25 min |
| Starter form values | 3 questions x 3 surfaces (Perplexity, Gemini, Grok) x 1 sample | about $2.36 | ~1 min |
The Actor logs its estimate before any AI call (question generation included) and never exceeds maxChargeUsd (left empty, it auto-scales to 1.5x the estimate). Samples that fail are not charged; if no usable answer comes back, the run fails and no audit events are charged.
If you set a maximum cost per run in Apify, the Actor tells you up front how many samples it covers, stops starting new samples before it would pass that amount, and writes a clearly labelled partial report. The report event is charged only if the remaining budget still covers it.
Tips and advanced options
- Use 2 or more samples per question for client reporting: AI answers vary, and the report then measures consistency.
- Add brand aliases (product names, old names) and set caseSensitiveBrand for ordinary-word brands.
- Write custom questions for the high-intent sales questions your clients care about; questions that name the brand are tagged automatically. To keep the generated set as well, turn on
addGeneratedQuestions. - To edit the generated questions, copy them from
PROMPT_SETintoprompts. - Schedule weekly runs with the same inputs to get "won / lost since last run". Leave
regeneratePromptsoff for scheduled runs. - Add the brands listed under "Brands AI recommends that you do not track" to
competitorson the next run to get share of voice against them. - If a surface is retired or rejects requests, the run skips it after the first error, finishes the others, and lists it under "Surfaces that failed".
- Long audits stop starting new samples shortly before the run timeout and write a clearly labelled partial report, so raise the timeout for Deep runs if needed.
FAQ, disclaimers, and support
Are these the real ChatGPT or Google AI Overview results?
No. Each surface is an API model from the same family as the consumer product, called through OpenRouter, with or without live web search (see the table above). Consumer apps add personalisation, memory, and their own retrieval, so their answers can differ. This Actor does not scrape consumer chat apps and does not collect Google AI Overviews or AI Mode.
Why do some rows say absent-answer?
The AI answered but said it could not find or does not know the brand. That is real evidence of low visibility, so it counts as "not mentioned" in every rate and is charged like any usable answer.
What is the top-3 rate, and how is it different from position?
brandPosition ranks your brand among the brands you track (your brand plus listed competitors). The top-3 rate asks a stricter question: of the unbranded answers, how often is your brand among the first three brands the answer names at all, including brands you do not track. An answer that lists two untracked vendors and then you still counts; one that lists four others first does not.
Is the GEO visibility score traffic?
No. It is a 0-100 directional score built from mention rate, position, owned-site citations, sentiment, and consistency. A brand that is never mentioned scores 0.
Personal data
The Actor analyses brand and public web visibility and does not intentionally collect personal data. Review outputs before sharing them, since AI answers and cited pages can contain personal data protected by GDPR and similar laws.
For issues or feature requests, use the Issues tab on the Actor page.