GEO (Generative Engine Optimization) est le nouveau nom en 2026 du SEO pour les moteurs de réponse IA. Un outil d'audit GEO vérifie la présence, la part de citation et la structure du contenu sur ChatGPT, Perplexity et Gemini. Ce tutoriel construit un audit de notation simple soutenu par Scavio.
Prérequis
- Python 3.10+
- Une clé API Scavio
- Un panneau de requêtes (20 à 50 requêtes cibles)
- Votre domaine
Parcours
Étape 1: Exécutez chaque requête sur les moteurs
Couverture ChatGPT, Perplexity, Gemini (AI Overview).
import requests, os
API_KEY = os.environ['SCAVIO_API_KEY']
def run(query):
engines = ['chatgpt', 'perplexity']
out = {}
for e in engines:
r = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'platform': e, 'query': query})
out[e] = r.json()
ov = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'query': query, 'include': ['ai_overview']}).json().get('ai_overview')
out['gemini_overview'] = ov
return outÉtape 2: Notez la présence de citation par moteur
1 point par moteur où votre domaine est cité.
def score_query(resp, domain):
score = 0
for e, r in resp.items():
srcs = r.get('citations', []) + r.get('sources', []) if isinstance(r, dict) else []
if any(domain in s.get('url', '') for s in srcs):
score += 1
return scoreÉtape 3: Auditez la structure du contenu
Vérifiez que vos pages ont un schéma FAQ, des titres clairs et des paragraphes courts.
def structure_check(url):
html = requests.get(url).text
return {
'has_faq_schema': 'FAQPage' in html,
'headings': html.count('<h2'),
'paragraphs': html.count('<p')
}Étape 4: Calculez le score GEO global
Moyenne pondérée de la présence + de la structure.
def geo_score(presence_score, structure):
return 0.7 * presence_score + 0.3 * min(structure['headings'] / 5, 1)Étape 5: Générez une liste d'actions
Marquez les requêtes où vous êtes absent avec des correctifs de contenu suggérés.
def actions(results, domain):
return [q for q, s in results.items() if s['presence'] == 0]Exemple Python
import os, requests
API_KEY = os.environ['SCAVIO_API_KEY']
QUERIES = ['best ai agent framework', 'how to build a rag agent']
DOMAIN = 'scavio.dev'
score = 0
for q in QUERIES:
r = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'platform': 'perplexity', 'query': q})
if any(DOMAIN in s.get('url', '') for s in r.json().get('sources', [])):
score += 1
print(f'GEO coverage: {score}/{len(QUERIES)}')Exemple JavaScript
const API_KEY = process.env.SCAVIO_API_KEY;
const QUERIES = ['best ai agent framework'];
const DOMAIN = 'scavio.dev';
let score = 0;
for (const q of QUERIES) {
const r = 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: 'perplexity', query: q })
});
const d = await r.json();
if (d.sources?.some(s => s.url.includes(DOMAIN))) score++;
}
console.log(`GEO coverage: ${score}/${QUERIES.length}`);Sortie attendue
Per-query GEO report with score, missing engines, and content structure gaps. Typical first-run score: 15-30% coverage on B2B SaaS, improvable to 60%+ in 90 days.