# AliExpress Reviews Scraper (`apt_marble/aliexpress-reviews-scraper`) Actor

Collect the public reviews on any AliExpress product: star rating, the shopper's own words plus an English translation, buyer country, the exact variant bought, photos and after-sale follow-ups. One product or a thousand, with the full star breakdown for each.

- **URL**: https://apify.com/apt\_marble/aliexpress-reviews-scraper.md
- **Developed by:** [Hamza](https://apify.com/apt_marble) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.00 / 1,000 review collecteds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## AliExpress Reviews Scraper

Turn any AliExpress product link into a clean table of its public reviews — star
rating, the shopper's own words plus an English translation, the country they
bought from, the exact variant they received, their photos, and the follow-up
they left weeks later. Give it one product or a thousand. It is built for people
who need to read what buyers actually said: sellers sizing up a product before
importing it, brands watching how their listings are received, and analysts who
want the complaints, not the average.

### What you can do with it

- **Vet a product before you source it.** Pull the 1, 2 and 3-star reviews for a
  shortlist of listings and read every complaint in one table.
- **Watch a competitor's listing** on a schedule and see what new buyers say
  week by week.
- **Find the quality problem.** Every row carries the exact variant the shopper
  received, so you can see that the complaints all land on one colour or size.
- **Mine buyer photos** — collect only the reviews that include images, with
  direct links to every photo.
- **Read the second opinion.** After-sale follow-ups are the reviews shoppers
  write once the product has been used for a few weeks; they are collected with
  their own text, their own date and how many days later they were written.
- **Feed sentiment or topic models** with multilingual review text and its
  English translation side by side.

### What you get

One row per review, plus an optional one-row summary per product.

A review row:

```json
{
  "recordType": "review",
  "productId": "1005008909030186",
  "reviewId": "60092251268973215",
  "foundIn": "all reviews",
  "reviewEdition": "ES",
  "stars": 5,
  "ratingPercent": 100,
  "reviewDate": "2025-08-20",
  "reviewDateText": "20 Aug 2025",
  "reviewerName": "M***e",
  "reviewerCountry": "MX",
  "isAnonymous": false,
  "reviewText": "Bocina es de color negro, tiene las 2 salidas...",
  "reviewTextEnglish": "The speaker is black in color, has 2 outputs...",
  "variant": "Color:With Bluetooth 3511 Set Type:Speaker",
  "photoCount": 5,
  "photos": ["https://ae-pic-a1.aliexpress-media.com/kf/A666618a03c5840bb92883d15297826e4B.jpg"],
  "reviewTags": ["Fast"],
  "shippingService": "Aliexpress Selection Standard",
  "isFeaturedReview": true,
  "hasAfterSaleFollowUp": false,
  "aiGeneratedFlag": false,
  "collectedAt": "2026-08-10T09:15:02.114Z"
}
```

A product summary row:

```json
{
  "recordType": "product-summary",
  "productId": "1005008909030186",
  "reviewsCollected": 471,
  "setsRead": ["after-sale follow-ups", "all reviews"],
  "sitePublishingLimitReached": false,
  "writtenReviewsPublished": 471,
  "publishedSetCounts": { "all": 471, "withPhotos": 83, "afterSale": 9, "fromSelectedCountry": 87 },
  "ratingBreakdown": {
    "averageStars": 4.9,
    "fiveStarRatings": 1523,
    "fourStarRatings": 300,
    "threeStarRatings": 147,
    "twoStarRatings": 0,
    "oneStarRatings": 0
  },
  "topMentions": [{ "phrase": "good sound", "mentions": 40, "sentiment": "positive" }]
}
```

### Input reference

| Field | Type | Default | What it does |
| --- | --- | --- | --- |
| `productUrls` | list of text | one example product | One AliExpress product per line — the product link, or just the product number from it. Anything that is not an AliExpress product is skipped and counted in the run summary. |
| `reviewSet` | select | `complete` | Which slice of the product's public reviews to collect. See the table below. |
| `maxReviewsPerProduct` | integer (1–25000) | `200` | Stop after this many reviews for each product. Products with fewer public reviews return everything they publish. |
| `includeAfterSaleFollowUps` | boolean | `true` | Also collect the follow-up comments shoppers add weeks after their first review, and attach that text to those reviews. Applies to the two "Everything" options. |
| `includeProductSummary` | boolean | `true` | Add one summary row per product with the average score, the full star breakdown, how many reviews the product publishes in each slice, and the phrases shoppers mention most. Summary rows count as results. |
| `country` | select | Spain | Which country's edition of the product's review pages to read. It sets the order reviews come back in, and it is the country used by the "reviews from shoppers in the selected country" option. |
| `productsAtOnce` | integer (1–8) | `2` | How many products to work through in parallel. |

`reviewSet` options:

| Option | What you get |
| --- | --- |
| **Everything (deepest coverage, recommended)** | Reads the product's reviews straight through, and when a product is large enough that the site stops publishing more, sweeps it again star band by star band — 5 stars, then 4, then 3, 2 and 1. This reaches several times deeper on heavily reviewed products than any single pass can. |
| **Everything in one straight run** | A single pass. Faster on small products, shallower on big ones. |
| **Positive only** | 5 and 4-star reviews. |
| **Critical only** | 3, 2 and 1-star reviews. |
| **Only reviews that include photos** | Reviews with buyer images attached. |
| **Only after-sale follow-ups** | Only the reviews that carry a later follow-up comment. |
| **Only reviews from shoppers in the selected country** | Reviews written by buyers in the country you chose. |

### Output fields

**Review rows**

| Field | Description |
| --- | --- |
| `recordType` | `review` |
| `productId`, `productUrl` | The product this review belongs to. |
| `reviewId` | Stable identifier for the review. |
| `foundIn` | Which slice this row was collected in, in words ("3 stars", "reviews with photos"). |
| `reviewEdition` | The country edition the reviews were read from. |
| `stars` | 1–5. |
| `ratingPercent` | The same score as the site publishes it, 20–100. |
| `reviewDate`, `reviewDateText` | Calendar date, and the date exactly as shown on the site. |
| `reviewerName`, `reviewerCountry`, `reviewerGender`, `isAnonymous`, `reviewerAvatarUrl` | Who wrote it, as far as the site publishes it. Names are shortened by the site itself. |
| `reviewText` | The review in the language it was written in. |
| `reviewTextEnglish` | The English version the site publishes beside it. |
| `variant` | The exact option the shopper bought — colour, size, bundle. |
| `photoCount`, `photos`, `photoThumbnails` | Buyer photos, full size and small. |
| `reviewTags` | The short tag AliExpress prints on some reviews ("Fast", "Fits ok"). The site does not say which quality the tag refers to, so it is returned on its own rather than attached to one. |
| `shippingService` | The delivery service named on the review. |
| `isFeaturedReview` | The site highlights this review on the product page. |
| `hasAfterSaleFollowUp`, `afterSaleDaysLater`, `afterSaleDate`, `afterSaleDateText`, `afterSaleText`, `afterSaleTextEnglish` | The follow-up comment, how long after the first review it was written, and its translation. |
| `aiGeneratedFlag` | The site marks this review as machine-written. |
| `collectedAt` | When this run read the product. |

**Product summary rows**

| Field | Description |
| --- | --- |
| `recordType` | `product-summary` |
| `reviewsCollected` | Exactly how many reviews this run returned for the product. |
| `setsRead` | Which slices were swept. |
| `sitePublishingLimitReached` | `true` when the product has more public reviews for that selection than the site will hand out. |
| `writtenReviewsPublished` | How many written reviews the site says the product has. |
| `publishedSetCounts` | How many the site says are in each slice: all, with photos, after-sale, from the selected country. |
| `ratingBreakdown` | Average score and the count of 5, 4, 3, 2 and 1-star ratings, as published. It holds no grand total, because the one AliExpress prints there is the number of written reviews and not the number of ratings. |
| `ratingBreakdownCovers` | A plain-English note on which group of shoppers the breakdown counts. |
| `topMentions` | The phrases shoppers mention most, with how often and whether they read positive or negative. |
| `reviewEdition`, `requestedEdition`, `editionSubstituted` | Which country edition was read, which one you asked for, and whether they differ. |

### Pricing

You pay per result, and nothing else.

| What you pay for | Price |
| --- | --- |
| Each result returned — one review, or one product summary | **$1.00 per 1,000** |

Worked example: five products, 1,000 reviews each, with the product summary
turned on, returns 5,005 results — **about $5.01**. A product that turns out to
have no public reviews returns no rows and therefore costs nothing.

### Limits & what this actor cannot do

- **The site publishes only so many reviews for any one selection.** Beyond that
  it stops serving more. The recommended "Everything" option works around this by
  sweeping the reviews star band by star band, which reaches several times
  deeper — in practice up to about 25,000 reviews for a single product — but a
  listing with more reviews than that will return what the site publishes rather
  than every review ever written. When that happens the product summary says so
  in `sitePublishingLimitReached`, so you are never left guessing.
- **The narrower selections have their own, lower ceiling.** "Positive only",
  "Critical only", "Only reviews with photos", "Only after-sale follow-ups" and
  "Only reviews from shoppers in the selected country" each stop at the same
  point the site stops publishing, and they do not sweep star band by star band
  the way the recommended option does. Choose one of the "Everything" options
  when depth matters more than a narrow slice.
- **AliExpress prints a short tag on some reviews without saying what it
  describes.** The same tag is repeated against every quality listed on the
  product, so it is returned as a plain tag and never attached to a quality it
  may not be about.
- **Reviews are shared across every variant of a listing.** AliExpress pools them
  for the whole product family, and there is no way to ask for one variant's
  reviews. Every row carries the variant the shopper actually received, so you
  can group them yourself.
- **The star breakdown counts a wider group than the review list.** It includes
  shoppers who left a score without writing anything. The two are returned as
  separate fields and must not be added together or divided into one another —
  `reviewsCollected` is the only exact count in the output.
- **The counts the site publishes drift.** Two reads of the same product minutes
  apart can report different totals. They are returned as the site's own
  published figures, not as a promise of how many rows you will get.
- **Review dates have day precision.** No time of day is published anywhere, so
  none is invented.
- **Reviews cannot be sorted by newest.** The site ignores every sort instruction
  on its public reviews, so no sort option is offered rather than one that
  quietly does nothing.
- **Reviewer names are already shortened by the site** ("M\*\*\*e"), and some
  shoppers post anonymously. Nothing further about a shopper is available.
- **A product with no reviews and a product that has been taken down look the
  same** from the outside. Both are reported as having no public reviews. A
  product number that was never valid is reported as unavailable, which is a
  different fact and is counted separately in the run summary.
- **There are no questions and answers on AliExpress** — the site removed that
  feature, so no such field exists.
- **The United States edition of the review pages is not offered.** It reports
  every reviewer as being in the United States whoever wrote the review, and it
  withholds most review photos. Reading it would produce confident, wrong data,
  so the actor reads a different edition and every row says which one.
- **Prices, stock and ratings are not part of this actor** — it returns reviews
  and the rating breakdown.
- **Everything is a snapshot** at the moment of collection and keeps changing
  afterwards.
- **Speed depends on the size of the job** and on how quickly the source site
  answers; no fixed throughput is promised.
- **The source site's terms govern automated access.** You are responsible for
  using the data lawfully and in line with those terms, and for handling any
  personal data in line with applicable privacy law.

### FAQ

**Do I need an account on the source site?**
No. Nothing is needed beyond the product links.

**Does it need my login or password?**
No. It never asks for one and never uses one.

**Can I schedule it?**
Yes. Schedule it on Apify like any other actor and it will pick up new reviews
each time it runs.

**Is the data complete?**
It is complete up to what AliExpress publishes. For most products that is every
public review. For very heavily reviewed listings the site stops publishing more
after a point; the recommended option digs several times deeper by sweeping star
band by star band, and the product summary tells you whenever a product hit that
ceiling.

**Can I get the reviews for just one colour or size?**
Not directly — AliExpress pools reviews across the whole product family and
offers no way to filter by variant. Every row tells you which variant the shopper
received, so you can group or filter the results yourself.

**Why is the star breakdown bigger than the number of reviews?**
Because it counts every shopper who left a score, including the many who left no
written review. The two numbers describe different groups of people, which is why
they are returned separately and never merged.

**What happens if a product link is wrong?**
It is skipped, counted, and listed in the run summary. One bad link never stops
the rest of the job.

# Actor input Schema

## `productUrls` (type: `array`):

One AliExpress product per line. Paste the product link, or just the product number from it. Anything that is not an AliExpress product is skipped and counted in the run summary.

## `reviewSet` (type: `string`):

Choose the slice of the product's public reviews you want. "Everything" walks the reviews star band by star band, which reaches far more of a heavily reviewed product than a straight run through the list does.

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

Stop after this many reviews for each product. Products with fewer public reviews return everything they publish.

## `includeAfterSaleFollowUps` (type: `boolean`):

Also collect the follow-up comments shoppers add weeks after their first review, and attach the follow-up text to those reviews. Applies to the two "Everything" options.

## `includeProductSummary` (type: `boolean`):

Adds a single extra row per product holding the average score, the full star breakdown, how many reviews the product publishes in each slice, and the phrases shoppers mention most. Summary rows count as results.

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

Which country's edition of the product's review pages to read. It sets the order reviews come back in, and it is the country used by the "reviews from shoppers in the selected country" option. The United States edition is not offered because it reports every reviewer as being in the United States and withholds review photos.

## `productsAtOnce` (type: `integer`):

How many products to work through in parallel. Higher is faster, but the source site is more likely to slow the run down.

## Actor input object example

```json
{
  "productUrls": [
    "https://www.aliexpress.com/item/1005007805726069.html"
  ],
  "reviewSet": "complete",
  "maxReviewsPerProduct": 100,
  "includeAfterSaleFollowUps": true,
  "includeProductSummary": true,
  "country": "es",
  "productsAtOnce": 2
}
```

# Actor output Schema

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

Every review row collected in this run, plus one summary row per product.

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

Counts of reviews collected, products without reviews, unavailable products and failures.

## `datasetInConsole` (type: `string`):

Browse the results table in the Apify console.

# 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 = {
    "productUrls": [
        "https://www.aliexpress.com/item/1005007805726069.html"
    ],
    "reviewSet": "complete",
    "maxReviewsPerProduct": 100,
    "country": "es",
    "productsAtOnce": 2
};

// Run the Actor and wait for it to finish
const run = await client.actor("apt_marble/aliexpress-reviews-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 = {
    "productUrls": ["https://www.aliexpress.com/item/1005007805726069.html"],
    "reviewSet": "complete",
    "maxReviewsPerProduct": 100,
    "country": "es",
    "productsAtOnce": 2,
}

# Run the Actor and wait for it to finish
run = client.actor("apt_marble/aliexpress-reviews-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 '{
  "productUrls": [
    "https://www.aliexpress.com/item/1005007805726069.html"
  ],
  "reviewSet": "complete",
  "maxReviewsPerProduct": 100,
  "country": "es",
  "productsAtOnce": 2
}' |
apify call apt_marble/aliexpress-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,apt_marble/aliexpress-reviews-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/FJl1nYW5er6KiN5Ya/builds/r7wDzOBN3DQDcjmLZ/openapi.json
