The Problem
Enterprise SEO dashboards from Ahrefs, Semrush, and Moz cost $200-500/mo and show you their interpretation of the data, not the raw data itself. You cannot customize the metrics, cannot integrate with your internal analytics, and cannot combine SERP data with your own business KPIs. When the tool decides to change its UI or deprecate a metric, you lose it. Teams pay for 100 features and use 5, but the 5 they need are locked behind the enterprise tier.
The Scavio Solution
Scavio returns raw SERP data as structured JSON for $0.005/credit. You build exactly the dashboard you need: rank tracking, SERP feature monitoring, competitor visibility scores, and whatever custom metrics matter to your business. The data feeds into your existing stack (Grafana, Looker, Retool, a custom Next.js app) instead of living in another vendor's silo. A 7,000-credit Project plan at $30/mo covers daily tracking of 230 keywords, which is more than most teams actively monitor.
Before
Before Scavio, teams paid $300-500/mo for enterprise SEO tools and still exported CSVs to build the custom views their stakeholders actually wanted. The dashboard lived in one tool but the reporting lived in another.
After
After Scavio, the team builds a custom dashboard in their existing BI stack using raw SERP data at $30/mo. Every metric is exactly what the business needs, and no feature is locked behind an enterprise tier.
Who It Is For
SEO teams paying $300-500/mo for enterprise tools but only using rank tracking and SERP feature monitoring. Agencies who need white-label dashboards without per-client tool licenses.
Key Benefits
- Raw SERP data at $0.005/credit vs $300-500/mo for enterprise SEO tools
- Build in your existing BI stack instead of another vendor silo
- Custom metrics and views tailored to your business KPIs
- Daily tracking of 230+ keywords on the $30/mo plan
- No feature gating or forced UI changes from vendor updates
Python Example
import requests
import json
from pathlib import Path
from datetime import datetime
API_KEY = "your_scavio_api_key"
DOMAIN = "yourdomain.com"
def track_serp(keyword: str) -> dict:
res = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"platform": "google", "query": keyword, "num": 20},
timeout=15,
)
res.raise_for_status()
data = res.json()
position = None
for item in data.get("organic", []):
if DOMAIN in item.get("link", ""):
position = item.get("position")
break
return {
"keyword": keyword,
"position": position,
"has_ai_overview": bool(data.get("ai_overview")),
"has_featured_snippet": bool(data.get("featured_snippet")),
"has_local_pack": bool(data.get("local_pack")),
"top_3": [r.get("link", "") for r in data.get("organic", [])[:3]],
"checked_at": datetime.utcnow().isoformat(),
}
def daily_dashboard_refresh(keywords: list[str]) -> dict:
results = [track_serp(kw) for kw in keywords]
ranked = [r for r in results if r["position"]]
avg_position = sum(r["position"] for r in ranked) / max(len(ranked), 1)
return {
"date": datetime.utcnow().strftime("%Y-%m-%d"),
"keywords_tracked": len(keywords),
"keywords_ranking": len(ranked),
"avg_position": round(avg_position, 1),
"credits_used": len(keywords),
"results": results,
}
keywords = ["your keyword 1", "your keyword 2", "your keyword 3"]
report = daily_dashboard_refresh(keywords)
Path(f"seo_dashboard_{report['date']}.json").write_text(json.dumps(report, indent=2))
print(f"Tracked {report['keywords_tracked']} keywords, {report['keywords_ranking']} ranking, avg position {report['avg_position']}")JavaScript Example
const API_KEY = "your_scavio_api_key";
const DOMAIN = "yourdomain.com";
async function trackSerp(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, num: 20 }),
});
if (!res.ok) throw new Error(`scavio ${res.status}`);
const data = await res.json();
let position = null;
for (const item of data.organic ?? []) {
if (item.link?.includes(DOMAIN)) { position = item.position; break; }
}
return {
keyword,
position,
hasAiOverview: !!data.ai_overview,
hasFeaturedSnippet: !!data.featured_snippet,
top3: (data.organic ?? []).slice(0, 3).map((r) => r.link ?? ""),
checkedAt: new Date().toISOString(),
};
}
async function dailyRefresh(keywords) {
const results = [];
for (const kw of keywords) results.push(await trackSerp(kw));
const ranked = results.filter((r) => r.position);
const avg = ranked.reduce((s, r) => s + r.position, 0) / Math.max(ranked.length, 1);
return { date: new Date().toISOString().slice(0, 10), tracked: keywords.length, ranking: ranked.length, avgPosition: Math.round(avg * 10) / 10, results };
}
const report = await dailyRefresh(["your keyword 1", "your keyword 2"]);
console.log(`Tracked ${report.tracked} keywords, avg position ${report.avgPosition}`);Platforms Used
Web search with knowledge graph, PAA, and AI overviews