The Problem
Teams manually check if their content appears in Google AI Overviews by searching keywords in a browser. This does not scale beyond 10-20 keywords and misses competitor citation changes.
The Scavio Solution
Query Scavio with include_ai_overview for each keyword, extract citation domains, and compare against your domain. Track citation gains and losses daily. Cost: $0.005/keyword.
Before
Before automation, a GEO strategist manually checked 15 keywords weekly in incognito browser tabs. She discovered citation changes 1-2 weeks after they happened, too late to react.
After
After automating, 100 keywords are checked daily ($0.50/day). Citation changes are detected within 24 hours. Weekly email report shows: keywords gained, keywords lost, competitor citation trends. Monthly cost: $15.
Who It Is For
SEO professionals, GEO strategists, content managers, and marketing teams tracking AI Overview visibility.
Key Benefits
- Monitor 100 keywords daily for $0.50/day
- Detect citation changes within 24 hours
- Track competitor domains in AI Overview citations
- Weekly trend reports from historical data
- MCP integration for agent-driven monitoring
Python Example
import requests, os, json
from datetime import date
H = {'x-api-key': os.environ['SCAVIO_API_KEY'], 'Content-Type': 'application/json'}
def check_citations(keywords, my_domain, history_file='aio_history.json'):
try:
with open(history_file) as f: history = json.load(f)
except FileNotFoundError: history = {}
today = date.today().isoformat()
changes = []
for kw in keywords:
data = requests.post('https://api.scavio.dev/api/v1/search',
headers=H, json={'query': kw, 'country_code': 'us',
'include_ai_overview': True}).json()
aio = data.get('ai_overview') or {}
cited_domains = [s.get('domain', '') for s in aio.get('sources', [])]
was_cited = history.get(kw, {}).get('cited', False)
is_cited = my_domain in str(cited_domains)
if is_cited != was_cited:
changes.append({'keyword': kw, 'change': 'gained' if is_cited else 'lost'})
history[kw] = {'cited': is_cited, 'domains': cited_domains, 'date': today}
with open(history_file, 'w') as f: json.dump(history, f)
return changes
changes = check_citations(['best crm 2026', 'crm comparison'], 'mysite.com')
for c in changes: print(f"{c['change'].upper()}: {c['keyword']}")JavaScript Example
const H = {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'};
const fs = require('fs');
async function checkCitations(keywords, myDomain) {
let history = {};
try { history = JSON.parse(fs.readFileSync('aio_history.json')); } catch {}
const changes = [];
for (const kw of keywords) {
const r = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST', headers: H,
body: JSON.stringify({query: kw, country_code: 'us', include_ai_overview: true})
}).then(r => r.json());
const domains = ((r.ai_overview || {}).sources || []).map(s => s.domain || '');
const isCited = domains.some(d => d.includes(myDomain));
const wasCited = history[kw]?.cited || false;
if (isCited !== wasCited) changes.push({keyword: kw, change: isCited ? 'gained' : 'lost'});
history[kw] = {cited: isCited, domains, date: new Date().toISOString().split('T')[0]};
}
fs.writeFileSync('aio_history.json', JSON.stringify(history));
return changes;
}
checkCitations(['best crm 2026'], 'mysite.com').then(c => c.forEach(x => console.log(`${x.change}: ${x.keyword}`)));Platforms Used
Web search with knowledge graph, PAA, and AI overviews