# AI Visibility Checker — ChatGPT Web Search Mentions (`khadinakbar/ai-visibility-checker`) Actor

Check whether a brand is mentioned or its domain is cited in web-grounded AI answers. Uses the OpenAI Responses API with web search and returns one evidence record per prompt with citations, context, and timestamp. API-based sample for repeatable visibility checks.

- **URL**: https://apify.com/khadinakbar/ai-visibility-checker.md
- **Developed by:** [Khadin Akbar](https://apify.com/khadinakbar) (community)
- **Categories:** AI, SEO tools, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $100.00 / 1,000 prompt checkeds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Check a brand’s visibility in web-grounded AI answers

This Actor checks a brand against a bounded set of prompts using the official OpenAI Responses API with its web-search tool. Each dataset item is one completed prompt: it records whether the answer mentions your brand or an accepted alias, whether the returned citations include your domain, the short mention context, citation URLs, model route, and timestamp. It is designed for repeatable API-based visibility sampling. Pair it with a dedicated SERP tracker for rank positions and a separate consumer-research workflow when those are the decision need.

### Best fit for this Actor

- Growth and content teams that need an evidence record for a small, repeatable set of category, alternative, or recommendation prompts.
- Analysts who need to distinguish an answer-text mention from a citation to the brand’s own domain.
- AI-agent workflows that need bounded input, per-prompt provenance, explicit terminal outcomes, and exportable data.

The Actor uses one OpenAI web-grounded response per completed prompt and records that API route on every row. Use the output as a bounded, timestamped sample for the exact prompts supplied.

### Focused standalone workflow

This Actor is designed as a focused standalone workflow: give it one brand and a small, stable set of real buyer questions, then use the returned mentions and citations in your own reporting or content-review process. The compact output makes it suitable as a standalone step before broader visibility analysis.

### Practical scenario: compare a small prompt set before a content review

Maya runs a three-prompt audit for `Ahrefs` in the `SEO` category. The Actor saves one row for each prompt. In the output, Maya can see which answers mentioned Ahrefs, the position of its first answer-text mention, and whether a returned web citation matched `ahrefs.com`. She exports the rows with their timestamps before her team reviews content and third-party source coverage. A later run can use the same custom prompts for a like-for-like comparison.

### Quick start input

```json
{
  "brandName": "Ahrefs",
  "brandDomain": "ahrefs.com",
  "industry": "SEO",
  "queryCategories": ["best_tools", "alternatives", "recommendations"],
  "maxChecks": 3
}
```

`maxChecks` is a cost boundary. Custom prompts run first, then the selected built-in prompts, until the unique-prompt cap is reached.

### Input reference

| Field | Type | What it controls |
|---|---|---|
| `brandName` | string | Required exact public brand, company, or product name to detect in answer text. |
| `brandDomain` | string | Optional canonical domain or URL. The Actor marks a domain citation only when a returned citation matches this domain or a subdomain. |
| `brandAliases` | array of strings | Up to 10 additional unambiguous names that count as a brand mention. |
| `industry` | string | Adds category context to the three built-in prompt templates. |
| `queryCategories` | array | Any of `best_tools`, `alternatives`, and `recommendations`. Defaults to all three. |
| `customPrompts` | array | Up to 10 specific user-intent prompts. These take priority over built-in prompts. |
| `maxChecks` | integer | One to ten unique prompts to process; default is three. Each completed prompt is a paid event. |

### What data you receive

One dataset record represents one prompt completed through the OpenAI Responses API. The most important fields are:

- `brand_mentioned`: whether the returned answer text contained the brand name or an alias.
- `mention_position`: approximate 1–10 decile for the first mention; a smaller number means earlier in this particular answer.
- `brand_domain_cited` and `brand_citation_url`: whether a returned web-search citation matched your configured domain.
- `citation_urls`: the canonicalized citations returned with that response.
- `response_excerpt`, `model`, `provenance`, and `checked_at`: enough context to audit what was checked and when.

```json
{
  "query": "What are credible alternatives to Ahrefs for SEO?",
  "brand_name": "Ahrefs",
  "brand_mentioned": true,
  "mention_position": 2,
  "brand_domain_cited": true,
  "brand_citation_url": "https://ahrefs.com/blog/seo/",
  "citation_urls": ["https://ahrefs.com/blog/seo/", "https://example.com/review"],
  "model": "gpt-4.1-mini",
  "provenance": "OpenAI Responses API; web_search required for this check.",
  "checked_at": "ISO 8601 UTC timestamp"
}
```

The default key-value store also contains `OUTPUT` (stable compact outcome) and `RUN_SUMMARY` (provider attempts, coverage, charges, warnings, and outcome). Read these records before treating an export as complete.

### Use through the Apify API

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('khadinakbar/ai-visibility-checker').call({
    brandName: 'Ahrefs',
    brandDomain: 'ahrefs.com',
    industry: 'SEO',
    customPrompts: ['Which SEO tools are best for a content team?'],
    maxChecks: 1,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Use with AI agents through Apify MCP

> Check whether Ahrefs and ahrefs.com appear in one web-grounded answer to “Which SEO tools are best for a content team?” Return the mention flag, first-mention position, matching brand citation URL, all citation URLs, response excerpt, and terminal run outcome.

After calling the Actor, have the agent inspect `OUTPUT` and `RUN_SUMMARY`, then read the dataset. Preserve the prompt and `checked_at` when comparing runs. For current client setup, use [Apify MCP](https://mcp.apify.com/).

### Pricing

This Actor uses Pay per event plus Apify platform usage. Each completed `Prompt checked` record is the primary billable event. Open the live Pricing tab for the current event price and use Apify’s maximum-cost control to keep a run within budget.

### Best results

- Use exact, decision-relevant prompts that a prospective customer would actually ask. Keep a fixed prompt set for comparisons across time.
- Provide the canonical domain when you need a source-citation signal. A mention and a domain citation answer different questions.
- Read `VALID_EMPTY`, `PARTIAL`, `UPSTREAM_FAILED`, and `CONFIG_ERROR` as separate terminal states. Each state keeps the evidence record and provider diagnostics clear for the next review step.
- Use an unambiguous brand name or aliases. Generic words can create false-positive text matches.

### Builder's note

I designed the output around prompt-level evidence rather than a synthetic overall score. Search-grounded AI answers can change with wording, sources, and time, so keeping the prompt, citations, excerpt, route, and timestamp makes every result reviewable and easier to compare responsibly.

### Responsible use

Use public brand names and prompts you are authorized to analyze. Respect applicable law, platform terms, and your organization’s policies. Represent each result as a bounded API sample and substantiate any public comparison with its underlying evidence.

# Actor input Schema

## `brandName` (type: `string`):

The company, product, or brand to look for in each answer. Use the exact public-facing name, for example "Ahrefs".

## `brandDomain` (type: `string`):

Your canonical website domain or URL, for example ahrefs.com. The Actor separately reports whether an OpenAI web-search citation points to this domain or one of its subdomains.

## `brandAliases` (type: `array`):

Alternate names or abbreviations that count as your brand. Use only unambiguous public names; up to 10 aliases are checked.

## `industry` (type: `string`):

Used to make the built-in prompts useful, for example "SEO", "CRM", or "project management".

## `queryCategories` (type: `array`):

Use these bounded, neutral prompts when you do not provide your own. Custom prompts run first, then built-in prompts until the max-check limit.

## `customPrompts` (type: `array`):

Specific user-intent questions to check, one per line. They run before built-in categories and are capped at 10.

## `maxChecks` (type: `integer`):

Maximum unique prompts in this run. Each completed prompt is one paid event. Default: 3; maximum: 10.

## Actor input object example

```json
{
  "brandName": "Ahrefs",
  "brandDomain": "ahrefs.com",
  "industry": "SEO",
  "queryCategories": [
    "best_tools",
    "alternatives",
    "recommendations"
  ],
  "maxChecks": 3
}
```

# Actor output Schema

## `results` (type: `string`):

One completed prompt with answer-text mention evidence, web-search citations, model route, and timestamp.

## `output` (type: `string`):

Outcome, counters, charges, and safe warnings.

## `runSummary` (type: `string`):

Per-run provider attempts, coverage metrics, and detailed diagnostics.

# 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 = {
    "brandName": "Ahrefs",
    "brandDomain": "ahrefs.com",
    "industry": "SEO"
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/ai-visibility-checker").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 = {
    "brandName": "Ahrefs",
    "brandDomain": "ahrefs.com",
    "industry": "SEO",
}

# Run the Actor and wait for it to finish
run = client.actor("khadinakbar/ai-visibility-checker").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 '{
  "brandName": "Ahrefs",
  "brandDomain": "ahrefs.com",
  "industry": "SEO"
}' |
apify call khadinakbar/ai-visibility-checker --silent --output-dataset

```

## MCP server setup

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

```

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/Bu8F3hseddjZi5SfB/builds/KRyA8eyKHbeVGJehe/openapi.json
