GEO/AEO Brand Visibility Analyzer
Pricing
from $5.00 / 1,000 analyzed visibility observations
GEO/AEO Brand Visibility Analyzer
Measure brand mentions, citations, explicit recommendation order, and run-to-run variance across AI-search observations you supply. Deterministic analysis without extra inference cost.
Pricing
from $5.00 / 1,000 analyzed visibility observations
Rating
0.0
(0)
Developer
Mehdi Badawi
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
8 days ago
Last modified
Share
Measure brand mentions, citations, explicit recommendation order, and run-to-run variance across AI-search observations you supply. Results retain the query, engine, timestamp, source, and every individual observation.
Start in 30 seconds
- Select Try for free and run with no input for a multi-engine demo.
- Supply a target brand and normalized observations from your collection workflow.
- Use the dataset for row-level evidence and
METRICSfor trend analysis.
Price: $0.005 per successfully analyzed observation, plus a $0.00005 start event. Engine failures, failed runs, and demo observations are free.
This Actor does not query ChatGPT, Gemini, Claude, Perplexity, Copilot, or Google AI Overviews. Upstream collection and inference remain separate.
Why preserving variance is the product
In traditional SEO, search engine result pages (SERPs) are relatively stable. In AI-search engines (GEO/AEO), models exhibit high stochastic variance:
- An engine may cite your brand on run 1, omit it on run 2, mention it without a link on run 3, and time out on run 4.
- Averaging this into a single metric (e.g. "50% visibility") destroys critical operational intelligence: the volatility, position spread, citation domain distribution, and failure modes.
This Actor:
- Preserves every observation as an independent dataset row with complete engine, query, timestamp, and source provenance.
- Emits deterministic variance metrics (
outcomeDistribution,binaryCitationVariance,positionVariance,observedPositions,minPosition,maxPosition,medianPosition,citationUrlFrequencies,competitorShare). - Tracks longitudinal variance across scheduled runs using key-value store persistence (
geo-aeo-visibility-state).
Visibility states
Every evaluated observation is classified into one of four deterministic states:
| State | Condition | Metrics |
|---|---|---|
cited | Target brand domain appears in the engine's citation URLs | isCited: true, isMentioned: true, brandRank: integer |
uncited | Target brand name/alias mentioned in answer text, but domain not cited | isCited: false, isMentioned: true, brandRank: integer |
missing_brand | Neither brand name nor brand domain appears; competitor cited/mentioned | isCited: false, isMentioned: false, brandRank: null |
engine_failed | Engine returned error, timeout, rate-limit, blocked, or empty response | isCited: false, isMentioned: false, error: object |
Contract & Outputs
Dataset items (default dataset)
One record per observation preserving:
engine: AI engine identifier (perplexity,chatgpt,gemini,copilot, etc.)queryId&query: stable query key and verbatim query textcapturedAt: ISO-8601 instant when the observation was recordedsource: provenance object (collector,runId,model,sourceUrl)rawStatus: upstream status (success,error,timeout,blocked,rate_limited)visibilityState:cited|uncited|missing_brand|engine_failedisMentioned: booleanisCited: booleanbrandRank: explicit 1-based recommendation position when supported by the supplied answer structure; a mention alone does not create a rankcitedUrls: list of URLs matching target brand domainscompetitorsMentioned&competitorsCited: list of competitor names present
Key-Value Store records
OUTPUT: run envelope with aggregate counts, overall visibility rates, and summary.METRICS: granular per-query $\times$ per-engine metrics with variance calculations.STATE: durable snapshot of observation history for cross-run variance tracking.
Local development & Testing
The Actor is 100% offline, deterministic, and requires no external API keys or paid services.
Run tests
$npm test
Executes Node's built-in test runner (node --test), verifying normalization, all visibility states (cited, uncited, missing_brand, engine_failed), provenance preservation, multi-run variance calculations, and Actor adapter seams.
Run credential-free demo
$npm start
When invoked without input, the Actor automatically loads built-in synthetic multi-engine observations covering all visibility and variance states, populating the default dataset and key-value store records without requiring credentials.
Package layout
| Path | Purpose |
|---|---|
src/main.mjs | Apify Actor adapter with storage and seam wiring |
src/demo-input.mjs | Synthetic multi-engine demo dataset for credential-free runs |
src/core/contract.mjs | Contract versions, constants, and state definitions |
src/core/canonical.mjs | Deterministic domain matching and string utilities |
src/core/normalize.mjs | Input schema validation, caps, and entity normalization |
src/core/evaluate.mjs | Pure evaluation engine (no I/O, no wall-clock dependencies) |
src/core/variance.mjs | Statistical variance, spread, and distribution calculations |
tests/fixtures/ | Synthetic query-result fixtures across multiple engines |
tests/core/ | Unit tests for evaluate and variance models |
tests/actor/ | Seam integration tests for Actor lifecycle and storage |
.actor/ | Actor specification and input/output/dataset/KVS schemas |
Dockerfile | Apify Actor Node.js 22 runtime image |
package.json | Pinned dependencies and scripts (npm test, npm start) |
Non-goals
- No live search or LLM API calls (offline evaluation of supplied observations).
- No browser automation or scraping in this processing Actor.
- No paid engine credentials or external tokens required.
Data, state, and support
Prompts and answers may be confidential. Minimize them, keep only the fields
needed for analysis, and do not use customer observations in public samples.
Use one stateStoreName per target brand; state from another brand is rejected
or isolated. Export STATE before recovery and delete its named store when the
retention period ends. Support owner: Mehdi Badawi through the Apify Store
support channel, with an initial-response target of two business days.
