Les AI Overviews de Google apparaissent désormais pour plus de 40% des requêtes informationnelles en 2026. Être cité dans un AI Overview génère un taux de clic significatif même si votre page n'est pas dans les 3 premiers résultats organiques. Suivre les requêtes qui citent votre domaine et celles qui ne le font pas est le nouveau rapport de classement. Ce tutoriel construit un traqueur de citations qui vérifie une liste de requêtes cibles, enregistre si votre domaine apparaît dans les sources de l'AI Overview, et consigne les résultats dans le temps pour une analyse des tendances. Chaque vérification coûte un crédit API Scavio à 0,005 $.
Prérequis
- Python 3.9+ installé
- bibliothèque requests installée
- Une clé API Scavio depuis scavio.dev
- Une liste de requêtes cibles pertinentes pour votre domaine
Parcours
Étape 1: Définir les requêtes cibles et le domaine
Configurez une liste de requêtes que vous souhaitez suivre pour les citations AI Overview. Il doit s'agir de requêtes informationnelles pour lesquelles vous pensez que votre contenu est pertinent.
import os, requests, json, time
from datetime import datetime
SCAVIO_KEY = os.environ['SCAVIO_API_KEY']
H = {'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json'}
URL = 'https://api.scavio.dev/api/v1/search'
TARGET_DOMAIN = 'scavio.dev'
QUERIES = [
'best search api for developers',
'how to get google search results programmatically',
'serp api comparison 2026',
'web search api for ai agents',
'mcp search server',
]Étape 2: Vérifier la citation AI Overview pour une seule requête
Effectuez une recherche avec include_ai_overview activé et vérifiez si le domaine cible apparaît dans la liste des sources de l'AI Overview.
def check_citation(query: str, domain: str) -> dict:
resp = requests.post(URL, headers=H,
json={'query': query, 'country_code': 'us', 'include_ai_overview': True})
data = resp.json()
ai = data.get('ai_overview', {})
sources = ai.get('sources', [])
cited = False
citation_position = None
for i, src in enumerate(sources):
if domain in src.get('link', ''):
cited = True
citation_position = i + 1
break
organic = data.get('organic_results', [])
organic_pos = None
for r in organic:
if domain in r.get('link', ''):
organic_pos = r.get('position')
break
return {
'query': query,
'ai_overview_present': bool(ai.get('text')),
'cited': cited,
'citation_position': citation_position,
'organic_position': organic_pos,
'total_ai_sources': len(sources),
'timestamp': datetime.now().isoformat(),
}Étape 3: Vérifier toutes les requêtes par lot et enregistrer les résultats
Parcourez toutes les requêtes cibles, vérifiez les citations et enregistrez les résultats dans un fichier JSON pour un suivi historique.
def track_citations(queries: list, domain: str) -> list:
results = []
for q in queries:
result = check_citation(q, domain)
results.append(result)
status = 'CITED' if result['cited'] else 'MISSING'
print(f'[{status}] "{q}" | AI src #{result["citation_position"]} | Organic #{result["organic_position"]}')
time.sleep(0.5)
# Save snapshot
snapshot = {'date': datetime.now().strftime('%Y-%m-%d'), 'domain': domain, 'results': results}
filename = f'ai_citations_{snapshot["date"]}.json'
with open(filename, 'w') as f:
json.dump(snapshot, f, indent=2)
cited_count = sum(1 for r in results if r['cited'])
print(f'\nCitation rate: {cited_count}/{len(results)} ({cited_count/len(results)*100:.0f}%)')
print(f'Saved to {filename}')
return results
results = track_citations(QUERIES, TARGET_DOMAIN)Étape 4: Comparer les citations dans le temps
Chargez les instantanés précédents et comparez l'état des citations pour détecter les gains et les pertes de visibilité dans l'AI Overview.
def compare_snapshots(current_file: str, previous_file: str):
with open(current_file) as f:
current = json.load(f)
with open(previous_file) as f:
previous = json.load(f)
prev_map = {r['query']: r['cited'] for r in previous['results']}
print(f'Citation changes: {previous["date"]} -> {current["date"]}')
for r in current['results']:
was_cited = prev_map.get(r['query'], False)
is_cited = r['cited']
if is_cited and not was_cited:
print(f' [GAINED] {r["query"]}')
elif not is_cited and was_cited:
print(f' [LOST] {r["query"]}')
elif is_cited:
print(f' [KEPT] {r["query"]}')
# compare_snapshots('ai_citations_2026-05-16.json', 'ai_citations_2026-05-09.json')Exemple Python
import os, requests, time, json
from datetime import datetime
SCAVIO_KEY = os.environ['SCAVIO_API_KEY']
H = {'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json'}
def check_ai_citation(query, domain):
resp = requests.post('https://api.scavio.dev/api/v1/search', headers=H,
json={'query': query, 'country_code': 'us', 'include_ai_overview': True})
data = resp.json()
sources = data.get('ai_overview', {}).get('sources', [])
cited = any(domain in s.get('link', '') for s in sources)
pos = next((i+1 for i, s in enumerate(sources) if domain in s.get('link', '')), None)
return {'query': query, 'cited': cited, 'position': pos}
queries = ['search api for developers', 'serp api python', 'web search mcp server']
for q in queries:
r = check_ai_citation(q, 'scavio.dev')
print(f'[{"CITED" if r["cited"] else "MISS"}] {q} (pos: {r["position"]})')
time.sleep(0.5)Exemple JavaScript
const SCAVIO_KEY = process.env.SCAVIO_API_KEY;
async function checkAICitation(query, domain) {
const resp = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST',
headers: { 'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({ query, country_code: 'us', include_ai_overview: true })
});
const data = await resp.json();
const sources = data.ai_overview?.sources || [];
const cited = sources.some(s => (s.link || '').includes(domain));
const pos = sources.findIndex(s => (s.link || '').includes(domain)) + 1 || null;
console.log(`[${cited ? 'CITED' : 'MISS'}] ${query} (pos: ${pos})`);
}
const queries = ['search api for developers', 'serp api python'];
(async () => { for (const q of queries) await checkAICitation(q, 'scavio.dev'); })();Sortie attendue
[CITED] "best search api for developers" | AI src #2 | Organic #4
[MISSING] "how to get google search results programmatically" | AI src #None | Organic #7
[CITED] "serp api comparison 2026" | AI src #1 | Organic #3
[MISSING] "web search api for ai agents" | AI src #None | Organic #12
[CITED] "mcp search server" | AI src #3 | Organic #2
Citation rate: 3/5 (60%)
Saved to ai_citations_2026-05-16.json