Como conseguir a resposta do AI Mode do Google e suas fontes via API
A resposta composta e as páginas que ela cita, como JSON, e por que o texto é saída do Google Search AI Mode que pode mudar entre duas chamadas idênticas. Testado em agosto de 2026.

Você quer a resposta que o AI Mode do Google dá para uma busca, junto com as fontes para as quais ela aponta, via API em vez de navegador: fundamentar seu próprio agente no que o Google atualmente diz às pessoas sobre um tópico, ou conferir esse texto antes que ele apareça num ticket de suporte ou no print de tela de um concorrente.
O que isso realmente é
O /v1/ai retorna a resposta do AI Mode do Google, o texto composto e as fontes por trás dele para uma busca. Não é um resumo da FastAF sobre nada. Disso seguem duas coisas. Primeiro, o texto pertence ao Google: se você mostrar para um usuário, apresente como a resposta do Google, não como um texto que você gerou. Segundo, ele pode mudar entre duas chamadas com a busca idêntica, porque é assim que a resposta subjacente se comporta; faça a mesma pergunta com uma hora de diferença e você pode receber uma redação diferente ou um conjunto diferente de fontes, sem nada errado do nosso lado.
A requisição
Uma chamada recebe a própria busca mais os parâmetros opcionais country, language e location se você precisar da resposta como ela apareceria para um mercado específico.
A resposta e suas citações, do mesmo JSON
O texto da resposta não é um campo só, é uma lista de text_blocks, cada um um parágrafo, um título, ou uma lista com marcadores, e os links citados inline ficam dentro desses blocos, ao lado do texto que eles sustentam:
import requests
API_KEY = "faf_live_..." # sua chave 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')
Rodamos isso para “what is a web scraping api” enquanto escrevíamos o post (agosto de 2026). A resposta voltou como sete blocos (três títulos, dois parágrafos, duas listas com marcadores) com 12 links embutidos direto no texto dos blocos, e uma lista references separada com 11 fontes, uma mistura de vídeos do YouTube e páginas escritas, das quais a resposta se vale no total.
Duas listas de links, e elas não são idênticas
Os links dentro de text_blocks são citações inline amarradas a uma frase ou marcador específico, cada um um par {anchor, link}. O anchor às vezes é o nome da coisa sendo citada, tipo o nome de um produto mencionado no meio da frase, e às vezes uma string vazia quando o bloco linka para fora sem nomear nada no texto âncora. A lista references no nível superior é mais ampla: toda fonte por trás da resposta, cada uma com title, link, source (de onde ela vem) e um index, tenha essa fonte específica recebido uma menção inline no texto ou não. Na nossa amostra, alguns links de references eram caminhos relativos e outros eram URLs completas, direto para um vídeo do YouTube por exemplo, então confira o formato do link antes de assumir um ou outro. Se você só quer o texto da resposta sem percorrer text_blocks você mesmo, a resposta também inclui uma string markdown pré-renderizada com a resposta inteira achatada, embora você perca a estrutura em nível de bloco e os links de citação separados se ler a partir dali. O loop acima só ramifica em paragraph, heading e list; qualquer tipo de bloco que ele não reconhece é ignorado silenciosamente em vez de lançar erro, o que é proposital, mas vale saber caso a resposta de uma busca algum dia pareça mais curta do que você esperava.
Junto com text_blocks, a resposta pode trazer shopping_results, inline_images, local_results e web_results. Os quatro vieram como listas vazias para essa busca, o que é normal: o AI Mode só os preenche quando a pergunta pede um carrossel de produtos, um mapa, ou uma tira de imagens. Confira o tamanho de cada um antes de construir UI em torno dele, em vez de assumir que um campo está preenchido só porque ele está presente no JSON.
Quanto custa
O /v1/ai custa 10 créditos por chamada, o mais alto entre os endpoints de busca, condizente com retornar uma resposta composta em vez de uma lista de resultados. Os 500 créditos do plano gratuito cobrem 50 chamadas. No pacote Scale ($99 por 300.000 créditos) isso dá 30.000 chamadas, $3,30 por 1.000.
Resumindo
Leia text_blocks para a resposta e suas citações inline, e references para a lista completa de fontes, e não guarde o texto em cache como se fosse fixo: é a resposta ao vivo do Google, e ela pode vir diferente numa nova execução da mesma busca. Pegue 500 créditos grátis, sem cartão e veja o que ela diz sobre um tópico que você já acompanha.