The Problem
Brands need to know whether LLMs mention them when users ask relevant questions. Manual testing (typing prompts into ChatGPT/Perplexity) covers 5-10 queries per hour and produces inconsistent results. For a brand with 50+ target keywords, manual testing is a weekly time sink that produces unreliable data.
The Scavio Solution
Automate LLM visibility monitoring by querying Scavio with ai_overview enabled for all target keywords on a weekly schedule. The AI Overview text represents what Google's AI model says about each query. Parse for brand mentions to track citation presence over time. 100 keywords/week = $0.50.
Before
Before automation, the marketing manager spent 2 hours every Friday manually searching 30 keywords in Google and ChatGPT, noting which responses mentioned the brand. The data lived in a spreadsheet that was updated inconsistently.
After
After automation, a weekly script queries 100 keywords via Scavio ($0.50/week), checks for brand mentions in AI Overview text, and generates a report showing citation count, week-over-week changes, and keywords where citations were gained or lost. Total time: 0 minutes (runs on cron). Total cost: $2/month.
Who It Is For
Marketing teams monitoring brand visibility in AI-generated search results. SEO agencies reporting GEO metrics to clients. Brand managers tracking competitive AI visibility.
Key Benefits
- 100 keywords scanned weekly for $0.50
- Consistent methodology enables trend tracking over time
- Automated alerts when brand citations appear or disappear
- Replaces 2+ hours of manual testing per week
- Historical data enables GEO visibility scoring
Python Example
import requests
import json
from datetime import datetime
from pathlib import Path
API_KEY = "your_scavio_api_key"
BRAND = "YourBrand"
def scan_visibility(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()
data = res.json()
ai_text = data.get("ai_overview", {}).get("text", "")
cited = BRAND.lower() in ai_text.lower()
results.append({"keyword": kw, "cited": cited, "ai_text_length": len(ai_text)})
cited_count = sum(1 for r in results if r["cited"])
report = {
"date": datetime.utcnow().strftime("%Y-%m-%d"),
"brand": BRAND,
"total_keywords": len(keywords),
"citations": cited_count,
"citation_rate": round(cited_count / len(keywords) * 100, 1),
"details": results,
}
Path(f"visibility_{report['date']}.json").write_text(json.dumps(report, indent=2))
return report
report = scan_visibility(["best search api", "serp api comparison", "web scraping alternative"])
print(f"Citation rate: {report['citation_rate']}% ({report['citations']}/{report['total_keywords']})")JavaScript Example
const API_KEY = "your_scavio_api_key";
const BRAND = "YourBrand";
async function scanVisibility(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.push({ keyword: kw, cited: aiText.toLowerCase().includes(BRAND.toLowerCase()) });
}
const cited = results.filter((r) => r.cited).length;
console.log(`Citation rate: ${((cited / results.length) * 100).toFixed(1)}%`);
return results;
}
await scanVisibility(["best search api", "serp api comparison"]);Platforms Used
Web search with knowledge graph, PAA, and AI overviews