AliExpress Scraper
Pricing
from $1.00 / 1,000 results
AliExpress Scraper
Scrape AliExpress search results: product title, sale price, original price, discount, star rating, units sold and images, from any search term, with pagination.
Pricing
from $1.00 / 1,000 results
Rating
0.0
(0)
Developer
Juan ignacio Veltri
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
AliExpress Scraper — search results with price, discount, rating and units sold
Scrape AliExpress search results: product title, sale price, original price, discount percentage, star rating, units sold and images — 60 products per page, with pagination.
Why this one keeps working
Every guide on scraping AliExpress tells you to read window.runParams. That object no longer
exists on the current site, which is why a lot of copied-from-a-tutorial scrapers quietly return
nothing.
This Actor reads window._dida_config_._init_data_, the state AliExpress's own front end renders
from. No CSS selectors are involved, so a redesign does not break it.
Quick start
{ "searchTerms": ["headphones"] }
Find what actually sells, not just what is listed:
{"searchTerms": ["phone case", "screen protector"],"minSold": 100,"minRating": "4.5","maxPagesPerSearch": 10}
minSold is the most useful filter here. AliExpress lists an enormous number of products that have
never sold a unit; requiring a sales history is the fastest way to a list worth reading.
Discount hunting:
{ "searchTerms": ["mechanical keyboard"], "onlyDiscounted": true, "maxPrice": "40" }
Input
| Field | Type | Default | Description |
|---|---|---|---|
searchTerms | array | ["headphones"] | What to search for |
startUrls | array | — | Result pages you already filtered on the site |
maxPagesPerSearch | integer | 3 | 60 products per page |
minPrice / maxPrice | string | — | Sale price range, e.g. 5, 49.99 |
minRating | string | — | Star rating floor, e.g. 4.5 |
minSold | integer | — | Minimum units sold |
onlyDiscounted | boolean | false | Only products genuinely below list price |
keywords | array | — | Only titles mentioning any of these |
maxItems | integer | 300 | Total cap. 0 = no cap |
includeSeen | boolean | true | Off = only products not seen in previous runs |
Output
{"id": "aliexpress:3256812596783345","url": "https://www.aliexpress.com/item/3256812596783345.html","title": "Wireless Over-Ear Headphones, 5.3 Smart Chip, HiFi Music Gaming","price": { "amount": 0.99, "currency": "USD", "raw": "US $0.99" },"listPrice": { "amount": 21.72, "currency": "USD", "raw": "US $21.72" },"discountPercent": 95,"rating": 5,"soldQuantity": 51,"condition": "new","images": ["https://ae-pic-a1.aliexpress-media.com/kf/Sfa03eb...jpg"],"sku": "3256812596783345","seller": null,"reviewsCount": null}
Three deliberate choices:
listPriceis only set when there is a real discount. With no offer running, AliExpress repeats the same number in both price fields; copying it would show a discount that does not exist.soldQuantityis a number. The site publishes"51 sold"as text, and you cannot sort or filter a string by sales volume.- Products with no price are not returned at all. The results page mixes in promoted cards that carry no price in the page state; a product row you cannot compare, sort or filter by price is not a result, and you are not charged for it. On a real run that was 17% of the raw cards.
seller,reviewsCountandstockQuantityarenull. They live on the product page, which is a separate request per product — a search results page simply does not carry them. That is information, not a gap.
Notes and limits
- AliExpress rate-limits hard. From an ordinary connection the first request succeeds and the
second comes back as a 2 KB challenge page. This Actor runs behind Apify's unblocking proxy, so
you do not have to configure anything — but it is why runs are slower than a plain HTTP scraper,
and why raising
maxRequestsPerMinutea lot is how runs start failing. - Prices are in the market's currency, which depends on the country the request is made from. Runs are pinned to the US market so a dataset stays comparable across runs.
- Products with no price are dropped by
minPrice/maxPrice, because claiming they fall in a range they never published would misreport the filter you asked for.
Pricing
Pay per result. You are charged for products that actually land in your dataset — filtered out and duplicate rows cost nothing.