# AliExpress Products Scraper (`neuro-scraper/aliexpress-products-scraper`) Actor

AliExpress Scraper SD - AliExpress Scraper is an e-commerce data tool that extracts AliExpress search results by keyword, search or category URL: price, original price, rating, exact sold count, Choice and ad flags, images and ship-from, plus rating summaries and product reviews.

- **URL**: https://apify.com/neuro-scraper/aliexpress-products-scraper.md
- **Developed by:** [Neuro Scraper](https://apify.com/neuro-scraper) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.49 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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

AliExpress Scraper exports AliExpress search results page after page: price, original price, discount, currency,
rating, exact sold count, Choice and ad flags, ship-from country, selling points, category and images. It also
returns product basics for item URLs and product reviews from AliExpress's public review feed. No login, no cookies
from a browser.

Prices come in the currency you choose (USD, EUR, GBP, CAD, AUD or BRL). The Actor selects it through
AliExpress's own currency switcher at the start of every session, so results do not depend on the proxy country.

#### Input

| Field | Default | Meaning |
|---|---|---|
| `mode` | `products` | `products`: one row per product. `reviews`: one row per review |
| `searchTerms` | `["phone case"]` (prefill) | Keywords, one per line |
| `startUrls` | empty | Search URLs (`/w/wholesale-phone-case.html`, `/wholesale?SearchText=...`), category URLs (`/category/100003109/women-clothing.html`), item URLs (`/item/1005007932835902.html`) or bare product ids. URLs and ids run before search terms |
| `maxItems` | `20` | Total rows (products or reviews) |
| `maxPagesPerSearch` | `60` | Safety cap on result pages per search (AliExpress serves at most 60) |
| `sortBy` | `best_match` | `best_match`, `orders`, `price_asc`, `price_desc` |
| `currency` | `USD` | `USD`, `EUR`, `GBP`, `CAD`, `AUD`, `BRL`, or `AUTO` (AliExpress picks it from the proxy IP) |
| `shipToCountry` | `US` | Two-letter country used for availability, prices and shipping |
| `includeDetails` | `false` | Products mode: add the review summary per product (1 extra request per product). Cards without a gallery (basic cards, single-image cards) also get the gallery from the item page (1 more request). Signed detail data is not included |
| `maxReviewsPerProduct` | `50` | Reviews mode: cap per product (20 per request) |
| `reviewsFilter` | `all` | Reviews mode: `all`, `image` (with photos), `additional` (with follow-up feedback) |
| `proxyConfiguration` | Apify RESIDENTIAL, US | Proxy |

#### Output: product rows

| Field | Meaning |
|---|---|
| `productId`, `title`, `url` | Product id as AliExpress gives it for the ship-to country (US uses its own id range, 3256...), title, item URL |
| `price`, `originalPrice`, `discountPercent`, `currency` | Sale price, struck-through price, discount, ISO currency |
| `rating`, `soldCount`, `soldText` | Card star rating, exact sold count, the "10,000+ sold" text |
| `isChoice`, `isAd`, `shipFrom` | Choice badge, sponsored placement, ship-from country (when the card carries it) |
| `sellingPoints`, `categoryId`, `launchDate` | Badges such as "Free shipping" or "Dollar Express", leaf category id, listing date |
| `image`, `images` | Main image and gallery |
| `reviewsCount`, `positiveRate`, `starCounts` | Only with `includeDetails` or item URLs: AliExpress's review summary |
| `source` | `search_card`, `basic_search_card` (AliExpress sent a reduced card: no rating or sold data) or `item_page` |
| `position`, `page`, `searchTerm`, `inputUrl`, `scrapedAt` | Rank across pages, result page, the input that produced the row, UTC timestamp |

Item URLs give a basics row: title, images, rating, `reviewsCount`, `positiveRate`, `starCounts`.

#### Output: review rows

`reviewId`, `productId`, `productTitle`, `rating` (1-5), `text`, `translatedText` (English), `date`, `reviewerName`
(masked by AliExpress), `reviewerCountry`, `skuInfo` (variant bought), `images`, `helpfulCount`, `logistics`,
`additionalFeedback` (follow-up text, translation, date), `position`, `productUrl`, `searchTerm` / `inputUrl`, `scrapedAt`.

#### Limits (measured 2026-10-03)

- Full product detail is not available: variant (SKU) prices, stock, seller/store, specifications and description
  come only from AliExpress's signed product API (a request signature computed by the page's own script). This
  Actor does not reproduce request signatures. The item page's plain HTML holds only the title and images.
  So item URLs give no price or sold count.
- Search: 57-60 cards per page, at most 60 pages (page 61 is empty), so 3,600 products per query. Runs measured:
  20 products in 4 s; 150 products over 3 pages in 7-9 s.
- AliExpress sometimes sends reduced "basic" cards (only id, title, image, price). The Actor asks again, up to
  2 more times, the last time in a new session. In the paginating runs 3 of 4 affected pages came back full after
  one re-ask. Once, 27 of 150 rows stayed basic; that run came before the new-session retry was added. Basic rows
  are marked `source: basic_search_card`.
- Price sorting is applied within each page, not across pages. In one run page 1 ended at 15,748 BDT and page 2
  started at 444 BDT.
- With ship-to US, AliExpress never answers "no results": a nonsense keyword returned "60,000" unrelated products.
  A product id typed as a keyword does not find that product.
- On "FREE with any purchase" promo cards (ship-to US) AliExpress sends no price. The price then comes from the card's
  tracking amount, which matched the shown price on 1,012 of 1,019 cards.
- Reviews: 20 per request, in AliExpress's default order. A "latest first" sort was not found, so it is not offered.
  A product with no reviews and a nonexistent id both report 0 reviews. For some products `starCounts` add up to
  more than `reviewsCount` (28,976 vs 4,637); the Actor exports both numbers as AliExpress sends them.
- `currency` offers only the 6 currencies tested. An unknown code was accepted by the switcher, but the search then
  returned 0 products.

#### Example input

```json
{"mode": "products", "searchTerms": ["phone case", "wireless earbuds"], "maxItems": 200, "sortBy": "orders",
 "currency": "EUR", "shipToCountry": "DE", "includeDetails": false}
```

# Actor input Schema

## `mode` (type: `string`):

products = one row per product: search terms and search URLs give product cards (price, rating, sold count ...), an item URL or product id gives a product basics row (title, images, rating summary). reviews = one row per review, for every product given by URL/id or found by the search terms.

## `searchTerms` (type: `array`):

What you would type in the AliExpress search box, one per line. Example: phone case

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

Search URLs (https://www.aliexpress.com/w/wholesale-phone-case.html or /wholesale?SearchText=phone+case, filters and sort in the URL are kept), category URLs (https://www.aliexpress.com/category/100003109/women-clothing.html), item URLs (https://www.aliexpress.com/item/1005007932835902.html) or bare product ids (1005007932835902). The kind is detected automatically.

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

Maximum number of rows in total (products in products mode, reviews in reviews mode). Pagination continues page after page until this number is reached or AliExpress has no next page. Example: 100

## `maxPagesPerSearch` (type: `integer`):

Safety cap on result pages read per search term or search URL. AliExpress serves at most 60 pages of 60 cards (3,600 products) per query. Example: 10

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

Order of the search results (AliExpress's own sort options). A sort already present in a pasted search URL wins.

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

Currency of the prices. It is set through AliExpress's own currency switcher at the start of each session. AUTO = AliExpress picks it from the visitor (proxy) IP.

## `shipToCountry` (type: `string`):

Two-letter country code AliExpress uses for availability, prices and shipping, set together with the currency. Example: US, DE, GB. Ignored when currency is AUTO.

## `includeDetails` (type: `boolean`):

For every search result, also load the public review summary: review count, positive rate and star counts (1 extra request per product; cards without a gallery also open the item page for it, 1 more request). Prices per variant, stock, seller/store and specifications need AliExpress's signed product API and are NOT included.

## `maxReviewsPerProduct` (type: `integer`):

How many reviews to read per product, 20 per request, in AliExpress's default review order. Example: 100

## `reviewsFilter` (type: `string`):

all = every review; image = only reviews with photos; additional = only reviews with a follow-up (additional) feedback.

## `proxyConfiguration` (type: `object`):

Residential proxy is recommended and is the default (US). The proxy country decides the currency only when currency is AUTO.

## Actor input object example

```json
{
  "mode": "products",
  "searchTerms": [
    "phone case"
  ],
  "startUrls": [],
  "maxItems": 20,
  "maxPagesPerSearch": 60,
  "sortBy": "best_match",
  "currency": "USD",
  "shipToCountry": "US",
  "includeDetails": false,
  "maxReviewsPerProduct": 50,
  "reviewsFilter": "all",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# 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 = {
    "mode": "products",
    "searchTerms": [
        "phone case"
    ],
    "startUrls": [],
    "maxItems": 20,
    "maxReviewsPerProduct": 50,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("neuro-scraper/aliexpress-products-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 = {
    "mode": "products",
    "searchTerms": ["phone case"],
    "startUrls": [],
    "maxItems": 20,
    "maxReviewsPerProduct": 50,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("neuro-scraper/aliexpress-products-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 '{
  "mode": "products",
  "searchTerms": [
    "phone case"
  ],
  "startUrls": [],
  "maxItems": 20,
  "maxReviewsPerProduct": 50,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call neuro-scraper/aliexpress-products-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,neuro-scraper/aliexpress-products-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/vn6TtQJerepcD2lbf/builds/VzFwSmDau7qQfVgHa/openapi.json
