Aperçu
Ce workflow surveille quotidiennement les citations en mode AI de Google pour un ensemble de mots-clés cibles. Il interroge chaque mot-clé avec l'extraction AI Overview activée, vérifie si votre domaine est cité dans la réponse générée par l'IA, compare avec les résultats du jour précédent et envoie des alertes lorsque des citations sont gagnées ou perdues. Conçu pour les équipes SEO post-Google I/O 2026 qui suivent la visibilité en mode AI, qui sert désormais plus d'1 milliard d'utilisateurs.
Déclencheur
Planification Cron (tous les jours à 7h00 UTC)
Planification
S'exécute quotidiennement à 7h00 UTC
Étapes du workflow
Charger les mots-clés cibles
Lire la liste des mots-clés cibles depuis un fichier JSON ou une table de base de données.
Interroger avec extraction AI Overview
Pour chaque mot-clé, appeler Scavio Google avec ai_overview activé pour obtenir le texte de réponse du mode AI.
Vérifier les citations de domaine
Analyser chaque texte AI Overview pour votre nom de domaine. Enregistrer la présence de citation (vrai/faux) par mot-clé.
Comparer aux résultats précédents
Charger les données de citations d'hier et identifier les mots-clés où des citations ont été gagnées ou perdues.
Envoyer des alertes de changement
Envoyer des notifications de citations gagnées/perdues vers Slack ou par email avec le mot-clé et le contexte.
Stocker les résultats
Écrire les données de citations d'aujourd'hui dans le stockage pour la comparaison de demain et le suivi historique.
Implémentation Python
import requests
import json
from datetime import datetime
from pathlib import Path
API_KEY = "your_scavio_api_key"
DOMAIN = "yourdomain.com"
def check_ai_citations(keywords: list[str]) -> dict:
results = {}
for kw in keywords:
res = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"platform": "google", "query": kw, "ai_overview": True},
timeout=15,
)
res.raise_for_status()
ai_text = res.json().get("ai_overview", {}).get("text", "")
results[kw] = {"cited": DOMAIN in ai_text.lower(), "ai_text_length": len(ai_text)}
return results
def run():
keywords = json.loads(Path("ai_mode_keywords.json").read_text())
today = datetime.utcnow().strftime("%Y-%m-%d")
prev_path = Path("ai_citations_latest.json")
previous = json.loads(prev_path.read_text()) if prev_path.exists() else {}
current = check_ai_citations(keywords)
gained = [kw for kw in current if current[kw]["cited"] and not previous.get(kw, {}).get("cited", False)]
lost = [kw for kw in current if not current[kw]["cited"] and previous.get(kw, {}).get("cited", False)]
cited_count = sum(1 for v in current.values() if v["cited"])
print(f"AI Mode Monitor {today}: {cited_count}/{len(keywords)} cited")
if gained:
print(f" Gained: {gained}")
if lost:
print(f" Lost: {lost}")
prev_path.write_text(json.dumps(current, indent=2))
if __name__ == "__main__":
run()Implémentation JavaScript
const API_KEY = "your_scavio_api_key";
const DOMAIN = "yourdomain.com";
async function checkAiCitations(keywords) {
const results = {};
for (const kw of keywords) {
const res = await fetch("https://api.scavio.dev/api/v1/search", {
method: "POST",
headers: { "x-api-key": API_KEY, "content-type": "application/json" },
body: JSON.stringify({ platform: "google", query: kw, ai_overview: true }),
});
const data = await res.json();
const aiText = data.ai_overview?.text ?? "";
results[kw] = { cited: aiText.toLowerCase().includes(DOMAIN), textLength: aiText.length };
}
return results;
}
const keywords = ["best search api 2026", "serp api comparison", "ai overview tracking"];
const results = await checkAiCitations(keywords);
const cited = Object.values(results).filter((r) => r.cited).length;
console.log(`AI Mode: ${cited}/${keywords.length} keywords cited`);Plateformes utilisées
Recherche web avec graphe de connaissances, PAA et aperçus IA