AliExpress Scraper - products, variants, prices & reviews
Pricing
from $1.80 / 1,000 product results
AliExpress Scraper - products, variants, prices & reviews
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.
Pricing
from $1.80 / 1,000 product results
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
6 days ago
Last modified
Categories
Share
AliExpress Scraper: Products, Prices, Variants & Reviews
AliExpress Scraper turns AliExpress into a clean product data API. Search by keyword or category, or walk pasted search, category and product URLs page by page, across 11 storefront markets (US, UK, DE, FR, ES, IT, BR, CA, AU, NL, PL) with prices in that market's currency. Every result carries identity, price, discount, rating, units sold, media and seller fields; switch on an optional detail step for SKU variant tables, specifications and full seller data, or an optional reviews step for per-product review records. Export to JSON, CSV or Excel, or pull results straight into your app through the API.
Why This Scraper?
- 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.
- Resume without re-paying. Continue an interrupted large pull with
resumeFromRunId, or extend one pull across separate runs, without re-collecting or re-billing products you already have. - 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.
Use Cases
- 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.
Data You Get
Sample shape: values are illustrative placeholders, not from a live listing.
| Field | Example |
|---|---|
type | "product" (also "review" in reviews-only mode) |
productId / id | "1234567890123" |
productUrl / url | AliExpress link to the product |
productName / title | "Bluetooth Earbuds, Wireless Headphones" |
currentPrice / price | 12.99 |
originalPrice | 45.90 |
discountPct / discountPercentage | 72 |
currency | "USD" |
ratingScore / rating | 4.8 |
reviewCount | 2300 |
itemSold / totalSold | "1,000+ sold" |
itemSoldCount / totalSoldCount | 1000 |
inStock / isSponsored | true / false |
sellingPoints | ["New shoppers save $5.00", "Free shipping"] |
sellerName / sellerCompanyName | "Example Store" / "Example Trading Co." |
brandName | "Example Brand" |
primaryImage / imageUrl | product photo URL |
imageGallery / additionalImages | ["https://...jpg", "https://...jpg"] |
categoryId / categoryNames | category id and breadcrumb names |
sourceUrl / seedType / seedValue | which search query or URL this run started from |
shippingCountry | "US" |
fetchedAt / scrapedAt | "2026-09-30T08:20:40.310Z" |
raw | the complete source object (SERP card plus detail page when fetched) |
When Fetch full product detail is on, each product additionally carries skuList (per-variant SKU table with prices), skuPropertyList (size/color/model options), specifications, description, descriptionHtml, breadcrumbs, shipping, warranty, sellerId, sellerPositiveRate, brandId and detail-page images. When Include reviews is on, each product carries an embeddedReviews array; Output reviews only instead emits one record per review with reviewId, buyerName, rating, reviewTime, reviewContent, skuInfo, likeCount and media. Incremental mode adds changeType, changedFields, firstSeenAt and lastSeenAt to every record (see below).
How to Use
- Pick a mode:
search(keyword and filters) orurl(paste search, category or product links). - For search mode, fill in keywords and optional category/price/rating/sort filters. For URL mode, paste the links.
- Turn on Fetch full product detail and/or reviews only if you need them; they add cost and time.
- Set Max products total to control run size and cost, then click Start.
Search by keyword with filters:
{"mode": "search","queries": ["led strip lights"],"shippingCountry": "us","minPrice": 5,"maxPrice": 50,"minRating": 4,"sortBy": "bestSelling","maxListings": 100}
Walk a pasted search URL, with full product detail:
{"mode": "url","urls": ["https://www.aliexpress.com/w/wholesale-earbuds.html"],"fetchDetails": true,"maxListings": 50}
Reviews only, for a keyword search:
{"mode": "search","queries": ["phone case"],"reviewsOnly": true,"maxReviewsPerProduct": 50,"maxListings": 20}
One pasted product URL:
{"mode": "url","urls": ["https://www.aliexpress.com/item/1234567890123.html"],"fetchDetails": true}
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/aliexpress-scraper").call(run_input={"mode": "search", "queries": ["airpods"], "maxListings": 20})for product in client.dataset(run["defaultDatasetId"]).iterate_items():print(product["productName"], product["currentPrice"], product["currency"])
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('abotapi/aliexpress-scraper').call({ mode: 'search', queries: ['airpods'], maxListings: 20 });const { items } = await client.dataset(run.defaultDatasetId).listItems();
Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.
Running multiple queries or URLs in one run
When a run has more than one search query or pasted URL, Max products total is split evenly between them. A product id seen under one query or URL is not collected again under another one in the same run, so you never pay twice for a product that shows up in overlapping searches. This sharing has side effects when the searches overlap:
- When a query or URL reaches its share partway through a results page, the rest of that page still counts as seen. If those products also appear under a later query or URL, they are skipped there too, even when the later one has room left. In incremental mode their price or stock changes are then not reported for that run.
- If a later query's or URL's results page contains only products already seen under earlier ones, the actor treats that page as the end of that query's results and stops. Its later pages are not collected. With
emitExpiredon, tracked products that only appear on those later pages can come back asEXPIRED(and billed) even though they are still listed. - In incremental mode, a product found under a different query or URL than last time comes back
UPDATED, with onlysourceUrlandseedValueinchangedFields.
For monitoring overlapping searches with incremental mode, run each query or URL as its own run with its own state key.
Resume and recurring updates
- Resume (
resumeFromRunId) continues one interrupted run: paste its run or dataset ID and the actor skips every product already saved there (matched by product id), so you don't pay twice. Skipped products are not fetched, returned or charged in any mode: products, embedded reviews, reviews-only rows and the detail surcharge. Some limits:- In reviews-only mode, a product counts as saved once any of its reviews is in that dataset. Reviews the interrupted run had not reached yet for that product are not collected.
- If the result order has shifted since the interrupted run (new products near the top), a results page made up only of already-saved products can end the walk early. Check the item count, and resume again if it looks short.
- Starting incremental mode with resume: the resumed products are not re-billed in that run. The next scheduled run returns them once as
UPDATED(products) orNEW(reviews-only), and they are billed then.
- Incremental mode (
incrementalMode) is for recurring runs over the same search or URL scope. Each product is classifiedNEW,UPDATED(withchangedFields),UNCHANGED(suppressed and not billed unlessemitUnchangedis on),REAPPEAREDorEXPIRED(only after a run that fully scanned the tracked scope, and only withemitExpired).stateKeynames or shares the stored state. Never reuse onestateKeyfor both a reviews-only run and a product run: reviews-only state is tracked per review, so a product run withemitExpiredon would return (and bill) those stored reviews asEXPIREDrows. With incremental mode off, output is exactly as before. - Tip: turning on
emitExpiredwith a low Max products total can still return more EXPIRED rows than that cap in one run: the EXPIRED batch is computed after the capped scan finishes and is not itself limited by Max products total. Raise the cap, or leaveemitExpiredoff, if you monitor a large tracked scope with a small per-run budget. - Tip: in incremental mode, Max products total limits the products scanned, not the rows returned. Unchanged products use up the cap even though they are hidden. If the top results stay unchanged, each scheduled run can hit the cap on them and return nothing, even when new products appear further down. This happens again on every run until the cap is raised. Set Max products total well above the number of products you expect to stay unchanged, or to
0.
Send results into your apps (MCP connectors)
Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape: the Apify dataset is never changed.
What gets written to the connector: a condensed, human-readable summary of each record, not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.
- Authorize a connector once under Apify → Settings → Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
- For Notion, also set
notionParentPageUrlto the page where items should be created.
The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | search | search (keyword/category) or url (walk pasted links). |
shippingCountry | string | us | Target market: pins the connection exit country and the currency/locale the storefront renders. |
queries | array | ["airpods"] | Search keywords (search mode). One paginated walk per keyword. |
categoryId | string | (none) | Optional: restrict a keyword search to one AliExpress category id. |
freeShippingOnly | boolean | false | Request only free-shipping eligible items. |
sortBy | string | relevance | relevance, bestSelling, newest, priceAsc, or priceDesc. |
urls | array | sample | AliExpress search, category or product URLs to walk (url mode). |
minPrice | integer | (none) | Minimum price in the market's currency; dropped after fetching. |
maxPrice | integer | (none) | Maximum price in the market's currency; dropped after fetching. |
minRating | integer | (none) | Drop products whose average rating is below this (1 to 5). |
reviewsOnly | boolean | false | Emit one record per review instead of one per product. |
fetchReviews | boolean | false | Embed each product's top reviews (adds a separate fetch per product). |
maxReviewsPerProduct | integer | 100 | Hard cap on reviews fetched per product. |
fetchDetails | boolean | false | Visit each product's detail page for SKU variants, specifications, description and seller data (adds a per-product fetch and surcharge). |
maxPages | integer | 0 | Optional bound on result pages per query/URL (0 = no limit; still bounded by Max products total). |
maxListings | integer | 3 | Hard cap on products across all keywords/URLs (0 = unlimited). In reviews-only mode this caps discovered products, not reviews. |
resumeFromRunId | string | (none) | Continue one interrupted run without re-collecting or re-billing products already saved there. |
incrementalMode | boolean | false | Return only new and changed products on recurring runs of the same search/URL scope. |
stateKey | string | (none) | Name or share an incremental-mode state; auto-derived from the scope when left empty. |
emitUnchanged | boolean | false | Also return (and bill) unchanged products. |
emitExpired | boolean | false | Also return (and bill) products no longer found after a complete scan. |
proxy | object | Apify Residential (market country) | Connection settings. Residential is required for reliable results; the connection country is pinned to the target market. |
mcpConnectors | array | (none) | Optional: send a summary of each record to apps you authorized under Integrations. |
notionParentPageUrl | string | (none) | Notion connector only: page under which item pages are created. |
maxNotifyListings | integer | 50 | Cap on items written to each connector per run. |
Output Example
Sample shape: values are illustrative placeholders, not from a live listing.
{"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": "200003409","raw": { "serp": {} },"fetchedAt": "2026-09-30T08:20:40.310Z"}
Plan Requirement
Apify Residential is required for reliable results; the default connection setting already selects it, and the actor warns at startup if another group is chosen. For large or frequent runs, keep Residential selected under Connection; a warning is shown if you switch away from it.
FAQ
How much does it cost?
You pay per product (or review) result returned, plus a per-product enrichment surcharge only when Fetch full product detail is on or in reviews-only mode (once per product, not per review). The Pricing tab shows the current rates. Use Max products total to cap the cost of any run.
Is it legal to scrape AliExpress?
This actor collects only publicly available product listing data. You are responsible for how you use it: follow AliExpress's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Prices, titles and specifications are generally facts, but product photos and seller branding may be subject to third-party rights.
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. The actor rotates to a fresh connection automatically (up to 12 browser launches per run, falling back to a broader connection pool after half that budget is spent with no clean response). 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.
🔗 More scrapers you might like
Pair this actor with these related scrapers from the same team:
| 🛒 Lazada Scrape Lazada products and reviews across SEA markets, including Malaysia, Singapore... | 🛒 Americanas Brazil Scrape Americanas Brazil (americanas.com.br) by keyword, department or pasted link... |
| 🛒 Tokopedia Scraper Extract product data from Tokopedia, Indonesia’s largest marketplace. Search by keyword... | 🧩 Mercado Livre Brazil Scrape Mercado Livre Brazil by keyword or URL. Filter by category, brand, price... |
| 🛒 Cdiscount Scraper Scrape product data from Cdiscount.com by keyword, category, or URL. Apply filters and... | 🛒 Naver Shopping Scraper Scrape Naver Shopping products by Korean or English keyword, or by URL. Returns 190+... |
💬 Support & custom scrapers
- 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
- 🛠️ Need another site, extra fields or a private build? Email abotapi@proton.me or message Telegram @abotapi.
- ⭐ Enjoying it? A quick review on the actor page helps other users find it.