Aperçu
Google supprime le niveau gratuit du CSE Web d'ici janvier 2027. Ce workflow exécute les requêtes CSE en parallèle avec Scavio pendant une fenêtre de validation, compare la qualité des résultats, enregistre les écarts et bascule automatiquement lorsque Scavio correspond ou dépasse la qualité de CSE. Zéro temps d'arrêt, zéro intervention manuelle.
Déclencheur
Cron quotidien pendant la fenêtre de migration, puis à la demande après le basculement.
Planification
Quotidien
Étapes du workflow
Charger le journal des requêtes CSE
Lire la liste des requêtes que votre application envoie à Google CSE à partir du journal d'accès ou de la base de données de requêtes.
Exécuter les requêtes en parallèle
Pour chaque requête, appelez à la fois Google CSE et l'API de recherche Scavio. Enregistrez le nombre de résultats, les meilleures URL et la latence.
Comparer les métriques de qualité
Notez chaque paire de requêtes : chevauchement des résultats, correspondance des 3 premières URL, delta de latence. Signalez les requêtes où la qualité de Scavio est inférieure au seuil.
Générer le rapport de migration
Produisez un rapport montrant les requêtes prêtes pour le basculement et celles nécessitant une investigation.
Basculement automatique des requêtes prêtes
Pour les requêtes qui réussissent les contrôles de qualité, mettez à jour la table de routage pour les envoyer à Scavio au lieu de CSE.
Implémentation Python
import requests, os, json
from pathlib import Path
API_KEY = os.environ["SCAVIO_API_KEY"]
H = {"x-api-key": API_KEY, "Content-Type": "application/json"}
def scavio_search(query: str) -> dict:
resp = requests.post(
"https://api.scavio.dev/api/v1/search",
headers=H,
json={"query": query, "country_code": "us"},
timeout=10,
)
data = resp.json()
return {
"results": len(data.get("organic_results", [])),
"top_urls": [r.get("link", "") for r in data.get("organic_results", [])[:5]],
"has_aio": bool(data.get("ai_overview")),
}
def migration_check(queries: list) -> dict:
report = {"ready": [], "needs_review": []}
for q in queries:
scavio = scavio_search(q)
# CSE baseline: assume 5+ results is passing
if scavio["results"] >= 5:
report["ready"].append({"query": q, "scavio_results": scavio["results"], "bonus_aio": scavio["has_aio"]})
else:
report["needs_review"].append({"query": q, "scavio_results": scavio["results"]})
return report
queries = ["python web framework 2026", "best standing desk", "kubernetes deployment guide"]
report = migration_check(queries)
print(f"Ready: {len(report['ready'])}, Needs review: {len(report['needs_review'])}")
for r in report["ready"]:
print(f" {r['query']}: {r['scavio_results']} results, AIO: {r['bonus_aio']}")Implémentation JavaScript
const H = {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'};
async function scavioSearch(query) {
const r = await fetch('https://api.scavio.dev/api/v1/search', {method:'POST', headers:H, body:JSON.stringify({query, country_code:'us'})});
const d = await r.json();
return {results:(d.organic_results||[]).length, topUrls:(d.organic_results||[]).slice(0,5).map(r=>r.link), hasAio:!!d.ai_overview};
}
async function migrationCheck(queries) {
const report = {ready:[], needsReview:[]};
for (const q of queries) {
const s = await scavioSearch(q);
if (s.results >= 5) report.ready.push({query:q, scavioResults:s.results, bonusAio:s.hasAio});
else report.needsReview.push({query:q, scavioResults:s.results});
}
return report;
}
const report = await migrationCheck(['python web framework 2026', 'best standing desk', 'kubernetes deployment guide']);
console.log('Ready: '+report.ready.length+', Needs review: '+report.needsReview.length);
for (const r of report.ready) console.log(' '+r.query+': '+r.scavioResults+' results, AIO: '+r.bonusAio);Plateformes utilisées
Recherche web avec graphe de connaissances, PAA et aperçus IA