Google Organic Rank Tracker avatar

Google Organic Rank Tracker

Pricing

Pay per event

Go to Apify Store
Google Organic Rank Tracker

Google Organic Rank Tracker

Track domain positions in Google organic search by keyword, country, language, and desktop or mobile device.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Stas Persiianenko

Stas Persiianenko

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Categories

Share

Track where your domains appear in Google organic search results across keywords, countries, languages, and desktop or mobile layouts.

The Actor writes one dated rank snapshot for every domain × keyword × locale × device combination. Schedule it daily or weekly to build position history in Apify datasets, Google Sheets, a database, or your SEO dashboard.

It reports both found and not-found checks, so missing positions do not disappear from monitoring pipelines.

What does Google Organic Rank Tracker do?

For each requested Google query, the Actor:

  1. requests localized search results;
  2. identifies external organic heading links;
  3. excludes Google navigation and non-organic modules;
  4. compares each result hostname with your tracked domains;
  5. records the first matching organic position, URL, and title;
  6. writes a timestamped row even when no match is found.

Ads, Maps packs, shopping modules, and AI modules are not counted as organic ranks.

Who is it for?

  • SEO specialists checking important keyword positions without copying SERPs by hand;
  • SEO agencies monitoring client and competitor domains by market;
  • Content teams checking whether a new or updated page starts ranking;
  • Growth teams comparing desktop and mobile visibility;
  • Data teams feeding repeatable rank snapshots into BI tools or warehouses.

Why use this rank tracker?

  • Check several domains against one SERP without repeating the Google request.
  • Combine multiple keywords, countries, languages, and devices in one run.
  • Keep explicit found: false records for stable time-series analysis.
  • Match subdomains to their parent tracked domain.
  • Receive the matched ranking URL and title, not only a position number.
  • Use typed default-dataset rows with Apify schedules, webhooks, API clients, and integrations.

What Google organic data is extracted?

FieldMeaning
checkedAtUTC timestamp shared by the run's snapshots
keywordGoogle query checked
trackedDomainNormalized input domain
countryCodeRequested Google country market
languageCodeRequested result language
devicedesktop or mobile layout
positionOne-based organic position, or null
rankingUrlMatched result URL, or null
titleMatched organic result title, or null
foundWhether the domain was found
organicResultsScannedRecognized organic links inspected
searchUrlLocalized Google query URL

How to track Google organic rankings

  1. Open the Actor input page.
  2. Enter one or more domains, such as apify.com.
  3. Add the keywords you want to monitor.
  4. Choose country/language locale pairs.
  5. Select desktop, mobile, or both devices.
  6. Start with the default 20 requested results, or raise it to 100 for broader rank coverage.
  7. Start the Actor.
  8. Open the Organic rank history dataset view.
  9. Add an Apify schedule if you want recurring snapshots.

Input parameters

domains

Required list of domains or website URLs. Inputs are normalized to hostnames. A result on blog.example.com matches tracked domain example.com.

Maximum: 20 domains.

keywords

Required list of Google queries.

Maximum: 50 keywords.

locales

Country/language objects such as:

[
{ "countryCode": "US", "languageCode": "en" },
{ "countryCode": "DE", "languageCode": "de" }
]

Maximum: 10 locale pairs.

devices

Choose desktop, mobile, or both.

maxResults

Number of organic results requested from Google per SERP. Accepted range: 10–100. Google can return fewer recognizable organic links than requested.

maxRequestRetries

Retries transient proxy or upstream failures using the same sticky session. Accepted range: 0–5.

A run may create at most 1,000 domain rank-check rows.

Input example

{
"domains": ["apify.com", "scrapingbee.com"],
"keywords": ["apify scrapingbee"],
"locales": [
{ "countryCode": "US", "languageCode": "en" }
],
"devices": ["desktop"],
"maxResults": 100,
"maxRequestRetries": 2
}

Output example

A real local check returned this shape:

{
"checkedAt": "2026-07-29T03:49:41.722Z",
"keyword": "apify scrapingbee",
"trackedDomain": "apify.com",
"countryCode": "US",
"languageCode": "en",
"device": "desktop",
"position": 1,
"rankingUrl": "https://apify.com/alternatives/scrapingbee-alternative",
"title": "ScrapingBee Alternative",
"found": true,
"organicResultsScanned": 8,
"searchUrl": "http://www.google.com/search?q=apify+scrapingbee&hl=en&gl=us&num=100&filter=0&pws=0"
}

When a domain is absent, position, rankingUrl, and title are null, while found is false.

How much does it cost to track Google organic rankings?

Pricing uses a one-time $0.005 run-start event plus one rankCheck event for every output row.

At the current BRONZE price of $0.00504 per domain rank check:

WorkloadRank checksEstimated event price
1 domain × 5 keywords5$0.005 start + 5 × $0.00504 rank checks
2 domains × 25 keywords50$0.005 start + 50 × $0.00504 rank checks
5 domains × 100 keyword/locale/device combinations500$0.005 start + 500 × $0.00504 rank checks

Higher usage tiers reduce the per-check event price. Platform compute and proxy usage are covered by event pricing; your final run charge is shown by Apify.

Scheduling position history

The Actor intentionally emits timestamped snapshots rather than hiding history in private internal storage.

To build a time series:

  1. save a Task with your production input;
  2. attach a daily or weekly Apify schedule;
  3. export each run's dataset through a webhook or integration;
  4. compare position by checkedAt, keyword, trackedDomain, locale, and device.

This model keeps each run reproducible and works with your preferred retention system.

Google Sheets and data-pipeline workflows

Useful integrations include:

  • append snapshots to Google Sheets;
  • send completed-run webhooks to Make or Zapier;
  • copy rows into BigQuery, Snowflake, PostgreSQL, or a data lake;
  • trigger Slack alerts when a downstream workflow detects a large position change;
  • join rankings with Search Console clicks and impressions outside the Actor.

The Actor does not calculate changes against prior runs itself. Compare snapshots downstream using their stable dimensions.

Run with the Apify API using cURL

curl -X POST \
"https://api.apify.com/v2/acts/automation-lab~seo-rank-tracker/runs?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"domains": ["apify.com"],
"keywords": ["web scraping platform"],
"locales": [{"countryCode":"US","languageCode":"en"}],
"devices": ["desktop"],
"maxResults": 100
}'

Use run-sync-get-dataset-items instead of runs when a short synchronous client request is appropriate.

Run with JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/seo-rank-tracker').call({
domains: ['apify.com'],
keywords: ['web scraping platform'],
locales: [{ countryCode: 'US', languageCode: 'en' }],
devices: ['desktop'],
maxResults: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Run with Python

import os
from apify_client import ApifyClient
client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/seo-rank-tracker').call(run_input={
'domains': ['apify.com'],
'keywords': ['web scraping platform'],
'locales': [{'countryCode': 'US', 'languageCode': 'en'}],
'devices': ['desktop'],
'maxResults': 100,
})
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)

Use with MCP and AI agents

Add this Actor to Claude Code through Apify MCP:

claude mcp add --transport http apify \
"https://mcp.apify.com?tools=automation-lab/seo-rank-tracker"

Claude Desktop, Cursor, and VS Code can use the same HTTP MCP server configuration in their MCP settings:

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=automation-lab/seo-rank-tracker"
}
}
}

Example prompts:

  • “Check apify.com for web scraping platform in US desktop Google results.”
  • “Compare apify.com and scrapingbee.com for apify scrapingbee.”
  • “Run mobile and desktop checks for these SEO keywords in US and UK markets.”

Accuracy, limits, and failure behavior

  • Google results change by time, market, device, personalization, and experiments.
  • gl and hl localize country and language; the Actor does not claim city or GPS-level localization.
  • Google may return fewer organic links than maxResults requests.
  • The first matching URL for a domain determines its position.
  • Ads, Maps, shopping, AI, and Google navigation are excluded from organic positions.
  • The parser relies on recognizable linked result headings; upstream markup can change.
  • A challenge or unrecognizable empty SERP fails the run instead of producing false not-found rows.
  • Results are observations, not guarantees of what every individual user sees.

Use the Actor only for lawful SEO measurement and public search-result analysis.

Respect applicable laws, contractual obligations, privacy requirements, and Apify platform rules. Do not use rankings to profile sensitive individuals or to evade access controls. Keep request volumes bounded and schedule only the checks you need.

Google is a trademark of Google LLC. This Actor is independent and is not endorsed by Google.

FAQ

Why is position null?

The tracked domain was not present in the recognized organic results returned for that keyword, locale, and device. Check organicResultsScanned, verify the domain spelling, and try a more relevant keyword.

Why did the run fail instead of returning null positions?

The Actor detected a challenge, proxy failure, or result page without recognizable organic links. Failing protects monitoring pipelines from treating a blocked SERP as a genuine ranking loss. Retry later or inspect the run log.

Why do mobile and desktop positions differ?

Google can rank and display results differently by device. Treat each device as a separate time series.

Can I track a city?

Not in this release. Country/language localization is supported; city/GPS-level location is not claimed.

Does the Actor include ads or Maps positions?

No. It reports linked organic web results only.

Use this Actor when the primary job is recurring organic domain position tracking rather than broad SERP extraction.