L'Answer Engine Optimization (AEO) est la pratique qui consiste à apparaître dans les réponses de ChatGPT, Perplexity et Claude, et pas seulement dans Google. Ce tutoriel vous guide dans la construction d'un tableau de bord AEO qui exécute des prompts quotidiens, capture les mentions de marque et visualise les tendances au fil du temps en utilisant Scavio pour les données et Metabase pour les graphiques.
Prérequis
- Python 3.8+
- Une clé API Scavio
- Une base de données Postgres (le niveau gratuit de Supabase fonctionne)
- Metabase auto-hébergé ou cloud
Parcours
Étape 1: Configurer le schéma de la base de données
Créer une table pour enregistrer les lignes prompt-réponse-mention.
CREATE TABLE aeo_log (
id SERIAL PRIMARY KEY,
run_date DATE,
engine TEXT,
prompt TEXT,
answer TEXT,
brand_mentions JSONB
);Étape 2: Écrire le script de suivi quotidien
Pour chaque moteur et chaque prompt, interroger Scavio et enregistrer le résultat.
ENGINES = ['chatgpt', 'perplexity']
PROMPTS = ['best SERP API 2026', 'top Claude Code alternatives']
def run_tracker():
for engine in ENGINES:
for prompt in PROMPTS:
resp = requests.post('https://api.scavio.dev/api/v1/ask',
headers={'x-api-key': API_KEY},
json={'platform': engine, 'prompt': prompt}).json()
mentions = count_brands(resp.get('answer', ''))
save_row(engine, prompt, resp['answer'], mentions)Étape 3: Planifier avec cron
Exécuter le suivi quotidiennement à 8h UTC.
0 8 * * * /usr/bin/python3 /path/to/aeo_tracker.pyÉtape 4: Construire des graphiques Metabase
Créer un graphique de tendance des mentions de marque au fil du temps, par moteur.
-- In Metabase, use:
SELECT run_date, engine, brand_mentions->>'Scavio' AS scavio_count
FROM aeo_log
ORDER BY run_date;Étape 5: Configurer des alertes
Configurer Metabase pour envoyer un e-mail à l'équipe lorsque le nombre de mentions d'un concurrent augmente de 20% ou plus.
// Metabase UI: Subscriptions > New alert on trend changeExemple Python
import os, requests, psycopg2, json
API_KEY = os.environ['SCAVIO_API_KEY']
PG_URL = os.environ['POSTGRES_URL']
BRANDS = ['Scavio', 'SerpAPI', 'Tavily']
def count_brands(text):
return {b: text.lower().count(b.lower()) for b in BRANDS}
def run():
conn = psycopg2.connect(PG_URL)
cur = conn.cursor()
for engine in ['chatgpt', 'perplexity']:
for prompt in ['best SERP API 2026']:
r = requests.post('https://api.scavio.dev/api/v1/ask',
headers={'x-api-key': API_KEY},
json={'platform': engine, 'prompt': prompt}).json()
cur.execute('INSERT INTO aeo_log (run_date, engine, prompt, answer, brand_mentions) VALUES (CURRENT_DATE, %s, %s, %s, %s)',
(engine, prompt, r.get('answer', ''), json.dumps(count_brands(r.get('answer', '')))))
conn.commit()
run()Exemple JavaScript
import { Client } from 'pg';
const API_KEY = process.env.SCAVIO_API_KEY;
const BRANDS = ['Scavio', 'SerpAPI', 'Tavily'];
const pg = new Client({ connectionString: process.env.POSTGRES_URL });
await pg.connect();
for (const engine of ['chatgpt', 'perplexity']) {
const r = await fetch('https://api.scavio.dev/api/v1/ask', {
method: 'POST',
headers: { 'x-api-key': API_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({ platform: engine, prompt: 'best SERP API 2026' })
});
const { answer } = await r.json();
const mentions = Object.fromEntries(BRANDS.map(b => [b, (answer.toLowerCase().match(new RegExp(b.toLowerCase(), 'g')) || []).length]));
await pg.query('INSERT INTO aeo_log (run_date, engine, prompt, answer, brand_mentions) VALUES (CURRENT_DATE, $1, $2, $3, $4)', [engine, 'best SERP API 2026', answer, mentions]);
}
await pg.end();Sortie attendue
Daily rows appear in the aeo_log table, one per engine-prompt combination. Metabase charts display a 30-day trend line of brand mentions, and an alert fires when a competitor's count spikes.