LNData
Back to products LNData Product · Zé do Precinho

Retail prices collected every day, store by store — with history and over an API.

Zé do Precinho is LNData’s Brazilian retail price intelligence platform. It collects the public prices of supermarkets and pharmacies daily — store by store, not chain by chain —, normalizes everything into a single format, keeps the history and delivers the result through two doors: a paid REST API, for those integrating into their own BI or ERP, and a web application, for those who want to use it by hand.

Visit the site zedoprecinho.com.br
Role · Proprietary product · architecture, data engineering, full-stack and infrastructure
Status · Data platform · in production · API + web application
In short, for decision-makers
The problem

Retail prices are public, but fragmented, regional and ephemeral. Each chain publishes on its own site, with internal naming and internal codes. The same product from the same chain costs different amounts in each city — and this is measured: between Criciúma and Florianópolis, on the same day, up to 41.9% of prices diverge. And yesterday’s price no longer exists anywhere. Whoever needs this data builds their own scraper: fragile, expensive to maintain and silently broken whenever the site changes.

What LNData did

We built Zé do Precinho, an end-to-end data platform: an automatic daily collection engine, real regionalization by postal code, verifiable product identity by barcode, an analytical warehouse with the full history and a commercial REST API with billing coupled to consumption. Alongside it comes a complete web application — search, store-by-store comparison, history chart, shopping lists with cart optimization and price alerts with push notification.

The result

The data arrives normalized, historical and auditable — with no scraper to maintain. Today the system collects six chains from six distinct economic groups every morning, answers for 19 cities and tracks 66,599 products identified by barcode. From the first commit to production with real payment: 17 days.

Zé do Precinho
API + app
two doors over the same data
Daily
automatic collection, no intervention
Store by store
real regionalization by postal code
In production
zedoprecinho.com.br
66,599
products tracked by barcode
6 chains
from 6 distinct economic groups
19 cities
markets answered in Santa Catarina
17 days
from first commit to production with payment
The engineering behind it — for those who want the technical detail

Architecture

Three independent axes — the retail segment, the e-commerce platform and the retailer — support the entire collection layer. Each adapter emits the same canonical contract; the rest of the system never knows the origin. The practical consequence: adding a retailer that runs on an already supported platform costs one configuration entry and zero code.

Collection
  • Adapters per platform · VTEX and custom
  • YAML registry · retailer = config
  • Regionalization by postal code
  • Brazilian network egress · selective
Core
Normalization + identity
History in ClickHouse
Orchestration with Dagster
Quality checks per run
Delivery
  • REST API · credits per query
  • Web application
  • Lists and alerts · email and push

What the platform does

An end-to-end flow that turns scattered public catalogs into queryable data: collect → normalize → identify → historize → serve → bill.

Collection

Every day, with nobody pressing a button

Collection runs automatically every morning, one run per retailer, with isolation per unit: a category that fails is accounted for and the others carry on — one broken category does not cost the whole catalog.

Regionalization

Price per market, not per chain

The system distinguishes the collected market from the served market — the one where the retailer itself declares it delivers from a store already covered. It is not an approximation from a neighbouring city: it is the same seller and the same region, and the API response states which market each row answers for.

Identity

The same product is the same product

Comparison only groups offers by provably global codes — a barcode with a valid checksum, or a manufacturer code when it is strong enough. Without that, the comparator would show a price difference between different products.

History

The history is the product

Each collection inserts new rows and never updates old ones. Re-running a collection is safe by construction, and the complete time series stays available to query — it is what nobody else kept.

API

A documented, versioned REST API

Store comparison, current price, historical series and text search, with multi-value scope filters by state, city, retailer and store. The discovery vocabulary is exactly what the filters accept, with no translation in between.

Application

A complete SaaS over the same data

Search, store-by-store comparison with a history chart, shopping lists with cart optimization, price alerts with push notification, credit purchase and interactive API documentation behind login.

The engineering that makes the difference

What technically sets the project apart is not scraping sites — it is everything that exists around the data. Every relevant decision was made with measurement, not intuition.

A sweep that reaches the whole catalog

Platform catalog APIs have a pagination ceiling, and above it the rest of the catalog becomes unreachable. The solution is an adaptive descent through the category tree, with price-range slicing on large leaves — coverage rose from 86.6% to 98.7%, recovering 11,591 products.

Identity measured before being trusted

In a test over 10,158 barcodes shared across three chains, no platform "reference" field matched — it is the store’s internal code. And 42.2% of brand-and-model keys merged distinct products. Using them would produce wrong comparisons, which is worse than no comparison because it looks right.

Quality judged against its own history

Every run goes through automatic checks compared with the median of that retailer’s last seven days — because each source has its own normal, and a fixed threshold would always alert on one and never on the other. The verdict has three states: a collection that ends 30% smaller is neither success nor failure.

Beyond the data

Billing, operation and trust

A commercial API does not end at the endpoint: it has to bill with transactional consistency, defend itself against abuse and speak up on its own when the day’s data did not arrive.

Credits with transactional consistency

Credits live in batches with expiry dates and consumption debits the batch that expires first, crossing batches when needed — before that, a client with a distributed balance was told "no credits" on an operation the balance covered.

Rate limiting and cache

An atomic rate control protects both the source and the cost, and repeating the same query inside the cache window returns the result without debiting. Sustained throughput is the same for the API key and the site session, on purpose: a higher ceiling on the interface would be the back door.

Alerts decided by measurement

Across 82,582 pairs of consecutive observations, 86.3% of prices do not change — and when they fall, the median drop is 19.3%. The signal is rare and large, so the thresholds are fixed presets: a free-form percentage would give false precision. And the notice carries the reference date, because "down 30%" without saying since when is a claim without a size.

An operation that speaks up on its own

A daily email summary says, in three states, whether the day went well. It exists because three failures were indistinguishable: the collector ran and found zero, the run died before writing, or it never started — none leaves a trace in the data, precisely because the defect is the absence of data.

ClickHouseDagsterFastAPIRedis

Impact

Whoever needs shelf prices stops maintaining their own scraper: the data arrives normalized, with history and with verifiable product identity.

Regionalization is real and measured — 18% to 42% of prices diverge between cities of the same chain, a difference a chain-level comparator simply cannot see.

Billing is coupled to consumption with transactional consistency, in production with real payment via Pix, bank slip and card.

Source curation rejects candidates with numbers in hand — one pharmacy was refused for being the same company as another already collected, and another for bringing a single comparable product.

Platform stack

PythonFastAPIClickHousePostgreSQLRedisDagsterNext.jsDocker

Need retail prices as data?

If your company tracks shelf prices, builds price indices or feeds a product with retail data, Zé do Precinho delivers it over an API. Explore the platform or talk to LNData.