Confrontare i prezzi di un prodotto tra i vari negozi con la Google Shopping API

Analizza tu stesso la stringa di prezzo, scarta le parti del payload che non ti servono, e usa query abbastanza specifiche da ottenere offerte davvero comparabili. Testato ad agosto 2026.

Vuoi il prezzo di un prodotto su ogni negozio che lo vende, per una pagina di confronto o un job di repricing che ricontrolla una lista di SKU un paio di volte al giorno. Aprire una scheda del browser per ogni concorrente non scala oltre una manciata di prodotti, ed è esattamente il tipo di lookup ripetitivo che dovrebbe fare uno script al posto tuo.

Cosa restituisce /v1/shopping

Manda una query a /v1/shopping e ricevi shopping_results, una lista in cui ogni voce ha un title, un source (il nome del negozio), una stringa price da mostrare tipo "$26.99", un numero extracted_price, un product_id, e diversi campi che non userai: thumbnail, original_thumbnail, page_token, immersive_url. Costa 10 crediti a chiamata.

Una query generica ti porta tutto ciò che condivide una parola chiave

Quanto è specifica la tua query decide quanto sono utili i risultati. Abbiamo chiamato l’endpoint con la query di due parole “web scraping api” e sono tornati 40 risultati. Solo un paio erano prodotti software o dati; la maggior parte del resto erano attrezzi e forniture il cui titolo o marchio conteneva per caso le stesse parole, inclusa una linea di attrezzi per apicoltura chiamata “APIs Tactical”. Google Shopping fa matching sul testo della query, non sulla tua intenzione, quindi un termine di categoria generico porta dentro tutto ciò che combacia con le parole, non tutto ciò che è rilevante per la categoria che avevi in mente.

Per una pagina di confronto o un job di repricing, usa come query il nome esatto del prodotto o il numero di modello, come lo digiteresti in una ricerca shopping aspettandoti un risultato specifico. Poi controlla che il titolo di ogni riga somigli davvero al tuo prodotto prima di trattare il suo prezzo come un’offerta concorrente, perché niente nella risposta garantisce che ogni riga sia in tema.

Analizza tu stesso la stringa di prezzo

extracted_price sembra il campo sicuro, un numero semplice invece di una stringa con un simbolo di valuta attaccato. Nel nostro campione era sbagliato una volta su 40: una scheda mostrata come "$1,400.00" è tornata con extracted_price impostato a 1.4, sbagliato di un fattore mille, quasi certamente per una virgola letta male. Una riga sbagliata su quaranta basta a rovinare una decisione di repricing se niente la intercetta. Analizza tu stesso la stringa mostrata con una regex, e tratta extracted_price come un suggerimento, non di più.

import re
import requests

API_KEY = "faf_live_..."  # la tua chiave 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"]}')

Nel nostro campione le cinque offerte più economiche erano una salvietta disinfettante e quattro pezzi di attrezzatura per apicoltura, tutte sotto gli $8, nessuna un prodotto di web scraping. Non è un bug di parsing, è quello che restituisce davvero una query di due parole: la prova che la query deve essere specifica prima che questa lista significhi qualcosa per una pagina di confronto.

Scarta quasi tutto

La risposta campione su cui abbiamo testato era 530.728 byte per 40 risultati. Campo per campo, thumbnail e original_thumbnail da soli valgono circa l’80% di quei byte: immagini codificate in base64 che a un job di repricing non servono a niente. page_token e immersive_url sono riferimenti interni di Google, utili solo per ricostruire la pagina di Google Shopping stessa. Niente di tutto questo appartiene a una riga di database che deve solo rispondere a quanto costa un prodotto adesso.

La list comprehension qui sopra fa da sola questo scarto: tiene tre campi per offerta e lascia che il resto di ogni voce di shopping_results venga raccolto dal garbage collector. Su una lista di SKU controllata più volte al giorno, la differenza tra questo e salvare ogni risposta parola per parola si accumula in fretta.

Quanto costa

Una chiamata costa 10 crediti, quindi controllare 100 prodotti una volta al giorno è 1.000 crediti, circa 30.000 al mese: i 75.000 crediti del pacchetto Growth da $29 ne coprono due mesi e mezzo. Le richieste fallite non vengono addebitate.

Inizia con il piano gratuito, 500 crediti senza carta, buono per 50 chiamate: abbastanza per vedere come appare davvero la copertura dei negozi per i prodotti specifici che ti interessano, prima di costruirci sopra un job di repricing.