# Google Rank Tracker API: Daily Keyword Positions (`steady-scrape/google-rank-tracker`) Actor

Track your Google rankings for a keyword list: position, ranking URL, top 10/30/100, any country or city, desktop or mobile. Shows AI Overview, Local Pack, People Also Ask and shopping features, top 3 competitors, and changes since the last run.

- **URL**: https://apify.com/steady-scrape/google-rank-tracker.md
- **Developed by:** [SteadyScrape](https://apify.com/steady-scrape) (community)
- **Categories:** SEO tools, Marketing, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.25 / 1,000 rank check (top 10)s

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

## 📈 Google Rank Tracker: SERP Positions, AI Overview & Changes

Track where your website ranks on Google for a list of keywords, in any country, city, language and device. For every keyword you get **your position and ranking URL**, the **SERP features** on the page (AI Overview, Local Pack, People Also Ask, shopping, videos and more), the **top 3 competitors**, and the **change since your last run**. Built for SEO agencies, in-house marketers, founders and developers who want daily rank tracking without a monthly subscription. **Price: $0.003 per keyword checked in the top 10** ($3 per 1,000 keywords), $0.007 for top 30 and $0.025 for top 100, plus $0.015 per run. 100 keywords checked daily cost about **$9.45 a month**.

- 🎯 **Positions you can trust**: organic position (1–100) and absolute position on the page, the exact ranking URL, and any other URLs of yours that rank
- 🔁 **Change tracking built in**: give your project a Tracker ID and every run is compared with the previous one: up, down, same, new, lost, plus ranking-URL changes (cannibalization alerts)
- 🧩 **SERP features**: AI Overview, Local Pack, People Also Ask, featured snippet, shopping, videos, top stories, forums, images and knowledge graph, and whether **your site appears inside them**
- 🤖 **AI Overview citations (optional)**: see whether Google's AI Overview cites your site
- 🥊 **Competitors**: the top 3 domains above or around you on every SERP, plus the positions of up to 10 competitors you name, with their changes too
- 🌍 **Any market**: 200+ countries, cities and regions (or GPS coordinates for local SEO), 40+ languages, desktop or mobile
- 💸 **Fair billing**: you pay only for keywords that were checked successfully. Errors, invalid keywords and checks that time out are free

### Use cases

- **Agency client reporting**: one Tracker ID per client and market, scheduled daily, exported to Google Sheets or Looker Studio. Show clients what moved up or down without paying per-seat SaaS fees.
- **Local SEO**: track "dentist near me" style keywords from a city or GPS point and see whether you're in the Local Pack, for each of your locations.
- **Content and launch monitoring**: watch a new page climb for its target keywords, and get alerted when a different URL of yours starts ranking instead (cannibalization).
- **Competitor watch**: track up to 10 competitor domains on the same keywords and see who gained or lost positions since the last run.
- **AI Overview visibility**: see which of your keywords trigger a Google AI Overview and whether your site is cited in it.
- **SEO tools and AI agents**: call it from your own app, a workflow tool or an AI agent to get structured ranking data on demand.

### Quick start

```json
{
  "target": "apify.com",
  "keywords": ["scrape amazon prices", "instagram scraper", "web scraping api"],
  "location": "United States",
  "depth": "10",
  "trackerId": "apify-us-desktop"
}
```

This run checks 3 keywords in the top 10 and costs $0.015 + 3 × $0.003 = **$0.024**. Run it again with the same `trackerId` (or set a [schedule](https://docs.apify.com/platform/schedules)) and every row shows `positionChange` and `changeStatus`.

Track one exact page in the top 30 on mobile in Germany, against two competitors:

```json
{
  "target": "https://www.example.com/pricing",
  "keywords": ["project management software", "kanban tool"],
  "location": "Germany",
  "language": "German",
  "device": "mobile",
  "depth": "30",
  "competitors": ["competitor-one.com", "competitor-two.com"],
  "trackerId": "pricing-page-de-mobile"
}
```

Local SEO for a city:

```json
{
  "target": "my-dental-clinic.com",
  "keywords": ["dentist near me", "emergency dentist", "teeth whitening"],
  "location": "Austin,Texas,United States",
  "trackerId": "clinic-austin"
}
```

### Input

| Field | Default | Notes |
|---|---|---|
| `target` | | Domain (`example.com`, any page counts) or full URL (only that exact page counts) |
| `keywords` | | One per line, up to 2,000 per run. Duplicates are removed. Search operators such as `site:` aren't supported |
| `location` | United States | Country name or ISO code, a city/region such as `Chicago,Illinois,United States`, a location code, or GPS `lat,lng,radius` |
| `language` | English | Name or code (`es`, `de`, `pt-BR`) |
| `device` | desktop | `desktop` or `mobile` |
| `depth` | 10 | `10`, `30` or `100` organic results. Deeper checks cost more because Google serves 10 results per page |
| `queueMode` | standard | `standard` (cheapest; typically under a minute for top 10, ~4 min for top 30, ~15 min for top 100), `priority` (faster), `live` (seconds) |
| `competitors` | | Up to 10 domains to track alongside yours |
| `trackerId` | auto | Name of the tracking project. Runs with the same Tracker ID are compared. If empty, one is built from target + location + language + device |
| `includeSubdomains` | true | Count `blog.example.com`, `shop.example.com` etc. as your site |
| `loadAiOverview` | false | Load AI Overviews that Google shows asynchronously, to check if your site is cited |
| `maxWaitMinutes` | 60 | How long to wait for queued checks. Checks still queued after that are marked `timeout` and are free |

### Output sample

A real top-10 run for `apify.com` (United States, desktop, second run of the same tracker):

| keyword | position | rankingUrl | changeStatus | serpFeatures | top competitor |
|---|---|---|---|---|---|
| scrape amazon prices | 1 | apify.com/junglee/free-amazon-product-scraper | up (+2) | ai_overview, video | youtube.com |
| instagram scraper | 5 | apify.com/apify/instagram-reel-scraper | up (+1) | ai_overview, video | igleads.ai |
| web scraping api | not in top 10 | | not_ranked | ai_overview, people_also_ask | scrapingbee.com |

### Output

One row per keyword (dataset views: **Overview**, **SERP features**, **Competitors**):

| Field | Example | Notes |
|---|---|---|
| `keyword` | `google maps scraper` | |
| `status` | `ok` | `ok`, `error`, `timeout`, `skipped`. Only `ok` rows are charged |
| `found` | `true` | Your site is in the checked results |
| `position` | `2` | Organic rank (1–100), `null` if not found |
| `absolutePosition` | `4` | Position counting every SERP element (AI Overview, ads, Local Pack...) |
| `rankingUrl` / `rankingTitle` | `https://example.com/page` | Best-ranking page of yours |
| `otherRankingUrls` | `[{"position": 7, "url": …}]` | Other pages of yours on the SERP |
| `positionChange` | `3` | Positive = moved up since the previous run |
| `changeStatus` | `up` | `first_check`, `up`, `down`, `same`, `new`, `lost`, `not_ranked`, `not_comparable` (depth changed) |
| `previousPosition`, `previousRankingUrl`, `rankingUrlChanged` | | From the previous run of the same tracker |
| `serpFeatures` | `["ai_overview", "people_also_ask", "local_pack"]` | Features on the first page |
| `hasAiOverview`, `hasLocalPack`, `hasPeopleAlsoAsk`, `hasFeaturedSnippet`, `hasShopping`, `hasVideos`, `hasTopStories`, … | `true` | Easy filters |
| `targetInSerpFeatures` | `["ai_overview"]` | Features where your site appears |
| `aiOverviewCited` | `true` | Your site is a source in the AI Overview |
| `topCompetitors` | `[{"domain": "rival.com", "position": 1, "url": …}]` | Top 3 other domains |
| `competitors` | `[{"domain": …, "position": 5, "positionChange": -1}]` | The competitors you listed |
| `checkUrl` | | Google URL for the same search, to verify by hand |
| `serpCheckedAt` | `2026-10-27T14:27:07Z` | When Google was checked |

The run's **OUTPUT** record in the key-value store has a summary: keywords checked, average position, how many ranked in the top 3/10, how many improved, declined, were lost or are new, and how often each SERP feature appeared.

### How change tracking works

Previous results are saved in a named key-value store in your Apify account (`serp-rank-tracker-state`), one record per Tracker ID. Each keyword is compared with the last successful check of the same keyword, location, language and device. Use a different Tracker ID for each site, market or device you track. To start a project again from scratch, use a new Tracker ID.

### Pricing

Pay per event. You pay only for keywords that were checked successfully:

| Event | Price |
|---|---|
| Run start (once per run, only if at least one keyword was checked) | $0.015 |
| Rank check, top 10 (per keyword) | **$0.003** |
| Rank check, top 30 (per keyword) | $0.007 |
| Rank check, top 100 (per keyword) | $0.025 |
| Priority queue surcharge (per 10 results checked) | $0.0015 |
| Live mode surcharge (per 10 results checked) | $0.003 |
| AI Overview citations (per keyword where an AI Overview was loaded) | $0.002 |

Apify also charges its standard tiny Actor start fee ($0.00005 per run at the default memory).

**Worked examples:**

- 100 keywords, top 10, standard queue, daily: $0.015 + 100 × $0.003 = **$0.315 per run, about $9.45 a month**.
- 1,000 keywords, top 10, weekly: $0.015 + 1,000 × $0.003 = **$3.02 per run, about $13 a month**.
- 50 keywords, top 100: $0.015 + 50 × $0.025 = **$1.27 per run**.
- 100 keywords, top 10, priority queue: $0.315 + 100 × $0.0015 = **$0.47 per run**.
- 20 keywords, top 30, live mode: $0.015 + 20 × ($0.007 + 3 × $0.003) = **$0.335 per run**.

Errors, invalid keywords, timeouts and keywords that were skipped because of your spending limit are never charged. The run stops checking once it reaches your **maximum cost per run**, so you can never spend more than you set.

### How it compares

| | This Actor | Monthly rank-tracking SaaS | General Google SERP scrapers |
|---|---|---|---|
| Cost model | Per keyword checked, no subscription | Fixed monthly plan, often with keyword caps | Per page or per result |
| Change since last run | ✅ built in | ✅ | ❌ you build it yourself |
| SERP features and AI Overview | ✅ incl. whether your site is inside them | Usually ✅ | Varies |
| Competitor positions | ✅ top 3 + up to 10 named | ✅ | Raw results only |
| API, webhooks, schedules | ✅ Apify platform | Often on higher plans | ✅ |
| Dashboards and reports UI | Use Sheets / Looker Studio | ✅ built in | ❌ |

If you need a polished reporting dashboard for many users, a SaaS tool may suit you better. If you want raw, cheap, scheduled rank data you can pipe anywhere, this Actor is built for that.

### Tips

- 🗓️ **Schedule it**: rankings move daily. A daily or weekly [schedule](https://docs.apify.com/platform/schedules) with a fixed Tracker ID gives you a ranking history in your datasets.
- 🐢 **Standard queue is the cheapest**: in our tests top-10 checks came back in under a minute, top 30 in about 4 minutes and top 100 in about 15 minutes. It can take longer at busy times. All keywords in a run are queued together, so 500 keywords take about as long as 5. Use `priority` or `live` when you need answers right away.
- 🔎 **Top 10 is usually enough**: track top 30 or 100 only for keywords where you are still climbing.
- 📍 **Local rankings depend on location**: for "near me" keywords, use a city or GPS location.

### Integrations

- **Schedules**: run it daily or weekly with an [Apify schedule](https://docs.apify.com/platform/schedules) and a fixed Tracker ID to build a ranking history.
- **API**: start runs and fetch results from any language with the [Apify API](https://docs.apify.com/api/v2) or the Python and JavaScript clients.
- **Make, Zapier and n8n**: use the Apify app or node to run the Actor on a schedule and push rows to Google Sheets, Airtable, Slack or email, for example "alert me in Slack when a keyword drops out of the top 10".
- **Webhooks**: trigger your own endpoint when a run finishes.
- **AI agents (MCP)**: connect it through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) so Claude, ChatGPT, Cursor or your own agent can check rankings on demand.
- **Google Sheets / Looker Studio**: export the dataset or use the Google Sheets integration for client dashboards.

### FAQ

**Where does the data come from?** From a licensed SERP data provider that checks real Google results for the location, language and device you choose. The Actor doesn't scrape Google from Apify's IPs, so runs don't get blocked by captchas.

**Why does my position differ from what I see in my browser?** Google personalizes results by your history, exact location and device. This Actor checks a clean, non-personalized search for the chosen location. Use `checkUrl` to see a comparable search.

**Does Google still show 100 results per page?** No. Google now serves 10 results per page, so a top-100 check loads 10 pages, which is why deeper checks cost more.

**How much does it cost to track 100 keywords every day?** About $9.45 a month in the top 10 ($0.315 per run). Top 30 is about $21.45 a month and top 100 about $75.45 a month.

**How fast is it?** In our tests, standard top-10 checks came back in under a minute, top 30 in about 4 minutes and top 100 in about 15 minutes. All keywords in a run are queued together, so 500 keywords take about as long as 5. Priority and Live modes are faster for a small surcharge.

**Am I charged if a keyword fails or times out?** No. Only keywords with status `ok` are charged, and the run start fee is only charged after the first successful check.

**Can I see rank history over time?** Yes. Every run's dataset is kept in your account, and each row includes the previous position and change. Schedule it with the same Tracker ID and export the datasets, or append rows to a Google Sheet with an integration.

**Can I track several sites or markets?** Yes. Use one Tracker ID per site, market and device, either as separate tasks or schedules.

**Can I track Bing, YouTube or Google Maps rankings?** Not yet. This Actor tracks Google web search (organic results, plus the SERP features on the page). For YouTube search rankings, use our [YouTube Search API](https://apify.com/steady-scrape/youtube-search-video-stats).

**Is it legal?** It reads publicly available search results through a licensed data provider. You are responsible for how you use the data.

### More from SteadyScrape

- [Keyword Search Volume](https://apify.com/steady-scrape/keyword-search-volume): find the keywords worth tracking: Google search volume, CPC, competition and a 12-month trend for up to 10,000 keywords per run.
- [Bulk Domain Rank & Traffic Checker](https://apify.com/steady-scrape/domain-seo-metrics): domain rank, backlinks, referring domains, spam score and estimated Google traffic for your site and the competitors you see in the SERPs.
- [Backlink Checker API: New and Lost Link Monitor](https://apify.com/steady-scrape/backlink-explorer): who links to the pages that outrank you: backlinks, referring domains, anchors and dofollow status, plus a new and lost link monitor.
- [AI Visibility & Share of Voice Tracker](https://apify.com/steady-scrape/ai-brand-visibility-tracker): see whether ChatGPT and Perplexity mention, rank and cite your brand versus your competitors.

See every **SteadyScrape (steady-scrape)** Actor on [our Apify profile](https://apify.com/steady-scrape).

Questions or a feature request? Open an issue on the **Issues** tab.

### Acceptable use

You may not use results from this service to build or operate a search engine, or any product or service that competes with or harms the business of search engine providers.

— SteadyScrape

# Actor input Schema

## `target` (type: `string`):

The site to track, e.g. example.com (any page of the domain counts) or https://example.com/pricing (only that exact page counts).

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

One keyword per line (up to 2,000 per run). Duplicates are removed. Search operators such as site: are not supported.

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

Country (US, GB, Germany...), a city or region in DataForSEO/Google format (e.g. 'Chicago,Illinois,United States'), a location code (2840), or GPS 'latitude,longitude' with an optional radius like '41.88,-87.63,5km' for local rankings.

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

Search language: a name (English, Spanish, German...) or code (en, es, de, pt-BR).

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

Desktop and mobile Google results often differ.

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

How many organic results to scan for your site. Deeper checks cost more because Google now serves 10 results per page.

## `queueMode` (type: `string`):

Standard is the best choice for scheduled tracking. Priority and Live cost extra per 10 results checked.

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

Up to 10 domains whose position you also want for every keyword, with changes since the last run. The top 3 competitors on each SERP are always included.

## `trackerId` (type: `string`):

Name for this tracking project, e.g. 'acme-us-desktop'. Runs with the same Tracker ID are compared, so each row shows the change since the last run. Leave empty to use domain + location + language + device.

## `includeSubdomains` (type: `boolean`):

When tracking a domain, also count blog.example.com, shop.example.com etc. as your site.

## `loadAiOverview` (type: `boolean`):

Loads Google AI Overviews that appear asynchronously, to see whether your site is cited in them. Charged as an extra event only for keywords where such an AI Overview is loaded. AI Overview presence is always reported for free.

## `maxWaitMinutes` (type: `integer`):

How long the run waits for queued checks. Checks still queued after this time are reported as 'timeout' and not charged.

## Actor input object example

```json
{
  "target": "apify.com",
  "keywords": [
    "scrape amazon prices",
    "instagram scraper",
    "web scraping api"
  ],
  "location": "United States",
  "language": "English",
  "device": "desktop",
  "depth": "10",
  "queueMode": "standard",
  "includeSubdomains": true,
  "loadAiOverview": false,
  "maxWaitMinutes": 60
}
```

# Actor output Schema

## `overview` (type: `string`):

Position, change and ranking URL per keyword.

## `features` (type: `string`):

AI Overview, Local Pack, People Also Ask, shopping and more per keyword.

## `competitors` (type: `string`):

Top 3 competitors and your tracked competitors per keyword.

## `summary` (type: `string`):

Totals, average position, winners/losers and charges.

# 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 = {
    "target": "apify.com",
    "keywords": [
        "scrape amazon prices",
        "instagram scraper",
        "web scraping api"
    ],
    "location": "United States",
    "language": "English"
};

// Run the Actor and wait for it to finish
const run = await client.actor("steady-scrape/google-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 = {
    "target": "apify.com",
    "keywords": [
        "scrape amazon prices",
        "instagram scraper",
        "web scraping api",
    ],
    "location": "United States",
    "language": "English",
}

# Run the Actor and wait for it to finish
run = client.actor("steady-scrape/google-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 '{
  "target": "apify.com",
  "keywords": [
    "scrape amazon prices",
    "instagram scraper",
    "web scraping api"
  ],
  "location": "United States",
  "language": "English"
}' |
apify call steady-scrape/google-rank-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,steady-scrape/google-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/4NQBgiK3WyTzPjIfF/builds/v9YObEduf9oOgla3e/openapi.json
