# AI Search Visibility Tracker — AEO & Citation Audit (`khadinakbar/ai-search-visibility-tracker`) Actor

Check if your domain gets cited by Perplexity, ChatGPT, Claude & Gemini. Tracks citation rank, content gaps & competing domains per keyword. AEO audit.

- **URL**: https://apify.com/khadinakbar/ai-search-visibility-tracker.md
- **Developed by:** [Khadin Akbar](https://apify.com/khadinakbar) (community)
- **Categories:** SEO tools, AI, Agents
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $90.00 / 1,000 keyword visibility checks

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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## AI Search Visibility Tracker — AEO & Citation Audit for Perplexity, ChatGPT, Claude & Gemini

**Find out if AI search engines cite your website as a source — and which topics they don't.** Submit any keyword or topic, and this actor queries Perplexity, ChatGPT, Claude, and Gemini to check whether your domain appears in their citations. No API keys needed. Results in minutes.

### What This Actor Does

When someone asks Perplexity "how do I do keyword research?", the AI cites 5–8 source URLs. This actor finds out if **your domain is one of them** — and if not, flags it as an **AEO content gap** you can act on.

Tracks four signals per check:
- **Citation presence** — is your domain cited at all?
- **Citation rank** — position 1 = your site is the primary source (lower = better)
- **Content gap** — AI cited competitors but not you → high-priority content opportunity
- **Competing domains** — see who else gets cited for your topics

Runs real-time web search on every query. No cached or static data.

### Who Uses This

| Buyer | Use case |
|---|---|
| **SEO teams** | AEO (Answer Engine Optimization) — measure whether content updates translate to AI citation gains |
| **Content marketers** | Find topics where AI answers with competitor pages instead of yours |
| **Digital agencies** | Report AI search visibility scores to clients; track month-over-month |
| **Website owners** | Understand which pages AI platforms treat as authoritative sources |

### Output Data Table

| Field | Type | Description |
|---|---|---|
| `domain_cited` | Boolean | True if any page from your domain was cited |
| `citation_rank` | Integer or null | 1-based position in citation list (1 = primary source) |
| `domain_citation_count` | Integer | How many of your pages were cited |
| `cited_page_url` | String or null | First page from your domain that was cited |
| `cited_pages` | Array | All cited pages from your domain |
| `content_gap` | Boolean | AI cited others but not you — actionable gap |
| `ai_coverage_ratio` | Float | Your pages / total sources (0.25 = 25% of sources are yours) |
| `competing_domains` | Array | Other domains cited for the same topic |
| `keyword` | String | The keyword/topic checked |
| `platform` | String | perplexity, chatgpt, claude, or gemini |
| `ai_answer_excerpt` | String | First 300–600 chars of the AI's answer |
| `visibility_score` | Integer | 0–100 composite across all keywords and platforms |
| `checked_at` | ISO datetime | When the check ran |

### Run Summary (Key-Value Store)

Every run saves `LAST_RUN_SUMMARY` to the key-value store:
- `visibility_score` — 0–100 composite (citation rate × rank quality × topic coverage × page bonus)
- `citation_rate` — fraction of checks where your domain was cited
- `avg_citation_rank` — where your domain typically appears in source lists
- `topic_coverage_rate` — percentage of keywords cited at least once
- `content_gaps` — list of uncited keywords (highest-priority AEO opportunities)
- `top_cited_pages` — your most-cited pages with citation counts
- `top_competing_domains` — competitor domains ranked by how often AI cites them for your topics
- `recommendations` — 3–5 actionable steps based on your data

### AI Search Visibility vs Brand Monitoring

| | AI Search Visibility Tracker | AI Search Brand Monitor |
|---|---|---|
| **Tracks** | Domain / page citations in source lists | Brand name mentions in AI answers |
| **Input** | Keywords / topics | Brand name |
| **Key metric** | Citation rank position | Mention rate + sentiment |
| **Content gaps** | ✅ Finds uncited topics | ❌ |
| **Page-level detail** | ✅ Which exact page was cited | ❌ |
| **Best for** | SEO / content teams | Brand / PR / marketing teams |

Run both for a complete AI search presence picture.

### Pricing

**$0.09 per keyword × query × platform check** (plus standard Apify actor-start fee based on memory).

| Scale | Config | Total checks | Approx. cost |
|---|---|---|---|
| Quick audit | 5 keywords × 1 query × 2 platforms | 10 | ~$0.90 |
| Standard | 10 keywords × 3 queries × 4 platforms | 120 | ~$10.80 |
| Deep audit | 20 keywords × 5 queries × 4 platforms | 400 | ~$36.00 |

All AI costs (Perplexity Sonar, GPT-4o Search Preview, Claude `web_search`, Gemini Google Search grounding) are included — no API keys required.

### How to Use

#### Quick start (minimum input)

```json
{
  "targetDomain": "yoursite.com",
  "keywords": ["your topic 1", "your topic 2", "your topic 3"]
}
````

#### Full input with competitors and custom queries

```json
{
  "targetDomain": "ahrefs.com",
  "keywords": ["SEO", "keyword research", "backlink analysis", "site audit"],
  "competitorDomains": ["semrush.com", "moz.com", "backlinko.com"],
  "platforms": ["perplexity", "chatgpt", "claude", "gemini"],
  "queryTemplates": ["topic_authority", "how_to", "what_is", "comparison"],
  "maxQueriesPerKeyword": 3,
  "webhookUrl": "https://hooks.zapier.com/your-hook",
  "responseFormat": "detailed"
}
```

#### Python

```python
import apify_client

client = apify_client.ApifyClient("YOUR_API_TOKEN")
run = client.actor("khadinakbar/ai-search-visibility-tracker").call(run_input={
    "targetDomain": "yoursite.com",
    "keywords": ["your topic 1", "your topic 2"],
    "platforms": ["perplexity", "chatgpt"],
    "maxQueriesPerKeyword": 2,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    if item["content_gap"]:
        print(f"Gap: {item['keyword']} on {item['platform']}")
    if item["domain_cited"]:
        print(f"Cited rank {item['citation_rank']}: {item['cited_page_url']}")
```

#### JavaScript / Node.js

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

const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });
const run = await client.actor('khadinakbar/ai-search-visibility-tracker').call({
    targetDomain: 'yoursite.com',
    keywords: ['your topic 1', 'your topic 2'],
    platforms: ['perplexity', 'chatgpt', 'claude', 'gemini'],
    maxQueriesPerKeyword: 3,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
const gaps = [...new Set(items.filter(i => i.content_gap).map(i => i.keyword))];
console.log('Content gaps:', gaps);
```

### MCP / AI Agent Usage

Exposed as `apify--ai-search-visibility-tracker` in the Apify MCP server. Claude, ChatGPT, and other AI agents can call it directly:

```
Use apify--ai-search-visibility-tracker to check whether ahrefs.com is cited 
for "SEO" and "keyword research" on Perplexity and ChatGPT.
```

Accepts AI-friendly input aliases:

- `targetDomain` → `domain`, `website`, `site`, `url`
- `keywords` → `topics`, `keyword`, `searchTerms`, `terms`
- `competitorDomains` → `competitors`, `competingSites`

### Query Templates

| Template | What it asks | Example query |
|---|---|---|
| `topic_authority` | Best resources / authoritative sites for X | "What are the best resources for learning SEO?" |
| `how_to` | Step-by-step guides | "How do I do keyword research? Step-by-step." |
| `what_is` | Definitions and explanations | "What is backlink analysis? Explain with examples." |
| `comparison` | Top tools compared | "Best tools for site audit — compare options in 2026." |
| `expert_picks` | Professional recommendations | "What do SEO experts recommend for rank tracking?" |

### AI Platform Coverage

| Platform | Model | Search method | Citation source |
|---|---|---|---|
| Perplexity | sonar | Native Sonar search | `citations[]` array |
| ChatGPT | gpt-4o-search-preview | Native OpenAI web search | Inline markdown + annotations |
| Claude | claude-sonnet-4.5 | `web_search_20250305` tool | `message.annotations[]` url\_citations |
| Gemini | gemini-2.5-flash | Native Google Search grounding | `groundingMetadata.groundingChunks[]` |

### Scheduling for AEO Trend Tracking

Run weekly to track visibility score changes over time. Each run stores `run_id` in every record — compare citation rate and citation rank across weeks without extra setup.

**Recommended schedule:** Monday morning, same keyword set each week.

### Webhook Integration

Set `webhookUrl` to receive the full run summary on completion:

- **Slack** — post weekly visibility score to `#seo` channel
- **Make.com / Zapier / n8n** — alert content team when new gaps appear
- **Google Sheets** — append weekly score rows for trend charts

### FAQ

**Does this track brand name mentions?**
No — it tracks domain citations in source lists. For brand name tracking use [`ai-search-brand-monitor`](https://apify.com/khadinakbar/ai-search-brand-monitor).

**Which AI crawl bots should I allow in robots.txt?**
Allow `PerplexityBot`, `GPTBot`, `ClaudeBot`, `Google-Extended`, `Googlebot`. Blocking these prevents AI indexing and citation. Also add an `llms.txt` file at your domain root listing key pages.

**What is a content gap?**
`content_gap: true` means the AI cited other sites for that topic but not yours. Create more comprehensive, up-to-date content on that topic to earn citations.

**How is citation\_rank measured?**
1-based index of the first URL from your domain in the AI's citation list. Rank 1 = your site is the most prominently cited source. Lower numbers are better.

**Why is my citation rate low despite good Google rankings?**
AI citation and search ranking are correlated but not identical. Common causes: robots.txt blocking AI crawlers, thin page content, lack of structured data (FAQ/HowTo schema), or pages not cited by other high-authority sources.

**What is AEO?**
Answer Engine Optimization — optimizing your content to be cited by AI search platforms (Perplexity, ChatGPT, Claude, Gemini) when they answer queries. AEO is complementary to traditional SEO and increasingly important as AI search gains share.

### Legal Notice

This actor queries publicly accessible AI search APIs. It does not scrape any website. Intended for legitimate SEO research, content strategy, and website analytics. Review each AI platform's terms of service before commercial use.

# Actor input Schema

## `targetDomain` (type: `string`):

The website domain whose pages you want to track as cited sources in AI search results. Enter just the domain without https:// or www (e.g., 'ahrefs.com', 'hubspot.com'). The actor checks whether any URL from this domain appears in AI citations. NOT a brand name — use the ai-search-brand-monitor actor for brand name tracking.

## `keywords` (type: `array`):

List of keywords or topics to ask AI platforms about. The actor submits topic-based queries (e.g., 'best resources for SEO') and checks whether your domain is cited as a source. Enter each topic as a separate item (e.g., \['SEO', 'keyword research', 'backlink analysis']). NOT brand names — use topics and categories your content covers.

## `targetUrls` (type: `array`):

Specific page URLs from your domain to monitor for citations (e.g., 'https://ahrefs.com/blog/seo-guide/'). When provided, the actor also tracks whether these exact pages are cited, not just the domain. Leave empty to track any page from the domain. Each URL must start with https://.

## `competitorDomains` (type: `array`):

Competitor website domains to highlight in the competing\_domains field (e.g., \['semrush.com', 'moz.com']). When set, the summary's top\_competing\_domains list is filtered to these. Leave empty to see all domains cited alongside yours. Helps you measure share-of-voice vs specific competitors.

## `platforms` (type: `array`):

Which AI search platforms to query for citations. Valid values: 'perplexity' (Sonar with real-time citations), 'chatgpt' (gpt-4o-search-preview with web search), 'claude' (Claude Sonnet 4.5 with live web\_search tool), 'gemini' (Gemini 2.5 Flash with native Google Search grounding). All four run real-time web search — no static knowledge cutoff. Defaults to all four.

## `queryTemplates` (type: `array`):

Built-in topic-query templates to run for each keyword. Options: 'topic\_authority' (best resources/authoritative sites for X), 'how\_to' (how to do X), 'what\_is' (what is X / define X), 'comparison' (top tools and resources for X), 'expert\_picks' (what experts recommend for X). Use customQueries instead when you have specific questions. Defaults to topic\_authority, how\_to, what\_is.

## `customQueries` (type: `array`):

Specific questions to submit to AI platforms for every keyword (e.g., 'Which tools do professional SEOs recommend for {keyword}?'). These run in addition to selected queryTemplates. Use plain English questions — the actor submits them verbatim. NOT query templates — these are literal prompts sent to AI.

## `maxQueriesPerKeyword` (type: `integer`):

Maximum number of unique queries to run per keyword across all templates. Higher values give more coverage but cost more credits — each query × platform = one check at $0.09. Default is 3 queries per keyword. Set to 5 for a deeper audit.

## `responseFormat` (type: `string`):

Controls how much of the AI's answer is stored in ai\_answer\_excerpt. 'concise' stores the first 300 characters (fewer tokens, lower storage). 'detailed' stores the first 600 characters (richer context for manual review). Does not affect which platforms are queried or what citations are tracked.

## `webhookUrl` (type: `string`):

An HTTPS URL that receives a POST request when the run completes. The payload is the full run summary JSON — visibility\_score, citation\_rate, content\_gaps, top\_cited\_pages, recommendations. Compatible with Make.com, Zapier, n8n, Slack webhooks, and any HTTP endpoint.

## `demoMode` (type: `boolean`):

Set to true to verify the actor is functional without making any AI API calls. The actor exits successfully with a confirmation message. Use for Apify scheduling tests, connectivity checks, or MCP tool validation without consuming credits.

## Actor input object example

```json
{
  "targetDomain": "ahrefs.com",
  "platforms": [
    "perplexity",
    "chatgpt",
    "claude",
    "gemini"
  ],
  "queryTemplates": [
    "topic_authority",
    "how_to",
    "what_is"
  ],
  "maxQueriesPerKeyword": 3,
  "responseFormat": "detailed",
  "demoMode": false
}
```

# Actor output Schema

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

One record per keyword × query × platform combination. Tracks citation presence, rank, and content gaps.

# 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 = {
    "targetDomain": "ahrefs.com"
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/ai-search-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 = { "targetDomain": "ahrefs.com" }

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

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

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

```

## CLI example

```bash
echo '{
  "targetDomain": "ahrefs.com"
}' |
apify call khadinakbar/ai-search-visibility-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=khadinakbar/ai-search-visibility-tracker",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "AI Search Visibility Tracker — AEO & Citation Audit",
        "description": "Check if your domain gets cited by Perplexity, ChatGPT, Claude & Gemini. Tracks citation rank, content gaps & competing domains per keyword. AEO audit.",
        "version": "1.0",
        "x-build-id": "qXsiUdxOacTQWrmOX"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/khadinakbar~ai-search-visibility-tracker/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-khadinakbar-ai-search-visibility-tracker",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/khadinakbar~ai-search-visibility-tracker/runs": {
            "post": {
                "operationId": "runs-sync-khadinakbar-ai-search-visibility-tracker",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/khadinakbar~ai-search-visibility-tracker/run-sync": {
            "post": {
                "operationId": "run-sync-khadinakbar-ai-search-visibility-tracker",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "targetDomain": {
                        "title": "Target domain to track",
                        "type": "string",
                        "description": "The website domain whose pages you want to track as cited sources in AI search results. Enter just the domain without https:// or www (e.g., 'ahrefs.com', 'hubspot.com'). The actor checks whether any URL from this domain appears in AI citations. NOT a brand name — use the ai-search-brand-monitor actor for brand name tracking."
                    },
                    "keywords": {
                        "title": "Keywords / topics to query",
                        "type": "array",
                        "description": "List of keywords or topics to ask AI platforms about. The actor submits topic-based queries (e.g., 'best resources for SEO') and checks whether your domain is cited as a source. Enter each topic as a separate item (e.g., ['SEO', 'keyword research', 'backlink analysis']). NOT brand names — use topics and categories your content covers.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "targetUrls": {
                        "title": "Target URLs to track (optional)",
                        "type": "array",
                        "description": "Specific page URLs from your domain to monitor for citations (e.g., 'https://ahrefs.com/blog/seo-guide/'). When provided, the actor also tracks whether these exact pages are cited, not just the domain. Leave empty to track any page from the domain. Each URL must start with https://.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "competitorDomains": {
                        "title": "Competitor domains to compare",
                        "type": "array",
                        "description": "Competitor website domains to highlight in the competing_domains field (e.g., ['semrush.com', 'moz.com']). When set, the summary's top_competing_domains list is filtered to these. Leave empty to see all domains cited alongside yours. Helps you measure share-of-voice vs specific competitors.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "platforms": {
                        "title": "AI platforms to query",
                        "type": "array",
                        "description": "Which AI search platforms to query for citations. Valid values: 'perplexity' (Sonar with real-time citations), 'chatgpt' (gpt-4o-search-preview with web search), 'claude' (Claude Sonnet 4.5 with live web_search tool), 'gemini' (Gemini 2.5 Flash with native Google Search grounding). All four run real-time web search — no static knowledge cutoff. Defaults to all four.",
                        "items": {
                            "type": "string"
                        },
                        "default": [
                            "perplexity",
                            "chatgpt",
                            "claude",
                            "gemini"
                        ]
                    },
                    "queryTemplates": {
                        "title": "Query template categories",
                        "type": "array",
                        "description": "Built-in topic-query templates to run for each keyword. Options: 'topic_authority' (best resources/authoritative sites for X), 'how_to' (how to do X), 'what_is' (what is X / define X), 'comparison' (top tools and resources for X), 'expert_picks' (what experts recommend for X). Use customQueries instead when you have specific questions. Defaults to topic_authority, how_to, what_is.",
                        "items": {
                            "type": "string"
                        },
                        "default": [
                            "topic_authority",
                            "how_to",
                            "what_is"
                        ]
                    },
                    "customQueries": {
                        "title": "Custom queries (optional)",
                        "type": "array",
                        "description": "Specific questions to submit to AI platforms for every keyword (e.g., 'Which tools do professional SEOs recommend for {keyword}?'). These run in addition to selected queryTemplates. Use plain English questions — the actor submits them verbatim. NOT query templates — these are literal prompts sent to AI.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxQueriesPerKeyword": {
                        "title": "Max queries per keyword",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Maximum number of unique queries to run per keyword across all templates. Higher values give more coverage but cost more credits — each query × platform = one check at $0.09. Default is 3 queries per keyword. Set to 5 for a deeper audit.",
                        "default": 3
                    },
                    "responseFormat": {
                        "title": "Response format",
                        "enum": [
                            "concise",
                            "detailed"
                        ],
                        "type": "string",
                        "description": "Controls how much of the AI's answer is stored in ai_answer_excerpt. 'concise' stores the first 300 characters (fewer tokens, lower storage). 'detailed' stores the first 600 characters (richer context for manual review). Does not affect which platforms are queried or what citations are tracked.",
                        "default": "detailed"
                    },
                    "webhookUrl": {
                        "title": "Webhook URL (optional)",
                        "type": "string",
                        "description": "An HTTPS URL that receives a POST request when the run completes. The payload is the full run summary JSON — visibility_score, citation_rate, content_gaps, top_cited_pages, recommendations. Compatible with Make.com, Zapier, n8n, Slack webhooks, and any HTTP endpoint."
                    },
                    "demoMode": {
                        "title": "Demo / health check mode",
                        "type": "boolean",
                        "description": "Set to true to verify the actor is functional without making any AI API calls. The actor exits successfully with a confirmation message. Use for Apify scheduling tests, connectivity checks, or MCP tool validation without consuming credits.",
                        "default": false
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
