The Problem
Tracking which websites get cited in Google AI Overviews is impossible to do manually at scale. Each keyword requires a separate search, reading the AI Overview, noting cited sources, and recording the data in a spreadsheet. For 200 target keywords, this takes an entire day of manual work and produces a snapshot that is stale by the time the spreadsheet is complete. There is no historical tracking, no alerting when citations change, and no way to measure GEO visibility trends over time.
The Scavio Solution
Build an automated pipeline using Scavio's include_ai_overview parameter that queries Google for each target keyword, extracts AI Overview citation data from the structured JSON response, stores daily snapshots, and diffs against previous snapshots to detect changes. The pipeline runs daily via cron, costs $0.005/keyword/day, and produces alerts when your domain gains or loses AI Overview citations. Historical data accumulates automatically for trend analysis.
Before
Before the pipeline, GEO audits were quarterly manual projects requiring a full day of work per 200 keywords. No historical data existed, citation changes went undetected for weeks, and the team could not answer whether GEO visibility was improving or declining.
After
After building the pipeline, GEO visibility is tracked daily across 500 keywords for $2.50/day. Citation changes trigger Slack alerts within 24 hours. Monthly trend reports show citation rate, competitor citation frequency, and AI Overview appearance rate per keyword cluster.
Who It Is For
SEO teams tracking AI Overview citations at scale. Content teams measuring whether their optimization efforts translate to GEO visibility. Agencies offering GEO auditing services to clients.
Key Benefits
- Daily AI Overview citation tracking across hundreds of keywords
- Automated alerts when citations appear, disappear, or change
- Historical time-series for GEO visibility trend analysis
- Competitor citation monitoring alongside your own domain
- Total cost under $75/month for 500 keywords tracked daily
Python Example
import requests
import json
from pathlib import Path
from datetime import datetime
API_KEY = "your_scavio_api_key"
MY_DOMAIN = "scavio.dev"
def audit_keyword(keyword: str) -> dict:
res = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"platform": "google", "query": keyword, "ai_overview": True},
timeout=15,
)
res.raise_for_status()
data = res.json()
ai = data.get("ai_overview")
return {
"keyword": keyword,
"has_ai_overview": ai is not None,
"citations": [c.get("source", "") for c in (ai or {}).get("citations", [])],
"my_domain_cited": any(MY_DOMAIN in c.get("source", "") for c in (ai or {}).get("citations", [])),
"ai_text_preview": (ai or {}).get("text", "")[:200],
}
def daily_audit(keywords: list[str]) -> dict:
results = [audit_keyword(kw) for kw in keywords]
date = datetime.utcnow().strftime("%Y-%m-%d")
report = {
"date": date,
"total_keywords": len(keywords),
"ai_overviews_present": sum(1 for r in results if r["has_ai_overview"]),
"my_domain_cited": sum(1 for r in results if r["my_domain_cited"]),
"results": results,
}
Path(f"geo_audit_{date}.json").write_text(json.dumps(report, indent=2))
return report
keywords = ["best search api", "serp api pricing", "google ai overview api"]
report = daily_audit(keywords)
print(f"AI Overviews: {report['ai_overviews_present']}/{report['total_keywords']}")
print(f"My domain cited: {report['my_domain_cited']} times")JavaScript Example
const API_KEY = "your_scavio_api_key";
const MY_DOMAIN = "scavio.dev";
async function auditKeyword(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, ai_overview: true }),
});
if (!res.ok) throw new Error(`scavio ${res.status}`);
const data = await res.json();
const ai = data.ai_overview;
return {
keyword,
hasAiOverview: !!ai,
citations: (ai?.citations ?? []).map((c) => c.source ?? ""),
myDomainCited: (ai?.citations ?? []).some((c) => (c.source ?? "").includes(MY_DOMAIN)),
};
}
const keywords = ["best search api", "serp api pricing"];
const results = await Promise.all(keywords.map(auditKeyword));
const cited = results.filter((r) => r.myDomainCited).length;
console.log(`AI Overviews: ${results.filter((r) => r.hasAiOverview).length}/${keywords.length}`);
console.log(`My domain cited: ${cited} times`);Platforms Used
Web search with knowledge graph, PAA, and AI overviews