# Changelog of Netto Scraper \[Just 💰$2] — Danish Grocery Prices (`blackfalcondata/netto-scraper`) Actor

- **URL**: https://apify.com/blackfalcondata/netto-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/blackfalcondata/netto-scraper.md

## Changelog

### \[0.3.2] - 2026-06-08

#### Fixed

- **Safer empty/invalid input** — a basket with only invalid EANs (e.g. a typo)
  no longer falls through to scraping the whole catalogue; it exits cleanly with
  no results and no per-result charge. Inputs that don't target Netto are
  likewise a no-op rather than an accidental full scrape.
- **Clearer failures** — transient data-source errors now return a short, clear
  message instead of an internal one.
- Incremental Mode without a State Key now warns and runs a normal scrape.

### \[0.3.1] - 2026-06-08

#### Fixed

- **Full-catalog coverage** — a full-catalogue run now returns every product.
  Previously a small number of uncategorised products were skipped; the complete
  catalogue (~4,300 products) is now scraped.

#### Notes

- Pant/deposit is not included — Netto does not publish a structured deposit
  amount in its product data, so none is shown. The `price` field is the shelf
  price as published (deposit is added at the register).

### \[0.3.0] - 2026-06-08

#### Added

- **Incremental mode** — `incrementalMode` + `stateKey` compares against the
  previous run and emits only NEW / UPDATED / EXPIRED products (price/offer
  changes, new SKUs, delistings), each with `changeType`, `firstSeenAt` and
  `lastSeenAt`. EXPIRED detection is gated on complete coverage (basket or full
  uncapped catalog). `emitUnchanged` / `emitExpired` control the output set;
  `notifyOnlyChanges` limits alerts to lifecycle events. State writes are
  guarded by a per-`stateKey` lock.

### \[0.2.0] - 2026-06-08

#### Added

- **Basket monitoring** — track a specific shopping list by EAN via `productIds`
  (+ optional `quantities`). Each row carries `quantity`, `lineSubtotal`, the
  Netto+ `lineMemberTotal` and `lineSavings`; the run writes a `basket-summary`
  key-value record (products, units, subtotal, Netto+ saving).
- **Notifications** — push a digest of each run to Telegram, Discord, Slack,
  WhatsApp, or a generic webhook (n8n / Make / Zapier).
- Query aliases (`keyword`, `searchString`, `q`, …) and a friendlier
  actionable-input rule: clearing the search box scans the full catalog.

### \[0.1.0] - 2026-06-08

#### Added

- Initial release — Netto (Salling Group) Danish grocery product & price scraper.
- Full product catalog (~4,300 SKUs) with current shelf `price` (DKK), `inStock`,
  and `isInCurrentLeaflet` (this week's avis).
- Netto+ member-offer block: `memberPrice`, `memberOriginalPrice`, `memberSavings`,
  `memberDiscountPercent`, offer title and offer window.
- Per-unit comparison pricing (`comparePrice` / `normalComparePrice` / `compareUnit`).
- Category hierarchy (`categoryLvl0`/`1`/`2` + `categoryPath`), `labels`
  (Økologisk, Svanemærket, …), `ageLimit`, `unitSize`/`unitMeasure`, `brand`,
  `ingredients`, structured `nutrition[]`, and product images.
- Modes & filters: keyword `query` or full-catalog scan, `categories`,
  `campaignsOnly`, `memberOffersOnly`, `inStockOnly`, `compact`,
  `excludeEmptyFields`.
- PPE pricing: $0.01 / run start + $0.002 / result.
