Googles AI-Mode-Antwort und ihre Quellen per API bekommen

Die zusammengesetzte Antwort und die Seiten, die sie zitiert, als JSON, und warum der Wortlaut Output von Google Search AI Mode ist, der sich zwischen zwei identischen Calls ändern kann. Getestet im August 2026.

Du willst die Antwort, die Googles AI Mode für eine Query gibt, zusammen mit den Quellen, auf die sie verweist, über eine API statt über einen Browser: um deinen eigenen Agenten in dem zu grounden, was Google Leuten gerade zu einem Thema erzählt, oder um diesen Wortlaut zu prüfen, bevor er in einem Support-Ticket oder im Screenshot eines Wettbewerbers auftaucht.

Was das eigentlich ist

/v1/ai liefert Googles AI-Mode-Antwort, den zusammengesetzten Text und die Quellen dahinter, für eine Query. Das ist nicht FastAFs Zusammenfassung von irgendetwas. Daraus folgen zwei Dinge. Erstens gehört der Wortlaut Google: Wenn du ihn einem Nutzer zeigst, präsentier ihn als Googles Antwort, nicht als Text, den du generiert hast. Zweitens kann er sich zwischen zwei Calls mit identischer Query ändern, weil sich die zugrunde liegende Antwort so verhält; stell dieselbe Frage eine Stunde später noch mal, und du bekommst vielleicht eine andere Formulierung oder andere Quellen, ohne dass bei uns etwas falsch läuft.

Der Request

Ein Call nimmt die Query selbst plus optionale country, language und location, wenn du die Antwort brauchst, wie sie für einen bestimmten Markt erscheinen würde.

Die Antwort und ihre Zitate aus demselben JSON

Der Antworttext ist kein einzelnes Feld, sondern eine Liste von text_blocks, jeder ein Absatz, eine Überschrift oder eine Aufzählungsliste, und die inline zitierten Links sitzen innerhalb dieser Blöcke direkt neben dem Text, den sie belegen:

import requests

API_KEY = "faf_live_..."  # dein FastAF-Key

resp = requests.get(
    "https://api.fastaf.co/v1/ai",
    params={"query": "what is a web scraping api"},
    headers={"Authorization": f"Bearer {API_KEY}"},
    timeout=60,
)
resp.raise_for_status()
data = resp.json()

answer_lines = []
citation_links = []

for block in data["text_blocks"]:
    if block["type"] == "paragraph":
        answer_lines.append(block["snippet"])
        citation_links += [l["link"] for l in block.get("links", [])]
    elif block["type"] == "heading":
        answer_lines.append(f'\n{block["text"]}')
    elif block["type"] == "list":
        for item in block["items"]:
            answer_lines.append(f'- {item["snippet"]}')
            citation_links += [l["link"] for l in item.get("links", [])]

answer = "\n".join(answer_lines)
sources = data["references"]

print(answer)
print(f'{len(sources)} sources cited, {len(citation_links)} inline citation links')

Wir haben das für “what is a web scraping api” beim Schreiben des Posts laufen lassen (August 2026). Die Antwort kam als sieben Blöcke zurück (drei Überschriften, zwei Absätze, zwei Aufzählungslisten) mit 12 Links, die direkt im Blocktext eingebettet waren, und einer separaten references-Liste von 11 Quellen, einer Mischung aus YouTube-Videos und geschriebenen Seiten, auf die sich die Antwort insgesamt stützt.

Zwei Linklisten, und sie sind nicht identisch

Die Links innerhalb von text_blocks sind Inline-Zitate, die an einen bestimmten Satz oder Bullet Point gebunden sind, jeweils ein {anchor, link}-Paar. Der anchor ist manchmal der Name der zitierten Sache, etwa ein Produktname, der mitten im Satz erwähnt wird, und manchmal ein leerer String, wenn der Block verlinkt, ohne im Anchor-Text etwas zu benennen. Die Top-Level-Liste references ist breiter gefasst: jede Quelle hinter der Antwort, jede mit title, link, source (woher sie stammt) und einem index, egal ob diese Quelle im Text eine Inline-Erwähnung bekommen hat oder nicht. In unserem Sample waren manche references-Links relative Pfade und andere komplette URLs, zum Beispiel direkt zu einem YouTube-Video, prüf also die Form von link, bevor du eins von beidem annimmst. Wenn du nur den Antworttext willst, ohne selbst durch text_blocks zu gehen, enthält die Antwort auch einen vorgerenderten markdown-String mit der gesamten Antwort flach zusammengefasst, wobei du dann aber die Struktur auf Blockebene und die separaten Zitat-Links verlierst, wenn du stattdessen daraus liest. Die Schleife oben unterscheidet nur nach paragraph, heading und list; jeder Blocktyp, den sie nicht erkennt, wird stillschweigend übersprungen statt einen Fehler zu werfen, was Absicht ist, aber gut zu wissen, falls die Antwort auf eine Query mal kürzer aussieht als erwartet.

Neben text_blocks kann die Antwort auch shopping_results, inline_images, local_results und web_results enthalten. Alle vier kamen für diese Query als leere Listen zurück, was normal ist: AI Mode füllt sie nur, wenn die Frage ein Produktkarussell, eine Karte oder einen Bilderstreifen verlangt. Prüf die Länge von jedem, bevor du UI drumherum baust, statt anzunehmen, dass ein Feld befüllt ist, nur weil es im JSON vorhanden ist.

Was es kostet

/v1/ai kostet 10 Credits pro Call, das Höchste unter den Such-Endpoints, passend dazu, dass er eine zusammengesetzte Antwort statt einer Ergebnisliste liefert. Die 500 Credits des Free Tiers decken 50 Calls ab. Mit dem Scale-Paket ($99 für 300.000 Credits) sind das 30.000 Calls, $3,30 pro 1.000.

Kurzversion

Lies text_blocks für die Antwort und ihre Inline-Zitate, und references für die vollständige Quellenliste, und cache den Wortlaut nicht so, als wäre er fix: Es ist Googles Live-Antwort, und sie kann bei einem erneuten Lauf derselben Query anders klingen. Hol dir 500 kostenlose Credits, keine Karte und schau, was sie zu einem Thema sagt, das du schon verfolgst.