Ottenere la risposta di AI Mode di Google e le sue fonti via API

La risposta composta e le pagine che cita, in JSON, e perché il testo è output di Google Search AI Mode che può cambiare tra due chiamate identiche. Testato ad agosto 2026.

Vuoi la risposta che AI Mode di Google dà per una query, insieme alle fonti a cui rimanda, via API invece che a browser: per ancorare il tuo agente a quello che Google dice oggi alle persone su un argomento, o per controllare quel testo prima che finisca in un ticket di supporto o nello screenshot di un concorrente.

Cos’è esattamente

/v1/ai restituisce la risposta di AI Mode di Google, il testo composto e le fonti dietro di esso per una query. Non è un riassunto fatto da FastAF. Da questo seguono due cose. Primo, il testo appartiene a Google: se lo mostri a un utente, presentalo come la risposta di Google, non come testo generato da te. Secondo, può cambiare tra due chiamate con la query identica, perché è così che si comporta la risposta sottostante; fai la stessa domanda a un’ora di distanza e potresti ricevere una formulazione diversa o un insieme diverso di fonti, senza che ci sia niente di rotto dal nostro lato.

La richiesta

Una chiamata prende la query stessa più country, language e location opzionali se ti serve la risposta come apparirebbe per un mercato specifico.

La risposta e le sue citazioni, dallo stesso JSON

Il testo della risposta non è un singolo campo, è una lista di text_blocks, ciascuno un paragrafo, un titolo, o un elenco puntato, e i link citati inline stanno dentro quei blocchi accanto al testo che supportano:

import requests

API_KEY = "faf_live_..."  # la tua chiave FastAF

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

Abbiamo eseguito questo per “what is a web scraping api” scrivendo il post (agosto 2026). La risposta è tornata come sette blocchi (tre titoli, due paragrafi, due elenchi puntati) con 12 link incorporati direttamente nel testo dei blocchi, e una lista references separata di 11 fonti, un mix di video YouTube e pagine scritte, su cui la risposta si basa nel complesso.

I link dentro text_blocks sono citazioni inline legate a una frase o un punto specifico, ciascuno una coppia {anchor, link}. L’anchor è a volte il nome della cosa citata, come il nome di un prodotto menzionato a metà frase, e a volte una stringa vuota quando il blocco rimanda a un link senza nominare niente nel testo di ancoraggio. La lista references di primo livello è più ampia: ogni fonte dietro la risposta, ciascuna con title, link, source (da dove viene) e un index, che quella fonte specifica abbia avuto o meno una menzione inline nel testo. Nel nostro campione, alcuni link di references erano percorsi relativi e altri erano URL completi, dritti a un video YouTube per esempio, quindi controlla la forma di link prima di darne per scontata una delle due. Se vuoi solo il testo della risposta senza scorrere tu stesso text_blocks, la risposta include anche una stringa markdown pre-renderizzata con l’intera risposta appiattita, anche se così perdi la struttura a blocchi e i link di citazione separati. Il ciclo sopra si ramifica solo su paragraph, heading e list; qualunque tipo di blocco che non riconosce viene saltato silenziosamente invece di sollevare un errore, il che è voluto, ma vale la pena saperlo se la risposta di una query sembra mai più corta di quanto ti aspettassi.

Insieme a text_blocks, la risposta può portare shopping_results, inline_images, local_results e web_results. Per questa query tutti e quattro sono tornati come liste vuote, il che è normale: AI Mode li riempie solo quando la domanda richiede un carosello prodotti, una mappa, o una striscia di immagini. Controlla la lunghezza di ciascuno prima di costruirci sopra una UI, invece di assumere che un campo sia popolato solo perché è presente nel JSON.

Quanto costa

/v1/ai costa 10 crediti a chiamata, il più alto tra gli endpoint di ricerca, coerente con il restituire una risposta composta invece di una lista di risultati. I 500 crediti del piano gratuito coprono 50 chiamate. Sul pacchetto Scale ($99 per 300.000 crediti) sono 30.000 chiamate, $3,30 per 1.000.

La versione breve

Leggi text_blocks per la risposta e le sue citazioni inline, e references per la lista completa delle fonti, e non mettere in cache il testo come se fosse fisso: è la risposta live di Google, e può leggersi diversamente rilanciando la stessa query. Prendi 500 crediti gratis, senza carta e guarda cosa dice su un argomento che già segui.