# Changelog of AliExpress Scraper API — Products, Variants, Reviews & Sellers (`pro100chok/aliexpress-scraper`) Actor

- **URL**: https://apify.com/pro100chok/aliexpress-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/pro100chok/aliexpress-scraper.md

## Changelog

### 1.1 (2026-08-19)

#### Seller storefront URLs now work

A `/store/<id>/...` URL used to return nothing. It was routed to the search-results parser, which requires an `itemList` block; a storefront page never contains one, so every fetch was rejected — and rejected as a *captcha*, so the run rotated through its whole IP budget and eight retry rounds while in truth every single page had loaded fine. Two things caused it, both fixed:

- storefront URLs now take their own route. A storefront is client-side rendered, so its products come from the seller catalogue endpoint (40 per page) instead of the page HTML, with the sort, filter, category and in-shop search text taken from the URL you paste. `https://www.aliexpress.com/store/<id>` alone works too.
- the host rotation used on retries no longer rewrites a seller's own subdomain. It was turning `azdent-dental.es.aliexpress.com/store/...` into `www.aliexpress.us/store/...`, which serves a different page, so each retry made things worse rather than better.

#### "Captcha" now means captcha

A page that loads but is not a listing is no longer reported as a block. Rotating the IP cures a block and nothing else, so that case now stops after a few attempts and says what actually arrived — including the page size and which URL shapes are accepted — instead of spending minutes and finishing with a misleading error. A small page is judged on the punish marker AliExpress always includes, not on its size, because a promo page (4.4 KB) and a not-found page (13.5 KB) are simply small.

#### Product details and storefronts are several times faster

The product endpoint limits each exit IP by request *rate*, not by reputation: an unproven IP is refused about three times in four, while one that has just worked keeps working for a burst of requests and then a steady trickle. The actor was rotating to a new IP on every call, which threw away the only thing worth keeping. It now holds a pool of proven proxy sessions and paces each one inside the endpoint's limit. Measured on 30 fully detailed products, against the previous behaviour under the same conditions: the same 30 rows delivered from 43 requests instead of 253, in about an eighth of the wall-clock time. Gateway tokens are also reused across the run, so each product costs one request instead of two.

#### Fixed

- Storefront rows were billed as `product-detailed` instead of `product-listed`, because they name their own seller and that was read as evidence of a full product lookup. Storefront listing rows are now billed as listings.
- A storefront item nobody has rated yet no longer reports `rating: 0` — an absent rating is left out.
- An unexpected internal failure was also being reported as "blocked" and retried for eight rounds. Only failures that waiting can actually fix are retried now; anything else is reported once, with its real cause.
- *Newest* on a storefront was sending the search-page sort code, which the storefront ignores, so the results came back in default order. It now sends the storefront's own code.
- Sorting a storefront by price is forwarded but noted in the log: AliExpress returns the same, unordered set for ascending and descending, so the run says so instead of leaving you to wonder whether the sort was dropped here.
- Store names arrive HTML-escaped and were passed through that way (`Stone&#39;s Store`); they are now decoded.
- A storefront link whose id redirects to another one (`/store/1103576287` → `1103573332`) now reports the store it actually read, in both `store.storeId` and `store.url`.

### 1.0 (2026-08-04)

- Initial release. Three modes: **Search & listings** (keyword, category or listing URL, paginated), **Product details** (full record per product) and **Reviews**.
- **One row per product.** Variants (`skus`), shipping (`shipping`), the seller (`store`), reviews (`reviews`) and the rating breakdown (`reviewsSummary`) are nested fields on the product's own row — no separate record types to join, no mixed row kinds. Keyword insights are the only other row kind, since they describe a search rather than a product.
- Each row is pushed the instant that product is complete, so results appear within seconds and an aborted run keeps everything already collected.
- Product data: title, sale and original price, discount %, currency, orders sold (text + parsed + exact where available), rating, review count, wishlist saves, stock, AliExpress Choice flag, sponsored flag, promo badges, bundle deals, category ID and path, listing date, image gallery.
- Every SKU variant with its own attributes, price, stock, availability and image, plus the variant option groups and purchase limits.
- Shipping per destination country: cost, free-shipping flag, carrier, delivery window in days, earliest/latest delivery dates, warehouse and tracking availability — every option, not just the default.
- Full specifications (as pairs and as a flat object for clean CSV export), long description text, attached manuals, buyer protection and after-sales terms, compliance disclosures, coupons.
- Reviews: star rating, original text and translation, buyer country, purchase date, variant bought, buyer photos, helpful votes, per-aspect ratings — plus a `reviewsSummary` with the star breakdown (5/4/3/2/1 counts, positive rate, photo-review count) and the recurring review themes.
- Seller & store data on every row: store name, URL, logo, seller ID, country, years active, positive-feedback rate, rating count, seller level, top-rated and local-warehouse flags, follower count and service scores.
- Keyword insights: total matching products, related and trending keywords, and every on-site filter with its values (brands, materials, colours, shipping origins, price bands).
- 50 shopper countries and 20 languages. Prices, promotions, shipping and delivery dates all come back as a shopper in the chosen country sees them, in that country's currency, so runs stay comparable. A currency that does not match the chosen country is reported in the log instead of silently mixing currencies.
- Search filters: sort order, min/max price, on-sale, free shipping, AliExpress Choice, 4-stars-and-up, ships-from country and category ID.
- `maxItems` is a hard ceiling on rows, and one row is one product — the run stops the moment it is reached, so a run never bills for more results than requested.
- Results stream into the dataset as they are found, so an aborted run keeps everything collected so far.
- Listing pages that cannot be loaded on the first pass are retried later in the run instead of being abandoned, and a product whose full record cannot be read still yields a row with everything the listing provided.
