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