AliExpress Products Scraper
Pricing
from $0.11 / 1,000 products
AliExpress Products Scraper
Scrape AliExpress search results by keyword for dropshipping and price research. Rows carry the product id, title, link, price, old price, rating, order count, image, delivery window and promo labels. Filter by price, orders, rating or free shipping and track price changes. $0.12 per 1,000 products.
Pricing
from $0.11 / 1,000 products
Rating
0.0
(0)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
12
Total users
4
Monthly active users
2 days ago
Last modified
Categories
Share
Search AliExpress by keyword and get one row per listing: product id, title, a clean link, the current price in one currency, the old price where there is a real markdown, the advertised discount, star rating, lifetime order count, the image and the Choice badge. No account, no API key.
It reads search listings and stops there. It never opens a product page, so there is no seller name, no review text and no shipping cost in the output.
| Input | Search terms, or AliExpress search URLs |
| Output | One row per product: price, old price and discount, star rating, lifetime orders, images, delivery window, selling-point labels, Choice and ad flags |
| Ceiling | 5,000 products per run, or per term with maxItemsPerTerm |
| Account needed | None |
| Price | $0.12 per 1,000 products on the Free plan, a little less on paid plans. The free plan's $5 a month covers about 41,000 |
๐ What AliExpress Products Scraper does
You give it terms like phone case or wireless earbuds. It walks the search listings 20 products
at a time and writes a row for each one, until it has the number you asked for or the term runs out.
Every price in one currency. Left alone, AliExpress picks the display currency itself, and a
single dataset can come back with some rows in USD and some in EUR with nothing on the row saying
which. Setting currency pins it for the whole run, so price means one thing when you sort or
total the file, and every row carries currency so you never have to remember what you picked.
Titles in your language. Pick one of 14 languages and AliExpress returns its own translated
titles, with the order badge in ordersText following along.
Results reshuffle as you page through them, which is AliExpress's doing. Rows are de-duplicated on
productId as they arrive, so maxItems means unique products, not raw cards seen.
๐ What data you get from each AliExpress product
| What you get | Field |
|---|---|
| Product id, title and a clean link | productId, title, productUrl |
| Current price, the price before a markdown, the advertised discount, and the currency | price, originalPrice, discountPercent, currency |
| Star rating | rating |
| Lifetime orders, exact and as the badge shows them | orders, ordersText |
| The main image, and every picture the card lists, main first | imageUrl, imageUrls |
| The Choice badge, and whether it is a paid placement | isChoice, isAd |
| Which of your terms found it, and where it ranked | searchKeyword, page, position |
| The selling-point labels on the card, and whether shipping is free | promoLabels, freeShipping |
| Delivery estimate: fewest and most days, earliest and latest date | deliveryMinDays, deliveryMaxDays, deliveryFromDate, deliveryToDate |
| AliExpress category ids, broadest first (ids only, no names) | categoryIds |
The price as the card prints it, like US $1.09 | priceText |
Number of reviews (optional, includeReviewCount) | reviewCount |
Last run's price, the change, and whether the product is new (optional, monitorName) | previousPrice, priceChange, isNew |
โถ๏ธ How to scrape AliExpress products
- Open AliExpress Products Scraper and click Try for free.
- Type your terms into Search terms, one per line.
- Set Maximum products, or Products per term to give each term its own cap. 40 is enough to see the shape of the output.
- Pick a Sort by, Currency, Ship-to country, Language or Filters if the defaults do not suit you, then click Start.
- Download the dataset as JSON, CSV or Excel.
Run it with no input at all and you get one labelled sample row, free.
๐ฐ How much does it cost to scrape AliExpress products?
$0.12 per 1,000 products on the Free plan. Paid plans pay a little less: $0.118 on Starter, $0.116 on Scale and $0.114 on Business. On the free plan, the $5 Apify gives you each month covers about 41,000 products.
You pay per product row. The sample row and diagnostic rows are not charged, and the same product
appearing again on a later page is dropped before it becomes a row. Products your filters leave out
are free too, and the review count is part of the product price. One exception: with a price
monitor, every product checked is charged, including the ones onlyChanged does not write.
๐ฅ What you give it
{"searchQueries": ["phone case", "wireless earbuds"],"maxItemsPerTerm": 500,"minOrders": 100,"currency": "USD","country": "US"}
maxItems is shared, and the first term fills it first: these two terms with maxItems: 1000
would come back as 1,000 phone cases and no earbuds. maxItemsPerTerm gives each term its own cap.
| Field | Default | What it is |
|---|---|---|
searchQueries | none | What to search for, one term per line. |
productUrls | none | AliExpress search URLs, if you would rather paste than type. The keyword is read out of the URL. An item page here gives you a BAD_INPUT row. |
maxItems | 40 | Total products across all your terms, up to 5,000. The first term fills it first. |
maxItemsPerTerm | none | Products per term, up to 5,000 each. When set, maxItems is not used. |
sortBy | relevance | AliExpress's own order, or priceAsc, priceDesc, ordersDesc (most orders first) or rating (highest rating first, unrated last). AliExpress sorts one page of 20 at a time; rating is sorted on each term's products once the term is done. |
currency | USD | The currency every price in the run comes back in: USD, EUR, GBP, CAD, AUD, BRL, RUB, JPY, KRW or INR. |
country | US | Two-letter ship-to country, which AliExpress uses for pricing and availability. |
language | en_US | The language titles come back in: es_ES, fr_FR, de_DE, it_IT, pt_BR, nl_NL, pl_PL, tr_TR, ru_RU, ja_JP, ko_KR, ar_MA or th_TH. |
minOrders | none | Only products with at least this many lifetime orders. |
minRating | none | Only products rated at least this, 0 to 5. Unrated products are left out once it is set. |
minPrice, maxPrice | none | A price band, in your currency. |
freeShippingOnly | none | Only listings that show free shipping. Free shipping over a minimum spend does not count. |
choiceOnly | none | Only products with the Choice badge. |
shipFromCountry | none | Two-letter code, such as US or ES. Only listings that say they ship from there; one that does not say is left out. Local stock shows for the matching country: Spanish stock with ES, not with US. |
includeReviewCount | false | Adds reviewCount. The run gets slower; the price does not change. |
monitorName | none | Turns on the price watch: letters, digits and hyphens, up to 38. Last prices are kept in a key-value store on your account named aliexpress-price-monitor- plus this name, one list per currency and ship-to country, up to 20,000 products. A new name marks every product isNew. |
onlyChanged | false | With monitorName: write only new and repriced products. |
requestDelayMs | 800 | Gap between page requests, in milliseconds. Setting it to 0 falls back to 800. |
proxyConfiguration | none | Optional. Leave it empty; the actor is set up to run without it. Your own servers are used exactly as given. |
A value the actor can't use, like an unknown sortBy or a minPrice above maxPrice, stops the
run with a free BAD_INPUT row before anything is searched.
๐ค What you get back
A real "phone case" row from 17 October 2026, imageUrls cut to three of seven:
{"productId": "3256811843466811","title": "Card slot phone case for Samsung S25 Ultra Edge S23 S24 Plus FE A56 A55,with magnetic rotating ring holder, thickened shockproof","productUrl": "https://www.aliexpress.com/item/3256811843466811.html","price": 1.09,"originalPrice": null,"discountPercent": 90,"currency": "USD","rating": 4.9,"orders": 4430,"ordersText": "4,000+ sold","imageUrl": "https://ae-pic-a1.aliexpress-media.com/kf/S041465aa06b141109affeadc0ee1b03aH.jpg","isChoice": false,"isAd": false,"searchKeyword": "phone case","page": 1,"position": 7,"scrapedAt": "2026-10-17T04:48:24.175Z","promoLabels": ["Free shipping"],"freeShipping": true,"deliveryMinDays": 4,"deliveryMaxDays": 10,"deliveryFromDate": "2026-10-20","deliveryToDate": "2026-10-26","categoryIds": ["202192403", "202228401", "380230"],"priceText": "US $1.09","imageUrls": ["https://ae-pic-a1.aliexpress-media.com/kf/S041465aa06b141109affeadc0ee1b03aH.jpg","https://ae-pic-a1.aliexpress-media.com/kf/Sd3814f22e07a4f6cb02c36cbc6c1e5dcu.jpg","https://ae-pic-a1.aliexpress-media.com/kf/S7acd95374bba474ab11b6a4b2f8902dcW.jpg"]}
| Field | How to read it |
|---|---|
price | What the listing sells for today, in your chosen currency. On AliExpress that is usually a sale price. |
originalPrice | The price before the markdown, and null when the seller is not running one. Expect plenty of nulls rather than a copy of price dressed up as a discount. |
discountPercent | The discount AliExpress advertises on the card. It can be present on a row where originalPrice is null, as above, because the two come from different places on the card. |
priceText | The price as the card prints it, like US $1.09. null when the card carries no price block, and then originalPrice and discountPercent are null too. In our tests that was between about one card in five and one in two, depending on the search. price is still read from the card's own numbers on those cards. |
orders | The exact lifetime order count, not a recent figure. Sort on this one. |
ordersText | The rounded badge a shopper actually sees, like 2,000+ sold. |
isAd | true on a paid placement. Roughly a fifth to a quarter of search rows are these. They are real listings, just promoted. |
productUrl | Rebuilt from the product id, so it is clean and carries no tracking. |
promoLabels | The text labels on the card, in the run's language. Picture-only badges have no text and are not listed. null when there are none. |
freeShipping | true when the card shows free shipping, false when it shows other labels but not that one, null when it shows none. Free shipping over a minimum spend is false. |
deliveryMinDays to deliveryToDate | AliExpress's delivery estimate for your ship-to country. All four are null when the card gives none. |
imageUrls | The main image first, then each variant's picture once. null when the card lists no variant pictures. |
reviewCount | Only with includeReviewCount. null when the count could not be read; the row is still charged. |
previousPrice, priceChange, isNew | Only with monitorName. previousPrice is last run's price in the same currency, priceChange the difference, both null on a new product. |
๐งพ Reading the output
| Row | How to spot it | Billed |
|---|---|---|
| A product | It has a productId and no _sample or _diagnostic key | yes |
| The sample row | _sample: true, only when no search term or URL was given | no |
| A diagnostic | _diagnostic: true and a status | no |
Product rows carry no charged flag; the sample and diagnostic rows carry charged: false. The
sample row has a productId like a real one, so to keep only products, drop every row with
_sample or _diagnostic.
status | What it means |
|---|---|
BAD_INPUT | That URL is not an AliExpress search URL, or a sortBy, language or filter value the actor can't use. A value like that stops the run before anything is searched. |
NO_RESULTS | AliExpress found nothing for that term, or nothing that passed your filters. When it fills the page with unrelated picks of its own instead, none of them are taken or charged. Usually a typo or a term that is too narrow. |
FEW_MATCHES | Fewer than 2 of the first 100 products for that term passed your filters, so that term stopped there. leftOutByFilters says how many were left out, none of them charged. |
MONITOR_UNAVAILABLE | The price watch's store could not be opened, so nothing was searched. Run it again in a few minutes. |
SEARCH_FAILED | That term could not be read, or AliExpress answered it without the sort or language you asked for. Re-run it. |
NOT_SERVED | This product was not served this run. Re-run it later. Until 12 October 2026 this code was called BLOCKED. |
TIME_LIMIT | The run got close to its time limit and stopped on its own. The products delivered before that are complete and charged. Give the run more time, or ask for fewer products, to get the rest. |
A diagnostic row never fails the run, except two: when the time limit stopped the run before any
product came back, the run ends as failed with a TIME_LIMIT row saying so, and a
MONITOR_UNAVAILABLE run fails too.
๐ก What people use it for
- Sizing a niche before sourcing it: pull 1,000 rows for a term and look at where
priceclusters and how farordersruns. - Finding what actually sells rather than what ranks, by sorting on
ordersinstead ofposition. - Watching a term weekly: give it a
monitorName, schedule it, and turn ononlyChangedto get just the new listings and the ones that changed price. - Dropping
isAdrows to see the organic ranking on its own, or keeping only them to see who is paying for that term.
๐ง What it does not do
- Search listings only. No product pages, so no description, no specifications, no variants and no SKU-level prices.
- No seller or store fields. AliExpress took store name, seller id and seller country off its search cards, so there is no column rather than a column that is always empty.
- No review text and no shipping cost. Both live on the product page;
includeReviewCountadds only the number of reviews. - The sort is per page, not strict across pages. With
sortByset, every page of 20 comes back in that order, but page 2 can start above where page 1 ended. Sort the dataset yourself if you need one exact order.ratingis the exception. ordersis lifetime, not recent. A listing from 2019 with 18,000 orders is not necessarily selling today.- Paid placements are mixed in, around a fifth to a quarter of rows, flagged
isAd. - A term can stop early. When AliExpress stops answering for a page, the run ends that term with
a
NOT_SERVEDrow and keeps everything already delivered. - Prices are what AliExpress shows for your ship-to country, before any coupon, and they move
constantly.
scrapedAtrecords when the row was read. - It is not an official AliExpress tool. Dami's Studio is independent and is not affiliated with or endorsed by AliExpress or Alibaba, or by any other company named on this page.
๐งญ Which marketplace scraper do you need?
| If you want | Use |
|---|---|
| AliExpress search results with prices and order counts | This one |
| Retail products in a Taobao category | Taobao Category Products Scraper |
| 1688 offers by search term: unit price, MOQ and the quantity price ladder | 1688 Wholesale Scraper |
| Export products, MOQ and suppliers on Alibaba.com | Alibaba.com Scraper |
| Amazon products by keyword or ASIN | Amazon Scraper |
โ Questions people ask
Do I need an AliExpress account or an API key?
No. Everything here is public search data.
Why are my AliExpress prices in the wrong currency?
They will not be if you set Currency. It is pinned for the whole run and echoed on every row.
Can I paste an AliExpress product link?
No. productUrls takes search URLs and reads the keyword out of them. An item page comes back as
BAD_INPUT.
Why is originalPrice empty on so many rows?
Because most listings are not on a markdown. A blank is the honest answer there.
Why did my second search term return nothing?
maxItems is shared and the first term filled it. Set maxItemsPerTerm instead.
Can I call it from code or connect it to an AI assistant?
Yes. The API tab has
ready-made code for Python, JavaScript and the command line. For Claude, ChatGPT or another MCP
client, connect
https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/aliexpress-products-scraper. Either
way the run happens on your Apify account at the same price.
Is scraping AliExpress legal?
These are public listings. Check AliExpress's terms and your own local rules before using the output commercially. Apify's write-up on the legality of web scraping is a good starting point, and we are not lawyers.
๐ If something breaks
Open the Issues tab on the actor page. Send the search term and the run ID; if you got a
diagnostic row, its status usually names the problem on its own.