You can track whether your brand is cited in Google's AI Overview by searching branded keywords weekly with include_ai_overview set to true, checking if your domain appears in the sources list, and logging the results for trend analysis.
Prerequisites
- Python 3.9+
- Scavio API key
- SQLite (stdlib)
Walkthrough
Step 1: Define your branded keyword list
Collect keywords that include your brand name plus high-intent queries.
BRANDED_KEYWORDS = [
"yourproduct reviews",
"yourproduct pricing",
"yourproduct vs competitor",
"yourproduct tutorial",
"is yourproduct worth it",
"yourproduct alternatives"
]
YOUR_DOMAIN = "yourproduct.com"Step 2: Check AI Overview citation for a keyword
Returns whether an AI Overview is present and whether your domain is cited.
import requests
API_KEY = "your-scavio-api-key"
def check_aio_citation(keyword: str, domain: str) -> dict:
r = requests.post(
"https://api.scavio.dev/api/v1/search",
json={"query": keyword, "include_ai_overview": True, "num_results": 5},
headers={"x-api-key": API_KEY},
timeout=20
)
r.raise_for_status()
data = r.json()
ao = data.get("ai_overview")
if not ao:
return {"keyword": keyword, "has_aio": False, "is_cited": False, "sources": []}
sources = ao.get("sources", [])
cited = any(domain in s.get("link", "") for s in sources)
return {
"keyword": keyword,
"has_aio": True,
"is_cited": cited,
"sources": [s.get("link") for s in sources],
"aio_text": ao.get("text", "")[:200]
}Step 3: Log results to SQLite
Store each check with date, keyword, and citation status for trend analysis.
import sqlite3
from datetime import date
def init_db(path="aio_tracker.db"):
conn = sqlite3.connect(path)
conn.execute("""
CREATE TABLE IF NOT EXISTS aio_log (
date TEXT,
keyword TEXT,
has_aio INTEGER,
is_cited INTEGER,
sources TEXT,
PRIMARY KEY (date, keyword)
)
""")
conn.commit()
return conn
def log_result(conn, result: dict):
import json
conn.execute(
"INSERT OR REPLACE INTO aio_log VALUES (?, ?, ?, ?, ?)",
(str(date.today()), result["keyword"],
int(result["has_aio"]), int(result["is_cited"]),
json.dumps(result.get("sources", [])))
)
conn.commit()Step 4: Run the weekly tracker
Schedule this weekly. It prints a summary and can post to Slack.
def run_weekly_tracker():
conn = init_db()
results = []
for kw in BRANDED_KEYWORDS:
result = check_aio_citation(kw, YOUR_DOMAIN)
log_result(conn, result)
results.append(result)
cited_count = sum(1 for r in results if r["is_cited"])
aio_count = sum(1 for r in results if r["has_aio"])
print(f"Week of {date.today()}: {cited_count}/{len(results)} keywords have AIO citation ({aio_count} have AI Overview)")
for r in results:
status = "CITED" if r["is_cited"] else ("AIO, not cited" if r["has_aio"] else "no AIO")
print(f" {r['keyword'][:50]:<50} {status}")
run_weekly_tracker()Python Example
import requests
import sqlite3
import json
from datetime import date
API_KEY = "your-scavio-api-key"
YOUR_DOMAIN = "yourproduct.com"
KEYWORDS = [
"yourproduct reviews", "yourproduct pricing",
"yourproduct vs competitor", "yourproduct tutorial",
"is yourproduct worth it", "yourproduct alternatives"
]
def check_aio(keyword, domain):
r = requests.post(
"https://api.scavio.dev/api/v1/search",
json={"query": keyword, "include_ai_overview": True, "num_results": 5},
headers={"x-api-key": API_KEY}, timeout=20
)
r.raise_for_status()
ao = r.json().get("ai_overview")
if not ao:
return {"keyword": keyword, "has_aio": False, "is_cited": False, "sources": []}
sources = ao.get("sources", [])
return {"keyword": keyword, "has_aio": True,
"is_cited": any(domain in s.get("link","") for s in sources),
"sources": [s["link"] for s in sources]}
def init_db(path="aio_tracker.db"):
conn = sqlite3.connect(path)
conn.execute("CREATE TABLE IF NOT EXISTS aio_log (date TEXT, keyword TEXT, has_aio INTEGER, is_cited INTEGER, sources TEXT, PRIMARY KEY (date, keyword))")
conn.commit()
return conn
def run():
conn = init_db()
today = str(date.today())
results = []
for kw in KEYWORDS:
r = check_aio(kw, YOUR_DOMAIN)
conn.execute("INSERT OR REPLACE INTO aio_log VALUES (?,?,?,?,?)",
(today, kw, int(r["has_aio"]), int(r["is_cited"]), json.dumps(r["sources"])))
conn.commit()
results.append(r)
cited = sum(1 for r in results if r["is_cited"])
has_aio = sum(1 for r in results if r["has_aio"])
print(f"AIO Report — {today}")
print(f"Cited in {cited}/{len(results)} keywords | AIO present for {has_aio}/{len(results)}")
print()
for r in results:
tag = "CITED" if r["is_cited"] else ("aio" if r["has_aio"] else "none")
print(f" [{tag:^10}] {r['keyword']}")
if __name__ == "__main__":
run()JavaScript Example
const API_KEY = 'your-scavio-api-key';
const YOUR_DOMAIN = 'yourproduct.com';
const KEYWORDS = ['yourproduct reviews', 'yourproduct pricing', 'yourproduct vs competitor'];
async function checkAio(keyword, domain) {
const res = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'x-api-key': API_KEY },
body: JSON.stringify({ query: keyword, include_ai_overview: true, num_results: 5 })
});
const data = await res.json();
const ao = data.ai_overview;
if (!ao) return { keyword, hasAio: false, isCited: false };
const sources = ao.sources ?? [];
return { keyword, hasAio: true, isCited: sources.some(s => s.link?.includes(domain)) };
}
for (const kw of KEYWORDS) {
const result = await checkAio(kw, YOUR_DOMAIN);
const tag = result.isCited ? 'CITED' : (result.hasAio ? 'aio' : 'none');
console.log(`[${tag}] ${kw}`);
}Expected Output
AIO Report - 2026-05-22
Cited in 2/6 keywords | AIO present for 4/6
[ CITED ] yourproduct reviews
[ aio ] yourproduct pricing
[ CITED ] yourproduct vs competitor
[ aio ] yourproduct tutorial
[ none ] is yourproduct worth it
[ none ] yourproduct alternatives