The Problem
SEO agencies pay per-client license fees for reporting tools like Ahrefs ($99-999/mo), Semrush ($120-450/mo), or SE Ranking ($52-207/mo). Each new client adds to the tool bill. The reports show the tool's branding, not yours. Customization is limited to what the tool allows. When a client asks for a metric the tool does not offer, the answer is 'we cannot do that.' The agency's value proposition is undermined by delivering reports that look like every other agency using the same tool.
The Scavio Solution
Scavio provides the raw SERP data that agencies use to build fully white-labeled reports with their own branding, custom metrics, and client-specific views. A $30/mo plan covers 7,000 queries, enough for daily rank tracking of 230 keywords across all clients. The agency builds reports in their own template (PDF, dashboard, email digest) with exactly the metrics each client cares about. No per-client license fees, no vendor branding, and no feature limitations.
Before
Before Scavio, agencies paid per-client license fees for SEO tools with vendor branding and limited customization. Each new client increased the tool bill, and the reports looked identical to every competitor agency using the same tool.
After
After Scavio, the agency builds fully white-labeled reports from raw SERP data at a flat $30/mo regardless of client count. Custom metrics, client-specific views, and agency branding differentiate the service from every competitor.
Who It Is For
SEO agencies paying per-client tool licenses who want to deliver white-labeled reports with custom metrics. Freelance SEO consultants who need professional reporting without enterprise tool costs.
Key Benefits
- Flat $30/mo covers all clients vs per-client license fees
- Fully white-labeled reports with agency branding
- Custom metrics tailored to each client's business goals
- No vendor branding on deliverables
- 7,000 queries/mo covers daily tracking of 230+ keywords
Python Example
import requests
import json
from datetime import datetime
from pathlib import Path
API_KEY = "your_scavio_api_key"
def track_client_keywords(client: dict) -> dict:
"""Track keywords for a single agency client."""
results = []
for keyword in client["keywords"]:
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 client["domain"] in item.get("link", ""):
position = item.get("position")
break
results.append({
"keyword": keyword,
"position": position,
"has_ai_overview": bool(data.get("ai_overview")),
"top_competitor": data.get("organic", [{}])[0].get("link", ""),
})
ranked = [r for r in results if r["position"]]
return {
"client": client["name"],
"domain": client["domain"],
"date": datetime.utcnow().strftime("%Y-%m-%d"),
"keywords_tracked": len(results),
"keywords_ranking": len(ranked),
"avg_position": round(sum(r["position"] for r in ranked) / max(len(ranked), 1), 1),
"results": results,
}
clients = [
{"name": "Client A", "domain": "clienta.com", "keywords": ["seo agency austin", "local seo services"]},
{"name": "Client B", "domain": "clientb.com", "keywords": ["saas marketing", "b2b content strategy"]},
]
for client in clients:
report = track_client_keywords(client)
Path(f"report_{client['name'].lower().replace(' ', '_')}_{report['date']}.json").write_text(json.dumps(report, indent=2))
print(f"{report['client']}: {report['keywords_ranking']}/{report['keywords_tracked']} ranking, avg position {report['avg_position']}")JavaScript Example
const API_KEY = "your_scavio_api_key";
async function trackClient(client) {
const results = [];
for (const keyword of client.keywords) {
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(client.domain)) { position = item.position; break; }
}
results.push({ keyword, position, hasAiOverview: !!data.ai_overview });
}
const ranked = results.filter((r) => r.position);
return { client: client.name, date: new Date().toISOString().slice(0, 10), tracked: results.length, ranking: ranked.length, avgPosition: Math.round(ranked.reduce((s, r) => s + r.position, 0) / Math.max(ranked.length, 1) * 10) / 10, results };
}
const clients = [{ name: "Client A", domain: "clienta.com", keywords: ["seo agency austin", "local seo services"] }];
for (const client of clients) {
const report = await trackClient(client);
console.log(`${report.client}: ${report.ranking}/${report.tracked} ranking, avg #${report.avgPosition}`);
}Platforms Used
Web search with knowledge graph, PAA, and AI overviews