AliExpress Deal Scanner — Discounts, Ratings & Sold Counts
Pricing
from $2.50 / 1,000 products
AliExpress Deal Scanner — Discounts, Ratings & Sold Counts
Scrape AliExpress search results: title, product ID, sale and original price, discount %, currency, free-shipping and coupon tags, image and product URL. 60 products per request, any keyword, any shipping country and currency.
Pricing
from $2.50 / 1,000 products
Rating
0.0
(0)
Developer
宗諭 楊
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
10 days ago
Last modified
Categories
Share
AliExpress Search Scraper — Prices, Discounts & Free Shipping
What sells, not just what costs
Every row now carries the two fields that tell you whether a listing matters:
starRating— the listing's rating, ornullwhere AliExpress does not show one. Measured: 46–56 of every 60 results have it.soldText— the sold count exactly as the page shows it, e.g.5,000+ sold.soldAtLeast— that string parsed to a number, and named for what it is: a lower bound.5,000+could be 5,000 or 9,999; onlysoldTextpreserves the bucket edge, so a gate refuses to emit the number without the string.
Those counts are localised, and the separators disagree. Measured across six locales:
| Locale | As shown | Parsed |
|---|---|---|
| en_US | 5,000+ sold | 5000 |
| de_DE | 1.000+ verkauft | 1000 |
| ja_JP | 10,000+ 点販売 | 10000 |
| pt_BR | 50.000+ vendido(s) | 50000 |
German and Brazilian listings use a period as the thousands separator, so
stripping commas alone turns 1.000+ into 1.0 — a thousandfold error, silently.
All eleven measured strings are in the test suite.
Missing values are null, never 0. A zero would read as "measured, and it is
zero sales", which is a different claim from "the page did not say".
When the source says no
If AliExpress returns its bot-mitigation page instead of results, this stops and says so — it does not solve the challenge, rotate user agents, or retry around it. The run fails with a message naming the fingerprint, so you know to slow down or use a proxy rather than waiting for a parser fix.
That distinction matters: the same symptom (no products in a 200 response) can mean the page changed or that the source is throttling you, and those need opposite responses. They are reported as different errors.
Scrape AliExpress search results at 60 products per request. Give it keywords (or paste AliExpress search URLs) and get back a clean, flat dataset: title, product ID, sale price, original price, discount %, currency, coupon and delivery tags, image and product URL.
Prices on AliExpress change with the destination country and currency, so both are
inputs — set Ship to and Currency and you get the prices a buyer in that country
actually sees.
What you get per product
| Field | Example |
|---|---|
title | Lenovo XT53 Wireless Bluetooth 5.3 Earphones Gaming Low Latency |
productId | 3256812453673234 |
url | product page URL |
image | image URL |
salePrice | 11.33 |
originalPrice | 31.22 |
discountPercent | 63 |
currency / currencySymbol | USD / $ |
formattedPrice | US $11.33 |
hasPrice | true |
skuId | 12000060768086864 |
tags | ["Save $19.89", "Delivery: Oct 16 - 22", "Free shipping"] |
freeShipping | false |
listedAt | 2026-09-25 00:00:00 |
searchTerm, page, sourceUrl | which query and page it came from |
Two ready-made dataset views: Products (everything, with thumbnails) and Biggest discounts (sorted by discount %, for deal hunting and repricing).
Filters
These are AliExpress's own search switches, not client-side filtering, so they change what the site returns:
- Free shipping
- On sale
- Ships from my country (the site's "Local+")
- AliExpress Choice
- Rating 4★ and up
- Ships from country — a specific origin, e.g.
US,ES,CN - Min / max price in your chosen currency
- Sort by — best match, most orders, newest, price ascending or descending
Filters combine with AND. A narrow combination can legitimately return zero products;
the run finishes successfully and says so in the log and in SUMMARY, rather than failing.
Typical uses
- Price monitoring and repricing — track a keyword or a competitor's catalogue over
time;
salePrice,originalPriceanddiscountPercentare separate fields, so a genuine price cut is distinguishable from a changed "original price". - Product and niche research —
listedAtshows when a product was listed, so you can separate new listings from long-standing ones. - Deal and coupon feeds — the
tagsfield carries the on-card offers (Save $19.89,$1.04 each, ≥ 2 pieces,Lowest price in 90 days,Free shipping). - Dropshipping sourcing — filter to AliExpress Choice or a specific ship-from country to find stock that reaches your buyers quickly.
Input example
{"searchKeywords": ["wireless earbuds", "mechanical keyboard"],"maxItemsPerKeyword": 120,"currency": "USD","shipTo": "US","sortBy": "orders","filters": ["freeShipping", "rating4Plus"],"minPrice": 5,"maxPrice": 50,"delaySeconds": 2}
60 products come back per request, so maxItemsPerKeyword: 120 is 2 requests per keyword.
How it handles things going wrong
Most scrapers fail quietly: they return an empty dataset, or half a dataset, and the run is marked successful. This one stops and tells you which check failed.
| Check | What it catches |
|---|---|
| Bot-detection page | The response is a challenge page rather than data. The run stops and reports it; this Actor does not attempt to bypass bot detection. |
| HTTP 200 with zero products | A shell page or a soft block. Not reported as "no products found". |
| Zero results, structure intact | Distinguished from the above: a filter combination with no matches finishes successfully with a note. |
| Page structure changed | The product array has moved. A structural fallback runs, and SUMMARY.dataPathUsed records that the fallback was used, so a silent change leaves a trace. |
| Pagination ignored | Page N returning page 1's products again. Overlap above 90% stops the run (a normal overlap is around 14%, from AliExpress repeating sponsored placements). |
| Wrong currency | Asking for USD and receiving another currency. Every field would look correct and every price would be wrong, so the run stops. |
| Price coverage collapse | Fewer than half the products parsing a price, which means the price field has moved. Records would still have titles and links and look fine. |
| Unknown filter value | An unrecognised filter is rejected instead of ignored, because ignoring it returns results you did not ask for. |
| Proxy requested but unavailable | Falling back to a direct connection would silently return another country's prices, so the run stops. |
SUMMARY (in the key-value store) records what actually ran: request count, record count,
duplicates skipped, records without a price, the filters applied, the data path used, and
a caveats list.
Notes on the data
- Prices and shipping offers depend on the destination country; results for one
Ship todo not transfer to another. - AliExpress repeats sponsored placements across pages. Duplicates are removed by product
ID and counted in
SUMMARY.duplicatesSkipped. - Search ordering is AliExpress's own and includes sponsored positions, so it is not a pure sales or relevance ranking.
- A small share of product cards carry no price block (0–15% in testing). Those records
have
hasPrice: falseand are counted inSUMMARY.recordsWithoutPrice. - Ratings and order counts are not present on the search cards and are therefore not in the output.