# AI Brand Visibility Tracker — Mentions & Citations (`travelmonitorlab/ai-brand-visibility-tracker`) Actor

Measure brand mentions and official-domain citations in real AI answers, compare results over time and keep a transparent model/query-specific history.

- **URL**: https://apify.com/travelmonitorlab/ai-brand-visibility-tracker.md
- **Developed by:** [Travel Monitor Lab](https://apify.com/travelmonitorlab) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $42.50 / 1,000 answer measureds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## AI Brand Visibility Tracker — Mentions & Citations

[![AI Brand Visibility Tracker status](https://apify.com/actor-badge?actor=travelmonitorlab/ai-brand-visibility-tracker)](https://apify.com/travelmonitorlab/ai-brand-visibility-tracker)

Measure whether a selected AI model mentions a brand and cites its official domain in real answers. Keep a persistent answer-level history and detect changes over time instead of relying on a single anecdotal AI response.

### Use this tool when

- You want evidence that a particular model mentions your company, product or client.
- You need to know whether the answer includes the official domain rather than a competitor or an unrelated website.
- You want to repeat the same prompts and compare `mentioned`, `cited` and `citationCount` over time.
- You need the exact answer and model-provided URLs for human review.

Use [AEO AI Visibility Checker](https://apify.com/travelmonitorlab/aeo-ai-visibility-checker) for technical website readiness and [Local AI Presence Monitor](https://apify.com/travelmonitorlab/local-ai-presence-monitor) for Google reviews and local-business signals. Those tools do not measure actual AI answers; this Actor does, one model at a time.

### What it measures

For every prompt, the Actor records:

- `mentioned`: exact brand name present in the answer text.
- `cited`: at least one returned URL belongs to the official domain or its subdomains.
- `citationCount` and all model-provided URLs.
- `mentionPosition`, current values and changes since the previous answer.
- The complete answer, model, timestamp and an explicit accuracy warning.

Results are specific to the selected model, prompts and run date. They do not represent every AI engine and do not guarantee a ranking or future citation. AI answers can be inaccurate; a returned URL is evidence supplied by the model, not verified truth.

### Quick start

1. Set `brand` and the official `domain` without protocol.
2. Keep one to ten stable `queries`.
3. Choose an OpenRouter `model` and provide `apiKey` as a secret input.
4. Run once, then repeat with the same input to see changes.
5. Read the dataset and `SUMMARY` for mention and official-citation rates.

The default `openrouter/free` router selects an available free model and can itself be rate-limited. For strictly comparable history, choose a fixed model and keep it unchanged. Paid models such as `perplexity/sonar` require provider credits. Reasoning models can require at least 1,000 tokens to return a final answer. Provider failures become actionable dataset items instead of disappearing silently.

### Dry run

`dryRun: true` returns a clearly marked technical sample without calling an AI provider or charging events. It is not a visibility result and contains no fabricated mention or citation.

### Pricing

- `run-started`: $0.05 per run outside dry-run.
- `query-measured`: $0.05 per successfully measured answer.
- `brand-citation-detected`: $0.10 per answer citing the official domain.

OpenRouter/provider costs are separate and depend on the selected model and key. Failed provider calls are not charged as `query-measured`.

### API and AI agents

Call through the Apify API or `https://mcp.apify.com`. Preserve the same brand, domain, model and queries between runs for meaningful comparisons. The public Markdown page is `https://apify.com/travelmonitorlab/ai-brand-visibility-tracker.md`.

Built by [Adaga solutions](https://adagasolutions.lu). For support, open an issue with the run ID, model, query and expected result. Never include your OpenRouter key.

# Actor input Schema

## `brand` (type: `string`):

Exact brand or company name to find in the answer text.

## `domain` (type: `string`):

Official domain without protocol, for example adagasolutions.lu. Subdomains of this domain count as official citations.

## `queries` (type: `array`):

One to ten prompts used for the visibility measurement. Keep the same prompts between runs for meaningful deltas.

## `model` (type: `string`):

Model used for every query. The default openrouter/free selects an available free model; choose a fixed model for strictly comparable history. Paid models require provider credits.

## `apiKey` (type: `string`):

Secret key required only for real measurements. Never printed or stored in the dataset. Leave empty only when dryRun is true.

## `maxTokens` (type: `integer`):

Upper bound per answer. Reasoning models may need at least 1,000 tokens to produce a final answer.

## `dryRun` (type: `boolean`):

Return a clearly marked technical sample without calling an AI provider or charging events. This is not a visibility result.

## Actor input object example

```json
{
  "brand": "Adaga solutions",
  "domain": "adagasolutions.lu",
  "queries": [
    "What is Adaga solutions in Luxembourg?"
  ],
  "model": "openrouter/free",
  "maxTokens": 1500,
  "dryRun": true
}
```

# Actor output Schema

## `measurements` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "brand": "Adaga solutions",
    "domain": "adagasolutions.lu",
    "queries": [
        "What is Adaga solutions in Luxembourg?"
    ],
    "model": "openrouter/free",
    "maxTokens": 1500,
    "dryRun": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("travelmonitorlab/ai-brand-visibility-tracker").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "brand": "Adaga solutions",
    "domain": "adagasolutions.lu",
    "queries": ["What is Adaga solutions in Luxembourg?"],
    "model": "openrouter/free",
    "maxTokens": 1500,
    "dryRun": True,
}

# Run the Actor and wait for it to finish
run = client.actor("travelmonitorlab/ai-brand-visibility-tracker").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "brand": "Adaga solutions",
  "domain": "adagasolutions.lu",
  "queries": [
    "What is Adaga solutions in Luxembourg?"
  ],
  "model": "openrouter/free",
  "maxTokens": 1500,
  "dryRun": true
}' |
apify call travelmonitorlab/ai-brand-visibility-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,travelmonitorlab/ai-brand-visibility-tracker"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/sQsdNCrait7Dg5m1J/builds/2r8I8IbEWXh7fWJv5/openapi.json
