Overview
SEO agencies need to show clients whether their content appears in Google AI Overviews, but no rank tracker includes AIO data. This workflow checks client keywords daily, extracts AI Overview presence and citation sources, and generates a report with trends. 100 keywords per client costs $0.50/day ($15/month).
Trigger
Daily cron at 8 AM UTC.
Schedule
Daily at 8 AM UTC
Workflow Steps
Load Client Keyword Lists
Read keyword lists for each client from the database. Each keyword has the target domain and priority level.
Check AI Overview Presence
For each keyword, search via Scavio and check whether an AI Overview is present. If present, extract citation sources.
Track Citation Changes
Compare today's citations against yesterday's. Flag new citations, lost citations, and competitor entries.
Generate Client Report
Compile a per-client report with AIO coverage percentage, citation trend, top cited competitors, and new citation opportunities.
Send Report via Email or Dashboard
Push the report to the client dashboard or send as a branded PDF via email.
Python Implementation
import requests, os, json
from datetime import date
API_KEY = os.environ["SCAVIO_API_KEY"]
def check_aio(keyword: str, target_domain: str) -> dict:
resp = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY, "Content-Type": "application/json"},
json={"query": keyword, "country_code": "us"},
timeout=15,
)
data = resp.json()
aio = data.get("ai_overview")
return {
"keyword": keyword,
"date": str(date.today()),
"has_aio": aio is not None,
"target_cited": any(target_domain in (s.get("domain", "") or "") for s in (aio or {}).get("sources", [])),
"cited_sources": [(s.get("domain", ""), s.get("title", "")) for s in (aio or {}).get("sources", [])],
}
client_keywords = [
{"kw": "best crm for small business", "domain": "example.com"},
{"kw": "how to track seo rankings", "domain": "example.com"},
]
for item in client_keywords:
result = check_aio(item["kw"], item["domain"])
status = "CITED" if result["target_cited"] else ("AIO" if result["has_aio"] else "none")
print(f"[{status}] {item['kw']}")JavaScript Implementation
const H = {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'};
async function checkAio(keyword, targetDomain) {
const r = await fetch('https://api.scavio.dev/api/v1/search', {method:'POST', headers:H, body:JSON.stringify({query:keyword, country_code:'us'})});
const d = await r.json();
const aio = d.ai_overview;
return {keyword, hasAio:!!aio, targetCited:(aio?.sources||[]).some(s=>(s.domain||'').includes(targetDomain)), sources:(aio?.sources||[]).map(s=>s.domain)};
}
const keywords = [{kw:'best crm for small business',domain:'example.com'}];
for (const k of keywords) {
const r = await checkAio(k.kw, k.domain);
console.log((r.targetCited?'CITED':r.hasAio?'AIO':'none')+' '+k.kw);
}Platforms Used
Web search with knowledge graph, PAA, and AI overviews