# Changelog of altex-price-scraper (`teodor_banea/altex-price-scraper`) Actor

- **URL**: https://apify.com/teodor\_banea/altex-price-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/teodor\_banea/altex-price-scraper.md

## Changelog

### 2.3.0 — 2026-06-14

#### Fixed

- Silenced the `MaxListenersExceededWarning` noise under concurrency by raising
  `EventEmitter.defaultMaxListeners` (the listener count is bounded, not a real leak).
- Proxy setup is wrapped in try/catch so a scoped/limited token (no proxy access) logs a
  clear warning instead of crashing.

#### Docs

- Clarified the recommended workflow: use **category/search mode for discovery** (collect
  product URLs), then run those URLs through **Product URLs mode** to get prices, stock,
  and specs from the product-detail endpoint.

### 2.2.0 — 2026-06-14

#### Changed

- **Unavailable fields are now omitted from output instead of left empty.** Listing-mode
  items (category/search) no longer carry empty `categoryBreadcrumbs: []` or `specs: {}` —
  those keys are simply absent (they're only available in Product URLs / detail mode).
  `price`, `availability`, `productId`, `url`, and `extractedAt` are always present.

### 2.1.0 — 2026-06-14

#### Changed

- **Proxy is now always-on residential RO.** Altex blocks datacenter and non-Romanian
  IPs on the platform, so the Actor now forces Apify residential proxies in Romania for
  every run instead of leaving it optional. Removed the `proxyConfiguration` input field
  (there is nothing to configure). Note: residential-proxy usage is billed on top of the
  per-result price.

### 2.0.0 — 2026-06-13

Major rewrite: **API-first**. The Actor now talks to Altex's public `fenrir` JSON API
instead of driving a headless browser.

#### Changed

- **Crawler:** Playwright + Chrome → `HttpCrawler`. No browser, no fingerprinting.
  Base image is now `apify/actor-node:20`; `playwright` dependency removed.
- **Endpoints:** product detail (`/catalog/product/{sku}`), search
  (`/v2/catalog/search/{term}`), and category listings (page `__NEXT_DATA__`).
- **Reliability & cost:** runs from datacenter IPs without a proxy; ~10× cheaper and
  faster per product. Proxy is now optional (off by default).
- **Pricing:** $0.006 → **$0.004 per product**.

#### Added

- `price.lowest` — EU 30-day lowest price (Omnibus Directive), when Altex exposes it.
- `detailLevel` field — `"full"` (Product URLs mode) vs `"listing"` (category/search).
- Real-API fixtures (`tests/fixtures/`) and tests asserting against them.

#### Removed

- Review-body scraping (`includeReviews`, `maxReviewsPerProduct`, `reviewsSample`):
  the API does not expose review text. Aggregate `rating` (average + count) is retained.

#### Migration notes

- Output is the same `AltexProduct` shape plus `price.lowest` and `detailLevel`, minus
  `reviewsSample` and `availability.estimatedDelivery`. Update downstream consumers
  that relied on those fields.

### 1.0.0 — 2026-04-20

Initial release (Playwright-based).

- Two input modes: `productUrls` and `categoryOrSearch`.
- JSON-LD + `__NEXT_DATA__` + DOM extraction with Playwright/Chrome.
- Conditional Apify proxy (residential RO), state persistence, errors dataset.
- Pay-per-result at $0.006 per product.
