Google AI Overviews mit Python tracken: Präsenz, Quellen, Änderungen

Wir haben am 19. Oktober 2026 100 Google-Suchen auf AI Overviews geprüft: wer eine bekommt, was zitiert wird, wie stabil sie sind, plus ein Python-Tracker mit Snapshots.

Ruf /v1/serp auf und such in der Antwort nach einem ai_overview-Objekt. Ist es da, enthält text_blocks den Text der Übersicht und references die zitierten Seiten; fehlt es, hat Google für diese Suche keine gezeigt. Wir haben am 19. Oktober 2026 so 100 Suchanfragen ausgeführt: 57 hatten eine Übersicht, sie zitierten im Schnitt 7,5 Quellen, und etwa zwei Drittel der zitierten Seiten rankten auch auf derselben Ergebnisseite. Als wir 20 davon im Abstand von Minuten wiederholten, änderten sich die zitierten Quellen weit häufiger als das Vorhandensein der Übersicht.

Dieser Beitrag behandelt AI Overviews auf der normalen Ergebnisseite. Zu Googles separatem AI Mode siehe den Beitrag zu AI Mode; zum klassischen Positions-Tracking siehe Keyword-Rankings überwachen.

Wie sieht eine AI Overview in der API-Antwort aus?

Sie ist ein Schlüssel ai_overview auf oberster Ebene neben organic_results. Was wir am 19. Oktober 2026 gesehen haben:

  • ai_overview.text_blocks: eine Liste von {type, snippet}-Objekten. In allen 57 gesammelten Übersichten hatte jeder Block den Typ paragraph, auch optische Überschriften, und der Text umfasste im Schnitt 232 Wörter (88 bis 415).
  • ai_overview.references: die zitierten Seiten, jeweils mit index, title, source (der Anzeigename der Seite) und link. Alle 425 Links waren absolute URLs, und 32 Titel enthielten ein wörtliches <b>-Tag, entferne Markup also, bevor du sie anzeigst.
  • answer_box und peopleAlsoAskedFor waren in genau den 57 Antworten mit einer Übersicht nicht leer und enthalten Bruchstücke davon (erster Satz, erste Referenz). Prüf ai_overview selbst, nicht diese.

Googles Dokumentation sagt, dass für eine Zitierung kein spezielles Markup nötig ist: Eine Seite muss indexiert und snippet-fähig sein, und Klicks landen im normalen Suchtyp „Web” der Search Console (Search Central, KI-Funktionen, zuletzt aktualisiert im Dezember 2025). Die Präsenz misst man also von außen, wie es der Tracker unten tut.

Wie oft zeigen Suchanfragen eine AI Overview?

Wir haben 100 Suchanfragen gebaut, 20 für jede von fünf Intentionen, und jede einmal mit country=us, Standardsprache, Desktop ausgeführt (gegen 18:00 UTC am 19. Oktober 2026). Fünf parallele Worker brauchten etwa 85 Sekunden.

Intention Beispielanfrage Mit Übersicht Anteil
Informational how do vaccines work 19 von 20 95 %
Kommerziell best crm for small business 20 von 20 100 %
Navigational netflix 14 von 20 70 %
Lokal plumber in austin tx 2 von 20 10 %
Entwickler fix cors error 2 von 20 10 %
Alle 57 von 100 57 %

„How”- und „best”-Anfragen bekamen fast immer eine. Die zwei lokalen Treffer waren „things to do in new orleans” und „pharmacy open 24 hours in atlanta”. Die sechs navigationalen Fehlschläge waren Markensuchen (chatgpt, youtube, netflix, linkedin, paypal login, walmart). Entwickleranfragen haben uns überrascht: Nur „what is a webhook” und „http 429 too many requests” hatten eine. Bei 20 Anfragen pro Intention solltest du Abstände unter etwa 15 Punkten als Rauschen behandeln.

Wie viele Quellen zitiert eine AI Overview, und stimmen sie mit den Top 10 überein?

Eine Übersicht zitierte im Schnitt 7,5 Quellen (Median 7, Spanne 2 bis 13). Wir haben jede zitierte Seite mit den Seiten in den organic_results derselben Antwort verglichen, die im Schnitt 8,9 Ergebnisse hatten statt voller zehn.

Intention Mittlere Quellenzahl Zitierte Seiten auch in den organischen Ergebnissen Exakt zitierte URLs auch in den organischen Ergebnissen
Informational 9,4 70 % 54 %
Kommerziell 7,2 66 % 44 %
Navigational 5,8 70 % 49 %
Lokal (2 Übersichten) 5,5 90 % 73 %
Entwickler (2 Übersichten) 5,5 45 % 36 %
Alle 57 Übersichten 7,5 69 % 50 %

Jede Übersicht teilte mindestens eine Seite mit den organischen Ergebnissen, aber nur die Hälfte der exakt zitierten URLs waren organische URLs. Ein Ranking auf Seite eins macht eine Zitierung wahrscheinlich, nicht sicher, und etwa ein Drittel der zitierten Seiten stand überhaupt nicht auf der Seite. Ohne YouTube liegt die Überschneidung bei 68 %.

Welche Domains zitiert Google am häufigsten?

Über die 57 Übersichten hinweg wurden 243 verschiedene Seiten zitiert. YouTube lag mit großem Abstand vorn.

Seite Übersichten, die sie zitieren Anteil an den 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 je 4 7 %

YouTube tauchte in 16 von 19 informationalen und 18 von 20 kommerziellen Übersichten auf, aber nur in 3 von 14 navigationalen. Ein Video kann die Zitierung sein, und Testseiten (nytimes, cnet, pcmag, rtings) häufen sich bei „best X”-Anfragen.

Wie stabil ist eine AI Overview von Lauf zu Lauf?

Wir haben 20 der 100 Anfragen über alle Intentionen gewählt (16 mit Übersicht im ersten Durchgang, 4 ohne) und sie zweimal wiederholt: etwa eine Minute nach dem ersten Durchgang, dann fünf Minuten danach.

Messwert Ergebnis
Übersicht in allen 3 Läufen vorhanden 15 Anfragen
Übersicht in allen 3 Läufen nicht vorhanden 3 Anfragen
Präsenz wechselte 2 Anfragen („facebook login” in 2 von 3, „netflix” in 1 von 3)
Gleicher Text und gleiche Quellen in allen 3 Läufen 5 von 16
Mittlere Überschneidung zitierter URLs zwischen Läufen 72 %
Mittlere Überschneidung zitierter Seiten zwischen Läufen 78 %
Mittlere Textähnlichkeit (auf Wortebene) 64 %

Die letzten vier Zeilen betreffen die 16 Anfragen mit einer Übersicht in mindestens zwei Läufen. Fünf (darunter „best vpn” und „how do vaccines work”) kamen Wort für Wort identisch zurück. Andere bewegten sich stark: Bei „what causes inflation” ging die Quellenzahl 10, 10, 8, und zwischen den letzten beiden Läufen fielen sechs Seiten weg, während congress.gov und youtube.com hinzukamen. Die Präsenz ist über Minuten meist stabil; Quellen und Wortlaut sind es nicht. Alarmiere bei Erscheinen, Verschwinden und wenn deine eigene Domain hinzukommt oder wegfällt, nicht bei Textänderungen.

Wie tracke ich AI Overviews täglich mit Python?

Das ist das Skript, mit dem wir den Datensatz erhoben haben. Es speichert pro Anfrage und Lauf einen Snapshot in SQLite und druckt, was sich seit dem vorherigen geändert hat. Setz WATCH_DOMAIN, um informiert zu werden, wenn du eine Zitierung gewinnst oder verlierst.

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()

Der Report vergleicht die letzten zwei 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)

Auszug aus der echten Ausgabe beim Vergleich unseres zweiten und dritten Laufs mit 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 ist wichtig: Mit dem Standard wirken lange Texte weit weniger ähnlich, als sie sind.

Was kostet das Tracking von AI Overviews?

Ein /serp-Aufruf kostet 5 Credits und die Übersicht kommt in derselben Antwort, das Tracking kostet also nichts extra. Ein Durchgang über 100 Anfragen sind 500 Credits, genau das Free-Kontingent, und etwa 0,25 $ beim Starter-Paket (10 $ für 20.000 Credits). Dieselben 100 Anfragen täglich über 30 Tage sind 15.000 Credits, 7,50 $ zu Starter-Preisen; siehe Preise und die SERP-API-Seite. Zwei zusätzliche Aufrufe am 19. Oktober 2026 lieferten HTTP 200 mit X-FastAF-Credits-Used: 5, in 3,9 und 14,4 Sekunden, nimm also einen großzügigen Timeout, wie es das Skript tut.

Was zeigen diese Daten nicht?

Ein Land (us), eine Sprache, Desktop, kein location, ein Nachmittag und 100 Anfragen, die wir selbst geschrieben haben, keine Stichprobe echten Traffics. Die Überschneidungen bei lokalen und Entwickleranfragen beruhen auf je 2 Übersichten. Google entscheidet pro Nutzer und Moment, die Antwort der API kann sich also von deinem Browser unterscheiden, und der Volatilitätslauf umfasst sechs Minuten. Wiederhole das mit deinen eigenen Anfragen, bevor du eine Strategie auf diese Zahlen baust.

Die Kurzfassung

Prüf ai_overview in der /serp-Antwort, speicher references täglich in SQLite und alarmiere bei Erscheinen, Verschwinden und wenn deine Domain in die Zitierungen kommt oder herausfällt. In unseren 100 Anfragen bekamen „how”- und „best”-Anfragen fast immer eine Übersicht, lokale und Entwickleranfragen selten, Quellen wurden weit stärker durchgemischt als die Präsenz, und YouTube wurde in zwei Dritteln der Übersichten zitiert. Hol dir 500 kostenlose Credits und lass deine eigene Anfrageliste durch das Skript laufen; die Docs listen jeden /serp-Parameter auf.