Compare preços de produtos entre lojas com a API do Google Shopping

Faça o parsing da string de preço você mesmo, descarte as partes do payload que você não precisa, e use uma busca específica o bastante para conseguir ofertas comparáveis. Testado em agosto de 2026.

Você quer o preço de um produto em todo comerciante que o vende, para uma página de comparação ou um job de repricing que reconfere uma lista de SKUs algumas vezes por dia. Abrir uma aba do navegador por concorrente não escala além de alguns produtos, e é exatamente o tipo de consulta repetitiva que um script deveria fazer no seu lugar.

O que o /v1/shopping retorna

Mande uma query para o /v1/shopping e você recebe shopping_results, uma lista onde cada item tem title, source (o nome do comerciante), uma string de exibição price como "$26.99", um número extracted_price, um product_id, e vários campos que você não vai usar: thumbnail, original_thumbnail, page_token, immersive_url. Custa 10 créditos por chamada.

Uma busca genérica te dá qualquer coisa que compartilhe uma palavra-chave

Quão específica é a sua busca decide quão úteis são os resultados. Chamamos o endpoint com a busca de duas palavras “web scraping api” e recebemos 40 resultados. Só um par deles eram produtos de software ou dados; a maioria do resto eram ferramentas e suprimentos cujo título ou marca continha as mesmas palavras por coincidência, incluindo uma linha de ferramentas de apicultura chamada “APIs Tactical”. O Google Shopping bate o texto da busca, não a sua intenção, então um termo de categoria genérico traz qualquer coisa que bata com as palavras, não tudo que é relevante para a categoria que você tinha em mente.

Para uma página de comparação ou um job de repricing, busque pelo nome exato do produto ou número de modelo, do jeito que você digitaria numa busca de shopping esperando um resultado específico. Depois confira se o título de cada linha realmente parece com o seu produto antes de tratar o preço dela como uma oferta concorrente, porque nada na resposta garante que toda linha é sobre o assunto certo.

Faça o parsing da string de preço você mesmo

extracted_price parece ser o campo seguro, um número puro em vez de uma string com símbolo de moeda junto. Na nossa amostra ele veio errado uma vez em 40: um anúncio exibido como "$1,400.00" voltou com extracted_price igual a 1.4, errado por um fator de mil, quase certamente por causa da vírgula sendo lida errado. Uma linha ruim em quarenta já é o suficiente para quebrar uma decisão de repricing se nada pegar isso. Faça o parsing da string de exibição você mesmo com uma regex, e trate extracted_price como uma dica, no máximo.

import re
import requests

API_KEY = "faf_live_..."  # sua chave 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"]}')

Na nossa amostra, as cinco ofertas mais baratas eram um lenço antisséptico e quatro peças de equipamento de apicultura, todas abaixo de $8, nenhuma delas um produto de web scraping. Isso não é um bug de parsing, é o que uma busca de duas palavras realmente retorna: prova de que a busca precisa ser específica antes que essa lista signifique alguma coisa para uma página de comparação.

Descarte quase tudo

A resposta de amostra que testamos tinha 530.728 bytes para 40 resultados. Campo por campo, só thumbnail e original_thumbnail respondem por cerca de 80% desses bytes: imagens em base64 que um job de repricing não usa para nada. page_token e immersive_url são referências internas do Google, úteis só para reconstruir a própria página do Google Shopping. Nada disso pertence a uma linha de banco de dados que só precisa responder quanto um produto custa agora.

A list comprehension acima já faz esse descarte sozinha: ela mantém três campos por oferta e deixa o resto de cada item de shopping_results ser coletado pelo garbage collector. Numa lista de SKUs verificada várias vezes por dia, a diferença entre isso e guardar cada resposta na íntegra soma rápido.

Quanto custa

Uma chamada custa 10 créditos, então checar 100 produtos uma vez por dia dá 1.000 créditos, cerca de 30.000 por mês: os 75.000 créditos do pacote Growth de $29 cobrem dois meses e meio disso. Requisições com falha não são cobradas.

Comece com o plano gratuito, 500 créditos e sem cartão, o suficiente para 50 chamadas: dá para ver como é de fato a cobertura de comerciantes para os produtos específicos que importam para você antes de construir um job de repricing em torno disso.