Récupérer la réponse du mode IA de Google et ses sources via une API

La réponse composée et les pages qu'elle cite, en JSON, et pourquoi ce texte est une sortie du mode IA de Google Search qui peut changer entre deux appels identiques. Testé en août 2026.

Vous voulez la réponse que le mode IA de Google donne pour une requête, avec les sources vers lesquelles elle pointe, via une API plutôt qu’un navigateur : ancrer votre propre agent dans ce que Google raconte actuellement aux gens sur un sujet, ou vérifier ce texte avant qu’il n’atterrisse dans un ticket support ou une capture d’écran d’un concurrent.

Ce que c’est vraiment

/v1/ai renvoie la réponse du mode IA de Google, le texte composé et les sources derrière, pour une requête donnée. Ça n’a rien d’un résumé fait par FastAF. Deux conséquences en découlent. D’abord, le texte appartient à Google : si vous le montrez à un utilisateur, présentez-le comme la réponse de Google, pas comme un texte que vous avez généré. Ensuite, il peut changer entre deux appels avec une requête identique, parce que c’est comme ça que la réponse sous-jacente se comporte ; posez la même question à une heure d’intervalle et vous pouvez obtenir une formulation différente ou un jeu de sources différent, sans que rien ne cloche de notre côté.

La requête

Un appel prend la requête elle-même, plus des paramètres optionnels country, language et location si vous avez besoin de la réponse telle qu’elle apparaîtrait pour un marché particulier.

La réponse et ses citations, depuis le même JSON

Le texte de la réponse n’est pas un champ unique, c’est une liste de text_blocks, chacun étant un paragraphe, un titre, ou une liste à puces, et les liens cités en ligne se trouvent à l’intérieur de ces blocs, juste à côté du texte qu’ils appuient :

import requests

API_KEY = "faf_live_..."  # votre clé 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')

Nous avons testé ça pour « what is a web scraping api » en écrivant l’article (août 2026). La réponse est revenue sous forme de sept blocs (trois titres, deux paragraphes, deux listes à puces) avec 12 liens intégrés directement dans le texte des blocs, et une liste references séparée de 11 sources, un mélange de vidéos YouTube et de pages écrites, sur lesquelles s’appuie la réponse dans son ensemble.

Deux listes de liens, et elles ne sont pas identiques

Les liens à l’intérieur de text_blocks sont des citations en ligne rattachées à une phrase ou une puce précise, chacune une paire {anchor, link}. L’anchor est parfois le nom de la chose citée, comme un nom de produit mentionné en plein milieu d’une phrase, et parfois une chaîne vide quand le bloc pointe vers un lien sans rien nommer dans le texte d’ancrage. La liste references de premier niveau est plus large : toutes les sources derrière la réponse, chacune avec title, link, source (sa provenance) et un index, que cette source précise ait eu ou non une mention en ligne dans le texte. Dans notre échantillon, certains liens references étaient des chemins relatifs et d’autres des URL complètes, tout droit vers une vidéo YouTube par exemple, donc vérifiez la forme du link avant de présumer de l’un ou l’autre. Si vous voulez juste le texte de la réponse sans parcourir text_blocks vous-même, la réponse inclut aussi une chaîne markdown pré-rendue avec toute la réponse aplatie, même si vous perdez la structure par bloc et les liens de citation séparés en lisant celle-là à la place. La boucle ci-dessus ne branche que sur paragraph, heading et list ; tout type de bloc qu’elle ne reconnaît pas est silencieusement ignoré plutôt que de lever une erreur, ce qui est voulu, mais bon à savoir si la réponse d’une requête semble un jour plus courte que prévu.

En plus de text_blocks, la réponse peut porter shopping_results, inline_images, local_results et web_results. Les quatre sont revenus en listes vides pour cette requête, ce qui est normal : le mode IA ne les remplit que quand la question appelle un carrousel de produits, une carte, ou une bande d’images. Vérifiez la longueur de chacun avant de construire une interface autour, plutôt que de supposer qu’un champ est rempli juste parce qu’il est présent dans le JSON.

Ce que ça coûte

/v1/ai coûte 10 crédits par appel, le plus élevé des endpoints de recherche, en cohérence avec le fait de renvoyer une réponse composée plutôt qu’une liste de résultats. Les 500 crédits de l’offre gratuite couvrent 50 appels. Sur le pack Scale (99 $ pour 300 000 crédits), ça fait 30 000 appels, 3,30 $ pour 1 000.

En bref

Lisez text_blocks pour la réponse et ses citations en ligne, et references pour la liste complète des sources, et ne mettez pas le texte en cache comme s’il était figé : c’est la réponse en direct de Google, et elle peut se lire différemment en relançant la même requête. Récupérez 500 crédits gratuits, sans carte et voyez ce que ça dit sur un sujet que vous suivez déjà.