Overview
Getting cited in Google AI Overviews drives significant traffic and authority in 2026. This workflow monitors whether your domain appears in AI Overview citations for target queries, tracks which competitors are cited instead, and alerts when your citation is added or dropped. Essential for AEO strategy.
Trigger
Daily monitoring run for target queries.
Schedule
Daily
Workflow Steps
Load Target Queries
Read the list of queries where AI Overview citation matters for your domain.
Extract AI Overviews
For each query, call Scavio search API to extract the AI Overview text and citation sources.
Check Domain Citation
For each AI Overview, check if your domain appears in the citation sources. Record position and surrounding text.
Track Changes
Compare today's citations against yesterday's. Flag new citations, lost citations, and position changes.
Alert on Changes
Send alerts for citation gains and losses. Include the query, competing sources, and AI Overview text excerpt.
Python Implementation
import requests, os, json
from pathlib import Path
from datetime import datetime
API_KEY = os.environ["SCAVIO_API_KEY"]
H = {"x-api-key": API_KEY, "Content-Type": "application/json"}
HISTORY_FILE = Path("aio_citations.json")
def check_aio_citations(query: str, target_domain: str) -> dict:
resp = requests.post(
"https://api.scavio.dev/api/v1/search",
headers=H,
json={"query": query, "country_code": "us"},
timeout=10,
)
data = resp.json()
aio = data.get("ai_overview", {})
sources = aio.get("sources", [])
cited = any(target_domain in s.get("link", "") for s in sources)
competitors = [s.get("link", "").split("/")[2] for s in sources if target_domain not in s.get("link", "")]
return {
"query": query,
"has_aio": bool(aio),
"cited": cited,
"competitors": competitors[:5],
"aio_text_preview": aio.get("text", "")[:200],
}
def daily_monitor(queries: list, domain: str) -> dict:
today = datetime.now().strftime("%Y-%m-%d")
history = json.loads(HISTORY_FILE.read_text()) if HISTORY_FILE.exists() else {}
today_data = {}
changes = []
for q in queries:
result = check_aio_citations(q, domain)
today_data[q] = result
yesterday = history.get(q, {})
if yesterday.get("cited") and not result["cited"]:
changes.append({"query": q, "change": "LOST_CITATION"})
elif not yesterday.get("cited") and result["cited"]:
changes.append({"query": q, "change": "GAINED_CITATION"})
history.update(today_data)
HISTORY_FILE.write_text(json.dumps(history, indent=2))
return {"date": today, "total_queries": len(queries), "cited_count": sum(1 for d in today_data.values() if d["cited"]), "changes": changes}
report = daily_monitor(["search api for ai agents", "web scraping api alternative"], "scavio.dev")
print(f"Cited in {report['cited_count']}/{report['total_queries']} AI Overviews")
for c in report["changes"]:
print(f" {c['change']}: {c['query']}")JavaScript Implementation
const H = {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'};
const fs = await import('fs');
async function checkAioCitations(query, targetDomain) {
const r = await fetch('https://api.scavio.dev/api/v1/search', {method:'POST', headers:H, body:JSON.stringify({query, country_code:'us'})});
const d = await r.json();
const aio = d.ai_overview || {};
const sources = aio.sources || [];
const cited = sources.some(s=>(s.link||'').includes(targetDomain));
const competitors = sources.filter(s=>!(s.link||'').includes(targetDomain)).map(s=>(s.link||'').split('/')[2]).slice(0,5);
return {query, hasAio:!!d.ai_overview, cited, competitors, aioPreview:(aio.text||'').slice(0,200)};
}
async function dailyMonitor(queries, domain) {
let history = {};
try { history = JSON.parse(fs.readFileSync('aio_citations.json','utf8')); } catch {}
const todayData = {};
const changes = [];
for (const q of queries) {
const result = await checkAioCitations(q, domain);
todayData[q] = result;
const yesterday = history[q] || {};
if (yesterday.cited && !result.cited) changes.push({query:q, change:'LOST_CITATION'});
else if (!yesterday.cited && result.cited) changes.push({query:q, change:'GAINED_CITATION'});
}
Object.assign(history, todayData);
fs.writeFileSync('aio_citations.json', JSON.stringify(history, null, 2));
return {totalQueries:queries.length, citedCount:Object.values(todayData).filter(d=>d.cited).length, changes};
}
const report = await dailyMonitor(['search api for ai agents', 'web scraping api alternative'], 'scavio.dev');
console.log('Cited in '+report.citedCount+'/'+report.totalQueries+' AI Overviews');
for (const c of report.changes) console.log(' '+c.change+': '+c.query);Platforms Used
Web search with knowledge graph, PAA, and AI overviews