SEMrush and Ahrefs charge $100-450/month for SEO dashboards. You can build the same core functionality with raw SERP API calls at $0.005/query. This tutorial builds a rank tracker, SERP feature monitor, and competitor comparison dashboard. 100 daily keyword checks cost $0.50/day.
Prerequisites
- Python 3.8+
- requests library
- A Scavio API key from scavio.dev
- List of target keywords and competitor domains
Walkthrough
Step 1: Build keyword rank tracker
Track your domain position for target keywords daily.
import os, requests, json
from datetime import datetime
API_KEY = os.environ['SCAVIO_API_KEY']
SH = {'x-api-key': API_KEY, 'Content-Type': 'application/json'}
DOMAIN = 'yourdomain.com'
KEYWORDS = ['search api for agents', 'serp api python', 'web search api 2026', 'mcp search tool']
def check_rank(keyword, domain):
data = requests.post('https://api.scavio.dev/api/v1/search',
headers=SH, json={'query': keyword, 'country_code': 'us'}).json()
organic = data.get('organic_results', [])
for i, r in enumerate(organic):
if domain in r.get('link', ''):
return {'position': i + 1, 'title': r.get('title', ''), 'link': r.get('link', '')}
return {'position': None, 'title': '', 'link': ''}
print(f'=== Rank Tracker - {DOMAIN} - {datetime.now().strftime("%Y-%m-%d")} ===')
ranks = []
for kw in KEYWORDS:
result = check_rank(kw, DOMAIN)
pos = f'#{result["position"]}' if result['position'] else 'Not in top 10'
print(f' {kw:40} | {pos}')
ranks.append({'keyword': kw, **result})
print(f'\nCost: ${len(KEYWORDS) * 0.005:.3f}')Step 2: Monitor SERP features per keyword
Detect AI Overviews, featured snippets, PAA boxes, and local packs.
def serp_features(keyword):
data = requests.post('https://api.scavio.dev/api/v1/search',
headers=SH, json={'query': keyword, 'country_code': 'us'}).json()
features = []
if data.get('ai_overview') or data.get('answer_box'):
features.append('AI Overview')
if data.get('featured_snippet'):
features.append('Featured Snippet')
if data.get('people_also_ask'):
features.append(f'PAA ({len(data["people_also_ask"])} questions)')
if data.get('local_results'):
features.append(f'Local Pack ({len(data["local_results"])} results)')
if data.get('shopping_results'):
features.append('Shopping')
return features
print(f'\n=== SERP Features ===')
for kw in KEYWORDS:
features = serp_features(kw)
print(f' {kw:40} | {" | ".join(features) if features else "Organic only"}')Step 3: Compare against competitors
Check competitor positions for the same keywords.
COMPETITORS = ['tavily.com', 'serpapi.com', 'serper.dev']
def competitor_comparison(keywords, domain, competitors):
print(f'\n=== Competitor Comparison ===')
header = f'{"Keyword":30} | {domain:15}'
for c in competitors:
header += f' | {c:15}'
print(header)
print('-' * len(header))
for kw in keywords:
data = requests.post('https://api.scavio.dev/api/v1/search',
headers=SH, json={'query': kw, 'country_code': 'us'}).json()
organic = data.get('organic_results', [])
positions = {}
for i, r in enumerate(organic):
link = r.get('link', '')
if domain in link:
positions[domain] = i + 1
for c in competitors:
if c in link:
positions[c] = i + 1
row = f'{kw[:30]:30} | {str(positions.get(domain, "-")):15}'
for c in competitors:
row += f' | {str(positions.get(c, "-")):15}'
print(row)
total_queries = len(keywords)
print(f'\nCost: ${total_queries * 0.005:.3f} (competitors checked in same query)')
competitor_comparison(KEYWORDS, DOMAIN, COMPETITORS)Python Example
import os, requests
SH = {'x-api-key': os.environ['SCAVIO_API_KEY'], 'Content-Type': 'application/json'}
def rank_check(keyword, domain):
data = requests.post('https://api.scavio.dev/api/v1/search',
headers=SH, json={'query': keyword, 'country_code': 'us'}).json()
for i, r in enumerate(data.get('organic_results', [])):
if domain in r.get('link', ''):
return i + 1
return None
for kw in ['search api', 'serp api python']:
pos = rank_check(kw, 'scavio.dev')
print(f'{kw}: #{pos}' if pos else f'{kw}: not found')
print('Cost: $0.010')JavaScript Example
const SH = { 'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json' };
async function rankCheck(keyword, domain) {
const data = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST', headers: SH,
body: JSON.stringify({ query: keyword, country_code: 'us' })
}).then(r => r.json());
const pos = (data.organic_results || []).findIndex(r => r.link?.includes(domain));
console.log(`${keyword}: ${pos >= 0 ? '#' + (pos+1) : 'not found'}`);
}
await rankCheck('search api', 'scavio.dev');Expected Output
=== Rank Tracker - yourdomain.com ===
search api for agents | #3
serp api python | #5
web search api 2026 | #2
mcp search tool | Not in top 10
Cost: $0.020
=== SERP Features ===
search api for agents | AI Overview | PAA (4 questions)
serp api python | Featured Snippet
=== Competitor Comparison ===
Keyword | yourdomain.com | tavily.com | serpapi.com
search api for agents | 3 | 7 | 4