How to Build an SEO Rank Tracking Tool with Google Search Scraper

Dedicated rank trackers charge $50 to $200 a month for what is essentially a scheduled Google search with a position lookup. The NanoScrape Google Search Scraper on Apify does the same thing for $1.50 per 1,000 SERP pages, with no monthly subscription. You give it a list of keywords, it scrapes Google, and you get back a structured dataset with every organic position, paid ad, People Also Ask question, AI Overview, and related query on each page. Schedule it daily and you have a full rank tracker for a fraction of the cost. This guide walks through setup, scheduling, and how to find your domain in the results.

Apify dataset table showing Google SERP results from the Google Search Scraper with columns for keyword, organic results, and position data
The dataset output: one row per SERP page with all organic positions, paid results, PAA questions, and AI Overview data.
Difficulty: Beginner
Time: 10 minutes
Cost: $0.001 actor start + $0.0015 per SERP page; free tier covers first $5/month (~3,300 pages)
Tools: Apify, NanoScrape Google Search Scraper
Open the Google Search Scraper on Apify See pricing details

In this tutorial

  1. What you get
  2. Prerequisites
  3. Find keywords worth tracking
  4. Step 1: Create a free Apify account
  5. Step 2: Open the Google Search Scraper
  6. Step 3: Build your keyword list
  7. Step 4: Run and find your domain
  8. Step 5: Schedule daily rank tracking
  9. Advanced: multi-country and competitive tracking
  10. Connect to AI agents via MCP
  11. Key input and output fields
  12. What it costs
  13. FAQ

What you get

The NanoScrape Google Search Scraper runs on Apify and returns one dataset row per SERP page. Each row contains everything Google shows for that query: the ordered list of organic results with their positions and URLs, paid ads, People Also Ask questions (with pre-rendered answers when Google provides them), related search suggestions, the featured snippet, and the full AI Overview text with source citations.

For rank tracking, the key field is organicResults. Each item has a position integer and a url field. To check your ranking for a keyword, search for your domain in the url values and read the position of the matching entry.

Prerequisites

Find keywords worth tracking

Before you start scraping SERPs, you need a keyword list that is actually worth tracking. Targeting queries with zero or negligible search volume means you are measuring rankings nobody cares about. DataForSEO gives you real Google search volume data via API, so you can build a list based on actual demand rather than guesswork.

The two most useful endpoints for this workflow are:

Here is a minimal example that takes a seed keyword, fetches related ideas, and filters to those with at least 100 monthly searches:

const response = await fetch(
  'https://api.dataforseo.com/v3/dataforseo_labs/google/keyword_ideas/live',
  {
    method: 'POST',
    headers: {
      Authorization: 'Basic ' + btoa('YOUR_LOGIN:YOUR_PASSWORD'),
      'Content-Type': 'application/json',
    },
    body: JSON.stringify([{
      keyword: 'rank tracking tool',
      location_code: 2840,   // United States
      language_code: 'en',
      limit: 100,
    }]),
  }
);
const { tasks } = await response.json();
const ideas = tasks[0].result[0].items;

// Filter to keywords with real search volume
const trackable = ideas
  .filter(k => k.keyword_info.search_volume >= 100)
  .map(k => ({ keyword: k.keyword, volume: k.keyword_info.search_volume }))
  .sort((a, b) => b.volume - a.volume);

console.log('Keywords to track:', trackable);
// Pass trackable.map(k => k.keyword) directly into the scraper's queries field
DataForSEO has a free trial with no credit card required. You get $1 of API credit to test with, enough to look up volume for several hundred keywords. Sign up at dataforseo.com and use the credentials you receive as the YOUR_LOGIN:YOUR_PASSWORD values above.

Once you have filtered your list down to keywords with meaningful volume, paste them into the scraper's queries field in Step 3. This way every run measures positions for queries that real users are actually typing.

STEP 1

Create a free Apify account

  1. Open the actor page on Apify and click Try for free.
  2. Sign up with Google or email. The form takes about a minute.
  3. You land on the actor's input form inside Apify Console. The $5 free credit is added automatically.
Already have an account? Click the actor link above and you land directly on the input form.
STEP 2

Open the Google Search Scraper

After signing in you are on the actor's page. The Information tab shows pricing, output field descriptions, and example inputs. The Input tab is where you enter your keyword list.

Apify Console showing the NanoScrape Google Search Scraper actor information tab with pricing and field descriptions
The actor's Information tab: pricing per SERP page, output field descriptions, and a quick-start summary.
STEP 3

Build your keyword list

Click Input in the left sidebar. Enter one keyword per line in the Search Queries field. Each keyword runs as a separate Google search and produces one dataset row per SERP page.

{
  "queries": [
    "best seo rank tracking tool",
    "google search position checker",
    "keyword rank tracker free"
  ],
  "countryCode": "us",
  "languageCode": "en",
  "resultsPerPage": 10,
  "maxPagesPerQuery": 1
}

Key input settings for rank tracking:

Apify Console Google Search Scraper input form showing the queries field with three SEO keywords entered and country set to us
The Input tab with a keyword list for rank tracking. Each keyword produces one dataset row per SERP page fetched.
For a first test, start with 5 to 10 keywords. A run with 10 keywords and 1 page per keyword completes in under 30 seconds and uses only 10 SERP page credits ($0.015).
STEP 4

Run and find your domain in the results

  1. Click Start at the bottom of the Input tab.
  2. The run opens automatically. The Log tab shows one line per SERP page fetched.
  3. When you see Status: SUCCEEDED, click Dataset in the left sidebar.
  4. In the Dataset table, open any row. Look at the organicResults array. Each entry has a url and a position field.
  5. Search for your domain name in the url values. The matching entry's position is your current rank for that keyword.
Apify run log for the Google Search Scraper showing SERP pages being fetched with status SUCCEEDED
The run log. Each line is one SERP page fetched. The status bar shows the total item count when finished.

To automate the position lookup, export the dataset as JSON and filter with a script. Here is a minimal example that prints your domain's rank for each keyword:

const data = require('./dataset.json');
const myDomain = 'yoursite.com';

for (const row of data) {
  const keyword = row.searchQuery.term;
  const match = row.organicResults.find(r => r.url.includes(myDomain));
  const rank = match ? match.position : 'not in top results';
  console.log(`${keyword}: position ${rank}`);
}
If your domain is not in the top 10 results for a keyword, it means you are not on page 1. Increase maxPagesPerQuery to 3 to also check positions 11 to 30.
STEP 5

Schedule daily rank tracking

A one-off run shows you today's rankings. To track changes over time, schedule the actor to run on a regular cadence:

  1. In Apify Console, open the Google Search Scraper actor and click Schedules in the left sidebar.
  2. Click New schedule. Give it a name like "Daily rank check".
  3. Set the cron expression. For a daily run at 6 AM UTC: 0 6 * * *. For weekly on Mondays: 0 6 * * 1.
  4. In the Input field, paste your keyword list as JSON (the same input you used in Step 3).
  5. Click Save. Apify runs the actor automatically at each scheduled time and stores each run's dataset separately.

Each scheduled run produces its own dataset with a timestamp in the run metadata. To compare rankings across dates, fetch multiple datasets by run date via the Apify API:

# List recent runs with their dataset IDs
curl -s "https://api.apify.com/v2/acts/santamaria-automations~google-search-scraper/runs?token=YOUR_TOKEN&limit=7" \
  | jq '.data.items[] | {startedAt, defaultDatasetId, status}'
For 100 keywords tracked daily, you use 100 SERP page credits per day (1 page per keyword). At $0.0015 per page that is $0.15/day or about $4.50/month, well under the free tier's $5 monthly credit.

Advanced: multi-country and competitive tracking

The actor supports two patterns for more advanced rank tracking scenarios.

Multi-country tracking

To track the same keyword in multiple countries, run the actor once per country with the appropriate countryCode and languageCode. You can also pass raw Google search URLs via searchUrls to preserve any additional filters or parameters already in the URL:

{
  "searchUrls": [
    "https://www.google.co.uk/search?q=project+management+software&gl=gb&hl=en",
    "https://www.google.de/search?q=project+management+software&gl=de&hl=de"
  ],
  "resultsPerPage": 10,
  "maxPagesPerQuery": 1
}

Competitive tracking

To monitor competitors, use the same approach as for your own domain. Run the actor against your target keywords, then search the organicResults for each competitor's domain. You can also enable extractAds to see which competitors are bidding on paid placements for the same queries:

{
  "queries": [
    "best project management software",
    "project management tool for teams"
  ],
  "countryCode": "us",
  "extractAds": true
}

With extractAds: true, the actor runs each query with rotated proxy sessions to maximize ad discovery. Paid results appear in paidResults[] (text ads) and paidProducts[] (shopping carousel cards).

Connect to AI agents via MCP

The actor works as a Model Context Protocol (MCP) tool. Paste this server URL into any MCP-compatible client (Claude Desktop, Claude.ai, Cursor, VS Code, LangChain, LlamaIndex):

https://mcp.apify.com?tools=santamaria-automations/google-search-scraper

Once connected, prompt your AI agent in plain English and it calls the actor with the right parameters:

Check where our domain example.com ranks for 'project management software' and 'team collaboration tool' in the US.

Clients that support dynamic tool discovery receive the full input schema automatically, so the model fills in all fields without you specifying parameters manually.

Key input and output fields

Input fields

Output fields per row

What it costs

The actor charges per SERP page scraped, not per run or per keyword.

The Apify free tier gives $5 of credit every month. At $0.0015 per SERP page that covers about 3,300 keyword checks per month at no cost. For 100 keywords checked daily that is about 3,000 pages per month, within the free tier.

Tracking 100 keywords daily for a month costs about $4.50 in SERP page credits. Tracking 500 keywords daily is about $22.50/month. There is no subscription, and unused credits do not carry over.

FAQ

Does this scraper use the official Google Search API?

No. It scrapes Google Search pages directly without using the Custom Search JSON API or any other official Google API. You only need an Apify account.

How accurate are the rank positions compared to a dedicated SEO tool?

Position data comes directly from the Google SERP returned by Apify's GOOGLE_SERP proxy. The same factors that affect any rank tracker apply: results can vary slightly by location, browser history personalization, and search context. For consistent results, use the same countryCode and languageCode in every run and run at the same time of day.

Can I track rankings in more than one country?

Yes. Run the actor once per country with the appropriate countryCode. Alternatively, pass raw Google search URLs via searchUrls if you already have country-specific search links.

How many keywords can I track in one run?

There is no hard limit on the number of keywords in a single run. In practice, batches of 100 to 500 keywords complete in a few minutes. For very large keyword lists (thousands), consider splitting into multiple scheduled runs.

What is the difference between resultsPerPage 10 and 100?

With resultsPerPage: 10 (the default), each page returns the top 10 results and Google includes the richest feature data: pre-rendered PAA answers, full AI Overview text, and more complete featured snippets. With resultsPerPage: 100, you get up to 100 results per page but some of those extra feature fields may be absent or less complete. For rank tracking where you primarily care about positions 1 through 10, the default of 10 is the better choice.

Can I run it on a schedule via the API?

Yes. From the Apify Console you can set up a cron schedule directly on the actor. You can also call it programmatically via the Apify API or the JavaScript/Python SDKs. The run endpoint is POST /v2/acts/santamaria-automations~google-search-scraper/runs.

Related resources

Open the Google Search Scraper on Apify Browse all actors