# Google Rank Tracker — Keyword Positions by Domain (`aitorsm/google-rank-tracker`) Actor

Check where your website ranks on Google for any keyword, in any country, on desktop or mobile. Returns your position, the ranking URL and the top 10 competitors — plus real monthly search volume and cost-per-click so you can sort keywords by what a position is actually worth.

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

## Pricing

from $20.00 / 1,000 keyword position checks

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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 Rank Tracker — Keyword Positions by Domain

Find out exactly where your website ranks on Google for the keywords you care about —
and, unlike most rank trackers, what each of those positions is actually worth.

No subscription. Pay for the keywords you check, nothing more.

### What you get

For every keyword:

- **Your position** in Google's results, and the exact page that ranks
- **What moved since your last check** — places gained or lost, keywords that entered or
  fell out of the top 10, and whether Google switched to ranking a different page of yours
- **Which competitors just appeared** in the top 10, and which dropped out
- **The top 10 results**, so you can see who is ahead of you and why
- **Monthly search volume** and **average cost-per-click** — the real figures advertisers
  pay, not estimates
- **A summary report** each run: how many keywords improved or slipped, net places gained,
  what the movement is worth, which competitors appear across your whole keyword set, and
  your biggest ranking opportunities ranked by value
- Desktop or mobile, and any country

### It tells you what changed, not just where you are

"You are position 9" is a fact. "You were 4 last week, you are 9 now, and Monday.com took
the spot" is something you can act on.

Run it once and you get a snapshot. Schedule it weekly and every run reports the movement
since the last one — including an estimate of **what that movement is worth per month**,
based on how click-through drops off down the page and what advertisers pay for the
keyword. Dropping three places on a keyword nobody searches is not news; dropping three
places on one worth $20 a click is.

Your history is kept on your own account and never leaves it.

### Why the search volume matters

Most rank trackers hand you a list of numbers and leave you to work out which ones matter.
Position 4 on a keyword nobody searches is worth less than position 11 on one that
advertisers pay $20 a click for.

Adding real volume and cost-per-click means you can sort your keywords by **what a position
is worth** rather than by the position itself. That is usually a very different list, and
it is the one worth acting on.

### Try it free

Leave **See a free sample first** switched on and you get a complete example instantly —
no charge, no setup. Turn it off when you want to check your own site.

### Good for

- Checking whether an SEO campaign actually moved anything
- Watching competitors on the keywords you share
- Deciding which keywords deserve budget next quarter
- Reporting to a client or a board with numbers attached
- Sizing up a market before you enter it — leave the website field empty and just collect
  the top results

### Example

**Input**

```json
{
  "domain": "notion.so",
  "keywords": ["project management software", "team wiki", "note taking app"],
  "weightByDemand": true,
  "country": "us"
}
```

**Output** — one row per keyword

```json
{
  "keyword": "project management software",
  "domain": "notion.so",
  "position": 7,
  "rankingUrl": "https://www.notion.so/product/projects",
  "found": true,
  "topResults": [
    { "position": 1, "domain": "monday.com", "url": "https://monday.com/" },
    { "position": 2, "domain": "asana.com", "url": "https://asana.com/" }
  ],
  "previousPosition": 4,
  "positionChange": -3,
  "daysSincePrevious": 7,
  "entered": false,
  "dropped": false,
  "rankingUrlChanged": true,
  "newCompetitors": ["linear.app"],
  "lostCompetitors": ["basecamp.com"],
  "monthlySearches": 33100,
  "avgCpcUsd": 22.4,
  "movementValueUsd": -2226.32
}
```

`positionChange` is places **gained**, so a negative number means you slipped. Here: down
three places over a week, Linear entered the top 10, Google switched which of your pages it
ranks — and the move is costing roughly $2,200 a month in equivalent ad spend.

Export to JSON, CSV or Excel, or pull it straight into a sheet or your own dashboard.

### Frequently asked questions

**How is this different from Ahrefs or Semrush?**
Those are subscriptions starting around $100 a month whether you use them or not. This is
pay-as-you-go — check 20 keywords once and you pay for 20 keywords once. If you need a full
SEO suite, buy the suite. If you need positions, this is cheaper.

**Do I need an API key or an account anywhere?**
No. Nothing to sign up for and nothing to configure.

**Can I track rankings automatically every week?**
Yes, and that is where it earns its keep. Schedule it and each run reports what moved since
the last one, so you get a trend rather than a series of disconnected snapshots.

**Where is my ranking history stored?**
On your own Apify account, in your own storage. It is never sent anywhere else and we
cannot see it. The first run has nothing to compare against; every run after that does.

**What does "move worth $/mo" mean?**
An estimate of what a ranking change is worth, combining how click-through falls away down
the page with what advertisers actually pay for that keyword. It is a guide for prioritising,
not an accounting figure — the raw position change sits right beside it.

**Can I check a competitor's site instead of my own?**
Yes. Put their domain in the website field. Nothing about it is specific to sites you own.

**Does it work outside the US?**
Yes, any country and language. Rankings differ noticeably between markets, so set the
country to the one your customers are actually in.

**Why is my position empty?**
Your site is not in the top results for that keyword. The top-10 list in the same row shows
who is, which is usually the more useful information.

**Is search volume included?**
Yes, when you switch on the volume option — real monthly searches and cost-per-click, not
modelled guesses.

### Also worth a look

Tracking Google positions is only half the picture now that buyers ask AI assistants
instead of searching. **[AI Visibility Tracker](https://apify.com/aitorsm/ai-visibility-tracker)**
shows whether ChatGPT, Google AI Overview and Perplexity mention your brand when someone
asks for a recommendation.

# Actor input Schema

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

Returns a ready-made example straight away so you can see exactly what you get. Nothing is checked and nothing is charged. Switch this off to track your own site.

## `domain` (type: `string`):

The site you want to find in the results. Enter it plainly, without https:// — subdomains are matched too. Leave it empty and you simply get the top results for each keyword, which is handy for sizing up a market you are not in yet.

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

The searches you want to hold a position for. One per line. Phrase them the way a customer would, not the way you describe yourself internally.

## `report` (type: `boolean`):

Adds one summary at the end: how many keywords improved or slipped, net places gained, what the week's movement is worth, which competitors are showing up across your whole keyword set, and where your biggest opportunities are. This is the part worth forwarding.

## `trackChanges` (type: `boolean`):

Reports what moved since you last ran this: places gained or lost, keywords that entered or fell out of the top 10, competitors that just appeared, and whether the page Google ranks has changed. Your history is kept on your own account and never leaves it. Schedule this weekly and you get a trend.

## `weightByDemand` (type: `boolean`):

Adds how many people search each keyword every month and what advertisers pay per click. Position 4 on a keyword nobody searches matters less than position 11 on one people pay $20 a click for — this lets you sort by value instead of by rank.

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

Two-letter country code — rankings differ by market (us, gb, es, de…).

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

Two-letter language code (en, es, de…).

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

Positions genuinely differ between the two, so check whichever your customers actually use.

## Actor input object example

```json
{
  "demoMode": true,
  "domain": "notion.so",
  "keywords": [
    "web scraping tools"
  ],
  "report": true,
  "trackChanges": true,
  "weightByDemand": false,
  "country": "us",
  "language": "en",
  "device": "desktop"
}
```

# Actor output Schema

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

Your position and ranking page for every keyword, with real monthly search volume and cost-per-click.

## `changes` (type: `string`):

Places gained or lost, keywords entering or dropping out of the top 10, and what each move is worth per month.

## `competition` (type: `string`):

The top 10 for every keyword, plus who entered and left since your last check.

# 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 = {
    "demoMode": true,
    "domain": "apify.com",
    "keywords": [
        "web scraping tools"
    ],
    "report": true,
    "trackChanges": true,
    "weightByDemand": false,
    "country": "us",
    "language": "en"
};

// Run the Actor and wait for it to finish
const run = await client.actor("aitorsm/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 = {
    "demoMode": True,
    "domain": "apify.com",
    "keywords": ["web scraping tools"],
    "report": True,
    "trackChanges": True,
    "weightByDemand": False,
    "country": "us",
    "language": "en",
}

# Run the Actor and wait for it to finish
run = client.actor("aitorsm/google-rank-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 '{
  "demoMode": true,
  "domain": "apify.com",
  "keywords": [
    "web scraping tools"
  ],
  "report": true,
  "trackChanges": true,
  "weightByDemand": false,
  "country": "us",
  "language": "en"
}' |
apify call aitorsm/google-rank-tracker --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/mKXI8cDtiSmh7j7SA/builds/YMV3oU9qazOl1pR44/openapi.json
