Suivre les AI Overviews de Google en Python : présence, sources
Nous avons testé 100 requêtes Google pour les AI Overviews le 19 octobre 2026 : qui en obtient, ce qu’elles citent, leur stabilité, plus un tracker Python avec snapshots.

Appelez /v1/serp et cherchez un objet ai_overview dans la réponse. S’il est là, text_blocks contient le texte de l’overview et references les pages qu’elle cite ; s’il manque, Google n’en a affiché aucune pour cette requête. Nous avons passé 100 requêtes ainsi le 19 octobre 2026 : 57 avaient une overview, elles citaient 7,5 sources en moyenne, et environ deux tiers des sites cités se classaient aussi sur la même page de résultats. Relancer 20 d’entre elles à quelques minutes d’écart a changé les sources citées bien plus souvent que la présence de l’overview.
Cet article traite des AI Overviews sur la page de résultats normale. Pour l’AI Mode de Google, distinct, voir l’article sur AI Mode ; pour le suivi classique des positions, voir surveiller le classement des mots-clés.
À quoi ressemble une AI Overview dans la réponse de l’API ?
C’est une clé ai_overview de premier niveau, à côté de organic_results. Ce que nous avons vu le 19 octobre 2026 :
ai_overview.text_blocks: une liste d’objets{type, snippet}. Dans les 57 overviews collectées, chaque bloc avait le typeparagraph, même les titres visuels, et le texte faisait en moyenne 232 mots (88 à 415).ai_overview.references: les pages citées, chacune avecindex,title,source(le nom d’affichage du site) etlink. Les 425 liens étaient des URL absolues, et 32 titres contenaient une balise<b>littérale : retirez le balisage avant de les afficher.answer_boxetpeopleAlsoAskedForn’étaient non vides que dans les 57 réponses avec une overview, et portent des fragments de celle-ci (première phrase, première référence). Testezai_overviewlui-même, pas ceux-là.
La documentation de Google dit qu’aucun balisage spécial n’est nécessaire pour être cité : une page doit être indexée et éligible aux extraits, et les clics arrivent dans le type normal « Recherche Web » de la Search Console (Search Central, fonctionnalités d’IA, mis à jour pour la dernière fois en décembre 2025). La présence se mesure donc de l’extérieur, comme le fait le tracker ci-dessous.
À quelle fréquence les requêtes affichent-elles une AI Overview ?
Nous avons construit 100 requêtes, 20 pour chacune de cinq intentions, et lancé chacune une fois avec country=us, langue par défaut, desktop (vers 18:00 UTC, 19 octobre 2026). Cinq workers en parallèle ont pris environ 85 secondes.
| Intention | Exemple de requête | Avec overview | Part |
|---|---|---|---|
| Informationnelle | how do vaccines work | 19 sur 20 | 95 % |
| Commerciale | best crm for small business | 20 sur 20 | 100 % |
| Navigationnelle | netflix | 14 sur 20 | 70 % |
| Locale | plumber in austin tx | 2 sur 20 | 10 % |
| Développeur | fix cors error | 2 sur 20 | 10 % |
| Toutes | 57 sur 100 | 57 % |
Les requêtes « how » et « best » en ont presque toujours obtenu une. Les deux réussites locales étaient « things to do in new orleans » et « pharmacy open 24 hours in atlanta ». Les six échecs navigationnels étaient des recherches de marque (chatgpt, youtube, netflix, linkedin, paypal login, walmart). Les requêtes développeur nous ont surpris : seules « what is a webhook » et « http 429 too many requests » en avaient une. Avec 20 requêtes par intention, considérez les écarts de moins de 15 points environ comme du bruit.
Combien de sources une AI Overview cite-t-elle, et correspondent-elles au top 10 ?
Une overview citait 7,5 sources en moyenne (médiane 7, plage de 2 à 13). Nous avons comparé chaque site cité aux sites des organic_results de cette réponse, qui comptaient en moyenne 8,9 résultats et non dix pleins.
| Intention | Sources (moyenne) | Sites cités aussi dans les résultats organiques | URL citées exactes aussi dans les résultats organiques |
|---|---|---|---|
| Informationnelle | 9,4 | 70 % | 54 % |
| Commerciale | 7,2 | 66 % | 44 % |
| Navigationnelle | 5,8 | 70 % | 49 % |
| Locale (2 overviews) | 5,5 | 90 % | 73 % |
| Développeur (2 overviews) | 5,5 | 45 % | 36 % |
| Les 57 overviews | 7,5 | 69 % | 50 % |
Chaque overview partageait au moins un site avec les résultats organiques, mais seule la moitié des URL citées exactes étaient des URL organiques. Se classer en première page rend une citation probable, pas certaine, et environ un tiers des sites cités n’étaient pas du tout sur la page. Hors YouTube, le recouvrement est de 68 %.
Quels domaines Google cite-t-il le plus ?
243 sites distincts ont été cités dans les 57 overviews. YouTube est en tête, de loin.
| Site | Overviews qui le citent | Part des 57 |
|---|---|---|
| youtube.com | 38 | 67 % |
| reddit.com | 12 | 21 % |
| wikipedia.org | 8 | 14 % |
| facebook.com | 7 | 12 % |
| nytimes.com | 6 | 11 % |
| cnet.com | 5 | 9 % |
| mayoclinic.org, pcmag.com, rtings.com, apple.com | 4 chacun | 7 % |
YouTube apparaissait dans 16 des 19 overviews informationnelles et 18 des 20 commerciales, mais seulement 3 des 14 navigationnelles. Une vidéo peut être la citation, et les sites d’avis (nytimes, cnet, pcmag, rtings) se concentrent sur les requêtes « best X ».
Quelle est la stabilité d’une AI Overview d’un run à l’autre ?
Nous avons choisi 20 des 100 requêtes, toutes intentions confondues (16 avec une overview au premier passage, 4 sans), et les avons relancées deux fois : environ une minute après le premier passage, puis cinq minutes après.
| Mesure | Résultat |
|---|---|
| Overview présente dans les 3 runs | 15 requêtes |
| Overview absente dans les 3 runs | 3 requêtes |
| Présence qui bascule | 2 requêtes (« facebook login » dans 2 runs sur 3, « netflix » dans 1 sur 3) |
| Même texte et mêmes sources dans les 3 runs | 5 sur 16 |
| Recouvrement moyen des URL citées entre runs | 72 % |
| Recouvrement moyen des sites cités entre runs | 78 % |
| Similarité moyenne du texte (au niveau des mots) | 64 % |
Les quatre dernières lignes portent sur les 16 requêtes avec une overview dans au moins deux runs. Cinq (dont « best vpn » et « how do vaccines work ») sont revenues mot pour mot identiques. D’autres ont beaucoup bougé : pour « what causes inflation », le nombre de sources a suivi la séquence 10, 10, 8, et entre les deux derniers runs six sites sont sortis tandis que congress.gov et youtube.com entraient. La présence est en grande partie stable sur quelques minutes ; les sources et la formulation ne le sont pas. Alertez sur l’apparition, la disparition, et l’entrée ou la sortie de votre propre domaine, pas sur les changements de texte.
Comment suivre les AI Overviews chaque jour en Python ?
C’est le script que nous avons exécuté pour le jeu de données. Il stocke un snapshot par requête et par run dans SQLite et affiche ce qui a changé depuis le précédent. Définissez WATCH_DOMAIN pour être prévenu quand vous gagnez ou perdez une citation.
import difflib, json, os, sqlite3, sys
from datetime import date
from urllib.parse import urlparse
import requests
API = "https://api.fastaf.co/v1"
KEY = os.environ["FASTAF_API_KEY"]
DB = os.environ.get("AIO_DB", "aio.db")
WATCH = os.environ.get("WATCH_DOMAIN", "") # e.g. example.com
def host(url):
return (urlparse(url).hostname or "").removeprefix("www.")
def parse(data):
ao = data.get("ai_overview")
return {
"has_overview": ao is not None,
"text": " ".join(b.get("snippet", "") for b in (ao or {}).get("text_blocks", [])).strip(),
"sources": [{"title": s.get("title"), "source": s.get("source"), "link": s["link"]}
for s in (ao or {}).get("references", [])],
"organic": [o["link"] for o in data.get("organic_results", [])],
}
def cites(domain, sources):
return any(host(x["link"]) == domain or host(x["link"]).endswith("." + domain) for x in sources)
def fetch(query, country="us"):
r = requests.get(f"{API}/serp", params={"query": query, "country": country},
headers={"Authorization": f"Bearer {KEY}"}, timeout=90)
r.raise_for_status()
return parse(r.json())
def init(db=DB):
conn = sqlite3.connect(db)
conn.execute("""CREATE TABLE IF NOT EXISTS snapshots (
snap TEXT, query TEXT, has_overview INTEGER, text TEXT, sources TEXT, organic TEXT,
taken_at TEXT DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (snap, query))""")
return conn
def save(conn, snap, query, s):
conn.execute("INSERT OR REPLACE INTO snapshots (snap, query, has_overview, text, sources, organic) "
"VALUES (?,?,?,?,?,?)",
(snap, query, int(s["has_overview"]), s["text"],
json.dumps(s["sources"]), json.dumps(s["organic"])))
conn.commit()
Le rapport compare les deux derniers snapshots :
def report(conn):
snaps = [r[0] for r in conn.execute(
"SELECT snap FROM snapshots GROUP BY snap ORDER BY MIN(taken_at) DESC LIMIT 2")]
if len(snaps) < 2:
return print("Need two snapshots to compare.")
new, old = snaps
q = "SELECT query, has_overview, text, sources FROM snapshots WHERE snap = ?"
a = {r[0]: r[1:] for r in conn.execute(q, (old,))}
b = {r[0]: r[1:] for r in conn.execute(q, (new,))}
print(f"{old} -> {new}")
for query in sorted(a.keys() & b.keys()):
(had, t0, s0), (has, t1, s1) = a[query], b[query]
if not had and has:
print(f"APPEARED {query}")
elif had and not has:
print(f"DISAPPEARED {query}")
elif has:
if WATCH and cites(WATCH, json.loads(s0)) != cites(WATCH, json.loads(s1)):
print(f"{'GAINED' if cites(WATCH, json.loads(s1)) else 'LOST'} CITATION {query}")
d0 = {host(x["link"]) for x in json.loads(s0)}
d1 = {host(x["link"]) for x in json.loads(s1)}
same = difflib.SequenceMatcher(None, t0.split(), t1.split(), autojunk=False).ratio()
if d0 != d1 or same < 0.9:
print(f"CHANGED {query}: text {same:.0%} alike, +{sorted(d1 - d0)} -{sorted(d0 - d1)}")
if __name__ == "__main__":
snap = sys.argv[1] if len(sys.argv) > 1 else date.today().isoformat()
conn = init()
for query in [q.strip() for q in open("queries.txt") if q.strip()]:
s = fetch(query)
save(conn, snap, query, s)
print(f"{query}: {'overview, %d sources' % len(s['sources']) if s['has_overview'] else 'no overview'}")
report(conn)
Extrait de la vraie sortie comparant nos deuxième et troisième runs avec WATCH_DOMAIN=youtube.com :
LOST CITATION best noise cancelling headphones
CHANGED best noise cancelling headphones: text 21% alike, +['audiophileon.com'] -['youtube.com']
DISAPPEARED netflix
GAINED CITATION what causes inflation
autojunk=False compte : avec la valeur par défaut, les textes longs paraissent beaucoup moins similaires qu’ils ne le sont.
Combien coûte le suivi des AI Overviews ?
Un appel /serp coûte 5 crédits et l’overview arrive dans la même réponse, donc le suivi ne coûte rien de plus. Un passage sur 100 requêtes fait 500 crédits, exactement la franchise gratuite, et environ 0,25 $ avec le pack Starter (10 $ pour 20 000 crédits). Les mêmes 100 requêtes chaque jour pendant 30 jours font 15 000 crédits, soit 7,50 $ au tarif Starter ; voir les tarifs et la page de la SERP API. Deux appels supplémentaires le 19 octobre 2026 ont renvoyé HTTP 200 avec X-FastAF-Credits-Used: 5, en 3,9 et 14,4 secondes : prévoyez donc un timeout généreux, comme le fait le script.
Que ne montrent pas ces données ?
Un pays (us), une langue, desktop, pas de location, un après-midi, et 100 requêtes écrites par nous, pas un échantillon de trafic réel. Les recouvrements local et développeur reposent sur 2 overviews chacun. Google décide par utilisateur et par moment, donc ce que renvoie l’API peut différer de votre navigateur, et le test de volatilité s’étale sur six minutes. Refaites-le avec vos propres requêtes avant de bâtir une stratégie sur ces chiffres.
En bref
Vérifiez ai_overview dans la réponse /serp, stockez references chaque jour dans SQLite, et alertez sur l’apparition, la disparition et l’entrée ou la sortie de votre domaine dans les citations. Sur nos 100 requêtes, les requêtes « how » et « best » ont presque toujours obtenu une overview, les requêtes locales et développeur rarement, les sources ont été rebattues bien plus que la présence, et YouTube a été cité dans deux tiers des overviews. Obtenez 500 crédits gratuits et passez votre propre liste de requêtes dans le script ; la documentation liste chaque paramètre de /serp.