Compara precios de productos entre comercios con la API de Google Shopping

Parsea tú mismo la cadena del precio, descarta las partes del payload que no necesitas, y haz consultas lo bastante concretas para obtener ofertas comparables. Probado en agosto de 2026.

Quieres el precio de un producto en todos los comercios que lo venden, para una página de comparación o un job de repricing que revisa una lista de SKUs varias veces al día. Abrir una pestaña del navegador por competidor no escala más allá de un puñado de productos, y es exactamente el tipo de búsqueda repetitiva que debería hacer un script en su lugar.

Qué devuelve /v1/shopping

Envía una query a /v1/shopping y recibes shopping_results, una lista donde cada entrada tiene title, source (el nombre del comercio), una cadena price para mostrar como "$26.99", un número extracted_price, un product_id, y varios campos que no vas a usar: thumbnail, original_thumbnail, page_token, immersive_url. Cuesta 10 créditos por llamada.

Una consulta amplia te trae cualquier cosa que comparta una palabra clave

Lo concreta que sea tu consulta determina lo útiles que son los resultados. Llamamos al endpoint con la consulta de dos palabras “web scraping api” y obtuvimos 40 resultados. Solo un par eran productos de software o datos; la mayoría del resto eran herramientas y suministros cuyo título o marca contenían por casualidad las mismas palabras, incluida una línea de herramientas de apicultura llamada “APIs Tactical”. Google Shopping busca coincidencias en el texto de la consulta, no en tu intención, así que un término de categoría amplio trae cualquier cosa que encaje con las palabras, no todo lo relevante para la categoría que tenías en mente.

Para una página de comparación o un job de repricing, consulta el nombre exacto del producto o el número de modelo, tal como lo escribirías en un buscador de compras esperando un resultado concreto. Después comprueba que el título de cada fila realmente se parece a tu producto antes de tratar su precio como una oferta competidora, porque nada en la respuesta garantiza que todas las filas vayan al tema.

Analiza tú mismo la cadena del precio

extracted_price parece el campo seguro, un número plano en vez de una cadena con un símbolo de moneda pegado. En nuestra muestra falló una vez de 40: un anuncio que mostraba "$1,400.00" venía con extracted_price puesto a 1.4, mil veces más bajo, casi seguro por leer mal la coma. Una fila mala de cuarenta basta para reventar una decisión de repricing si nada lo detecta. Analiza tú mismo la cadena que se muestra con una regex, y trata extracted_price como mucho como una pista.

import re
import requests

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

En nuestra muestra, las cinco ofertas más baratas fueron una toallita de alcohol y cuatro piezas de equipo de apicultura, todas por debajo de $8, ninguna un producto de web scraping. Eso no es un bug de parsing, es lo que realmente devuelve una consulta de dos palabras: la prueba de que la consulta tiene que ser específica antes de que esta lista signifique algo para una página de comparación.

Descarta casi todo

La respuesta de muestra contra la que probamos pesaba 530.728 bytes para 40 resultados. Campo por campo, thumbnail y original_thumbnail por sí solos suponen cerca del 80% de esos bytes: imágenes en base64 que un job de repricing no usa para nada. page_token y immersive_url son referencias internas de Google, útiles solo para reconstruir la propia página de resultados. Nada de eso pertenece a una fila de base de datos que solo necesita responder cuánto cuesta un producto ahora mismo.

La list comprehension de arriba hace el descarte sola: se queda con tres campos por oferta y deja que el resto de cada entrada de shopping_results acabe en el garbage collector. En una lista de SKUs comprobada varias veces al día, la diferencia entre eso y guardar cada respuesta tal cual se nota rápido.

Cuánto cuesta

Una llamada cuesta 10 créditos, así que comprobar 100 productos una vez al día son 1.000 créditos, unos 30.000 al mes: los 75.000 créditos del pack Growth de $29 cubren dos meses y medio. Las solicitudes fallidas no se cobran.

Empieza con el plan gratuito, 500 créditos sin tarjeta, para 50 llamadas: suficiente para ver qué cobertura de comercios hay de verdad para los productos concretos que te interesan antes de montar un job de repricing alrededor de esto.