Suivez les changements quotidiens des Google AI Overviews en interrogeant des mots-clés cibles via une API de recherche et en comparant la réponse avec l'instantané du jour précédent. Cette approche révèle les nouvelles citations, les sources supprimées et les résumés réécrits sans vérification manuelle des SERP. L'API Scavio renvoie des données structurées des AI Overviews, y compris les URL des sources et le texte des résumés, ce qui rend la comparaison automatisée simple. Ce tutoriel construit un script compatible cron qui stocke des instantanés quotidiens et rapporte les différences.
Prérequis
- Python 3.8+ ou Node.js 18+ installé
- bibliothèque requests (Python) ou fetch intégré (JS)
- Une clé API Scavio depuis scavio.dev
- Une liste de mots-clés cibles à surveiller
Parcours
Étape 1: Définir les mots-clés et le stockage
Configurez la liste de mots-clés et un répertoire pour les instantanés quotidiens.
import os, json, datetime
API_KEY = os.environ['SCAVIO_API_KEY']
KEYWORDS = ['best crm for startups', 'ai search api comparison', 'mcp server tutorial']
SNAPSHOT_DIR = 'aio_snapshots'
os.makedirs(SNAPSHOT_DIR, exist_ok=True)
TODAY = datetime.date.today().isoformat()Étape 2: Récupérer l'AI Overview pour chaque mot-clé
Interrogez l'API Scavio et extrayez la section AI Overview, y compris les sources et le texte du résumé.
import requests
def fetch_ai_overview(keyword: str) -> dict:
resp = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'platform': 'google', 'query': keyword}, timeout=15)
resp.raise_for_status()
data = resp.json()
aio = data.get('ai_overview', {})
return {
'keyword': keyword,
'summary': aio.get('text', ''),
'sources': [s.get('link', '') for s in aio.get('sources', [])],
}Étape 3: Comparer avec l'instantané d'hier
Chargez l'instantané du jour précédent et calculez les sources ajoutées/supprimées et si le texte du résumé a changé.
def diff_snapshots(today_data: dict, yesterday_data: dict) -> dict:
old_sources = set(yesterday_data.get('sources', []))
new_sources = set(today_data.get('sources', []))
return {
'keyword': today_data['keyword'],
'added_sources': list(new_sources - old_sources),
'removed_sources': list(old_sources - new_sources),
'summary_changed': today_data.get('summary', '') != yesterday_data.get('summary', ''),
}
def load_yesterday(keyword: str) -> dict:
yesterday = (datetime.date.today() - datetime.timedelta(days=1)).isoformat()
path = os.path.join(SNAPSHOT_DIR, f'{keyword}_{yesterday}.json')
if os.path.exists(path):
with open(path) as f: return json.load(f)
return {}Étape 4: Exécuter quotidiennement et enregistrer les résultats
Parcourez tous les mots-clés, récupérez les données actuelles, comparez avec celles d'hier, enregistrez l'instantané d'aujourd'hui et imprimez un rapport des changements.
def run_daily():
changes = []
for kw in KEYWORDS:
current = fetch_ai_overview(kw)
previous = load_yesterday(kw)
path = os.path.join(SNAPSHOT_DIR, f'{kw}_{TODAY}.json')
with open(path, 'w') as f: json.dump(current, f, indent=2)
if previous:
delta = diff_snapshots(current, previous)
if delta['added_sources'] or delta['removed_sources'] or delta['summary_changed']:
changes.append(delta)
for c in changes:
print(f"[{c['keyword']}] +{len(c['added_sources'])} -{len(c['removed_sources'])} sources, summary_changed={c['summary_changed']}")
return changes
run_daily()Exemple Python
import requests, os, json, datetime
H = {'x-api-key': os.environ['SCAVIO_API_KEY']}
TODAY = datetime.date.today().isoformat()
def fetch_aio(kw):
data = requests.post('https://api.scavio.dev/api/v1/search', headers=H,
json={'platform': 'google', 'query': kw}, timeout=15).json()
aio = data.get('ai_overview', {})
return {'summary': aio.get('text', ''), 'sources': [s.get('link', '') for s in aio.get('sources', [])]}
def track(keywords):
for kw in keywords:
snapshot = fetch_aio(kw)
print(f'{kw}: {len(snapshot["sources"])} sources')
track(['best crm 2026', 'ai search api comparison'])Exemple JavaScript
const H = {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'};
async function fetchAIO(kw) {
const r = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST', headers: H, body: JSON.stringify({platform: 'google', query: kw})
});
const data = await r.json();
const aio = data.ai_overview || {};
return {summary: aio.text || '', sources: (aio.sources || []).map(s => s.link)};
}
async function track(keywords) {
for (const kw of keywords) {
const snap = await fetchAIO(kw);
console.log(`${kw}: ${snap.sources.length} sources`);
}
}
track(['best crm 2026', 'ai search api comparison']);Sortie attendue
A daily change report showing which AI Overview sources were added or removed, and whether the summary text changed, for each tracked keyword.