Les agences SEO paient 100 à 500 $/mois pour des outils de suivi de classement (Ahrefs, SEMrush, AccuRanker). Pour les agences qui suivent des volumes de mots-clés modérés, une API de recherche à 0,005 $/requête peut reproduire le suivi de classement de base à une fraction du coût. Ce tutoriel construit un suivi de classement quotidien pour les clients d'agence.
Prérequis
- Python 3.8+
- Une clé API Scavio
- Mots-clés clients et URL cibles
Parcours
Étape 1: Définir les ensembles de mots-clés clients
Structurer les données clients avec des mots-clés et des domaines cibles.
CLIENTS = [
{
'name': 'Client A',
'domain': 'clienta.com',
'keywords': ['crm software', 'best crm 2026', 'crm for startups', 'crm comparison'],
},
{
'name': 'Client B',
'domain': 'clientb.io',
'keywords': ['project management tool', 'team collaboration app', 'agile project management'],
},
]Étape 2: Construire le vérificateur de classement
Rechercher sur Google chaque mot-clé et trouver la position du client.
import requests, os
H = {'x-api-key': os.environ['SCAVIO_API_KEY'], 'Content-Type': 'application/json'}
def check_rank(keyword: str, target_domain: str) -> dict:
resp = requests.post('https://api.scavio.dev/api/v1/search', headers=H,
json={'platform': 'google', 'query': keyword}, timeout=10)
results = resp.json().get('organic', [])
for i, r in enumerate(results):
url = r.get('link', '')
if target_domain in url:
return {'keyword': keyword, 'position': i + 1, 'url': url, 'title': r.get('title','')}
return {'keyword': keyword, 'position': None, 'not_in_top_results': True}Étape 3: Exécuter le suivi quotidien
Vérifier tous les mots-clés d'un client et stocker les données historiques.
import json
from datetime import date
from pathlib import Path
def daily_client_check(client: dict) -> dict:
today = date.today().isoformat()
results = []
for kw in client['keywords']:
rank = check_rank(kw, client['domain'])
rank['date'] = today
results.append(rank)
# Store history
history_file = Path(f"ranks_{client['name'].replace(' ','_').lower()}.json")
history = json.loads(history_file.read_text()) if history_file.exists() else []
history.extend(results)
history_file.write_text(json.dumps(history, indent=2))
return {
'client': client['name'],
'date': today,
'tracked': len(results),
'ranking': sum(1 for r in results if r.get('position')),
'avg_position': sum(r['position'] for r in results if r.get('position')) / max(sum(1 for r in results if r.get('position')), 1),
'results': results,
}Étape 4: Générer un rapport client
Créer un rapport récapitulatif montrant les changements de position dans le temps.
def client_report(client_name: str, days: int = 7) -> dict:
history_file = Path(f"ranks_{client_name.replace(' ','_').lower()}.json")
if not history_file.exists():
return {'error': 'No data found'}
history = json.loads(history_file.read_text())
dates = sorted(set(r['date'] for r in history))[-days:]
report = {'client': client_name, 'period': f'Last {days} days', 'keywords': {}}
for kw in set(r['keyword'] for r in history):
kw_data = [r for r in history if r['keyword'] == kw and r['date'] in dates]
if len(kw_data) >= 2:
first = next((r['position'] for r in kw_data if r.get('position')), None)
last = next((r['position'] for r in reversed(kw_data) if r.get('position')), None)
if first and last:
report['keywords'][kw] = {'current': last, 'change': first - last, 'trend': 'up' if last < first else 'down' if last > first else 'stable'}
return reportExemple Python
import requests, os
H = {'x-api-key': os.environ['SCAVIO_API_KEY'], 'Content-Type': 'application/json'}
def check_rank(keyword, domain):
r = requests.post('https://api.scavio.dev/api/v1/search', headers=H,
json={'platform': 'google', 'query': keyword}).json()
for i, x in enumerate(r.get('organic',[])):
if domain in x.get('link',''):
return i + 1
return NoneExemple JavaScript
async function checkRank(keyword, domain) {
const r = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST', headers: {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'},
body: JSON.stringify({platform: 'google', query: keyword})
});
const results = (await r.json()).organic || [];
const idx = results.findIndex(x => x.link?.includes(domain));
return idx >= 0 ? idx + 1 : null;
}Sortie attendue
A daily rank tracker that monitors Google positions for agency clients, stores historical data, and generates position change reports.