# Changelog of Alibaba B2B Product Scraper (`w3crawler/alibaba-b2b-scraper`) Actor

- **URL**: https://apify.com/w3crawler/alibaba-b2b-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/w3crawler/alibaba-b2b-scraper.md

## Changelog

### \[Unreleased] - 2026-10-25

#### Changed

- Removed the undeclared `includeDiagnostics` and `fixtureFile` controls from the public input contract; the default input and QA examples now use only schema-declared keys. Tests still inject fixture HTML directly through the internal `fixtureBody` option.

#### Fixed

- Fail closed on access barriers: HTTP 401/403/406/429/451 and `ACCESS_BARRIER_*`/`BLOCKED_SOURCE` codes are terminal, pagination stops, and the run reports `BLOCKED_FAIL_CLOSED`.
- Never switch transports after a browser block or a recorded blocked code, and never retry HTTP 429.
- Browser failures always contribute diagnostics so a valid input can no longer suppress failure status.

### \[1.2.0] - 2026-09-05

#### Added

- Browser-first extraction from Alibaba's rendered product-card DOM and public product-detail structured data
- Multiple search sources, bounded per-source pagination, global output limits, cross-source deduplication, global sorting, and optional detail enrichment
- Developer controls for request delay, concurrency, retries, navigation/request-handler timeouts, standard Apify Proxy routing, and fail-closed diagnostics
- Rich normalized dataset/output/key-value-store schemas, checked-in fixtures, input variants, media-association checks, and README examples

#### Fixed

- Scope product images to the card/detail record that exposed them, allow current Alibaba CDN image paths, remove common logo/icon/avatar assets, and guarantee `thumbnail === images[0]`
- Keep HTTP/SSR parsing as a truthful fallback for public structured data and local fixtures; CAPTCHA and access-control responses are never converted into synthetic product rows

### \[1.1.1] - 2026-09-04

#### Fixed

- Parse live `window.__page__data_sse10._offer_list` SSR data in addition to `application/ld+json`; previously live search pages with 48 offers emitted false `NO_PUBLIC_DATA` because only JSON-LD was inspected
- Infer INR (₹) and other symbol currencies, parse `~`-separated and comma-grouped price ranges, and split `Min. order:` MOQ quantity/unit correctly
- Canonicalize product URLs without tracking query parameters so they pass validation and deduplicate; absolutize protocol-relative supplier/image URLs
- Strip HTML tags/entities from titles and normalize NBSP/zero-width whitespace across extraction and compaction
- Preserve honest fail-closed diagnostics: unavailable runs still emit a single `run_diagnostic` with stable error codes and never fabricate products

### \[1.1.0] - 2026-07-23

#### Fixed

- Use Alibaba's current `/trade/search?SearchText=` endpoint
- Reject CAPTCHA, interception, 404, and unrelated recommendation pages
- Require a genuine product ID/URL, query match, price, MOQ, supplier, and image
- Remove nulls, blanks, empty arrays, and synthetic discount values
- Fail explicitly when no complete products are extracted
- Replace the permissive validator with recursive semantic checks

#### Added

- Supplier years/country/profile, MOQ quantity/unit, price range/currency
- Ratings, review counts, sold counts, reorder rates, delivery, badges, and action flags
- Current fingerprints, automation masking, session persistence, and retry rotation

### \[1.0.0] - 2026-06-01

#### Added

- Initial release of Alibaba B2B Product Scraper.
- PlaywrightCrawler with channel: 'chrome' on apify/actor-node-playwright-chrome.
- SSR JSON data extraction with DOM fallback.
- Multi-page pagination, deduplication, proxy support.
- Modular structure: main.js, routes.js, handlers.js, extractors, filters, schema, utils, errors.
