Monitore preços da Walmart para um conjunto de produtos com Python

Monte uma URL de busca da Walmart, percorra os grupos e itens aninhados na resposta, e combine com o endpoint da Amazon para comparar um preço entre as duas. Testado em agosto de 2026.

Repricing e monitoramento competitivo começam com a mesma pergunta: por quanto esse produto está sendo vendido na Walmart agora. Isto é como puxar isso como campos estruturados com Python, como a resposta realmente é depois que você passa do primeiro nível, e a única jogada de economia de créditos que vale a pena saber se você também acompanha o mesmo produto na Amazon.

O endpoint quer uma URL, não uma query string

O /v1/walmart não recebe um parâmetro query. Ele recebe url, e essa url tem que ser uma URL de busca de verdade da Walmart, do tipo que você digitaria na barra de endereço. Você mesmo constrói ela:

from urllib.parse import urlencode

def walmart_search_url(query):
    return "https://www.walmart.com/search?" + urlencode({"q": query})

Esse é todo o truque: a própria página de busca da Walmart recebe um parâmetro q, então qualquer nome de produto, marca, ou UPC que você normalmente digitaria na caixa de busca funciona aqui também. Passe a URL pronta como url e a FastAF busca e faz o parsing dela. Como é uma URL real, comum, e não um formato de busca inventado, qualquer ordenação ou filtro que você consiga configurar à mão na própria página de busca da Walmart passa junto do mesmo jeito, já que a URL é o que realmente é buscado.

A versão que funciona

import requests

API_KEY = "faf_live_..."  # sua chave FastAF

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

for group in resp.json()["search_results"]:
    for item in group["item"]:
        print(f'{item["current_price"]:>10}  {item["seller_name"]:<20}  {item["usItemId"]}  {item["title"][:50]}')

Isso custa 5 créditos e imprime uma linha por produto: preço atual, vendedor, o usItemId que você usa para acompanhar exatamente aquele anúncio, e o título.

Grupos primeiro, produtos dentro dos grupos

search_results não é uma lista plana de produtos. É uma lista de grupos, cada um com seu próprio title, description, totalItemCount, e uma lista item, e os produtos vivem dentro de item. Rodando a busca acima, a resposta veio com dois grupos: um grupo “Results for …” com zero itens, e um grupo “Other options to consider” trazendo 40 dos 54 itens que ele reportava. Um código que só lê o primeiro grupo não imprimiria nada e pareceria quebrado. Percorra todo grupo, como o exemplo acima faz, e você pega os 40.

Os preços chegam como strings de exibição, não números: "$19.59" normalmente, "Now $18.61" quando before_price guarda o valor antes do desconto. Um pequeno helper lida com os dois:

def clean_price(raw):
    if not raw:
        return None
    return float(raw.replace("Now $", "").replace("$", "").replace(",", ""))

Guarde usItemId como a chave estável. current_price, seller_name, e availability_status são os três campos que realmente mudam entre checagens; todo o resto de um anúncio (título, marca, canonicalUrl) está lá para exibição e raramente vale a pena comparar.

Dois campos que vale a pena conhecer antes de confiar neles: rating e reviews voltam null na maioria dos resultados de busca na prática, então construa seu monitoramento em torno de preço e estoque, não contagem de avaliações, a menos que você tenha confirmado que um anúncio específico os traz. seller_name também vale a pena checar: uma busca na Walmart mistura anúncios vendidos diretamente pela Walmart.com com outros vendidos por vendedores do marketplace, e a amostra acima trouxe os dois tipos mais alguns livreiros terceirizados, cada item trazendo seu próprio seller_name e current_price. Se sua regra de repricing é especificamente sobre bater com o preço da própria Walmart e não de todo revendedor que aparece na busca, filtre por seller_name antes de comparar qualquer coisa.

Acompanhe ao longo do tempo, depois compare com a Amazon

Um job de repricing é só essa chamada num cronograma: salve clean_price(item["current_price"]) por usItemId, compare com o último valor salvo, e alerte a partir do limite que importa para você. Três checagens por dia por SKU dá 15 créditos por dia, ou cerca de 450 créditos por mês por produto acompanhado.

Se você vende o mesmo item em mais de um lugar, o endpoint da Amazon (1 crédito, contra 5 aqui) responde a outra metade da pergunta:

def amazon_price(query):
    resp = requests.get(
        "https://api.fastaf.co/v1/amazon",
        params={"query": query, "domain": "com"},
        headers={"Authorization": f"Bearer {API_KEY}"},
        timeout=60,
    )
    resp.raise_for_status()
    for item in resp.json()["results"]:
        if item["type"] == "search_product":
            return item["extracted_price"]

Seis créditos te dão o preço do mesmo produto nos dois marketplaces numa única passada, que normalmente é exatamente o que uma regra de repricing precisa: não só “nosso preço mudou” mas “ainda somos competitivos contra o outro canal”. Rode a dupla no mesmo cronograma e guarde os dois preços lado a lado, para que uma diferença entre marketplaces apareça como uma linha nos seus próprios dados em vez de algo que você percebe por acaso semanas depois.

Quanto isso custa

Volume Créditos (30 dias) Pacote que cobre Custo
300 SKUs, checados uma vez por dia 45.000 Growth, $29 ~$17,40 do pacote
1.000 SKUs, checados duas vezes por dia 300.000 Scale, $99 o pacote inteiro
5.000 SKUs, varredura única 25.000 Growth, $29 ~$9,67 do pacote

Requisições com falha nunca são cobradas, os créditos são reservados quando uma requisição começa e devolvidos se nada voltar. Comece no plano gratuito: 500 créditos, sem cartão, suficiente para apontar isso para o seu próprio catálogo e ver como é a resposta antes de comprometer um cronograma a isso.