# Google SERP Scraper & Rank Tracker + AI Overviews (`kirozhang/serp-rank-tracker`) Actor

Google SERP scraper and rank tracker for your domain and competitors on any keyword list. Daily positions, changes, visibility score, SERP features, AI Overview citations, landing URLs and an HTML report.

- **URL**: https://apify.com/kirozhang/serp-rank-tracker.md
- **Developed by:** [Kiro Zhang](https://apify.com/kirozhang) (community)
- **Categories:** SEO tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.50 / 1,000 google results pages

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

> **Built for SEO agencies and in-house SEO teams.** One scheduled run per client or market: positions for your domain and competitors, the change since the last run, AI Overview citations, landing URLs and a client-ready HTML report.
>
> **Why not a plain SERP scraper?** A scraper hands you raw result pages. This tracker compares every keyword with the previous run, re-checks suspicious drops for free (Google often shuffles results), tracks competitors on the same keywords and keeps the history for trends.

### What does this Google SERP scraper & rank tracker do?

**SERP Rank Tracker** checks where **your domain and your competitors rank on Google** for any list of keywords — and remembers every run, so you instantly see what moved:

- 📈 **Positions** (top 10 to top 100) for your domain and up to dozens of competitors, with the **exact ranking URL**.
- 🔁 **Changes since the last run**: improved, declined, new rankings, lost rankings.
- 🏆 **Visibility score & leaderboard**: CTR-weighted visibility, average position, top 3 / top 10 / top 20 counts for you vs. every competitor.
- 🤖 **AI Overviews**: whether Google shows an AI Overview for the keyword, **whether it cites your site**, and which domains it cites instead.
- 🧩 **SERP features**: People also ask, videos, short videos, images, discussions & forums, things to know, local pack, top stories, ads.
- 📊 **HTML report** after each run + the full top 10 for every keyword in the dataset.

Real Google results through Apify's dedicated Google SERP proxy — no API keys, no Google account.

### Why use it?

- 💸 **A fraction of SaaS rank-tracker prices**, pay only for what you check, no seats or plans.
- 🧠 **Built for the AI-search era**: track not only blue links but also AI Overview citations.
- ⏰ **Set and forget**: schedule it daily or weekly with the same *Tracking name*; trends build up automatically in your own Apify account.
- 🔌 **Plug into anything**: Google Sheets, Looker Studio, Slack, n8n, Make, Zapier or your own app via API.
- 💡 **Smart and frugal**: with deeper tracking (top 20–100) it stops paging as soon as all your tracked domains are found, so you don't pay for pages you don't need.

#### Who is it for?

SEO agencies reporting to clients, in-house SEO and content teams, founders checking their brand's search presence, and analysts benchmarking competitors.

### How to use it

1. Enter **your domain** (e.g. `example.com`).
2. Add your **keywords** (one per line) and optional **competitor domains**.
3. Choose **country**, **language** and **tracking depth**.
4. Run it, then add a **Schedule** (daily or weekly) with the same **Tracking name** to build history.

### Output

#### Dataset – one row per keyword

```json
{
    "keyword": "crm software",
    "position": 3,
    "url": "https://www.hubspot.com/products/crm",
    "previousPosition": 5,
    "positionChange": 2,
    "inTop3": true,
    "competitors": [
        { "domain": "salesforce.com", "position": 1, "url": "https://www.salesforce.com/crm/", "positionChange": 0 },
        { "domain": "pipedrive.com", "position": 12, "url": null, "positionChange": -3 }
    ],
    "aiOverviewStatus": "shown",
    "domainCitedInAiOverview": true,
    "aiOverviewCitedDomains": ["hubspot.com", "pcmag.com", "salesforce.com"],
    "serpFeatures": ["ai_overview", "people_also_ask", "videos", "images"],
    "topResults": [{ "position": 1, "domain": "salesforce.com", "title": "…", "url": "…" }]
}
```

`positionChange` is positive when you moved up, negative when you dropped, `"entered"` for a new ranking and `"dropped_out"` when you fell out of the tracked depth.

#### Summary & report (key-value store)

- **OUTPUT** – your visibility score, average position, top 3/10/20, the competitor leaderboard, all changes, SERP feature counts, AI Overview stats and a timeline of previous runs.
- **REPORT** – a clean HTML dashboard you can share.

### How much does it cost?

| Event | Free & Starter | Scale | Business |
|---|---|---|---|
| Google results page checked (10 results) | $0.01 | $0.009 | $0.0085 |

Tracking the top 10 = 1 page per keyword. The examples below use Starter prices.

| Setup | Cost |
|---|---|
| 100 keywords, top 10, weekly | ≈ $4.30 / month |
| 100 keywords, top 10, daily | ≈ $30 / month |
| 500 keywords, top 20, daily | ≈ $150–300 / month (stops early when all domains are found) |

URL resolution, change tracking, history and the report are included. On the Apify free plan each run tracks up to 10 keywords.

To cap spending, set **Maximum cost per run** in the run options – the Actor stops cleanly when it is reached and keeps what it already saved.

### Automations: Slack, email, n8n, Make, Zapier

- **n8n – ready-made workflow:** [Google rank drops → email](https://api.apify.com/v2/key-value-stores/JFOMYybxejeFmBbUK/records/n8n-google-rank-drops-to-email). In n8n choose *Import from URL* and paste the link, add your Apify API token as a *Header Auth* credential (`Authorization` = `Bearer YOUR_TOKEN`), edit the input and activate.
- **Make or Zapier:** use the Apify app → *Run an Actor* with this Actor and the same input → filter on `positionChange` (a number below 0 means the keyword lost positions, `dropped_out` means it left the checked results) → Slack, Gmail or Google Sheets.
- **Apify only:** add a *Schedule* (daily is typical), then connect Slack or email in the Actor's *Integrations* tab.

### Reliability

An automated health check runs this Actor against live pages every week, and open issues are checked twice a day. If something looks wrong, open an issue with the run ID and you'll get an answer within 24 hours.

### Tips & limits

- Results are **non-personalized desktop** results for the chosen country.
- Google sometimes serves different result sets for the same query (A/B tests, shifting intent), so single-run jumps can happen; judge trends over several runs.
- AI Overviews are reported when Google serves one for the query; long conversational queries often have none.

### FAQ

**Does it support mobile rankings or local (city-level) rankings?** Not yet — desktop, country-level. Open an issue if you need it.

**Where is my history stored?** In the named key-value store `serp-rank-tracker-history` in your Apify account.

**Can I export to Google Sheets / Looker Studio?** Yes — use Apify's Google Sheets integration or the dataset API.

# Actor input Schema

## `myDomain` (type: `string`):

Required. The domain to track, e.g. example.com. Subdomains count as the same site.

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

Required. One keyword per line (up to 5,000 per run; 10 on the Apify free plan). Each keyword costs one charge per Google page checked.

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

Optional. Competitor domains tracked on the same keywords, e.g. competitor.com.

## `country` (type: `string`):

Google country (local Google domain + location).

## `language` (type: `string`):

Google interface / results language.

## `depth` (type: `string`):

How deep to look. Each 10 results is one Google page (one charge). The tracker stops early once all your tracked domains are found.

## `trackingId` (type: `string`):

Stable name for this project, e.g. 'example-us'. Runs with the same name are compared, which produces positionChange and trends. Defaults to your domain + country.

## `resolveUrls` (type: `string`):

Google hides exact result URLs; resolving them costs no extra charge but takes a moment.

## Actor input object example

```json
{
  "myDomain": "hubspot.com",
  "keywords": [
    "best crm for small business",
    "free crm",
    "crm software",
    "sales pipeline software"
  ],
  "competitorDomains": [
    "salesforce.com",
    "pipedrive.com",
    "zoho.com"
  ],
  "country": "us",
  "language": "en",
  "depth": "10",
  "resolveUrls": "tracked"
}
```

# Actor output Schema

## `keywords` (type: `string`):

No description

## `report` (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 = {
    "myDomain": "hubspot.com",
    "keywords": [
        "best crm for small business",
        "free crm",
        "crm software",
        "sales pipeline software"
    ],
    "competitorDomains": [
        "salesforce.com",
        "pipedrive.com",
        "zoho.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("kirozhang/serp-rank-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 = {
    "myDomain": "hubspot.com",
    "keywords": [
        "best crm for small business",
        "free crm",
        "crm software",
        "sales pipeline software",
    ],
    "competitorDomains": [
        "salesforce.com",
        "pipedrive.com",
        "zoho.com",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("kirozhang/serp-rank-tracker").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "myDomain": "hubspot.com",
  "keywords": [
    "best crm for small business",
    "free crm",
    "crm software",
    "sales pipeline software"
  ],
  "competitorDomains": [
    "salesforce.com",
    "pipedrive.com",
    "zoho.com"
  ]
}' |
apify call kirozhang/serp-rank-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,kirozhang/serp-rank-tracker"
        }
    }
}
```

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

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/uPuODL05pLjfSQM82/builds/3csgKnPjPe5aLEX3I/openapi.json
