price.recommended (PRP) is now set only when the page shows it: the recommended price must be above the selling price and no struck-through previous price may be shown. Rows where the recommended price was at or below the selling price no longer carry it.
- Stock code "in stoc la furnizor" (in stock at the supplier, orderable) came out as
UNKNOWN; it is now IN_STOCK
with rawText: "in stoc la furnizor". Every stock state seen on altex.ro maps to a documented value.
- New
price.recommended: the manufacturer's recommended price ("PRP") shown on many product pages. It does not
change original, discountPercent or isOnPromo (the page shows no percentage for it).
- Retry warnings name the real reason (for example "Altex refused the connection (HTTP 403)").
- The final status mentions Maximum total products only when the limit actually left products out.
- ERRORS rows for skipped inputs keep the entry in
url when it is a web address.
- Rating average was wrong:
rating.average held the sum of all stars (3 five-star reviews showed 15). It is now
the real average (1–5, one decimal, as the product page shows it).
- Pre-orders were reported as
UNKNOWN stock. New status PRE_ORDER (rawText: "precomanda").
- Products that can only be bought in a store were reported as
OUT_OF_STOCK. New status IN_STORE_ONLY
(rawText: "disponibil in magazin"), as the product page shows it.
- Far less residential proxy traffic. Every request now starts on Apify datacenter connections and the Actor
keeps the ones Altex answers; only a request Altex refuses there three times moves to a Romanian residential
connection (2.1–2.3 sent every request through residential proxies).
- One invalid URL no longer fails the whole run: invalid entries are skipped and listed under ERRORS.
- Products that no longer exist are reported once, without retries.
MaxListenersExceededWarning noise in longer runs.
- Every row has every key again (values Altex does not have are
null). 2.2.0 omitted empty fields; listing
rows now carry specs: null and, for search results, categoryBreadcrumbs: null.
- Problems are stored in an
ERRORS record of the run's key-value store instead of a named errors dataset.
The Actor no longer creates any storage in your account besides the run's own dataset and key-value store.
(An errors dataset left by earlier versions can be deleted from Storage.)
- Category mode rows carry the category path of the listed category (
categoryBreadcrumbs).
url is always the canonical product page URL (also in Product URLs mode).
- Category pages are read faster and with far less traffic; products of each listing page are saved in one batch.
- The same product given twice is read once; product URL lists are capped at 10,000 per run.
- Clear progress and final status messages (products delivered, not-found pages, skipped inputs); the run stops
itself shortly before its timeout and keeps everything collected so far.
- Default memory 512 MB, timeout 1 hour.
seller — "Altex" or the marketplace seller of the offer.
- 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.
- 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 each product page.
- 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.
- 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.
Major rewrite: the Actor no longer drives a headless browser.
- Crawler: Playwright + Chrome →
HttpCrawler. No browser, no fingerprinting.
Base image is now apify/actor-node:20; playwright dependency removed.
- 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.
price.lowest — EU 30-day lowest price (Omnibus Directive), when Altex exposes it.
detailLevel field — "full" (Product URLs mode) vs "listing" (category/search).
- Tests against real captured data.
- Review-body scraping (
includeReviews, maxReviewsPerProduct, reviewsSample):
review text is not available. Aggregate rating (average + count) is retained.
- Output is the same
AltexProduct shape plus price.lowest and detailLevel, minus
reviewsSample and availability.estimatedDelivery. Update downstream consumers
that relied on those fields.
Initial release (Playwright-based).
- Two input modes:
productUrls and categoryOrSearch.
- Browser-based extraction (Playwright/Chrome).
- Conditional Apify proxy (residential RO), state persistence, errors dataset.
- Pay-per-result at $0.006 per product.