Overview
This workflow scans target keywords weekly for brand mentions in Google AI Overview responses. It calculates a GEO visibility score, tracks week-over-week trends, identifies keywords where citations were gained or lost, and generates a report for stakeholder review. At $0.50/week for 100 keywords, this replaces hours of manual prompt testing.
Trigger
Cron schedule (every Friday at 6 AM UTC)
Schedule
Runs every Friday at 6:00 AM UTC
Workflow Steps
Load keyword set
Read the list of target keywords and brand names to track.
Query with AI Overview
Search each keyword via Scavio with ai_overview enabled.
Check brand citations
Parse AI Overview text for brand name mentions.
Calculate GEO score
Compute citation rate and composite visibility score.
Compare to previous week
Identify gained and lost citations vs previous scan.
Generate report
Output structured visibility report with trends and recommendations.
Python Implementation
import requests
import json
from datetime import datetime
from pathlib import Path
API_KEY = "your_scavio_api_key"
BRAND = "YourBrand"
def weekly_scan(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.append({"keyword": kw, "cited": BRAND.lower() in ai_text.lower()})
cited = sum(1 for r in results if r["cited"])
geo_score = round(cited / len(results), 3) if results else 0
date = datetime.utcnow().strftime("%Y-%m-%d")
prev_path = Path("visibility_latest.json")
prev_score = 0
if prev_path.exists():
prev = json.loads(prev_path.read_text())
prev_score = prev.get("geo_score", 0)
report = {
"date": date,
"brand": BRAND,
"keywords": len(keywords),
"citations": cited,
"geo_score": geo_score,
"prev_score": prev_score,
"score_change": round(geo_score - prev_score, 3),
"details": results,
}
Path(f"visibility_{date}.json").write_text(json.dumps(report, indent=2))
prev_path.write_text(json.dumps(report, indent=2))
print(f"GEO Score: {geo_score} (change: {report['score_change']:+.3f}), Citations: {cited}/{len(keywords)}")
return report
weekly_scan(["best search api 2026", "serp api comparison", "ai agent search tool"])JavaScript Implementation
const API_KEY = "your_scavio_api_key";
const BRAND = "YourBrand";
async function weeklyScan(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 aiText = (await res.json()).ai_overview?.text ?? "";
results.push({ keyword: kw, cited: aiText.toLowerCase().includes(BRAND.toLowerCase()) });
}
const cited = results.filter((r) => r.cited).length;
console.log(`GEO Score: ${(cited / results.length).toFixed(3)}, Citations: ${cited}/${results.length}`);
return results;
}
await weeklyScan(["best search api 2026", "serp api comparison"]);Platforms Used
Web search with knowledge graph, PAA, and AI overviews