Comparer les prix d'un produit entre marchands avec la Google Shopping API

Analysez vous-même la chaîne de prix, jetez les parties de la réponse dont vous n'avez pas besoin, et ciblez vos requêtes assez précisément pour obtenir des offres comparables. Testé en août 2026.

Vous voulez le prix d’un produit chez tous les marchands qui le vendent, pour une page de comparaison ou une tâche de repricing qui revérifie une liste de SKU plusieurs fois par jour. Ouvrir un onglet de navigateur par concurrent ne tient pas la route au-delà d’une poignée de produits, et c’est exactement le genre de recherche répétitive qu’un script devrait faire à votre place.

Ce que renvoie /v1/shopping

Envoyez une query à /v1/shopping et vous récupérez shopping_results, une liste où chaque entrée a un title, une source (le nom du marchand), une chaîne price d’affichage du type "$26.99", un nombre extracted_price, un product_id, et plusieurs champs que vous n’utiliserez pas : thumbnail, original_thumbnail, page_token, immersive_url. Ça coûte 10 crédits par appel.

Une requête large récupère tout ce qui partage un mot-clé

La précision de votre requête détermine l’utilité des résultats. Nous avons appelé l’endpoint avec la requête à deux mots « web scraping api » et obtenu 40 résultats. Seuls deux ou trois étaient des produits logiciels ou data ; la plupart des autres étaient des outils et fournitures dont le titre ou la marque contenait par hasard les mêmes mots, y compris une gamme d’outils d’apiculture appelée « APIs Tactical ». Google Shopping fait correspondre le texte de la requête, pas votre intention, donc un terme de catégorie trop large ramène tout ce qui correspond aux mots, pas tout ce qui est pertinent pour la catégorie que vous aviez en tête.

Pour une page de comparaison ou une tâche de repricing, interrogez le nom exact du produit ou son numéro de modèle, comme vous le taperiez dans une recherche shopping en attendant un résultat précis. Vérifiez ensuite que le titre de chaque ligne ressemble bien à votre produit avant de traiter son prix comme une offre concurrente, parce que rien dans la réponse ne garantit que chaque ligne est pertinente.

Analysez vous-même la chaîne de prix

extracted_price a l’air d’être le champ sûr, un simple nombre plutôt qu’une chaîne avec un symbole monétaire collé dessus. Dans notre échantillon, il était faux une fois sur 40 : une annonce affichée "$1,400.00" est revenue avec extracted_price à 1.4, un facteur mille d’écart, presque certainement la virgule mal interprétée. Une ligne fausse sur quarante suffit à fausser une décision de repricing si rien ne l’attrape. Analysez vous-même la chaîne affichée avec une regex, et traitez extracted_price comme un indice, tout au plus.

import re
import requests

API_KEY = "faf_live_..."  # votre clé FastAF

def price_to_float(display):
    digits = re.sub(r"[^0-9.]", "", display or "")
    return float(digits) if digits else None

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

offers = [
    {
        "merchant": item["source"],
        "price": price_to_float(item["price"]),
        "title": item["title"],
    }
    for item in resp.json()["shopping_results"]
]

offers.sort(key=lambda o: (o["price"] is None, o["price"]))
for o in offers[:5]:
    print(f'{o["price"]:>8.2f}  {o["merchant"]:<24}  {o["title"]}')

Sur notre échantillon, les cinq offres les moins chères étaient une lingette antiseptique et quatre articles d’apiculture, tous à moins de 8 $, aucun n’étant un produit de web scraping. Ce n’est pas un bug de parsing, c’est ce qu’une requête à deux mots renvoie réellement : la preuve qu’une requête doit être précise avant que cette liste ait un sens pour une page de comparaison.

Jetez presque tout

La réponse que nous avons testée pesait 530 728 octets pour 40 résultats. Champ par champ, thumbnail et original_thumbnail à eux seuls représentent environ 80 % de ces octets : des images encodées en base64 dont une tâche de repricing n’a aucune utilité. page_token et immersive_url sont des références internes à Google, utiles seulement pour reconstruire la page Google Shopping elle-même. Rien de tout ça n’a sa place dans une ligne de base de données qui doit juste répondre à combien coûte un produit en ce moment.

La list comprehension ci-dessus fait le tri toute seule : elle garde trois champs par offre et laisse le reste de chaque entrée shopping_results partir au garbage collector. Sur une liste de SKU vérifiée plusieurs fois par jour, la différence entre ça et stocker chaque réponse telle quelle s’accumule vite.

Ce que ça coûte

Un appel coûte 10 crédits, donc vérifier 100 produits une fois par jour fait 1 000 crédits, environ 30 000 par mois : les 75 000 crédits du pack Growth à 29 $ en couvrent deux mois et demi. Les requêtes échouées ne sont pas facturées.

Commencez avec l’offre gratuite, 500 crédits et sans carte, bonne pour 50 appels : de quoi voir à quoi ressemble réellement la couverture marchande pour les produits qui vous intéressent avant de construire une tâche de repricing autour de ça.