Back to Blog

How to Build a Keyword Rank Tracker in Python Using a SERP API

Build a Python keyword rank tracker with a SERP API. Track positions, monitor competitors, schedule daily checks, and export ranking data.

May 23, 2026
By SerpBase Teampython rank trackerserp apirank trackingseo automationpython tutorial

Why Build a Custom Rank Tracker

Off-the-shelf rank trackers charge based on keyword volume, and costs spiral quickly. Building your own with a SERP API gives you full control over keywords, markets, refresh frequency, and budget.

Prerequisites

  • Python 3.8+
  • A SerpBase API key (free 100 searches to start)
  • Basic familiarity with Python and JSON

Step 1: Set Up the Project

mkdir rank-tracker && cd rank-tracker
python -m venv venv
source venv/bin/activate
pip install requests pandas

Step 2: Make Your First API Call

import requests
import json

API_KEY = "your-api-key"
url = "https://api.serpbase.dev/google/search"
headers = {
    "X-API-Key": API_KEY,
    "Content-Type": "application/json"
}

def check_rank(keyword, domain, gl="us", hl="en"):
    payload = {"q": keyword, "gl": gl, "hl": hl}
    resp = requests.post(url, json=payload, headers=headers)
    data = resp.json()

    for result in data.get("organic", []):
        if domain in result.get("link", ""):
            return {
                "keyword": keyword,
                "position": result["position"],
                "title": result["title"],
                "url": result["link"],
                "snippet": result.get("snippet", "")
            }
    return {"keyword": keyword, "position": None}

print(check_rank("python tutorials", "realpython.com"))

Step 3: Track Multiple Keywords

keywords = [
    "python tutorials",
    "learn python",
    "python for beginners",
    "python web framework"
]

domain = "realpython.com"
results = []

for kw in keywords:
    result = check_rank(kw, domain)
    results.append(result)
    print(f"{kw}: position {result['position']}")

import pandas as pd
df = pd.DataFrame(results)
df.to_csv("rankings.csv", index=False)

Step 4: Add Multi-Market Tracking

markets = [
    {"gl": "us", "hl": "en", "name": "US"},
    {"gl": "gb", "hl": "en", "name": "UK"},
    {"gl": "de", "hl": "de", "name": "Germany"},
]

all_results = []
for kw in keywords:
    for market in markets:
        result = check_rank(kw, domain, market["gl"], market["hl"])
        result["market"] = market["name"]
        all_results.append(result)

Step 5: Schedule Daily Checks

# save as schedule_rankings.py
import schedule
import time

def daily_rank_check():
    print("Running daily rank check...")
    # your rank tracking logic here
    results = [check_rank(kw, domain) for kw in keywords]
    df = pd.DataFrame(results)
    df.to_csv(f"rankings_{pd.Timestamp.now().date()}.csv", index=False)
    print("Done!")

schedule.every().day.at("08:00").do(daily_rank_check)

while True:
    schedule.run_pending()
    time.sleep(60)

Step 6: Detect Ranking Changes

def detect_changes(yesterday_file, today_file):
    yesterday = pd.read_csv(yesterday_file)
    today = pd.read_csv(today_file)
    merged = yesterday.merge(today, on="keyword", suffixes=("_prev", "_curr"))

    merged["change"] = merged["position_prev"] - merged["position_curr"]
    winners = merged[merged["change"] > 0].sort_values("change", ascending=False)
    losers = merged[merged["change"] < 0].sort_values("change")

    print("Biggest winners:")
    print(winners[["keyword", "position_prev", "position_curr", "change"]])

    print("Biggest losers:")
    print(losers[["keyword", "position_prev", "position_curr", "change"]])

Cost Analysis

Tracking 500 keywords daily in 3 markets:

  • 500 × 30 × 3 = 45,000 searches/month
  • At SerpBase $0.50/1k = $22.50/month
  • At Serper.dev = $112.50/month
  • At SerpApi = $1,125/month

Next Steps

  • Add email or Slack alerts for ranking drops
  • Build a simple dashboard with Streamlit
  • Track competitor domains alongside your own
  • Export historical data for reporting