Overview
This workflow monitors Google AI Mode citations daily for a set of target keywords. It queries each keyword with AI Overview extraction enabled, checks whether your domain is cited in the AI-generated answer, compares against the previous day's results, and sends alerts when citations are gained or lost. Designed for post-Google I/O 2026 SEO teams tracking visibility in AI Mode, which now serves 1B+ users.
Trigger
Cron schedule (daily at 7 AM UTC)
Schedule
Runs daily at 7:00 AM UTC
Workflow Steps
Load target keywords
Read the list of target keywords from a JSON file or database table.
Query with AI Overview extraction
For each keyword, call Scavio Google with ai_overview enabled to get the AI Mode response text.
Check for domain citations
Parse each AI Overview text for your domain name. Record citation presence (true/false) per keyword.
Compare against previous results
Load yesterday's citation data and identify keywords where citations were gained or lost.
Send change alerts
Push gained/lost citation notifications to Slack or email with keyword and context.
Store results
Write today's citation data to storage for tomorrow's comparison and historical tracking.
Python Implementation
import requests
import json
from datetime import datetime
from pathlib import Path
API_KEY = "your_scavio_api_key"
DOMAIN = "yourdomain.com"
def check_ai_citations(keywords: list[str]) -> dict:
results = {}
for kw in keywords:
res = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"platform": "google", "query": kw, "ai_overview": True},
timeout=15,
)
res.raise_for_status()
ai_text = res.json().get("ai_overview", {}).get("text", "")
results[kw] = {"cited": DOMAIN in ai_text.lower(), "ai_text_length": len(ai_text)}
return results
def run():
keywords = json.loads(Path("ai_mode_keywords.json").read_text())
today = datetime.utcnow().strftime("%Y-%m-%d")
prev_path = Path("ai_citations_latest.json")
previous = json.loads(prev_path.read_text()) if prev_path.exists() else {}
current = check_ai_citations(keywords)
gained = [kw for kw in current if current[kw]["cited"] and not previous.get(kw, {}).get("cited", False)]
lost = [kw for kw in current if not current[kw]["cited"] and previous.get(kw, {}).get("cited", False)]
cited_count = sum(1 for v in current.values() if v["cited"])
print(f"AI Mode Monitor {today}: {cited_count}/{len(keywords)} cited")
if gained:
print(f" Gained: {gained}")
if lost:
print(f" Lost: {lost}")
prev_path.write_text(json.dumps(current, indent=2))
if __name__ == "__main__":
run()JavaScript Implementation
const API_KEY = "your_scavio_api_key";
const DOMAIN = "yourdomain.com";
async function checkAiCitations(keywords) {
const results = {};
for (const kw of keywords) {
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: kw, ai_overview: true }),
});
const data = await res.json();
const aiText = data.ai_overview?.text ?? "";
results[kw] = { cited: aiText.toLowerCase().includes(DOMAIN), textLength: aiText.length };
}
return results;
}
const keywords = ["best search api 2026", "serp api comparison", "ai overview tracking"];
const results = await checkAiCitations(keywords);
const cited = Object.values(results).filter((r) => r.cited).length;
console.log(`AI Mode: ${cited}/${keywords.length} keywords cited`);Platforms Used
Web search with knowledge graph, PAA, and AI overviews