AliExpress Scraper at a glance
AliExpress Scraper is a ready-to-run Apify actor from abotapi for collecting web data. Its documented output includes type, id, url, title and title (alias), which you can export as JSON, CSV or Excel or read through the Apify API. It costs $2.60 per 1,000 results on the Apify Free plan and from $1.80 on paid plans, with smaller per-run or optional feature charges listed on Apify.
- Runs on
- Apify cloud: console, API, schedules and integrations
- Data type
- Web data
- Pricing
- $2.60 per 1,000 results (Free plan), from $1.80 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 30 options
Scrape AliExpress products: search by keyword or category, or process pasted search, category and product URLs page by page. Identity, price, availability, media and SKU fields come from the results page; optional detail and reviews steps add variant tables, specifications, seller data and reviews.
What AliExpress Scraper can do
- Two ways to find products. Search by keyword (with category, price, rating and free-shipping filters) or paste search, category and product URLs and let the actor walk them forward page by page.
- Results-page fields by default, deep detail on demand. The default (fast, low cost) pass already covers id, title, price, discount, rating, sold count, images and seller name; turn on detail fetching only when you need SKU variants, specifications, description or full seller data.
- Reviews two ways. Embed each product's top reviews inline, or switch to reviews-only mode to get one row per review across every matching product.
- 11 markets, one actor. Pin the market and the storefront renders prices in that market's own currency.
- Built for schedules. Incremental mode returns only new and changed products on recurring runs, and a fully refused run fails loudly instead of returning an empty dataset.
- Send results into your apps. Pipe a summary of every record into Notion, Linear, Airtable or Apify's own MCP server as an extra delivery step alongside the dataset.
Choose what to collect
These inputs let you configure AliExpress Scraper - products, variants, prices & reviews. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | Pick how to start. 'search' runs the queries + filters below. 'url' walks one or more pasted search / category / product URLs forward, page by page. Product URLs emit a single product; search and category URLs walk their full result list. |
shippingCountrystring | Which market to scrape. Pins the connection exit country and the currency/locale the storefront renders (prices come back in that market's currency). Defaults to the United States. |
queriesarray | One or more search terms. The actor runs a separate paginated walk for each keyword. Examples: 'airpods', 'led strip lights', 'phone case'. Only used when mode = search. |
querystring | Single search keyword, an alias for the first entry of Search keywords. Only used when mode = search. |
pageinteger | Result page to start from (1 = first page). The walk continues forward from here up to Max result pages. Only used when mode = search. |
categoryIdstring | Optional: restrict the keyword search to one AliExpress category. Accepts the numeric id, a pasted category URL (/category//.html), or the exact name of a top-level category from the site's menu (for example Electronics or Pet Supplies; case-insensitive, no partial matches). A name is resolved to its id at the start of the run; one that is not on the menu stops the run with the closest names listed. Leave empty for all categories. |
freeShippingOnlyboolean | Request only items eligible for free shipping. Applied to the search request; on some results the storefront still mixes in non-eligible items. |
Show 23 more inputs
| Input | What it controls |
|---|---|
sortBystring | Sort the search results. Best match is the storefront default. |
urlsarray | One or more AliExpress URLs. Search result pages (/w/wholesale-...html), category pages (/category/...html) and product pages (/item/.html) are all accepted. Multi-URL supported. Each search/category URL is walked forward from its starting page; filters are baked into the pasted URL, not reapplied here (the price/rating filters below still apply). Examples: https://www.aliexpress.com/w/wholesale-earbuds.html, https://www.aliexpress.com/category/100003109/women-clothing.html, https://www.aliexpress.com/item/1234567890123.html. The default list holds one example per supported URL shape; m.aliexpress.com links are rewritten to www. |
minPriceinteger | Minimum price in the market's currency. Products below this are dropped. Applies to a keyword search and a pasted search or category URL. No bound when empty. |
maxPriceinteger | Maximum price in the market's currency. Products above this are dropped. Applies to a keyword search and a pasted search or category URL. No bound when empty. |
minRatinginteger | Drop products whose average rating is below this value (1 to 5). Applied after the results are fetched. Applies to a keyword search and a pasted search or category URL, not just one mode. |
reviewsOnlyboolean | When ON, the actor scans the results to discover product IDs but emits ONE record per review (type='review'), not one per product. Works in both modes. |
fetchReviewsboolean | When ON and reviewsOnly is OFF, every product record additionally carries an embedded array of its top reviews (capped by Max reviews per product). This is a separate fetch per product - it adds real time and the same per-product detail-enrichment surcharge as Fetch full product detail below. We recommend leaving it OFF unless you specifically need review text; products with no reviews emit an empty list either way. |
maxReviewsPerProductinteger | Hard cap on reviews fetched per product (default 20, maximum 5000). |
fetchDetailsboolean | When ON, the actor visits each product's own detail page after the results, adding full SKU variant tables, specifications, description, seller data, and more. This is a separate fetch per product, so it meaningfully slows the run and adds a per-product detail-enrichment surcharge. We recommend leaving this OFF: the default (OFF) results-page fields already cover id, title, price, discount, rating, sold count, images and seller name, which is enough for most uses at much lower cost and speed. Turn ON only when you specifically need SKU variants, specs, or full seller data. |
maxPagesinteger | Optional bound on result pages fetched per keyword or pasted search/category URL (the storefront serves ~60 cards per page). Leave empty (0) for no page limit - the run still stops at Max products total. |
maxListingsinteger | Hard cap across all keywords / URLs. Set to 0 for unlimited (still bounded by Max result pages). When reviewsOnly = true, this caps DISCOVERED products, not reviews; total review records can be much higher. |
resumeFromRunIdstring | Paste a previous run ID or dataset ID to continue a full walk without returning or charging for products already collected there (matched by product id). Use this after an interrupted run, or to keep extending one pull across separate runs. For recurring daily/weekly monitoring of the same search, use Incremental mode below instead. |
incrementalModeboolean | Turn this on for daily or recurring monitoring. The first run returns all matching products as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED products. What is compared: every output field of the product (price, original price, discount, rating and review count, stock, SKU table, title, images, seller, shipping and the rest). What is excluded and never causes UPDATED: fetch timestamps, the raw passthrough, sold counters (sold text and sold count), and the rotating image CDN host (only the image path counts). Use Ignore fields to exclude more, or Change scope to react to price and stock only. Turn on "Emit unchanged" or "Emit expired" only when you also want those products returned (and billed). State is kept separately per mode + search/URL/filter configuration; use State key when you want to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above. |
stateKeystring | Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the mode + search/URL/filter settings - different searches then never mix state with each other. |
emitUnchangedboolean | Off by default. Turn on to also return products that have not changed since the last run, marked UNCHANGED. This returns - and bills - extra rows you already have, so leave it off unless you specifically want the full snapshot every run. |
emitExpiredboolean | Off by default. Turn on to also return products that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search - not when Max products total capped it, when Resume was used, or in reviews-only mode. This returns - and bills - extra synthetic rows, so leave it off unless you need expiry tracking. |
expireAfterMissedScansinteger | Only used with Emit expired. A product is marked EXPIRED only after it was missing from this many consecutive complete scans (1 = the first complete scan that misses it). EXPIRED means the product dropped out of the scanned results; it does not prove the product is unavailable or delisted, because no product page is opened to check. |
changeScopestring | All fields (default): any change in a compared field makes the product UPDATED. Price and stock only: UPDATED only when the price, original price, discount, in-stock flag or a per-variant (SKU) stock or price moves; titles, images, descriptions, ratings and the rest never create a row. Changing this changes the automatic state key unless you set State key. |
compactUpdatesboolean | Off by default. When on, UPDATED and EXPIRED rows are slim (ids, url, title, current price and stock, priceChanges with old and new values, variantChanges per SKU). NEW rows stay full. A compact row does not carry the product detail data, so it does not bill the detail-enrichment event. |
ignoreFieldsForChangesarray | Field names that must not make a product UPDATED, e.g. reviewCount or rating. Nested paths use dots, e.g. skuList.image ignores that key in every SKU and still compares the rest. The ignored fields stay in the output. Applies on top of the built-in exclusions (fetch timestamps, sold counters, image CDN host). |
mcpConnectorsarray | Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON - the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com). |
notionParentPageUrlstring | URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Cap on items written to each connector per run. Does not affect the dataset. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
typeType (text)idID (text)urlURL (link)productNameTitle (text)titleTitle (alias) (text)currentPricePrice (number)pricePrice (alias) (number)originalPriceWas (number)discountPct% off (number)discountPercentage% off (alias) (number)currencyCCY (text)ratingScoreRating (number)Show 55 more fields
ratingRating (alias) (number)reviewCount# reviews (number)itemSoldSold (text)totalSoldSold (alias) (text)totalSoldCountSold count (alias) (number)inStockIn stock (boolean)isSponsoredSponsored (boolean)sellingPointsSelling points (text)sellerNameSeller (text)sellerCompanyNameCompany (text)brandNameBrand (text)primaryImagePhoto (image)imageUrlPhoto (alias) (image)productTypeType (text)categoryIdCategory ID (text)shippingCountryMarket (text)fetchedAtFetched (date)scrapedAtScraped (alias) (date)changeTypeChange (incremental mode) (text)changedFieldsChanged fields (text)firstSeenAtFirst seen (date)lastSeenAtLast seen (date)productIdProduct ID (text)legacylegacyproductUrlProduct URL (link)sourceUrlsourceUrlseedTypeseedTypeseedValueseedValueitemSoldCountSold count (number)sellerIdSeller ID (text)storeIdStore ID (text)storeUrlStore URL (link)sellerPositiveRatesellerPositiveRatebrandIdbrandIdimageGalleryimageGalleryadditionalImagesadditionalImagesbreadcrumbsbreadcrumbsdescriptiondescriptiondescriptionHtmldescriptionHtmlskuListskuListskuPropertyListskuPropertyListskuCount# SKUs (number)specificationsspecificationsshippingshippingwarrantywarrantyreviewsSummaryreviewsSummaryreviewIdReview ID (text)buyerNameBuyer (text)reviewTimeWhen (text)skuInfoVariant (text)likeCountLikes (number)compactCompact row (boolean)priceChangesPrice/stock changes (object)variantChangesVariant changes (array)skuStockVariant stock (array)Example output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"type": "product",
"id": "1234567890123",
"url": "https://www.aliexpress.com/item/1234567890123.html",
"productName": "Bluetooth Earbuds, Wireless Headphones with Noise Cancelling",
"productId": "1234567890123",
"productUrl": "https://www.aliexpress.com/item/1234567890123.html",
"sourceUrl": "https://www.aliexpress.com/w/wholesale-earbuds.html",
"seedType": "url",
"seedValue": "https://www.aliexpress.com/w/wholesale-earbuds.html",
"shippingCountry": "US",
"currency": "USD",
"title": "Bluetooth Earbuds, Wireless Headphones with Noise Cancelling",
"price": 12.99,
"originalPrice": 45.9,
"discountPercentage": 72,
"rating": 4.8,
"totalSold": "1,000+ sold",
"totalSoldCount": 1000,
"currentPrice": 12.99,
"discountPct": 72,
"ratingScore": 4.8,
"reviewCount": 2300,
"inStock": true,
"isSponsored": false,
"sellingPoints": [
"New shoppers save $5.00",
"Free shipping"
],
"sellerName": "Example Store",
"brandName": "Example Brand",
"primaryImage": "https://ae-pic-a1.aliexpress-media.com/kf/S00000000000000000a.jpg",
"imageGallery": [
"https://ae-pic-a1.aliexpress-media.com/kf/S00000000000000000b.jpg"
],
"categoryId": "100003109",
"raw": {
"serp": {}
},
"fetchedAt": "2026-09-30T08:20:40.310Z"
}Ways to use this data
- Price monitoring and repricing: track a product list's price, discount and stock across markets on a schedule and get only what changed.
- Market and competitor research: pull a category or keyword's full result set, sellers and brands to see how a niche is priced and positioned.
- Product sourcing and dropshipping: compare SKU variants, seller ratings and units sold before committing to a supplier.
- Review and reputation analysis: collect review text, ratings and buyer counts per product to spot quality issues or standout listings.
- Catalog and feed building: turn a search or category into a structured product feed for your own store, app or spreadsheet.
Before you run
Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.
Questions about this actor
What data does AliExpress Scraper return?
The documented output for AliExpress Scraper includes type, id, url, title, title (alias), price, price (alias) and was. Availability of each field depends on the source page and the selected mode.
How much does AliExpress Scraper cost?
It costs $2.60 per 1,000 results on the Apify Free plan and from $1.80 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
Can I get only new or changed products on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new and updated products, and unchanged ones are not billed unless you turn on Emit unchanged.
Why does the actor recommend keeping detail and review fetching off?
The default results-page fields already cover id, title, price, discount, rating, sold count, images and seller name, which is enough for most uses. Turning on Fetch full product detail or Include reviews on each product adds a separate page fetch per product, which meaningfully slows the run; detail fetching also adds a per-product surcharge. Turn them on only when you specifically need SKU variants, specifications or review text.
Why did my run fail instead of returning an empty dataset?
AliExpress intermittently refuses a share of connections with a refusal page instead of real results. Search result pages are first read directly over the selected connection, with no browser; the browser starts only for product pages, reviews, a category-name lookup, or a page the direct read was refused, and a refusal never moves the run to another connection type by itself. The actor rotates to a fresh connection automatically (up to 12 browser launches per run, 3 attempts per connection type, escalating Automatic, Residential, the unblocking pool, then backup connections). If every connection tried is still refused, the run fails with a clear message instead of returning an empty dataset, so "the site refused every attempt" is never confused with "no matching products." Simply retry; a fresh connection is very likely to succeed. A partially refused run instead reports a "Partial results" status message and keeps what it found.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.
