AliExpress Deal Scanner — Discounts, Ratings & Sold Counts avatar

AliExpress Deal Scanner — Discounts, Ratings & Sold Counts

Pricing

from $2.50 / 1,000 products

Go to Apify Store
AliExpress Deal Scanner — Discounts, Ratings & Sold Counts

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 Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

10 days ago

Last modified

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, or null where 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; only soldText preserves 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:

LocaleAs shownParsed
en_US5,000+ sold5000
de_DE1.000+ verkauft1000
ja_JP10,000+ 点販売10000
pt_BR50.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

FieldExample
titleLenovo XT53 Wireless Bluetooth 5.3 Earphones Gaming Low Latency
productId3256812453673234
urlproduct page URL
imageimage URL
salePrice11.33
originalPrice31.22
discountPercent63
currency / currencySymbolUSD / $
formattedPriceUS $11.33
hasPricetrue
skuId12000060768086864
tags["Save $19.89", "Delivery: Oct 16 - 22", "Free shipping"]
freeShippingfalse
listedAt2026-09-25 00:00:00
searchTerm, page, sourceUrlwhich 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, originalPrice and discountPercent are separate fields, so a genuine price cut is distinguishable from a changed "original price".
  • Product and niche research — listedAt shows when a product was listed, so you can separate new listings from long-standing ones.
  • Deal and coupon feeds — the tags field 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.

CheckWhat it catches
Bot-detection pageThe 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 productsA shell page or a soft block. Not reported as "no products found".
Zero results, structure intactDistinguished from the above: a filter combination with no matches finishes successfully with a note.
Page structure changedThe 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 ignoredPage 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 currencyAsking for USD and receiving another currency. Every field would look correct and every price would be wrong, so the run stops.
Price coverage collapseFewer 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 valueAn unrecognised filter is rejected instead of ignored, because ignoring it returns results you did not ask for.
Proxy requested but unavailableFalling 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 to do 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: false and are counted in SUMMARY.recordsWithoutPrice.
  • Ratings and order counts are not present on the search cards and are therefore not in the output.