# AliExpress Scraper — Products, Prices & Reviews · $0.8/1K (`memo23/aliexpress-scraper`) Actor

AliExpress Scraper at $0.80 per 1,000 products: search by keyword or paste any URL and get price, discount, sold count, rating, image, tags and store as clean JSON or CSV. Product, search, mobile, regional, app and share links all work. Optional reviews, currency and country. No login.

- **URL**: https://apify.com/memo23/aliexpress-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** E-commerce, AI, Agents
- **Features:** Limited permissions
- **Stats:** 62 total users, 17 monthly users, 98.1% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $0.65 / 1,000 product scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## AliExpress Scraper — Products, Prices, Discounts & Ratings

Extract structured product data from **AliExpress** at scale — prices, discounts, sold counts, ratings, images and store details — by keyword or URL, from just **$0.8 / 1,000 results**. No login, no cookies, no browser. Clean JSON or CSV out.

![How it works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-aliexpress.png)

### Why use this AliExpress Scraper?

- **Search by keyword or paste any URL** — product pages, category pages, search/wholesale pages, mobile & regional domains, even AliExpress app deep links and short share links are all handled.
- **Rich data straight from search** — price, original price, discount %, sold count, rating, image and promo tags on every row, no detail fetch required.
- **Pick your currency + region** — prices in USD, EUR, GBP, BRL and more, pinned server-side so output never drifts with the proxy's exit country. Titles stay English.
- **Built for scale** — pagination (60 products/page), residential-proxy rotation, and automatic retry through AliExpress's anti-bot.
- **One clean row per product** — you pay per result, never for padding.

### Coming from another AliExpress scraper?

If your current scraper keeps letting you down, here's how this one answers the most common complaints:

| Complaint about other scrapers | This scraper |
|---|---|
| "0 products found / blocked by CAPTCHA even with residential proxies" | Cookie-warmed sessions + automatic IP rotation on every anti-bot block — returns data where others return nothing |
| "JSON response doesn't include all the data" | Rich output on every row: price, original price, discount %, sold count, rating, image, tags, store |
| "Only returns the first page / silently caps results" | Explicit `maxItems`, deep pagination, no hidden cap |
| "Duplicate products across runs" | Deduplicated by product ID within the run |
| "No way to get prices in my currency" | Selectable `currency` + `country` (USD, EUR, GBP, BRL, …) |
| "No way to sort or filter — I get 1,000 random products" | Sort by orders / price / newest, price range and free-shipping filters applied by AliExpress itself, plus min-rating and min-orders filters on the results |
| "I need the reviews, not just the star average" | `includeReviews` pulls buyer reviews per product — English text and the original, date, country, variant bought, photos, helpful votes — plus the product's full star breakdown. The Reviews output is one row per review |
| "Too expensive" | From **$0.0006–0.0008 per result** — the lowest on the Store |

### Overview

AliExpress is one of the largest global marketplaces, with hundreds of millions of listings across electronics, fashion, home, tools and more. This scraper turns any AliExpress search or product URL into structured data you can use for **price monitoring, product research, dropshipping sourcing, competitor analysis, and market intelligence**.

It runs on a pure HTTP stack (no headless browser), reads the product data AliExpress embeds in its own search pages, and returns it as tidy JSON/CSV — fast and cheap.

### Supported inputs

| Input type | Example |
|---|---|
| Keyword search | `wireless earbuds`, `mechanical keyboard` |
| Product URL | `https://www.aliexpress.com/item/1005009437537145.html` |
| Search / wholesale URL | `https://www.aliexpress.com/w/wholesale-drone.html` |
| Category page | `https://www.aliexpress.com/category/200003411/interior-accessories.html` |
| Mobile / regional domain | `https://m.aliexpress.com/item/...`, `https://de.aliexpress.com/item/...`, `aliexpress.us` |
| App deep link | `aliexpress://productDetail?productId=1005009437537145` |
| Short share link | `https://a.aliexpress.com/_mNxYzAb` |

All URL formats are auto-normalized to the canonical product/search URL.

> **Direct product URLs** return title, price, discount, rating, review count, sold count and store. Turn on `scrapeDetails` to also get every variant, shipping and the seller card for them.

### Use cases

- **Price monitoring & repricing** — track sale price, original price and discount over time.
- **Dropshipping product sourcing** — find high-sold, high-rated products and their stores.
- **Competitor & market research** — map what sells in a category, at what price, with what ratings.
- **Catalog building** — pull titles, images and prices for thousands of products by keyword.
- **Deal & trend discovery** — surface the biggest discounts and best-selling items in any niche.

### How it works

1. You provide keyword searches and/or AliExpress URLs.
2. The scraper builds canonical wholesale-search URLs and normalizes any pasted links (category pages, deep links, share links, mobile/regional domains) to the web form.
3. It fetches each search page through a residential proxy with a warmed, locale-pinned session, and reads the product list AliExpress embeds in the page.
4. Results are paginated (60 products per page) up to your **Max items** limit.
5. With `scrapeDetails`, each product's details come from AliExpress's product API: every variant with its own price and stock, shipping options and delivery dates to your `country`, the seller card, specs, gallery and video.
6. Every product is written to the dataset as one clean row.

### Input configuration

| Field | Type | Description |
|---|---|---|
| `searchQueries` | array | Keywords to search on AliExpress. Each is paginated up to `maxItems`. |
| `startUrls` | array | Direct product / category / search / mobile / regional / deep-link / share-link URLs. |
| `scrapeDetails` | boolean | Add variants (price and stock each), shipping to `country`, seller card, specs, gallery and video. One extra request per product, charged as `additional-data` only when details come back. Default `false`. |
| `currency` | string | Price currency for the output — USD, EUR, GBP, BRL, AUD, and more. Default `USD`. Titles stay English on the global site. |
| `country` | string | Shipping region (ISO-2) for shipping estimates and regional promo prices. Default `US`. `RU` selects the Russian site. |
| `site` | string | `aliexpress.com` (default) or `ru.aliexpress.com`. Country Russia, or a pasted Russian URL, selects the Russian site even when this stays on Global. |
| `sortBy` | string | `default` (best match), `orders` (most sold first), `price_asc`, `price_desc`, `newest`. Applied by AliExpress. |
| `minPrice` / `maxPrice` | integer | Price bounds in the output currency. Applied by AliExpress, so pages come back already filtered. |
| `freeShipping` | boolean | Only listings AliExpress marks as free shipping to `country`. Default `false`. |
| `minRating` | integer | Drop products rated below this many stars (1–5). Applied to the results; products with no rating yet are kept. |
| `minOrders` | integer | Drop products with fewer orders. "1,000+ sold" counts as 1000. Products with no count shown are kept. |
| `includeReviews` | boolean | Fetch buyer reviews per product. Nested on the product row, and one row each in the **Reviews** dataset (CSV is one review per line). One extra request per 20 reviews. Default `false`. |
| `maxReviews` | integer | Cap per product when `includeReviews` is on. Rounded up to pages of 20. Default `20`. |
| `maxItems` | integer | Hard cap on products returned. Default `100`. |
| `maxConcurrency` | integer | Parallel detail fetches (only when `scrapeDetails` is on, at most 6). Default `8`. |
| `proxy` | object | Proxy config. **Residential is required** — AliExpress blocks datacenter IPs. |

### Output overview

Each product is one dataset row with price, discount, sales, rating, image, store and promo data. Search-level runs populate the core commerce fields; enable `scrapeDetails` to add variants, stock, shipping, seller, specs, gallery and video.

With `includeReviews`, the same reviews are nested on the product and written again as one row per review in the **Reviews** output. Export that dataset for a spreadsheet. Those rows are not billed as products. The **Run summary** record (`RUN_SUMMARY` in the key-value store) has the counts, the site (`glo` or `rus`), and `detailFallbacks`.

When a detail page is refused, the product row keeps the listing fields, `_warnings` contains `detail_page_blocked_used_listing_data`, and the `additional-data` charge is not applied.

### Output sample

```json
{
  "productId": "3256811844384040",
  "title": "2026 New TWS Wireless Earphones with Bluetooth 5.4 Gaming Headset Sport Earbuds with LED Display",
  "productUrl": "https://www.aliexpress.com/item/3256811844384040.html",
  "image": "https://ae-pic-a1.aliexpress-media.com/kf/S0e29ca8ecde64e12a58e4c939d28ce3eZ.jpg",
  "salePrice": "US $13.44",
  "salePriceValue": 13.44,
  "originalPrice": "US $41.13",
  "currency": "USD",
  "discountPct": 67,
  "soldCount": "1,000+ sold",
  "rating": 4.9,
  "reviewCount": null,
  "storeName": null,
  "storeUrl": null,
  "tags": ["New shoppers save $27.69", "Free shipping"],
  "sourceQuery": "wireless earbuds",
  "scrapedAt": "2026-07-21T11:19:02.413Z"
}
```

### Key output fields

| Field | Description |
|---|---|
| `productId` | AliExpress product ID |
| `title` | Product title |
| `productUrl` | Canonical product URL |
| `salePrice` / `salePriceValue` | Current price (formatted + numeric) |
| `originalPrice` | Pre-discount price |
| `currency` | Currency code (USD by default) |
| `discountPct` | Discount percentage |
| `soldCount` | Units sold (e.g. "1,000+ sold") |
| `rating` | Star rating (0–5) |
| `soldCountValue` | `soldCount` as a number — "1,000+ sold" → `1000` |
| `reviews` | With `includeReviews`: array of `{ reviewId, rating, text, originalText, date, buyerName, buyerCountry, anonymous, sku, logistics, images, upVotes, downVotes }` |
| `reviewStats` | With `includeReviews`: `{ averageStar, totalReviews, fiveStar, fourStar, threeStar, twoStar, oneStar }` |
| `image` | Primary product image |
| `tags` | Promo / shipping badges |
| `storeName` / `storeUrl` | Seller store *(with `scrapeDetails`, and for direct product URLs)* |
| `skus` | *(with `scrapeDetails`)* one entry per variant: `attributes` (Color, Size, Ships From), `price`, `originalPrice`, `stock`, `maxBuyCount`, `available`, `image` |
| `priceRange` / `originalPriceRange` | *(with `scrapeDetails`)* lowest and highest price across variants |
| `shipping` | *(with `scrapeDetails`)* options to `country`: `method`, `carrier`, `fee`, `freeShipping`, `shipFrom`, `deliveryDaysMin`/`Max`, `estimatedDelivery`, `tracking`, `available` |
| `shipsToCountry` / `totalStock` | *(with `scrapeDetails`)* deliverable to `country`; units across all variants |
| `store` | *(with `scrapeDetails`)* `name`, `id`, `rating`, `positiveRate`, `communicationRating`, `soldLast180Days`, `country`, `openedAt`, `topRatedSeller` |
| `specs` / `images` / `video` / `description` | *(with `scrapeDetails`)* specs table, gallery, product video, seller description page URL |
| `categoryPath` / `certifications` / `documents` | *(with `scrapeDetails`)* category ids, certificates, PDF manuals |
| `detailStatus` | *(with `scrapeDetails`)* `ok`, `unavailable` (no longer sold) or `not_found` (removed) |
| `_warnings` | `detail_page_blocked_used_listing_data` when the detail page was refused and the row kept the listing fields |

### FAQ

**Do I need cookies or a login?** No. The scraper is fully no-login, no-cookies.

**Why are `storeName` and `reviewCount` empty?** AliExpress doesn't put them in search results. Turn on `scrapeDetails` and they come back with the rest of the product details.

**I only need details for a list of product links.** Paste them into `startUrls`, or use the [AliExpress Product Details Scraper](https://apify.com/memo23/aliexpress-product-details-scraper), built for product lists and charging only for products that come back.

**Why is a search price lower than the price in the product details?** The search card shows the price AliExpress puts on it, which is the cheapest variant and sometimes includes a new-shopper deal or coupon. In a sample of 14 products 11 matched exactly; the other 3 showed a lower card price. Turn on `scrapeDetails` to get every variant's own price (`skus`) and the real range (`priceRange`).

**Can I scrape with country set to Russia?** Yes. Country `RU`, site `ru.aliexpress.com`, or a pasted `ru.aliexpress.com` / `aliexpress.ru` URL runs on the Russian site. An `aliexpress.ru` link whose ID starts with `1_` (like `/item/1_542628186.html`) is an AliExpress Russia listing this actor cannot open. The run skips it; paste the `www.aliexpress.com` link instead if the product is sold there too. Titles come back in Russian. Prices stay in the currency you chose, and shipping is quoted for the country you set (Russia, when that is the country). Belarus, Kazakhstan and the other CIS countries (BY, KZ, AM, AZ, GE, KG, MD, TJ, TM, UZ) still search the global site, with shipping quoted for the US, because that regional site answers with a block page. The run log says when that rewrite happens, and `RUN_SUMMARY.regionRewritten` is true.

**Why does a knife search return nothing for some countries?** AliExpress doesn't list knives for every country. Shipping to France, for example, it shows no results for "knife", "pocket knife" or "knife strop". If your search is for something used with knives (a whetstone, strop, sharpener, holder or sheath), the actor searches again without the word "knife". Those rows keep your search in `sourceQuery`, and `searchedAs` shows the words that found them. A search for knives themselves ends with a "no results" message, and you're not charged for it.

**Do I need residential proxies?** Yes. AliExpress blocks datacenter IPs; the actor ships with a working residential pool by default.

**What currency / language do I get?** English titles and USD prices by default on the global site, pinned server-side regardless of proxy location. The Russian site returns Russian titles.

**How many products per search?** 60 per page; it paginates automatically up to your `maxItems`.

### Support

Found a bug or need a field added? Open an issue on the actor's **Issues** tab and it'll be looked at quickly.

### Additional services

Need this data enriched, on a schedule, or pushed to your warehouse/webhook? Reach out via the Issues tab — custom fields, monitoring runs and integrations are available.

### Explore more scrapers

Check the publisher profile for more e-commerce and marketplace scrapers, including AliExpress's sister marketplaces and other product catalogs.

- [**1688 Wholesale Scraper**](https://apify.com/memo23/1688-wholesale-scraper) — the same kinds of products at factory prices on 1688.com, with tier pricing, MOQ and supplier
- [**1688 Image Search**](https://apify.com/memo23/1688-image-search-scraper) — find the 1688 factories and wholesalers selling a product, from its photo

### 🤖 For AI Agents & LLM Apps

This actor returns clean, flat JSON ideal for RAG pipelines and agent tool-calling: one product per row, stable field names, numeric price fields (`salePriceValue`, `discountPct`, `rating`) ready for filtering and ranking without post-processing. Point your agent at a keyword or a product URL and get structured commerce data back.

### ⚠️ Disclaimer

This scraper collects only publicly available data from AliExpress. It does not log in, bypass authentication, or access private data. You are responsible for using the scraped data in compliance with AliExpress's terms, applicable laws (including copyright and data-protection regulations), and for any downstream use. Use responsibly.

### SEO Keywords

AliExpress scraper, AliExpress API, AliExpress product scraper, AliExpress price scraper, scrape AliExpress, AliExpress data extraction, AliExpress product data, dropshipping scraper, AliExpress search scraper, AliExpress listings, product price monitoring, e-commerce scraper, AliExpress ratings, AliExpress sold count, AliExpress store scraper, marketplace scraper, AliExpress crawler, AliExpress JSON, AliExpress CSV export.

# Actor input Schema

## `searchQueries` (type: `array`):

Keywords to search on AliExpress (e.g. "wireless earbuds", "mechanical keyboard"). Each becomes a wholesale search and is paginated (60 products per page) up to your Max items limit.

## `startUrls` (type: `array`):

Direct AliExpress URLs. Accepts product pages (`/item/<id>.html`), search/wholesale pages (`/w/wholesale-...`), category pages (`/category/<id>/...`), mobile & regional domains (`m.`, `de.`, `aliexpress.us`), app deep links (`aliexpress://...`) and short share links (`a.aliexpress.com/_xxx`). All are auto-normalized. aliexpress.ru links whose ID starts with 1\_ (like `/item/1_542628186.html`) are AliExpress Russia's own listings and are skipped.

## `scrapeDetails` (type: `boolean`):

Adds every variant with its own price and stock, shipping options and delivery dates to your country, the seller card, specs, gallery and video. One extra request per product, charged as additional data only when details come back. Leave off if the search-level fields are enough.

## `currency` (type: `string`):

Currency for all prices in the output. Titles remain English regardless.

## `country` (type: `string`):

Country for shipping estimates and regional promo prices. Russia uses ru.aliexpress.com (Russian titles, your currency, shipping to Russia). Belarus, Kazakhstan and the other CIS countries still search the global site with shipping quoted for the US; prices still use your currency.

## `site` (type: `string`):

Global keeps English titles. Russia uses ru.aliexpress.com: Russian titles, prices in your currency, shipping for the ship-to country. Choosing country Russia selects this site even if you leave it on Global. A pasted ru.aliexpress.com or aliexpress.ru URL does the same, except an aliexpress.ru listing with a 1\_ ID, which is skipped.

## `sortBy` (type: `string`):

Order AliExpress returns results in. <b>orders</b> puts the most-sold products first, <b>newest</b> the most recently listed.

## `minPrice` (type: `integer`):

Lowest price to include, in the output currency.

## `maxPrice` (type: `integer`):

Highest price to include, in the output currency.

## `freeShipping` (type: `boolean`):

Only listings AliExpress marks as free shipping to the selected country.

## `minRating` (type: `integer`):

Drop products rated below this many stars (1–5). Products with no rating yet are kept.

## `minOrders` (type: `integer`):

Drop products with fewer orders than this. AliExpress shows counts as floors ("1,000+ sold" counts as 1000). Products with no count shown are kept.

## `includeReviews` (type: `boolean`):

Fetch buyer reviews for every product: rating, English text and the original, date, buyer country, variant bought, photos and helpful votes, plus the product's star breakdown. One extra request per 20 reviews per product.

## `maxReviews` (type: `integer`):

Cap per product when <b>Include reviews</b> is on. Rounded up to whole pages of 20.

## `maxItems` (type: `integer`):

Hard cap on the number of products returned across all queries and URLs. One search page yields up to 60 products; raise this to paginate deeper.

## `maxConcurrency` (type: `integer`):

Maximum number of detail pages fetched in parallel (only relevant when "Scrape product detail pages" is on).

## `proxy` (type: `object`):

Residential proxies are REQUIRED — AliExpress blocks datacenter IPs. The actor ships with a working residential pool by default; override here only if you have your own residential proxy.

## Actor input object example

```json
{
  "searchQueries": [
    "wireless earbuds"
  ],
  "startUrls": [],
  "scrapeDetails": false,
  "currency": "USD",
  "country": "US",
  "site": "aliexpress.com",
  "sortBy": "default",
  "freeShipping": false,
  "includeReviews": false,
  "maxReviews": 20,
  "maxItems": 100,
  "maxConcurrency": 8,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `products` (type: `string`):

One row per product. Reviews are nested on the row and also written as separate rows in the reviews dataset.

## `reviews` (type: `string`):

One row per buyer review, written when Include reviews is on. These rows are not charged as products.

## `runSummary` (type: `string`):

Counts, the site used, and how many detail pages fell back to listing data.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchQueries": [
        "wireless earbuds"
    ],
    "startUrls": [],
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/aliexpress-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchQueries": ["wireless earbuds"],
    "startUrls": [],
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/aliexpress-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQueries": [
    "wireless earbuds"
  ],
  "startUrls": [],
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call memo23/aliexpress-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,memo23/aliexpress-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/EmYtEMbEKSU05ktkF/builds/e75C0RRXI1c1p7Tk8/openapi.json
