Monitorare le Google AI Overviews con Python: presenza e fonti
Abbiamo controllato 100 query Google per le AI Overviews il 19 ottobre 2026: chi ne ottiene una, cosa cita, quanto è stabile. Più un tracker Python che salva gli snapshot.

Chiama /v1/serp e cerca un oggetto ai_overview nella risposta. Se c’è, text_blocks contiene il testo dell’overview e references le pagine che cita; se manca, Google non ne ha mostrata nessuna per quella query. Abbiamo eseguito così 100 query il 19 ottobre 2026: 57 avevano un’overview, citavano in media 7,5 fonti, e circa due terzi dei siti citati si posizionavano anche nella stessa pagina dei risultati. Rieseguendone 20 a distanza di pochi minuti, le fonti citate sono cambiate molto più spesso della presenza dell’overview.
Questo articolo riguarda le AI Overviews nella normale pagina dei risultati. Per la AI Mode di Google, che è separata, vedi il post su AI Mode; per il tracciamento classico delle posizioni, vedi monitorare il posizionamento delle parole chiave.
Che aspetto ha una AI Overview nella risposta dell’API?
È una chiave ai_overview di primo livello accanto a organic_results. Cosa abbiamo visto il 19 ottobre 2026:
ai_overview.text_blocks: una lista di oggetti{type, snippet}. In tutte le 57 overview raccolte, ogni blocco aveva tipoparagraph, anche i titoletti visivi, e il testo era in media di 232 parole (da 88 a 415).ai_overview.references: le pagine citate, ciascuna conindex,title,source(il nome visualizzato del sito) elink. Tutti i 425 link erano URL assoluti, e 32 titoli contenevano un tag<b>letterale, quindi togli il markup prima di mostrarli.answer_boxepeopleAlsoAskedForerano non vuoti esattamente nelle 57 risposte con un’overview, e ne portano dei frammenti (prima frase, prima fonte). Testaai_overviewstesso, non questi.
La documentazione di Google dice che non serve nessun markup speciale per essere citati: una pagina deve essere indicizzata e idonea agli snippet, e i clic finiscono nel normale tipo Ricerca web di Search Console (Search Central, funzioni AI, ultimo aggiornamento dicembre 2025). La presenza è quindi qualcosa che si misura da fuori, come fa il tracker qui sotto.
Quanto spesso le query mostrano una AI Overview?
Abbiamo costruito 100 query, 20 per ciascuno di cinque intenti, ed eseguito ciascuna una volta con country=us, lingua predefinita, desktop (verso le 18:00 UTC del 19 ottobre 2026). Cinque worker in parallelo hanno impiegato circa 85 secondi.
| Intento | Query di esempio | Con overview | Quota |
|---|---|---|---|
| Informativo | how do vaccines work | 19 su 20 | 95% |
| Commerciale | best crm for small business | 20 su 20 | 100% |
| Navigazionale | netflix | 14 su 20 | 70% |
| Locale | plumber in austin tx | 2 su 20 | 10% |
| Sviluppatori | fix cors error | 2 su 20 | 10% |
| Tutti | 57 su 100 | 57% |
Le query “how” e “best” ne hanno quasi sempre avuta una. I due casi locali erano “things to do in new orleans” e “pharmacy open 24 hours in atlanta”. I sei mancati navigazionali erano ricerche di brand (chatgpt, youtube, netflix, linkedin, paypal login, walmart). Le query per sviluppatori ci hanno sorpreso: solo “what is a webhook” e “http 429 too many requests” ne avevano una. Con 20 query per intento, considera rumore le differenze sotto i 15 punti circa.
Quante fonti cita una AI Overview, e coincidono con la top 10?
Un’overview citava in media 7,5 fonti (mediana 7, intervallo da 2 a 13). Abbiamo confrontato ogni sito citato con i siti in organic_results di quella risposta, che avevano in media 8,9 risultati e non dieci pieni.
| Intento | Fonti (media) | Siti citati presenti anche nei risultati organici | URL citati esatti presenti anche nei risultati organici |
|---|---|---|---|
| Informativo | 9,4 | 70% | 54% |
| Commerciale | 7,2 | 66% | 44% |
| Navigazionale | 5,8 | 70% | 49% |
| Locale (2 overview) | 5,5 | 90% | 73% |
| Sviluppatori (2 overview) | 5,5 | 45% | 36% |
| Tutte le 57 overview | 7,5 | 69% | 50% |
Ogni overview condivideva almeno un sito con i risultati organici, ma solo metà degli URL citati esatti erano URL organici. Posizionarsi in prima pagina rende probabile una citazione, non certa, e circa un terzo dei siti citati non era affatto nella pagina. Escludendo YouTube, la sovrapposizione è del 68%.
Quali domini cita di più Google?
Sono stati citati 243 siti distinti nelle 57 overview. YouTube è in testa con largo margine.
| Sito | Overview che lo citano | Quota sulle 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 ciascuno | 7% |
YouTube compariva in 16 overview informative su 19 e in 18 commerciali su 20, ma solo in 3 navigazionali su 14. Un video può essere la citazione, e i siti di recensioni (nytimes, cnet, pcmag, rtings) si concentrano nelle query “best X”.
Quanto è stabile una AI Overview fra un’esecuzione e l’altra?
Abbiamo scelto 20 delle 100 query fra tutti gli intenti (16 con overview al primo passaggio, 4 senza) e le abbiamo eseguite altre due volte: circa un minuto dopo il primo passaggio, poi cinque minuti dopo.
| Misura | Risultato |
|---|---|
| Overview presente in tutte e 3 le esecuzioni | 15 query |
| Overview assente in tutte e 3 le esecuzioni | 3 query |
| Presenza che cambia | 2 query (“facebook login” in 2 su 3, “netflix” in 1 su 3) |
| Stesso testo e stesse fonti in tutte e 3 le esecuzioni | 5 su 16 |
| Sovrapposizione media degli URL citati fra esecuzioni | 72% |
| Sovrapposizione media dei siti citati fra esecuzioni | 78% |
| Somiglianza media del testo (a livello di parola) | 64% |
Le ultime quattro righe riguardano le 16 query con un’overview in almeno due esecuzioni. Cinque (fra cui “best vpn” e “how do vaccines work”) sono tornate identiche parola per parola. Altre si sono mosse molto: per “what causes inflation” il numero di fonti è andato 10, 10, 8, e fra le ultime due esecuzioni sei siti sono usciti mentre sono entrati congress.gov e youtube.com. La presenza è per lo più stabile nell’arco di minuti; fonti e formulazione no. Imposta gli avvisi su comparsa, scomparsa, e ingresso o uscita del tuo dominio, non sui cambi di testo.
Come monitoro le AI Overviews ogni giorno in Python?
Questo è lo script che abbiamo usato per il dataset. Salva in SQLite uno snapshot per query per esecuzione e stampa cosa è cambiato rispetto al precedente. Imposta WATCH_DOMAIN per essere avvisato quando guadagni o perdi una citazione.
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()
Il report confronta gli ultimi due snapshot:
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)
Estratto dell’output reale del confronto fra la nostra seconda e terza esecuzione con 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 conta: con il valore predefinito, i testi lunghi sembrano molto meno simili di quanto siano.
Quanto costa monitorare le AI Overviews?
Una chiamata /serp costa 5 crediti e l’overview arriva nella stessa risposta, quindi il monitoraggio non costa niente in più. Un passaggio su 100 query sono 500 crediti, esattamente la quota gratuita, e circa $0,25 sul pacchetto Starter ($10 per 20.000 crediti). Le stesse 100 query ogni giorno per 30 giorni sono 15.000 crediti, $7,50 ai prezzi Starter; vedi i prezzi e la pagina della SERP API. Due chiamate aggiuntive il 19 ottobre 2026 hanno restituito HTTP 200 con X-FastAF-Credits-Used: 5, in 3,9 e 14,4 secondi, quindi usa un timeout generoso, come fa lo script.
Cosa non mostrano questi dati?
Un solo paese (us), una sola lingua, desktop, nessuna location, un pomeriggio, e 100 query scritte da noi, non un campione di traffico reale. La sovrapposizione per locale e sviluppatori poggia su 2 overview ciascuno. Google decide per utente e per momento, quindi ciò che restituisce l’API può differire dal tuo browser, e la prova di volatilità copre sei minuti. Ripetila con le tue query prima di costruire una strategia su questi numeri.
La versione breve
Controlla ai_overview nella risposta di /serp, salva ogni giorno references in SQLite, e imposta gli avvisi su comparsa, scomparsa e ingresso o uscita del tuo dominio dalle citazioni. Nelle nostre 100 query, le query “how” e “best” hanno quasi sempre avuto un’overview, quelle locali e per sviluppatori di rado, le fonti sono state rimescolate molto più della presenza, e YouTube è stato citato in due terzi delle overview. Prendi 500 crediti gratuiti e fai girare la tua lista di query con lo script; la documentazione elenca ogni parametro di /serp.