GEO/AEO Brand Visibility Analyzer avatar

GEO/AEO Brand Visibility Analyzer

Pricing

from $5.00 / 1,000 analyzed visibility observations

Go to Apify Store
GEO/AEO Brand Visibility Analyzer

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

Mehdi Badawi

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

8 days ago

Last modified

Categories

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

  1. Select Try for free and run with no input for a multi-engine demo.
  2. Supply a target brand and normalized observations from your collection workflow.
  3. Use the dataset for row-level evidence and METRICS for 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:

  1. Preserves every observation as an independent dataset row with complete engine, query, timestamp, and source provenance.
  2. Emits deterministic variance metrics (outcomeDistribution, binaryCitationVariance, positionVariance, observedPositions, minPosition, maxPosition, medianPosition, citationUrlFrequencies, competitorShare).
  3. 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:

StateConditionMetrics
citedTarget brand domain appears in the engine's citation URLsisCited: true, isMentioned: true, brandRank: integer
uncitedTarget brand name/alias mentioned in answer text, but domain not citedisCited: false, isMentioned: true, brandRank: integer
missing_brandNeither brand name nor brand domain appears; competitor cited/mentionedisCited: false, isMentioned: false, brandRank: null
engine_failedEngine returned error, timeout, rate-limit, blocked, or empty responseisCited: 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 text
  • capturedAt: ISO-8601 instant when the observation was recorded
  • source: provenance object (collector, runId, model, sourceUrl)
  • rawStatus: upstream status (success, error, timeout, blocked, rate_limited)
  • visibilityState: cited | uncited | missing_brand | engine_failed
  • isMentioned: boolean
  • isCited: boolean
  • brandRank: explicit 1-based recommendation position when supported by the supplied answer structure; a mention alone does not create a rank
  • citedUrls: list of URLs matching target brand domains
  • competitorsMentioned & 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

PathPurpose
src/main.mjsApify Actor adapter with storage and seam wiring
src/demo-input.mjsSynthetic multi-engine demo dataset for credential-free runs
src/core/contract.mjsContract versions, constants, and state definitions
src/core/canonical.mjsDeterministic domain matching and string utilities
src/core/normalize.mjsInput schema validation, caps, and entity normalization
src/core/evaluate.mjsPure evaluation engine (no I/O, no wall-clock dependencies)
src/core/variance.mjsStatistical 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
DockerfileApify Actor Node.js 22 runtime image
package.jsonPinned 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.