# Google SERP Rank & Visibility Monitor — PAA, Features + API (`aileo/google-ai-visibility-monitor`) Actor

Track your Google organic rankings, People Also Ask, SERP features and competitor share of voice for a list of keywords. Change alerts + real-time REST API. Built on Apify's Google SERP proxy.

- **URL**: https://apify.com/aileo/google-ai-visibility-monitor.md
- **Developed by:** [Leo Rohmann](https://apify.com/aileo) (community)
- **Categories:** SEO tools, Developer tools, E-commerce
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $15.00 / 1,000 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/docs.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.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/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

## Google SERP Rank & Visibility Monitor — PAA, Features + API

**Know exactly where you stand on Google — for any list of keywords.** This actor returns your **organic ranking position**, the **People Also Ask** questions, the **SERP features** present (ads, shopping, local pack, featured snippet), and your **competitors' share of voice** — as clean, alert-ready JSON. Track it over time and get only what *changed* since the last run.

Two ways to use it in one actor:
- **Batch monitoring** — run on a Schedule, store history, receive only changed keywords.
- **Real-time API** — run in **Standby mode** for a low-latency REST endpoint (`/check`) with a published OpenAPI schema you can plug into n8n, Make, a dashboard, or your own app.

Data is fetched through Apify's own **Google SERP proxy** — no CAPTCHAs, no headless browser, no third-party dependency, no proxy setup on your side.

> Keywords: Google rank tracker, SERP monitor, keyword rank checker, People Also Ask scraper, SERP features, share of voice, competitor rank tracking, SEO monitoring, position tracker, Google SERP API, GEO, AEO, AI Overview detection.

### 💡 What you can do with it

- **Rank tracking** — monitor your organic position for target keywords across countries, languages and devices.
- **Competitor share of voice** — see who ranks against you and who owns each keyword.
- **People Also Ask mining** — pull PAA questions for content and SEO research.
- **SERP-feature awareness** — know when ads, shopping, local packs or featured snippets appear.
- **Change alerts** — run daily with `onlyChanged` and get only keywords that moved in the rankings.
- **Real-time checks** — hit the Standby `/check` endpoint from your CRM, Slack bot, Google Sheet, or AI agent.
- **Bonus: AI Overview citations** — when Google serves an AI Overview for a query, the cited source domains are captured too (`hasAiOverview`, `aiOverviewSourceDomains`).

### ⚙️ Input

| Field | Description |
|---|---|
| `keywords` | Search queries to check. |
| `targetDomain` | Your domain (e.g. `example.com`). Leave empty to just map the SERP landscape. |
| `competitorDomains` | Competitor domains for share-of-voice comparison. |
| `countryCode` / `languageCode` | Where and in which language to search (`gl` / `hl`). |
| `device` | `desktop` or `mobile`. |
| `topN` | How deep to look for your domain in the organic results. |
| `includePaa` | Toggle People Also Ask extraction. |
| `onlyChanged` | Monitoring mode — output only keywords whose ranking changed since the last run. |
| `maxKeywords` | Cap keywords per run. |

**Example input**
```json
{
  "keywords": ["best crm software for small business", "project management tools"],
  "targetDomain": "example.com",
  "competitorDomains": ["competitor1.com", "competitor2.com"],
  "countryCode": "us",
  "languageCode": "en",
  "onlyChanged": false,
  "maxKeywords": 25
}
````

### 📤 Output (one row per keyword)

```json
{
  "keyword": "best crm software for small business",
  "country": "us",
  "language": "en",
  "device": "desktop",
  "checkedAt": "2026-07-16T10:00:00.000Z",
  "searchUrl": "https://www.google.com/search?q=...",
  "organicTargetRank": 7,
  "organicTargetUrl": "https://example.com/crm",
  "featuredSnippetIsTarget": false,
  "paaQuestions": ["Which CRM is best for a small team?", "Is there a free CRM?"],
  "serpFeatures": ["peopleAlsoAsk", "ads"],
  "competitors": [
    { "domain": "competitor1.com", "organicRank": 2, "aioCited": false, "aioCitationRank": null }
  ],
  "shareOfVoice": { "example.com": 1, "competitor1.com": 1 },
  "visibilityScore": 34,
  "hasAiOverview": false,
  "aiOverviewCitesTarget": false,
  "aiOverviewSourceDomains": [],
  "changed": true,
  "changes": ["organic_rank:9->7"],
  "previousOrganicRank": 9,
  "sourceUrl": "https://www.google.com/search?q=..."
}
```

`visibilityScore` (0–100) is driven primarily by your organic ranking, with bonuses for a featured snippet and any AI Overview citation.

### 🔁 Daily monitoring

1. Run once with your keywords + `targetDomain`, `onlyChanged: false` to establish a baseline.
2. Add a daily **Schedule** in the Apify Console with `onlyChanged: true`.
3. Receive only keywords that moved — connect to Slack / email / Google Sheets / your data warehouse.

State (last-seen rank per keyword) is kept in a **named key-value store** so change detection survives across scheduled runs. Each account gets its own private store.

### ⚡ Real-time API (Standby mode)

Enable **Standby** and call the endpoint — see the interactive **API / Standby** tab (rendered from the OpenAPI schema):

```
GET https://<your-standby-url>/check?keyword=best%20crm%20software&targetDomain=example.com&country=us
```

Returns the same JSON record for a single query, in real time. `/health` is free; each `/check` is billed as one result.

### 🔧 How it works

SERP data is sourced through Apify's own **Google SERP proxy** — a sanctioned, CAPTCHA-free way to fetch Google result-page HTML. This actor parses it and adds the ranking, share-of-voice, change-detection and real-time-API layers on top. No headless browser, no proxy setup, low maintenance.

> Note on AI Overviews: Google renders AI Overviews client-side and does not serve them to non-JavaScript clients, so they are captured **when present** but are not the primary signal — organic rank, PAA and SERP features are.

### 💳 Pricing

Pay-per-event: you pay per **visibility check** (one keyword in batch, or one `/check` request in Standby). No monthly subscription. Readiness probes and `/health` are free.

### 🔒 Data protection & fair use

- This tool analyzes public Google Search results for **SEO monitoring, market research and competitive analysis**. You are responsible for complying with applicable laws in your jurisdiction.
- It does **not** extract personal contact data.
- Results depend on Google and can vary by location, language and device.

***

*Not affiliated with Google. "Google" is a trademark of Google LLC. Data belongs to the respective owners.*

# Actor input Schema

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

The search queries to check. Question-style queries ("how...", "best...", "what is...") are most likely to trigger an AI Overview.

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

The domain to score visibility for, e.g. "example.com" (no protocol). Leave empty to only map which domains Google cites, without scoring a specific site.

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

Competitor domains for share-of-voice comparison, e.g. "competitor.com". Optional.

## `countryCode` (type: `string`):

Country to search from (Google country domain + gl parameter).

## `languageCode` (type: `string`):

Interface / results language (Google hl parameter).

## `device` (type: `string`):

Emulate desktop or mobile results (AI Overviews and layout differ).

## `topN` (type: `integer`):

How deep to look for your domain in the organic results.

## `includeAiOverview` (type: `boolean`):

Extract the AI Overview block and its cited source domains. This is the core feature.

## `includePaa` (type: `boolean`):

Extract People Also Ask questions.

## `includeAiMode` (type: `boolean`):

Also open Google's conversational AI Mode tab where available. Heavier and less stable — off by default.

## `onlyChanged` (type: `boolean`):

Monitoring mode: only output keywords whose visibility changed vs. the previous run (state persisted in a named store). Keep OFF for the first run so you get a full baseline.

## `maxKeywords` (type: `integer`):

Upper bound on keywords processed per run. Kept modest so a default run is cheap and always returns results.

## Actor input object example

```json
{
  "keywords": [
    "what is generative engine optimization",
    "best crm software for small business",
    "how to track brand visibility in ai search"
  ],
  "targetDomain": "example.com",
  "countryCode": "us",
  "languageCode": "en",
  "device": "desktop",
  "topN": 10,
  "includeAiOverview": true,
  "includePaa": true,
  "includeAiMode": false,
  "onlyChanged": false,
  "maxKeywords": 25
}
```

# 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 = {
    "keywords": [
        "what is generative engine optimization",
        "best crm software for small business",
        "how to track brand visibility in ai search"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("aileo/google-ai-visibility-monitor").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 = { "keywords": [
        "what is generative engine optimization",
        "best crm software for small business",
        "how to track brand visibility in ai search",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("aileo/google-ai-visibility-monitor").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 '{
  "keywords": [
    "what is generative engine optimization",
    "best crm software for small business",
    "how to track brand visibility in ai search"
  ]
}' |
apify call aileo/google-ai-visibility-monitor --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Google SERP Rank & Visibility Monitor — PAA, Features + API",
        "description": "Track your Google organic rankings, People Also Ask, SERP features and competitor share of voice for a list of keywords. Change alerts + real-time REST API. Built on Apify's Google SERP proxy.",
        "version": "0.1",
        "x-build-id": "lHUdroF39lNU9gjA6"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/aileo~google-ai-visibility-monitor/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-aileo-google-ai-visibility-monitor",
                "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/aileo~google-ai-visibility-monitor/runs": {
            "post": {
                "operationId": "runs-sync-aileo-google-ai-visibility-monitor",
                "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/aileo~google-ai-visibility-monitor/run-sync": {
            "post": {
                "operationId": "run-sync-aileo-google-ai-visibility-monitor",
                "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",
                "required": [
                    "keywords"
                ],
                "properties": {
                    "keywords": {
                        "title": "Keywords / search queries",
                        "type": "array",
                        "description": "The search queries to check. Question-style queries (\"how...\", \"best...\", \"what is...\") are most likely to trigger an AI Overview.",
                        "default": [
                            "what is generative engine optimization",
                            "best crm software for small business",
                            "how to track brand visibility in ai search"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "targetDomain": {
                        "title": "Your domain",
                        "type": "string",
                        "description": "The domain to score visibility for, e.g. \"example.com\" (no protocol). Leave empty to only map which domains Google cites, without scoring a specific site."
                    },
                    "competitorDomains": {
                        "title": "Competitor domains",
                        "type": "array",
                        "description": "Competitor domains for share-of-voice comparison, e.g. \"competitor.com\". Optional.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "countryCode": {
                        "title": "Country",
                        "enum": [
                            "us",
                            "gb",
                            "ca",
                            "au",
                            "ie",
                            "de",
                            "at",
                            "ch",
                            "fr",
                            "es",
                            "it",
                            "nl",
                            "se",
                            "in",
                            "br",
                            "mx",
                            "jp"
                        ],
                        "type": "string",
                        "description": "Country to search from (Google country domain + gl parameter).",
                        "default": "us"
                    },
                    "languageCode": {
                        "title": "Language",
                        "enum": [
                            "en",
                            "de",
                            "fr",
                            "es",
                            "it",
                            "nl",
                            "sv",
                            "pt",
                            "hi",
                            "ja"
                        ],
                        "type": "string",
                        "description": "Interface / results language (Google hl parameter).",
                        "default": "en"
                    },
                    "device": {
                        "title": "Device",
                        "enum": [
                            "desktop",
                            "mobile"
                        ],
                        "type": "string",
                        "description": "Emulate desktop or mobile results (AI Overviews and layout differ).",
                        "default": "desktop"
                    },
                    "topN": {
                        "title": "Organic depth (top N)",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "How deep to look for your domain in the organic results.",
                        "default": 10
                    },
                    "includeAiOverview": {
                        "title": "Include AI Overview",
                        "type": "boolean",
                        "description": "Extract the AI Overview block and its cited source domains. This is the core feature.",
                        "default": true
                    },
                    "includePaa": {
                        "title": "Include People Also Ask",
                        "type": "boolean",
                        "description": "Extract People Also Ask questions.",
                        "default": true
                    },
                    "includeAiMode": {
                        "title": "Include AI Mode (experimental, slower)",
                        "type": "boolean",
                        "description": "Also open Google's conversational AI Mode tab where available. Heavier and less stable — off by default.",
                        "default": false
                    },
                    "onlyChanged": {
                        "title": "Only changed since last run",
                        "type": "boolean",
                        "description": "Monitoring mode: only output keywords whose visibility changed vs. the previous run (state persisted in a named store). Keep OFF for the first run so you get a full baseline.",
                        "default": false
                    },
                    "maxKeywords": {
                        "title": "Max keywords per run",
                        "minimum": 1,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Upper bound on keywords processed per run. Kept modest so a default run is cheap and always returns results.",
                        "default": 25
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
