Buscame el código, botija.
API HTTP que recibe un código EAN y devuelve los datos del producto consultando supermercados de Uruguay y Argentina.
No existe API pública oficial de productos en estos mercados. Cada estrategia replica la llamada que el frontend de cada supermercado hace a su backend (VTEX en todos los casos hasta hoy).
cp .env.example .env # editar y poner un API_TOKEN seguro
docker compose up -dcurl -H "Authorization: Bearer $API_TOKEN" \
http://localhost:8198/product/8445291738775{
"ean": "8445291738775",
"name": "Café Soluble Nescafe Gold Signature 95 G",
"brand": "Nescafé",
"category": "Comestibles/Almacen/Café",
"store": "El Dorado",
"description": "Cafe Nescafe Gold Frasco 95gr",
"image_base64": "UklGRpaPAABXRUJQVlA4..."
}category, store, description vienen del primer supermercado que matcheó — no se completan desde estrategias posteriores. Pueden venir vacíos si el supermercado no los expone (ej: Tata no tiene category ni description).
image_base64 es la imagen re-encodeada como WebP. Si la descarga falla, viene null. Para usarla:
<img src="data:image/webp;base64,${response.image_base64}" />Códigos: 200 encontrado · 401 token inválido · 404 no encontrado.
Documentación interactiva en /docs.
| Variable | Default | Descripción |
|---|---|---|
API_TOKEN |
— | Token Bearer requerido. Obligatorio. |
STRATEGIES |
— | Estrategias activas en orden de consulta, separadas por coma. |
STRATEGY_TIMEOUT |
5 |
Segundos máximos por estrategia. Si se excede, se pasa a la siguiente. |
name, brand e image_base64 se completan a través de estrategias (si la primera no tiene marca, la siguiente puede aportarla). category, store y description solo vienen del primer match.
| Estrategia | Supermercado | País |
|---|---|---|
tata |
Tata | UY |
eldorado |
El Dorado | UY |
dia |
Dia | AR |
jumbo |
Jumbo | AR |
carrefour |
Carrefour | AR |
masonline |
Más Online | AR |
vea |
VEA | AR |
discoar |
Disco Argentina | AR |
Setup inicial (una sola vez):
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
cp .env.example .env # editar y poner un API_TOKENComandos:
.venv/bin/uvicorn api:app --reload --port 8198 # server con autoreload
.venv/bin/python product_lookup.py # CLI interactivo
.venv/bin/python product_lookup.py test # test de cada estrategia-
Identificar el endpoint. Si la URL de búsqueda tiene el patrón
/<ean>?_q=<ean>&map=ft, es VTEX IO clásico → copiarstrategies/eldorado.pyy cambiar dominio y locale. Para otros stacks, capturar el tráfico con DevTools → Network → Export HAR y buscar qué respuesta JSON contiene el producto. Verstrategies/tata.pycomo ejemplo de FastStore. -
Implementar
strategies/nuevo.pyextendiendoProductLookupStrategy. Setearstoreen elProductInforetornado. Sobreescribirtest_eansi el supermercado no tiene el EAN de prueba por defecto. -
Registrar en
_REGISTRYdentro deproduct_lookup.pyy agregar alSTRATEGIESdel.env. -
Verificar con
python product_lookup.py test.
api.py # FastAPI app + auth bearer
product_lookup.py # ProductInfo, ProductLookup, _REGISTRY, CLI
image.py # Descarga + conversión a WebP base64
strategies/ # Una clase por supermercado
Dockerfile
docker-compose.yml
Este proyecto es de uso personal y educativo. No está afiliado, asociado, autorizado ni respaldado por ninguno de los supermercados mencionados. Todas las marcas y nombres comerciales pertenecen a sus respectivos dueños.
El script consulta endpoints públicos que los propios sitios exponen a sus frontends, sin evadir autenticación ni protecciones. Cada quien es responsable del uso que le da.
El software se provee "tal cual". Si un supermercado cambia su API, la estrategia correspondiente puede dejar de funcionar.