The Problem
Different keyword data providers return different monthly search volumes for the same keyword. Semrush says 2,400, Ahrefs says 1,900, and DataForSEO says 3,100. Teams that rely on a single provider's volume data make budget and content decisions based on numbers that could be off by 30-60%. There is no easy way to cross-reference multiple sources and flag discrepancies that should trigger manual review before committing resources.
The Scavio Solution
Build a cross-checker pipeline that queries the same keyword across multiple data sources, compares the returned volumes, calculates the variance, and flags keywords where providers disagree significantly. Scavio's Google search returns related search data and People Also Ask questions that provide additional keyword context. The pipeline outputs a report showing each provider's volume, the variance percentage, and a confidence score based on provider agreement.
Before
Before the cross-checker, teams trusted whichever tool they subscribed to without knowing how its volumes compared to other sources. Content investments were sometimes based on volumes that were 2-3x inflated due to close variant grouping differences.
After
After building the cross-checker, every keyword investment decision includes a confidence score. Keywords where providers agree within 20% get high confidence. Keywords with 50%+ variance are flagged for manual review before committing content resources.
Who It Is For
Content strategists who need reliable keyword volume data for resource allocation. SEO agencies that present keyword opportunities to clients and need confidence in the numbers they share.
Key Benefits
- Compare keyword volumes across multiple data sources automatically
- Confidence scoring based on provider agreement level
- Flag high-variance keywords before investing content resources
- Additional context from PAA and related searches via Scavio
- Automated report generation for content planning meetings
Python Example
import requests
API_KEY = "your_scavio_api_key"
def get_serp_context(keyword: str) -> dict:
"""Get SERP context for a keyword via Scavio."""
res = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"platform": "google", "query": keyword},
timeout=15,
)
res.raise_for_status()
data = res.json()
return {
"keyword": keyword,
"organic_count": len(data.get("organic", [])),
"paa_questions": [q.get("question", "") for q in data.get("people_also_ask", [])],
"related_searches": [r.get("query", "") for r in data.get("related_searches", [])],
}
def cross_check(keyword: str, volumes: dict[str, int]) -> dict:
values = list(volumes.values())
avg = sum(values) / len(values)
max_diff = max(abs(v - avg) / avg * 100 for v in values) if avg > 0 else 0
serp = get_serp_context(keyword)
return {
"keyword": keyword,
"volumes": volumes,
"average": round(avg),
"max_variance_pct": round(max_diff, 1),
"confidence": "high" if max_diff < 20 else "medium" if max_diff < 50 else "low",
"paa_questions": serp["paa_questions"][:3],
"related": serp["related_searches"][:3],
}
result = cross_check("serp api", {"semrush": 2400, "ahrefs": 1900, "dataforseo": 3100})
print(f"{result['keyword']}: avg={result['average']}, variance={result['max_variance_pct']}%, confidence={result['confidence']}")
for q in result["paa_questions"]:
print(f" PAA: {q}")JavaScript Example
const API_KEY = "your_scavio_api_key";
async function getSerpContext(keyword) {
const res = await fetch("https://api.scavio.dev/api/v1/search", {
method: "POST",
headers: { "x-api-key": API_KEY, "content-type": "application/json" },
body: JSON.stringify({ platform: "google", query: keyword }),
});
if (!res.ok) throw new Error(`scavio ${res.status}`);
const data = await res.json();
return {
paa: (data.people_also_ask ?? []).map((q) => q.question ?? ""),
related: (data.related_searches ?? []).map((r) => r.query ?? ""),
};
}
function crossCheck(keyword, volumes) {
const vals = Object.values(volumes);
const avg = vals.reduce((a, b) => a + b, 0) / vals.length;
const maxDiff = Math.max(...vals.map((v) => Math.abs(v - avg) / avg * 100));
return { keyword, volumes, average: Math.round(avg), maxVariance: Math.round(maxDiff * 10) / 10, confidence: maxDiff < 20 ? "high" : maxDiff < 50 ? "medium" : "low" };
}
const result = crossCheck("serp api", { semrush: 2400, ahrefs: 1900, dataforseo: 3100 });
console.log(`${result.keyword}: avg=${result.average}, variance=${result.maxVariance}%, confidence=${result.confidence}`);Platforms Used
Web search with knowledge graph, PAA, and AI overviews