Methodology — AI Visibility Lite
How we call official APIs, how mention matching works, measured accuracy, and what we never promise.
English source for the public /methodology page on https://clioos.com/ai-visibility/. Written: 2026-10-29 (Asia/Shanghai). Based on the local MVP (mvp/app/), requirements.md, and measured results in mvp/ACCURACY.md. Do not publish promises of citations, rankings, or traffic.
At a glance
AI Visibility Lite spot-checks whether OpenAI and Perplexity answers mention your brand for five buyer questions you provide. We call official provider APIs only (no ChatGPT.com or Perplexity website scraping). We report Mentioned / Not mentioned per question × engine, with a short excerpt, optional competitor name hits, model id, and timestamp. Results are API snapshots, not a guarantee that AI engines will cite you, rank you, or send traffic.
Product unit (MVP): 1 check = 5 buyer questions across 2 engines (OpenAI and Perplexity) = 10 official API calls. Free: 3 checks per email (one-time; email required, no forced account). IP also capped at 3/day. Paid packs are one-time and do not expire.
How we call the APIs
Engines in v1
| Engine | Official endpoint (MVP) | Default model | Tools / notes |
|---|---|---|---|
| OpenAI | POST https://api.openai.com/v1/responses | gpt-4o-mini (override via OPENAI_MODEL) | tools: [{ "type": "web_search" }], tool_choice: "auto" |
| Perplexity | POST https://api.perplexity.ai/chat/completions | sonar (override via PERPLEXITY_MODEL) | User message = the buyer question; citations taken from provider search_results / citations when present |
- API keys are platform-owned, read only from server environment variables (
OPENAI_API_KEY,PERPLEXITY_API_KEY). v1 has no bring-your-own-key (BYOK) UI. - Without keys, the local MVP returns deterministic mock fixture answers labeled as mock — useful for UI development, not for production accuracy claims.
- We do not automate or scrape ChatGPT.com, Perplexity.ai web UI, Google AI Overviews, Claude, or other surfaces in v1.
- Each buyer question is sent independently to both engines. One check always runs both engines; users cannot turn one off for a “half check.”
What one check produces
- You submit brand (+ optional domain / aliases / competitor names) and exactly five buyer questions, plus email for free-quota binding.
- For each question, we call OpenAI and Perplexity, collect answer text and any citation URLs the provider returns.
- A local detector (
app/detect.py) scores each answer for mention and citation (see below). - The result UI shows a Visibility summary (mention rate with sample size
5 prompts × 2 enginesand check time — not labeled Score / rating) plus a per-question × engine matrix with truncated excerpts.
Cost note (measured, not a price promise)
On the 2026-10-29 Set C live holdout (10 brands × 5 questions × 2 engines = 100 calls), measured spend was about $0.0340 per check (total Set C API spend $0.3402 including a tiny probe). Cumulative live API spend for Set C + Set D was $0.5245. See mvp/ACCURACY.md. Live costs vary with token use and whether OpenAI invokes web search.
How brand-name matching works
Detection is a deterministic string heuristic in app/detect.py. It does not use an LLM to judge “is this about my brand?”
Mention (`mentioned`)
We treat an answer as mentioning the brand when a normalized form of the brand name, an allowed alias, or a domain-style host appears in the answer text, including in negated sentences (e.g. “not Acme”).
Normalization and matching include:
- Unicode NFKC / Latin diacritic folding (e.g. Café ≈ Cafe)
- Case folding
- Hyphen / underscore treated like spaces
- Legal suffix stripping on multi-word names (
Inc,LLC,Ltd,Corp,GmbH, …) - Compact variants (spaces removed) where appropriate
- Word-boundary style matching so short tokens like
Flowdo not match insideWorkflow - Optional aliases and domain you supply
- Rejection of overly generic alias fragments (e.g. stopword-heavy phrases such as bare “the browser”) so lookalike / generic product words are less likely to false-positive
Bare domains in prose are handled via host extraction rather than as free-text brand tokens, to reduce false hits from URL-looking strings.
Citation (`cited`)
A citation hit means your brand domain (or an alias that looks like a domain) appears as a URL host in the answer text or in the provider’s citation list. A brand name appearing only in a third-party citation title is not counted as your citation.
Competitors
Only competitor names you supply are matched as plain strings in the same answer. We do not invent a competitive set.
Visibility ring (UI)
Internally the MVP can compute visible = mentioned and attitude != negative for the Visibility percentage. Attitude / sentiment is not a v1 product feature: it may be stored in API payloads for research, but the UI keeps it hidden by default (SHOW_ATTITUDE_UI=0). Marketing and the public methodology page must not present sentiment/attitude as a customer-facing capability. Negated mentions are excluded from Visibility when that internal rule runs; the customer-facing labels remain Mentioned / Not mentioned plus the Visibility summary with sample size and timestamp.
Measured accuracy (from `mvp/ACCURACY.md` only)
Generated 2026-10-29 (Asia/Shanghai). Detector: app/detect.py. Holdouts used live OpenAI + Perplexity keys.
| Evaluation | Mention | Citation | Notes |
|---|---|---|---|
| Set A — development fixtures (30) | 100% | 100% | Regression set — not the headline claim |
| Set B — adversarial, before hardening (30) | 50.0% | 100% | Honest baseline for brittle string rules |
| Set B — after hardening (same 30) | 100% | 100% | Rules already saw these cases — not a blind score |
| Set C — live holdout (10 brands, 100 calls) | 99.0% (99/100) | 100% (100/100) | Blind human labels; no rule edits after scoring |
| Set D — small-SaaS holdout after alias hardening (5 brands, 50 calls) | 100% (50/50) | 100% (50/50) | 0 mention FP/FN among 24 human-absent answers |
Set C protocol (summary): Nike, Notion, Figma, Linear, Stripe, Loom, Raycast, Arc, Buffer, Superhuman; each ran 5 buyer questions × both engines; raw answers frozen before labeling; mention gate target ≥90% (pass); attitude mislabel gate ≤2 (fail: 28) — which is one reason attitude stays out of the UI.
Known mention miss example (Set C): one Arc / OpenAI case false-positive when a generic alias fragment matched (“the browser” from “The Browser Company”). Alias validation was tightened afterward; Set D showed 0 mention FP/FN on that later freeze.
Do not treat mock fixture scores as production accuracy.
Limitations
- Official API ≠ consumer website. Answers from the OpenAI Responses API (with web search) or Perplexity Sonar can differ from what you see on ChatGPT.com or Perplexity’s website on your device, account, locale, or time.
- String matching, not human judgment. We look for brand / alias / domain strings. Paraphrases without the brand string, heavy obfuscation, or unusual lookalikes can be wrong.
- Snapshots in time. One check is a point-in-time sample, not continuous monitoring or a ranking guarantee.
- Engine coverage. v1 is OpenAI + Perplexity only. No Google AI Overviews, AI Mode, Claude, Gemini consumer UI, etc.
- No whole-web crawl of your site as part of a check. We only send your questions to the APIs and score the returned text.
- Attitude / sentiment is not shipped as a feature. Coarse polarity rules failed the Set C attitude gate (28 mislabels). Do not rely on or advertise sentiment scores.
- Rate limits, outages, and model changes at the providers can affect availability and answer shape.
What we do not promise
We never promise or imply any of the following:
- That ChatGPT, Perplexity, or any AI engine will cite, recommend, or rank your brand
- That running checks will increase traffic, leads, or revenue
- “#1 on ChatGPT,” “guaranteed visibility,” or similar ranking claims
- That API results match the consumer web UI
- That publishing
llms.txtor using this tool causes AI citations - A customer-facing sentiment / attitude product in v1
Fixed result footer used in the product:
> Snapshot via official APIs at [time]. Not a guarantee of rankings, citations, or traffic.
Privacy & keys (summary)
- Free checks require an email to bind quota; full account registration is not forced in v1.
- Provider API keys stay on the server; they are not logged into the repository or shown in the UI.
- Operational logs should use short retention (see Privacy policy when published).
- Refunds for unused paid checks follow the Refund policy.
Reproduce / audit trail
- Detector unit + adversarial (keys unset):
env -u OPENAI_API_KEY -u PERPLEXITY_API_KEY ./run.sh test - Accuracy notes and holdout protocol:
mvp/ACCURACY.md - Product unit definition:
mvp/README.md,mvp/app/wallet_mock.py(QUESTIONS_PER_CHECK = 5) - Adapters:
mvp/app/adapters/openai_adapter.py,mvp/app/adapters/perplexity_adapter.py
This page describes the methodology for AI Visibility Lite (Clioos). It is not legal advice and not a performance guarantee.
Related
Publish a site summary with the llms.txt generator, then return to the checker to spot-check brand mentions.
Questions: contact@clioos.com