Google I/O 2026 a annoncé des changements majeurs pour les Aperçus IA, notamment Gemini 3.5 Flash, une boîte de recherche repensée et des Agents d'information. Ces modifications affectent les sites cités et la structure des réponses. Ce tutoriel détecte les changements des Aperçus IA en comparant les instantanés quotidiens des SERP, signalant les déplacements de citations ou les modifications significatives du contenu.
Prérequis
- Python 3.8+
- bibliothèque requests
- Une clé API Scavio depuis scavio.dev
- Mots-clés cibles à surveiller
Parcours
Étape 1: Capturer des instantanés des Aperçus IA
Stocker le contenu complet de l'Aperçu IA pour chaque mot-clé afin de comparer dans le temps.
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}')Étape 2: Comparer les instantanés pour détecter les changements
Comparer les instantanés d'aujourd'hui avec les précédents pour trouver ce qui a changé.
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)Étape 3: Générer un rapport de modifications avec alertes
Résumer les changements détectés et signaler les écarts importants pour examen.
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)Exemple 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')Exemple 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}`);Sortie attendue
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