The Problem
GEO audits require comparing your AI Overview citation performance against competitors. This means searching each keyword, noting which sites get cited, tracking citation changes over time, and generating comparison reports showing your domain vs competitor domains in AI Overviews. Manual generation of these reports takes 4-8 hours per client per month for agencies and provides only a single point-in-time snapshot.
The Scavio Solution
Build an automated report generator that queries Scavio for each target keyword with ai_overview enabled, extracts cited domains, tracks your domain and competitor domains in citations, and generates weekly comparison reports. The pipeline produces formatted reports showing: keywords where you are cited, keywords where competitors are cited, keywords where AI Overviews appeared but no one in the competitive set is cited, and weekly trends.
Before
Before automation, GEO audit reports were manual 4-8 hour projects per client. The agency could only deliver monthly snapshots, missing citation changes that happened and reversed between reports.
After
After automation, weekly GEO comparison reports generate in minutes for each client. The reports show citation trends, new citation wins, lost citations, and competitive gaps. Client meetings focus on strategy instead of data gathering.
Who It Is For
SEO agencies delivering GEO audit reports to clients. In-house SEO teams tracking competitive AI Overview citation performance. Content teams measuring whether content updates improve AI citation rates.
Key Benefits
- Weekly automated GEO comparison reports vs monthly manual snapshots
- Your domain vs competitor domain citation tracking per keyword
- Citation gap analysis: keywords where competitors are cited but you are not
- Trend visualization showing citation wins and losses over time
- Report generation cost: $2.50/week for 500 keywords
Python Example
import requests
import json
from datetime import datetime
from pathlib import Path
from collections import defaultdict
API_KEY = "your_scavio_api_key"
def audit_citations(keywords: list[str], my_domain: str, competitor_domains: list[str]) -> dict:
all_domains = [my_domain] + competitor_domains
results = defaultdict(lambda: {"cited_in": [], "not_cited_in": [], "no_ai_overview": []})
for kw in keywords:
res = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"platform": "google", "query": kw, "ai_overview": True},
timeout=15,
)
res.raise_for_status()
data = res.json()
ai = data.get("ai_overview")
if not ai:
for domain in all_domains:
results[domain]["no_ai_overview"].append(kw)
continue
citations = [c.get("source", "") for c in ai.get("citations", [])]
for domain in all_domains:
if any(domain in cite for cite in citations):
results[domain]["cited_in"].append(kw)
else:
results[domain]["not_cited_in"].append(kw)
report = {
"date": datetime.utcnow().strftime("%Y-%m-%d"),
"keywords_audited": len(keywords),
"domains": {},
}
for domain in all_domains:
d = results[domain]
report["domains"][domain] = {
"citation_count": len(d["cited_in"]),
"citation_rate": f"{len(d['cited_in']) / len(keywords) * 100:.1f}%",
"cited_keywords": d["cited_in"],
"gaps": d["not_cited_in"][:10],
}
Path(f"geo_comparison_{report['date']}.json").write_text(json.dumps(report, indent=2))
return report
report = audit_citations(
["best search api", "serp api pricing", "web scraping tools"],
"scavio.dev",
["serpapi.com", "tavily.com"]
)
for domain, data in report["domains"].items():
print(f"{domain}: {data['citation_count']} citations ({data['citation_rate']})")JavaScript Example
const API_KEY = "your_scavio_api_key";
async function auditCitations(keywords, myDomain, competitorDomains) {
const allDomains = [myDomain, ...competitorDomains];
const results = {};
for (const d of allDomains) results[d] = { cited: [], notCited: [] };
for (const kw of 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: kw, ai_overview: true }),
});
const data = await res.json();
const citations = (data.ai_overview?.citations ?? []).map((c) => c.source ?? "");
for (const d of allDomains) {
if (citations.some((c) => c.includes(d))) results[d].cited.push(kw);
else results[d].notCited.push(kw);
}
}
for (const [domain, data] of Object.entries(results)) {
console.log(`${domain}: ${data.cited.length}/${keywords.length} citations (${(data.cited.length / keywords.length * 100).toFixed(1)}%)`);
}
}
await auditCitations(["best search api", "serp api pricing"], "scavio.dev", ["serpapi.com", "tavily.com"]);Platforms Used
Web search with knowledge graph, PAA, and AI overviews