Monitoriza precios de Walmart para un conjunto de productos con Python

Construye una URL de búsqueda de Walmart, recorre los grupos e items anidados de la respuesta, y combínalo con el endpoint de Amazon para comparar un precio entre ambos. Probado en agosto de 2026.

El repricing y la monitorización de competencia empiezan por la misma pregunta: a qué precio se está vendiendo este producto en Walmart ahora mismo. Así es como sacar eso como campos estructurados con Python, cómo es la respuesta de verdad una vez que pasas del primer nivel, y el truco para ahorrar créditos que conviene conocer si también sigues el mismo producto en Amazon.

El endpoint quiere una URL, no una cadena de consulta

/v1/walmart no acepta un parámetro query. Acepta url, y esa url tiene que ser una URL de búsqueda real de Walmart, del tipo que escribirías en la barra de direcciones. La construyes tú mismo:

from urllib.parse import urlencode

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

Ese es todo el truco: la propia página de búsqueda de Walmart acepta un parámetro q, así que cualquier nombre de producto, marca o UPC que normalmente escribirías en el buscador funciona aquí también. Pasa la URL final como url y FastAF la obtiene y la parsea. Como es una URL real y corriente en vez de un formato de consulta inventado, cualquier orden o filtro que puedas fijar a mano en la propia página de búsqueda de Walmart se traslada igual, porque la URL es lo que realmente se va a buscar.

La versión que funciona

import requests

API_KEY = "faf_live_..."  # tu clave de 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]}')

Eso cuesta 5 créditos e imprime una fila por producto: precio actual, vendedor, el usItemId que usas para seguir ese listado exacto, y el título.

Primero los grupos, los productos dentro de los grupos

search_results no es un listado plano de productos. Es un listado de grupos, cada uno con su propio title, description, totalItemCount, y un listado item, y los productos viven dentro de item. Al ejecutar la consulta de arriba, la respuesta volvió como dos grupos: un grupo “Results for …” con cero items, y un grupo “Other options to consider” que traía 40 de sus 54 items reportados. Un código que solo lea el primer grupo no imprimiría nada y parecería roto. Recorre todos los grupos, como hace el ejemplo de arriba, y obtienes los 40.

Los precios llegan como cadenas para mostrar, no como números: "$19.59" normalmente, "Now $18.61" cuando before_price guarda el valor previo al descuento. Un pequeño helper se encarga de ambos casos:

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

Guarda usItemId como la clave estable. current_price, seller_name, y availability_status son los tres campos que realmente cambian entre comprobaciones; todo lo demás en un listado (título, marca, canonicalUrl) está ahí para mostrar y rara vez merece la pena diferenciarlo.

Dos campos que conviene conocer antes de fiarte de ellos: rating y reviews vuelven como null en la mayoría de resultados de búsqueda en la práctica, así que monta tu monitorización alrededor del precio y el stock, no de los recuentos de reseñas, a menos que hayas confirmado que un listado concreto los trae. seller_name también merece que lo compruebes: una búsqueda en Walmart mezcla listados vendidos directamente por Walmart.com con otros vendidos por comercios del marketplace, y la muestra de arriba trajo ambos tipos más un puñado de libreros externos, cada entrada con su propio seller_name y current_price. Si tu regla de repricing es concretamente igualar el precio propio de Walmart y no el de cualquier revendedor que aparezca en la búsqueda, filtra por seller_name antes de comparar nada.

Sigue el precio en el tiempo, y luego compáralo con Amazon

Un job de repricing no es más que esta llamada con un horario: guarda clean_price(item["current_price"]) por usItemId, compáralo con el último valor guardado, y avisa al superar el umbral que te importe. Tres comprobaciones al día por SKU son 15 créditos al día, unos 450 créditos al mes por producto seguido.

Si vendes el mismo artículo en más de un sitio, el endpoint de Amazon (1 crédito, frente a 5 aquí) responde la otra mitad de la pregunta:

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 dan el precio del mismo producto en ambos marketplaces en una sola pasada, que normalmente es justo lo que necesita una regla de repricing: no solo “se ha movido nuestro precio” sino “seguimos siendo competitivos frente al otro canal”. Ejecuta el par con el mismo horario y guarda ambos precios uno junto al otro, para que una diferencia entre marketplaces aparezca como una fila en tus propios datos en vez de algo que notas por casualidad semanas después.

Cuánto cuesta esto

Volumen Créditos (30 días) Pack que lo cubre Coste
300 SKUs, comprobados una vez al día 45.000 Growth, $29 ~$17,40 del pack
1.000 SKUs, comprobados dos veces al día 300.000 Scale, $99 el pack entero
5.000 SKUs, barrido puntual 25.000 Growth, $29 ~$9,67 del pack

Las solicitudes fallidas nunca se cobran, los créditos se reservan al iniciar una solicitud y se devuelven si no llega nada. Empieza con el plan gratuito: 500 créditos, sin tarjeta, suficiente para apuntar esto a tu propio catálogo y ver cómo es la respuesta antes de comprometerte con un horario.