Tutorial

How to Detect AI Overview Changes After Google I/O

Detect when Google AI Overviews change after I/O 2026. Track content shifts, new citations, and layout changes via SERP API.

Google I/O 2026 announced major changes to AI Overviews including Gemini 3.5 Flash, a redesigned search box, and Information Agents. These changes alter which sites get cited and how answers are structured. This tutorial detects AI Overview changes by comparing daily SERP snapshots, flagging when citations shift or content changes significantly.

Prerequisites

  • Python 3.8+
  • requests library
  • A Scavio API key from scavio.dev
  • Target keywords to monitor

Walkthrough

Step 1: Capture AI Overview snapshots

Store the full AI Overview content for each keyword to compare over time.

Python
import os, requests, json, hashlib
from datetime import datetime

API_KEY = os.environ['SCAVIO_API_KEY']
SH = {'x-api-key': API_KEY, 'Content-Type': 'application/json'}

KEYWORDS = ['best search api 2026', 'how to add search to ai agent', 'mcp tools for agents']

def snapshot_ai_overview(keyword):
    data = requests.post('https://api.scavio.dev/api/v1/search',
        headers=SH, json={'query': keyword, 'country_code': 'us'}, timeout=10).json()
    ai = data.get('ai_overview', data.get('answer_box', {}))
    organic_top3 = [r.get('link', '') for r in data.get('organic_results', [])[:3]]
    featured = data.get('featured_snippet', {})
    content_str = json.dumps(ai, sort_keys=True)
    return {
        'keyword': keyword,
        'timestamp': datetime.now().isoformat(),
        'has_ai_overview': bool(ai),
        'ai_content': ai,
        'ai_content_hash': hashlib.md5(content_str.encode()).hexdigest(),
        'organic_top3': organic_top3,
        'has_featured': bool(featured),
    }

today = []
for kw in KEYWORDS:
    snap = snapshot_ai_overview(kw)
    today.append(snap)
    print(f'  {kw[:40]:40} | AI: {"yes" if snap["has_ai_overview"] else "no":3} | hash: {snap["ai_content_hash"][:8]}')
print(f'\nSnapshots: {len(today)} | Cost: ${len(KEYWORDS) * 0.005:.3f}')

Step 2: Compare snapshots to detect changes

Diff today's snapshots against previous ones to find what changed.

Python
HISTORY_FILE = 'ai_overview_history.json'

def load_history():
    try:
        with open(HISTORY_FILE) as f:
            return json.load(f)
    except FileNotFoundError:
        return []

def save_history(history):
    with open(HISTORY_FILE, 'w') as f:
        json.dump(history, f, indent=2)

def detect_changes(today_snaps, history):
    if not history:
        print('  First snapshot. No comparison available.')
        return []
    prev_day = history[-1]
    prev_by_kw = {s['keyword']: s for s in prev_day['snapshots']}
    changes = []
    for snap in today_snaps:
        kw = snap['keyword']
        prev = prev_by_kw.get(kw)
        if not prev:
            continue
        change = {'keyword': kw, 'changes': []}
        if snap['ai_content_hash'] != prev['ai_content_hash']:
            change['changes'].append('AI Overview content changed')
        if snap['has_ai_overview'] != prev['has_ai_overview']:
            status = 'appeared' if snap['has_ai_overview'] else 'disappeared'
            change['changes'].append(f'AI Overview {status}')
        if snap['organic_top3'] != prev['organic_top3']:
            change['changes'].append('Top 3 organic results changed')
        if change['changes']:
            changes.append(change)
            for c in change['changes']:
                print(f'  CHANGE: {kw[:35]} -> {c}')
    if not changes:
        print('  No changes detected.')
    return changes

history = load_history()
changes = detect_changes(today, history)
history.append({'date': datetime.now().strftime('%Y-%m-%d'), 'snapshots': today})
save_history(history)

Step 3: Generate change report with alerts

Summarize detected changes and flag significant shifts for review.

Python
def change_report(changes, today_snaps):
    print(f'\n{"=" * 60}')
    print(f'  AI Overview Change Report - {datetime.now().strftime("%Y-%m-%d")}')
    print(f'  Post Google I/O 2026 Monitoring')
    print(f'{"=" * 60}')
    print(f'\n  Keywords monitored: {len(today_snaps)}')
    print(f'  Changes detected: {len(changes)}')
    ai_count = sum(1 for s in today_snaps if s['has_ai_overview'])
    print(f'  AI Overviews present: {ai_count}/{len(today_snaps)}')
    if changes:
        print(f'\n  Changes:')
        for c in changes:
            print(f'    {c["keyword"][:40]}')
            for ch in c['changes']:
                print(f'      - {ch}')
    # Alert levels
    ai_changes = [c for c in changes if any('AI Overview' in ch for ch in c['changes'])]
    if ai_changes:
        print(f'\n  ALERT: {len(ai_changes)} AI Overview structure changes detected.')
        print(f'  This may indicate post-I/O algorithm updates.')
        print(f'  Review affected keywords and update content strategy.')
    print(f'\n  Daily cost: ${len(today_snaps) * 0.005:.3f}')
    print(f'  Monthly: ${len(today_snaps) * 0.005 * 30:.2f}')

change_report(changes, today)

Python Example

Python
import os, requests, json, hashlib
SH = {'x-api-key': os.environ['SCAVIO_API_KEY'], 'Content-Type': 'application/json'}

def snapshot(keyword):
    data = requests.post('https://api.scavio.dev/api/v1/search',
        headers=SH, json={'query': keyword, 'country_code': 'us'}, timeout=10).json()
    ai = data.get('ai_overview', data.get('answer_box', {}))
    h = hashlib.md5(json.dumps(ai, sort_keys=True).encode()).hexdigest()[:8]
    print(f'{keyword[:40]:40} | AI: {bool(ai)} | hash: {h}')

snapshot('best search api 2026')

JavaScript Example

JavaScript
const SH = { 'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json' };
const data = await fetch('https://api.scavio.dev/api/v1/search', {
  method: 'POST', headers: SH,
  body: JSON.stringify({ query: 'best search api 2026', country_code: 'us' })
}).then(r => r.json());
const ai = data.ai_overview || data.answer_box || {};
console.log(`AI Overview present: ${Object.keys(ai).length > 0}`);

Expected Output

JSON
  best search api 2026                   | AI: yes | hash: 3f8a2b1c
  how to add search to ai agent          | AI: yes | hash: 9d4e7f2a
  mcp tools for agents                   | AI: no  | hash: d41d8cd9

Snapshots: 3 | Cost: $0.015

  CHANGE: best search api 2026 -> AI Overview content changed
  CHANGE: mcp tools for agents -> AI Overview appeared

============================================================
  AI Overview Change Report - 2026-05-21
  Post Google I/O 2026 Monitoring
============================================================

  Keywords monitored: 3
  Changes detected: 2
  AI Overviews present: 2/3

  ALERT: 1 AI Overview structure changes detected.

  Daily cost: $0.015
  Monthly: $0.45

Related Tutorials

Frequently Asked Questions

Most developers complete this tutorial in 15 to 30 minutes. You will need a Scavio API key (free tier works) and a working Python or JavaScript environment.

Python 3.8+. requests library. A Scavio API key from scavio.dev. Target keywords to monitor. A Scavio API key gives you 250 free credits per month.

Yes. The free tier includes 250 credits per month, which is more than enough to complete this tutorial and prototype a working solution.

Scavio has a native LangChain package (langchain-scavio), an MCP server, and a plain REST API that works with any HTTP client. This tutorial uses the raw REST API, but you can adapt to your framework of choice.

Start Building

Detect when Google AI Overviews change after I/O 2026. Track content shifts, new citations, and layout changes via SERP API.