Aperçu
Exécutez des requêtes SERP quotidiennes pour vos mots-clés cibles Surfer SEO afin de suivre les positions de classement, les apparitions AI Overview et les mouvements des concurrents. Alimentez les décisions d'optimisation de contenu avec des données SERP en direct.
Déclencheur
Cron quotidien à 06:00 UTC
Planification
Quotidiennement à 06:00 UTC
Étapes du workflow
Charger la liste de mots-clés
Lire les mots-clés cibles depuis un fichier JSON, une base de données ou Google Sheet. Chaque mot-clé inclut l'URL cible dont il faut suivre la position.
Interroger le SERP pour chaque mot-clé
Rechercher sur Google via Scavio pour chaque mot-clé avec AI Overview activé. Extraire les classements organiques complets, la présence d'AI Overview et les People Also Ask.
Trouver la position cible
Analyser les résultats organiques pour l'URL cible. Enregistrer sa position, ou marquer comme 'non trouvé' si hors du top 100.
Détecter les changements d'AI Overview
Vérifier si le mot-clé déclenche un AI Overview et si le domaine cible est cité. Enregistrer les changements par rapport au jour précédent.
Stocker et alerter
Ajouter l'instantané quotidien à une base de données de séries temporelles ou un CSV. Envoyer des alertes en cas de baisse de position de plus de 3 ou de changements dans les citations AI Overview.
Implémentation Python
import requests, os, json
from datetime import date
H = {'x-api-key': os.environ['SCAVIO_API_KEY']}
def track_keyword(keyword, target_domain):
r = requests.post('https://api.scavio.dev/api/v1/search', headers=H,
json={'platform': 'google', 'query': keyword, 'ai_overview': True},
timeout=10).json()
organic = r.get('organic', [])
position = None
for o in organic:
if target_domain in o.get('link', ''):
position = o.get('position')
break
aio = r.get('ai_overview', {}) or {}
aio_text = aio.get('text', '')
return {
'date': str(date.today()),
'keyword': keyword,
'position': position,
'top_3': [{'domain': o.get('link', '').split('/')[2] if '/' in o.get('link', '') else '',
'title': o['title']} for o in organic[:3]],
'has_ai_overview': bool(r.get('ai_overview')),
'cited_in_aio': target_domain in aio_text.lower(),
'paa_count': len(r.get('people_also_ask', [])),
}
keywords = [
('best project management tool 2026', 'example.com'),
('project management software comparison', 'example.com'),
]
for kw, domain in keywords:
result = track_keyword(kw, domain)
pos = result['position'] or 'not found'
aio = 'CITED' if result['cited_in_aio'] else 'not cited'
print(f"{kw}: #{pos} | AIO: {result['has_ai_overview']} ({aio})")Implémentation JavaScript
const H = {"x-api-key": process.env.SCAVIO_API_KEY, "Content-Type": "application/json"};
async function trackKeyword(keyword, targetDomain) {
const r = await fetch("https://api.scavio.dev/api/v1/search", {
method: "POST", headers: H,
body: JSON.stringify({platform: "google", query: keyword, ai_overview: true})
}).then(r => r.json());
const organic = r.organic || [];
const match = organic.find(o => (o.link || "").includes(targetDomain));
const aio = r.ai_overview || {};
return {
date: new Date().toISOString().split("T")[0],
keyword,
position: match ? match.position : null,
top3: organic.slice(0, 3).map(o => ({
domain: (o.link || "").split("/")[2] || "", title: o.title
})),
hasAiOverview: Boolean(r.ai_overview),
citedInAio: (aio.text || "").toLowerCase().includes(targetDomain),
paaCount: (r.people_also_ask || []).length,
};
}
(async () => {
const keywords = [
["best project management tool 2026", "example.com"],
["project management software comparison", "example.com"],
];
for (const [kw, domain] of keywords) {
const r = await trackKeyword(kw, domain);
const pos = r.position || "not found";
console.log(`${kw}: #${pos} | AIO: ${r.hasAiOverview} (${r.citedInAio ? "CITED" : "not cited"})`);
}
})();Plateformes utilisées
Recherche web avec graphe de connaissances, PAA et aperçus IA