# AI Share of Voice: AI Visibility Checker & Report, 4 Assistants (`spokentext/ai-share-of-voice`) Actor

AI visibility checker and report: ask OpenAI GPT, Grok, Meta AI and Mistral your customers' questions with web search on. Get the brands each names and in what order, your share of answers per assistant, the questions where rivals appear without you, and cited sites.

- **URL**: https://apify.com/spokentext/ai-share-of-voice.md
- **Developed by:** [clement](https://apify.com/spokentext) (community)
- **Categories:** SEO tools, AI
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $55.00 / 1,000 answers

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

### What is AI Share of Voice?

**AI Share of Voice** measures **how visible your brand is across four AI assistants at once**: OpenAI's GPT models (the family behind ChatGPT), Grok, Meta AI and Mistral. Give it your brand, your competitors and the questions your customers ask. Every assistant answers each question with live web search, and you get:

- which brands each answer names, and in what order
- **your share of answers per assistant**, side by side
- **the gaps**: questions where an assistant names your competitors but not you
- the websites the assistants cite, where each one shares them

It is built for marketers, SEO and GEO specialists and agencies who report on **AI search visibility** and want one run, one table, instead of four tools.

### Why use it?

- **Four assistants in one run.** No other Store tool covers Grok, Meta AI and Mistral together, and this one adds OpenAI GPT on top.
- **A comparison, not four exports.** The summary lines up your share of answers and average position for each assistant, and lists every question where you are missing.
- **Official APIs with web search.** Each provider's own developer interface, so answers reflect what is online today.
- **Pay per answer.** The comparison report is included. Nothing is charged for answers that fail.
- **Choose your assistants.** Ask all four, or only the ones your clients care about.

Because it runs on Apify, you also get:

- **Scheduling:** repeat the same questions every week and follow each assistant over time.
- **API access:** start runs and read results from your own code.
- **Integrations:** send results to Make, Zapier, n8n, Google Sheets and more.
- **Exports:** download results as JSON, CSV or Excel.

### What data do you get?

| Data | What it tells you |
|---|---|
| Share of answers per assistant | How often each assistant names your brand |
| Average position per assistant | Whether you come first, or after competitors |
| Gaps | Questions where an assistant names competitors and not you |
| Coverage per question | For each question, your share with each assistant |
| Competitors mentioned | Who each assistant recommends instead of you |
| Highlighted terms | Products and names in bold, even ones you did not list |
| Cited websites | The sources behind the answers, where a mention would count |
| Search queries | What each assistant searched for before answering |

### How to use it

1. Enter **your brand** and, if needed, other spellings of it.
2. List the **competitors** you want to compare against.
3. Write the **questions** a customer would ask, one per line.
4. Keep all four **AI assistants**, or untick the ones you do not need.
5. Optionally set how many **times to ask each question**, and the **location of the person asking**.
6. Click **Start**. Open the **Output** tab for the answers and the comparison summary.
7. To follow your visibility over time, save the run as a task and add a weekly **schedule**.

Live answers need a paid Apify plan. On the free plan, the Actor returns clearly labelled sample rows and charges nothing for your questions, so you can see the exact output format.

### How much does it cost?

You pay per answer: one question asked to one assistant. The comparison summary is included.

| Store discount tier | Price per answer |
|---|---|
| Bronze | $0.06 |
| Silver | $0.057 |
| Gold and above | $0.055 |

At the Bronze price, with all four assistants:

| Usage | Answers | Cost |
|---|---|---|
| 10 questions, once | 40 | $2.40 |
| 10 questions, asked 3 times each | 120 | $7.20 |
| 10 questions, once a week for a month | 160 | $9.60 |

Set the run's maximum charge to cap spending. When the limit is reached, the Actor stops after a question has been put to every assistant, so the figures stay comparable.

### Input example

```json
{
    "brand": "Brooks",
    "brandAliases": [
        "Brooks Running"
    ],
    "competitors": [
        "ASICS",
        "Hoka",
        "New Balance",
        "Saucony",
        "Nike"
    ],
    "questions": [
        "What are the best running shoes for flat feet?",
        "Which running shoe brand is best for beginners?",
        "What are the most comfortable running shoes for long distances?"
    ],
    "engines": ["openai", "grok", "meta", "mistral"],
    "repeats": 1
}
```

| Field | Meaning |
|---|---|
| `brand` | The brand you want to track |
| `brandAliases` | Other spellings of your brand (optional) |
| `competitors` | The brands to compare against |
| `questions` | What your customers would ask, up to 100 per run |
| `engines` | The assistants to ask: `openai`, `grok`, `meta`, `mistral` |
| `repeats` | Times to ask each question, from 1 to 5 |
| `location` | Country or city of the person asking (optional) |

### Output example

Real results for the input above, captured on 2026-11-03: 12 answers in 16 seconds. Your share of answers and average position, per assistant:

| Assistant | Brooks named | Average position | Most named competitor |
|---|---|---|---|
| OpenAI GPT | 100% | 1 | ASICS, Saucony (66.7%) |
| Grok | 100% | 1 | ASICS, Hoka, Saucony (100%) |
| Meta AI | 100% | 1.7 | ASICS, Hoka, New Balance, Saucony (100%) |
| Mistral | 100% | 1 | ASICS, Hoka (100%) |

Across the four assistants, Brooks was named first in 11 of 12 answers; ASICS came next, in 91.7% of answers. Meta AI was the only assistant to put a competitor ahead of Brooks.

#### One result per answer

The names of the cited websites are replaced by `example.com` here.

```json
{
    "question": "What are the best running shoes for flat feet?",
    "repeat": 1,
    "engine": "openai",
    "engineName": "OpenAI GPT",
    "model": "gpt-6-luna",
    "status": "ok",
    "brand": "Brooks",
    "brandMentioned": true,
    "brandPosition": 1,
    "brandsMentioned": [
        { "name": "Brooks", "isOwnBrand": true, "mentions": 1, "position": 1 },
        { "name": "Saucony", "isOwnBrand": false, "mentions": 2, "position": 2 },
        { "name": "ASICS", "isOwnBrand": false, "mentions": 1, "position": 3 }
    ],
    "competitorsMentioned": ["Saucony", "ASICS"],
    "highlightedTerms": [
        "Brooks Adrenaline GTS 25 — best all-around stability shoe.",
        "Saucony Guide 19 — best for firmer, moderate support.",
        "ASICS GT-2000 15 — best lighter option."
    ],
    "citedSources": [
        {
            "url": "https://example.com/running-shoes-flat-feet/",
            "domain": "example.com",
            "title": "The 8 Best Running Shoes for Flat Feet in 2026"
        }
    ],
    "citedDomains": ["example.com"],
    "sourcesAvailable": true,
    "searchQueries": [
        "best running shoes flat feet 2026 stability shoes review"
    ],
    "answer": "**Best starting picks for flat feet:**\n\n- **Brooks Adrenaline GTS 25 — best all-around stability shoe.** Its GuideRails offer gentle support...",
    "answerIsAiGenerated": true,
    "answeredAt": "2026-11-03T22:39:49.334Z"
}
```

| Field | Meaning |
|---|---|
| `engine`, `engineName` | Which assistant answered |
| `brandMentioned` | Whether the answer names your brand |
| `brandPosition` | Order in which your brand first appears among the tracked brands. 1 means it was named first |
| `brandsMentioned` | Every tracked brand found, in order of first appearance, with the number of mentions |
| `citedSources`, `citedDomains` | The web pages and websites the answer cites |
| `sourcesAvailable` | False for Mistral, whose terms do not allow its sources to be passed on |
| `searchQueries` | The web searches the assistant ran before answering |
| `answer` | The full answer text. It is generated by an AI model |

#### Comparison summary

The **Summary** link in the Output tab holds the comparison:

```json
{
    "brand": "Brooks",
    "answersAnalysed": 12,
    "answersFailed": 0,
    "overall": [
        { "name": "Brooks", "isOwnBrand": true, "answersMentioning": 12, "shareOfAnswers": 100, "namedFirst": 11, "averagePosition": 1.2 },
        { "name": "ASICS", "isOwnBrand": false, "answersMentioning": 11, "shareOfAnswers": 91.7, "namedFirst": 1, "averagePosition": 2.3 }
    ],
    "byEngine": [
        {
            "engine": "meta",
            "engineName": "Meta AI",
            "answersAnalysed": 3,
            "yourShareOfAnswers": 100,
            "yourAveragePosition": 1.7,
            "leader": "Brooks",
            "brands": ["..."],
            "topCitedDomains": []
        }
    ],
    "questionsByEngine": [
        {
            "question": "What are the best running shoes for flat feet?",
            "yourShareByEngine": { "openai": 100, "grok": 100, "meta": 100, "mistral": 100 }
        }
    ],
    "gaps": [],
    "topCitedDomains": [
        { "domain": "example.com", "answers": 3 }
    ]
}
```

| Field | Meaning |
|---|---|
| `overall` | Share of answers, first places and average position for each brand, all assistants together |
| `byEngine` | The same figures for each assistant, with its most cited websites |
| `questionsByEngine` | For each question, your share with each assistant |
| `gaps` | Each answer that names competitors but not you, with the assistant and the competitors named. Empty here, as Brooks was named every time |
| `topCitedDomains` | The websites cited most across assistants |

### Use cases

- **AI visibility reporting:** one weekly table per client, covering four assistants.
- **Find where you are missing:** the gaps list shows which assistant to work on, and for which question.
- **Generative engine optimization (GEO):** see which websites the assistants rely on in your market, to know where a mention would count.
- **Competitive monitoring:** follow how often each competitor is recommended, assistant by assistant.
- **European markets:** Mistral and location settings cover customers who ask in French, German, Spanish and other languages.

### Tips for reliable results

- **Ask like a customer.** "What is the best CRM for a small team?" reveals more than a question that names your brand.
- **Ask each question 3 times or more.** AI answers vary, so a single answer can mislead.
- **Keep the same questions over time.** Changing them makes weeks impossible to compare.
- **Add other spellings of your brand,** so that no mention is missed.

### FAQ

#### Which models answer?

OpenAI `gpt-6-luna`, xAI `grok-4.3`, Meta `muse-spark-1.3` and `mistral-medium-latest`, each through its provider's official API with web search switched on. The `model` field of every row names the model used.

#### Are these the same answers people see in ChatGPT, Grok, Meta AI or Le Chat?

Not exactly. Consumer apps can use other models, personalise answers or search differently, and any AI answer varies from one time to the next. Treat the results as a measurement of how each assistant's model tends to answer, not as a copy of one person's screen. This tool measures brand visibility; it does not rate the assistants against each other.

#### Why are some sources missing?

Mistral's terms for web search allow the pages it finds to be viewed, not stored or passed on, so Mistral rows never include sources (`sourcesAvailable` is false). Meta AI often answers without citing pages, so its rows can have none either.

#### How are brands detected?

By looking for each name you provide as a whole word, ignoring upper and lower case. Links inside the answer are removed first, so a brand in a web address does not count. Very short or common names, such as "On" or "Apple", can match ordinary words; check `brandsMentioned` against the answer text for those.

#### Can I ask questions for a specific country?

Yes. Set **Location of the person asking** to a country or city, and write the questions in that market's language.

#### What happens to my questions?

They are sent to each provider's model to be answered, with storage switched off where the provider offers it. Results are stored only in your own Apify account.

### Limits

- Tracks the brands you list. Other names appear only in `highlightedTerms`.
- Up to 100 questions and 5 repetitions per run.
- Answers are kept short (about 250 words). Each assistant decides how many searches to run, within a limit of two for OpenAI and Meta AI.

### Other Actors you may find useful

| Actor | What it does |
|---|---|
| [Grok Brand Visibility Tracker](https://apify.com/spokentext/grok-brand-visibility) | Grok only, at the same price per answer |
| [Meta AI Brand Visibility Tracker](https://apify.com/spokentext/meta-ai-brand-visibility) | Meta AI only, at a lower price per answer |
| [Mistral AI Brand Visibility Tracker](https://apify.com/spokentext/mistral-brand-visibility) | Mistral only |
| [Keyword Ideas Generator](https://apify.com/spokentext/keyword-ideas) | Long-tail keyword ideas, to find the questions customers ask |

### Run it from the API

With cURL:

```bash
curl -X POST "https://api.apify.com/v2/acts/spokentext~ai-share-of-voice/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "brand": "Brooks", "competitors": ["ASICS", "Hoka"], "questions": ["What are the best running shoes for flat feet?"] }'
```

With Python:

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_TOKEN")
run = client.actor("spokentext/ai-share-of-voice").call(run_input={
    "brand": "Brooks",
    "competitors": ["ASICS", "Hoka"],
    "questions": ["What are the best running shoes for flat feet?"],
})
summary = client.key_value_store(run["defaultKeyValueStoreId"]).get_record("SUMMARY")["value"]
for engine in summary["byEngine"]:
    print(engine["engineName"], engine["yourShareOfAnswers"], engine["yourAveragePosition"])
```

This Actor is an independent tool. It is not affiliated with or endorsed by OpenAI, xAI, X, Meta or Mistral AI; their names only describe the assistants it measures.

### Feedback

Something failed or gave a wrong result? Open an issue in the **Issues** tab of this page, with the error message from your results: every report is read and fixed. If the Actor saved you time, a rating helps others find it.

# Actor input Schema

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

The brand, product or company name to look for in the answers.

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

Other names that should count as your brand, such as a longer name or an abbreviation.

## `competitors` (type: `array`):

Other brands to look for, so you can compare how often and how early each one is named.

## `questions` (type: `array`):

The questions your customers would ask an AI assistant, one per line, written the way a person would ask. Up to 100 per run.

## `engines` (type: `array`):

Each question is asked to every assistant chosen here, and each answer is charged once. Leave all four for a full comparison.

## `repeats` (type: `integer`):

AI answers vary from one time to the next. Asking each question several times gives a steadier share figure. Each repetition is charged as one answer per assistant.

## `location` (type: `string`):

A country or city, such as France or New York. The answer is written for someone located there. Leave empty for no particular location.

## Actor input object example

```json
{
  "brand": "Brooks",
  "brandAliases": [
    "Brooks Running"
  ],
  "competitors": [
    "ASICS",
    "Hoka",
    "New Balance",
    "Saucony",
    "Nike"
  ],
  "questions": [
    "What are the best running shoes for flat feet?",
    "Which running shoe brand is best for beginners?",
    "What are the most comfortable running shoes for long distances?"
  ],
  "engines": [
    "openai",
    "grok",
    "meta",
    "mistral"
  ],
  "repeats": 1
}
```

# Actor output Schema

## `answers` (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": "Brooks",
    "brandAliases": [
        "Brooks Running"
    ],
    "competitors": [
        "ASICS",
        "Hoka",
        "New Balance",
        "Saucony",
        "Nike"
    ],
    "questions": [
        "What are the best running shoes for flat feet?",
        "Which running shoe brand is best for beginners?",
        "What are the most comfortable running shoes for long distances?"
    ],
    "engines": [
        "openai",
        "grok",
        "meta",
        "mistral"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("spokentext/ai-share-of-voice").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": "Brooks",
    "brandAliases": ["Brooks Running"],
    "competitors": [
        "ASICS",
        "Hoka",
        "New Balance",
        "Saucony",
        "Nike",
    ],
    "questions": [
        "What are the best running shoes for flat feet?",
        "Which running shoe brand is best for beginners?",
        "What are the most comfortable running shoes for long distances?",
    ],
    "engines": [
        "openai",
        "grok",
        "meta",
        "mistral",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("spokentext/ai-share-of-voice").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": "Brooks",
  "brandAliases": [
    "Brooks Running"
  ],
  "competitors": [
    "ASICS",
    "Hoka",
    "New Balance",
    "Saucony",
    "Nike"
  ],
  "questions": [
    "What are the best running shoes for flat feet?",
    "Which running shoe brand is best for beginners?",
    "What are the most comfortable running shoes for long distances?"
  ],
  "engines": [
    "openai",
    "grok",
    "meta",
    "mistral"
  ]
}' |
apify call spokentext/ai-share-of-voice --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,spokentext/ai-share-of-voice"
        }
    }
}
```

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/MlSBQloP7G4jGX9WH/builds/X64q3DZNRr6NyuAD8/openapi.json
