1.1 build 3 (2026-10-25): The outcome is decided per target, not per page attempt. A pasted alibaba.com URL that a later route (Apify's unblocking proxy) read successfully, but that has no listing data, now ends VALID_EMPTY with no charge, even if an earlier route showed a verification page. A listing target that no route could read still ends UPSTREAM_FAILED. Such a read page is no longer retried.
1.1 build 2 (2026-10-22): Detail enrichment now reads product pages through Apify's unblocking proxy (plain HTTP detail requests always got a verification page, so no product was ever enriched). A blocked detail page is retried; after the last retry the listing card is saved without enrichment, counted in OUTPUT.detailBlocked, and the run ends PARTIAL. The search-page fallback gets a final attempt through the unblocking proxy.
1.1 (2026-10-21): Own route first. Keywords and pasted search/showroom/products URLs are read from Alibaba.com's public search gallery JSON (search page HTML with embedded offerResultData as second own route; showroom SEO pages now answer HTTP 410), paginated until maxResults, over the caller's proxy then Apify Residential US. The fallback data source runs only for keywords the own reader could not serve at all. Verification pages count as blocks; currency comes from the price string. Rows are written and charged in one SDK call; the reduced-row retry was removed. Invalid input writes OUTPUT/RUN_SUMMARY.
1.0 (2026-06-20): Initial release. Keyword/URL search of Alibaba showroom listings via embedded PAGE_DATA JSON. 30+ fields per product incl. tier price, MOQ, supplier trust signals, reviews. Optional detail enrichment. PPE + Pay-Per-Usage.