SERP API pricing varies 50x between providers ($0.0006/query to $0.025/query) but cheap does not always mean best value. This tutorial helps you calculate the real cost for your specific use case including hidden costs like minimum deposits, expired credits, and missing SERP features.
Prerequisites
- Python 3.8+
- Your monthly query volume estimate
- Knowledge of which SERP features you need
Walkthrough
Step 1: Calculate per-query costs by provider
Compare effective per-query pricing at your volume.
volume = 10_000 # monthly queries
providers = {
'SerpAPI': {'plans': [(1000, 25), (5000, 75), (15000, 150), (30000, 275)],
'features': 'full'},
'Serper': {'plans': [(2500, 0), (50000, 50/12), (500000, 50)],
'features': 'basic', 'note': 'Google only'},
'Scavio': {'per_query': 0.005, 'plan': (7000, 30),
'features': 'full', 'note': '6 platforms'},
'DataForSEO': {'per_query': 0.0006, 'min_deposit': 50,
'features': 'full', 'note': 'async delivery for cheap tier'},
'SearchAPI.io': {'plans': [(0, 40), (35000, 100)],
'features': 'partial', 'note': 'missing fields reported'},
}
print(f'Monthly cost at {volume:,} queries:')
print(f' SerpAPI: $150 (15K plan, 5K wasted)')
print(f' Serper: $50/mo (500K plan, Google only)')
print(f' Scavio: $50 (on-demand) or $30 + $15 overage')
print(f' DataForSEO: $6 (but $50 min deposit)')
print(f' SearchAPI.io: $100 (35K plan)')Step 2: Test output quality
Compare what each provider returns for the same query.
import requests, os
H = {'x-api-key': os.environ['SCAVIO_API_KEY'], 'Content-Type': 'application/json'}
data = requests.post('https://api.scavio.dev/api/v1/search',
headers=H,
json={'query': 'best CRM 2026', 'country_code': 'us',
'include_ai_overview': True}).json()
print('Fields returned:')
print(f' organic_results: {len(data.get("organic_results", []))}')
print(f' people_also_ask: {len(data.get("people_also_ask", []))}')
print(f' ai_overview: {bool(data.get("ai_overview"))}')
print(f' knowledge_graph: {bool(data.get("knowledge_graph"))}')
print(f' shopping_results: {len(data.get("shopping_results", []))}')
print(f' related_searches: {len(data.get("related_searches", []))}')Python Example
# Full pricing calculator
def calculate_cost(volume, provider):
costs = {
'serpapi': next((p for q, p in [(1000,25),(5000,75),(15000,150),(30000,275)] if q >= volume), 275),
'serper': 0 if volume <= 2500 else 50,
'scavio_ondemand': volume * 0.005,
'scavio_plan': 30 + max(0, (volume - 7000)) * 0.005,
'dataforseo': max(50, volume * 0.0006),
'searchapi': 40 if volume <= 1000 else 100,
}
return costs
for vol in [1000, 5000, 10000, 50000]:
costs = calculate_cost(vol, None)
print(f'\n--- {vol:,} queries/month ---')
for provider, cost in sorted(costs.items(), key=lambda x: x[1]):
print(f' {provider}: ${cost:.2f}')JavaScript Example
function calculateCost(volume) {
return {
serpapi: volume <= 1000 ? 25 : volume <= 5000 ? 75 : volume <= 15000 ? 150 : 275,
serper: volume <= 2500 ? 0 : 50,
scavio_ondemand: volume * 0.005,
scavio_plan: 30 + Math.max(0, (volume - 7000)) * 0.005,
dataforseo: Math.max(50, volume * 0.0006),
searchapi: volume <= 1000 ? 40 : 100,
};
}
[1000, 5000, 10000, 50000].forEach(vol => {
console.log(`\n--- ${vol.toLocaleString()} queries/month ---`);
const costs = calculateCost(vol);
Object.entries(costs).sort((a,b) => a[1]-b[1]).forEach(([p, c]) =>
console.log(` ${p}: $${c.toFixed(2)}`));
});Expected Output
Cost comparison table showing actual monthly spend for each provider at your query volume, plus feature coverage differences.