Cómo obtener la respuesta de Google AI Mode y sus fuentes por API

La respuesta compuesta y las páginas que cita, en JSON, y por qué el texto es una salida de Google Search AI Mode que puede cambiar entre dos llamadas idénticas. Probado en agosto de 2026.

Quieres la respuesta que da el AI Mode de Google para una consulta, junto con las fuentes a las que apunta, por API en vez de por navegador: para anclar tu propio agente en lo que Google le dice ahora mismo a la gente sobre un tema, o para comprobar ese texto antes de que aparezca en un ticket de soporte o en la captura de pantalla de un competidor.

Qué es esto en realidad

/v1/ai devuelve la respuesta del AI Mode de Google, el texto compuesto y las fuentes detrás de ella para una consulta. No es un resumen de FastAF sobre nada. De ahí se siguen dos cosas. Primera, el texto pertenece a Google: si se lo enseñas a un usuario, preséntalo como la respuesta de Google, no como un texto que generaste tú. Segunda, puede cambiar entre dos llamadas con la consulta idéntica, porque así se comporta la respuesta subyacente; pregunta lo mismo con una hora de diferencia y puedes obtener una redacción distinta o un conjunto de fuentes distinto, sin que eso sea un fallo de nuestra parte.

La solicitud

Una llamada recibe la propia consulta más los parámetros opcionales country, language y location si necesitas la respuesta tal como aparecería para un mercado concreto.

La respuesta y sus citas, del mismo JSON

El texto de la respuesta no es un solo campo, es un listado de text_blocks, cada uno un párrafo, un encabezado o una lista con viñetas, y los enlaces citados en línea están dentro de esos bloques, junto al texto que respaldan:

import requests

API_KEY = "faf_live_..."  # tu clave de 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')

Ejecutamos esto para “what is a web scraping api” mientras escribíamos el post (agosto de 2026). La respuesta volvió como siete bloques (tres encabezados, dos párrafos, dos listas con viñetas) con 12 enlaces incrustados directamente en el texto de los bloques, y un listado references aparte con 11 fuentes, una mezcla de vídeos de YouTube y páginas escritas, en las que se apoya la respuesta en conjunto.

Dos listados de enlaces, y no son iguales

Los enlaces dentro de text_blocks son citas en línea ligadas a una frase o viñeta concreta, cada una un par {anchor, link}. El anchor a veces es el nombre de lo que se cita, como un nombre de producto mencionado a mitad de frase, y a veces una cadena vacía cuando el bloque enlaza sin nombrar nada en el texto del ancla. El listado references de nivel superior es más amplio: todas las fuentes detrás de la respuesta, cada una con title, link, source (de dónde viene) y un index, tenga o no esa fuente concreta una mención en línea en el texto. En nuestra muestra, algunos enlaces de references eran rutas relativas y otros URLs completas, directas a un vídeo de YouTube por ejemplo, así que comprueba la forma de link antes de asumir una cosa u otra. Si solo quieres el texto de la respuesta sin recorrer text_blocks tú mismo, la respuesta también incluye una cadena markdown prerrenderizada con toda la respuesta aplanada, aunque si lees de ahí pierdes la estructura a nivel de bloque y los enlaces de cita por separado. El bucle de arriba solo distingue entre paragraph, heading y list; cualquier tipo de bloque que no reconoce se salta en silencio en vez de lanzar un error, lo cual es intencionado, pero conviene saberlo si alguna vez la respuesta de una consulta te parece más corta de lo esperado.

Junto a text_blocks, la respuesta puede traer shopping_results, inline_images, local_results y web_results. Los cuatro volvieron como listados vacíos para esta consulta, lo cual es normal: AI Mode solo los rellena cuando la pregunta pide un carrusel de productos, un mapa o una tira de imágenes. Comprueba la longitud de cada uno antes de construir interfaz alrededor, en vez de asumir que un campo está poblado solo porque aparece en el JSON.

Cuánto cuesta

/v1/ai cuesta 10 créditos por llamada, lo más caro de los endpoints de búsqueda, en línea con devolver una respuesta compuesta en vez de un listado de resultados. Los 500 créditos del plan gratuito cubren 50 llamadas. En el pack Scale ($99 por 300.000 créditos) son 30.000 llamadas, $3,30 por cada 1.000.

En resumen

Lee text_blocks para la respuesta y sus citas en línea, y references para el listado completo de fuentes, y no caches el texto como si fuera fijo: es la respuesta en vivo de Google, y puede leerse distinto si repites la misma consulta. Consigue 500 créditos gratis, sin tarjeta y mira qué dice sobre un tema que ya sigues.