The Problem
Google AI Overviews, Perplexity, and ChatGPT search are absorbing clicks that used to land on your site. Google Analytics shows a traffic decline but cannot tell you which queries now have an AI Overview that answers the question without a click. Without knowing which keywords are affected, content teams optimize blindly.
The Scavio Solution
Build a pipeline that queries Scavio for your target keywords with the ai_overview flag, checks whether an AI Overview exists and what it says, and correlates this with your analytics data. Keywords that have AI Overviews and show traffic declines are your zero-click casualties. Keywords without AI Overviews that are declining have a different problem. The data separates AI-caused traffic loss from other ranking issues.
Before
Before measurement, a SaaS company saw a 15% organic traffic decline over two months. The content team assumed it was a ranking issue and spent three weeks rewriting articles. Traffic continued to decline because the real cause was AI Overviews answering the queries directly.
After
After deploying the measurement pipeline, the team identified that 40 of their 200 tracked keywords now had AI Overviews. Those 40 keywords accounted for 80% of the traffic decline. The team shifted strategy to target keywords without AI Overviews and to optimize existing content for AI Overview citations.
Who It Is For
SEO managers and growth teams who see organic traffic declining and need to determine how much is caused by AI-generated answers versus traditional ranking changes.
Key Benefits
- Identify which keywords have AI Overviews programmatically
- Correlate AI Overview presence with traffic decline data
- Separate AI-caused zero-click loss from ranking drops
- Prioritize content updates based on actual AI Overview data
- Daily monitoring at $0.005 per keyword
Python Example
import requests, os, json
H = {'x-api-key': os.environ['SCAVIO_API_KEY']}
def measure_ai_shift(keywords: list[str], my_domain: str) -> list[dict]:
report = []
for kw in keywords:
r = requests.post('https://api.scavio.dev/api/v1/search', headers=H,
json={'platform': 'google', 'query': kw, 'ai_overview': True}, timeout=10).json()
aio = r.get('ai_overview')
organic = r.get('organic', [])
my_pos = next((i+1 for i, o in enumerate(organic)
if my_domain in o.get('link', '')), None)
report.append({
'keyword': kw,
'has_ai_overview': bool(aio),
'aio_length': len(aio.get('text', '')) if aio else 0,
'my_position': my_pos,
'likely_zero_click': bool(aio and aio.get('text', '') and len(aio['text']) > 200)
})
return report
keywords = ['what is a serp api', 'best search api for llm', 'web scraping vs api']
for row in measure_ai_shift(keywords, 'yourdomain.com'):
print(json.dumps(row))JavaScript Example
const H = { 'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json' };
async function measureAiShift(keywords, myDomain) {
const report = [];
for (const kw of keywords) {
const r = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST', headers: H,
body: JSON.stringify({ platform: 'google', query: kw, ai_overview: true })
}).then(r => r.json());
const aio = r.ai_overview;
const myPos = (r.organic || []).findIndex(o => (o.link || '').includes(myDomain)) + 1;
report.push({
keyword: kw, hasAiOverview: !!aio,
aioLength: aio?.text?.length || 0,
myPosition: myPos || null,
likelyZeroClick: !!(aio?.text && aio.text.length > 200)
});
}
return report;
}Platforms Used
Web search with knowledge graph, PAA, and AI overviews