# AliExpress Scraper - Product Search, Prices, Ratings & Details (`rjmacarthy/aliexpress-scraper`) Actor

Scrape AliExpress search results and product pages: price, discount, rating, orders sold, badges, plus optional store, SKU variants, stock and shipping options. Keyword search or product URLs, only-new mode for monitoring. No login.

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

## Pricing

from $2.00 / 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.

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 Search Scraper - Products, Prices, Orders & Ratings

**AliExpress Search Scraper** collects public AliExpress search results for any keyword. For each product you get the title, price, original price, discount, star rating, **orders sold as a number**, free-shipping flag, delivery text, badges (Choice, Big Sale, promotions), the sponsored flag, images, category and its rank in the results. Sort by best match, orders or price, filter by price range, and choose the ship-to country and currency. Turn on **Only new products** and schedule it to get only listings you haven't seen before, which is handy for dropshippers watching a niche. It reads the JSON embedded in AliExpress's own search pages: no login and no browser, and **you pay only for the products you get**.

Why this one? Other AliExpress Actors fail 5-17% of their runs, charge for the run start or don't parse the numbers. This one gives clean numbers (orders "9K+ sold" → `9589` when AliExpress has the exact count, discounts in %, prices as numbers) at **$0.002 per product**. It recognises AliExpress's anti-bot page explicitly and keeps partial results instead of failing the run. Its monitor mode charges only for new products.

### What data can you get?

| Field | Example | Notes |
|---|---|---|
| `id`, `url`, `title` | 1005010089186351 | Canonical AliExpress item id and product link |
| `price`, `originalPrice`, `currency`, `discountPct`, `priceText` | 1.09, 4.11, USD, 73 | Numbers, in the currency you choose |
| `rating`, `ordersCount`, `ordersText` | 4.9, 9589, "9K+ sold" | Orders parsed to a number (exact when the listing has it) |
| `freeShipping`, `shippingText` | false, "Fastest delivery in 7 days" | From the result card |
| `badges`, `isAd`, `isChoice` | \["Choice", "Big Sale", "Save $2.43"] | Promotions, AliExpress Choice and sponsored results |
| `aggregatedListing` | true | AliExpress "super link" results that pool sales of similar items from several sellers |
| `imageUrl`, `images` | full-size image URLs | |
| `keyword`, `page`, `position`, `categoryId` | "phone case", 1, 3 | Where the product ranked |
| `listingDataLevel`, `scrapedAt` | "full" | Data-quality flag (see Tips) |

Every item has the same keys. Missing values are `null` (or `[]`). Download the results as JSON, CSV, Excel or HTML, or read them through the API.

### Use cases

- **Dropshipping product research:** find best sellers for a niche and compare prices, discounts and order counts.
- **New-listing monitoring:** schedule a keyword with **Only new products** and get only listings you haven't seen.
- **Price tracking:** follow prices and discounts for a keyword over time, per country and currency.
- **Market analysis:** see how many results a keyword has, what sells, at what price points and with which badges.
- **Ad and placement research:** see which results are sponsored and where products rank.

### How to use it

1. Click **Try for free** or **Start**.
2. Type one or more **Search keywords**.
3. Set **Max products** (default 60) and **Max pages per keyword** (default 3, about 60 products per page).
4. Optional: sort order, price range, **Ship to** country and **Currency**.
5. Click **Start**.

#### Example: best sellers for a keyword

```json
{
    "keywords": ["usb c cable"],
    "sortBy": "orders",
    "maxItems": 20,
    "maxPagesPerKeyword": 1
}
```

#### Example: price range, several keywords, shipped to Germany in euros

```json
{
    "keywords": ["wireless earbuds", "bluetooth speaker"],
    "minPrice": 5,
    "maxPrice": 20,
    "shipTo": "DE",
    "currency": "EUR",
    "maxItems": 100
}
```

#### Example: new-listing monitor

Schedule this daily or hourly (Actor → **Schedules**). The first run outputs everything and becomes the baseline. After that, each run outputs only products that earlier runs with the same **State key** haven't output.

Only products that were actually output are remembered, so give the first (baseline) run a **Max products** high enough to cover the results you care about, or 0 for no limit.

```json
{
    "keywords": ["iphone 16 case"],
    "shipTo": "GB",
    "currency": "GBP",
    "onlyNew": true,
    "stateKey": "uk-iphone16-case",
    "maxItems": 100,
    "maxPagesPerKeyword": 2
}
```

### Output example

Real output from 3 November 2026 (image lists shortened):

```json
[
  {
    "type": "product",
    "id": "1005009845891324",
    "url": "https://www.aliexpress.com/item/1005009845891324.html",
    "title": "Transparent Magnetic Phone Case For iPhone 17 Pro Max 18 16 13 11 15 14 12 17 Air 17Promax Soft Silicone Shockproof Funda Cover",
    "imageUrl": "https://ae-pic-a1.aliexpress-media.com/kf/Sf2ee010c6dc74fcf8b2cd486718444e8J.jpg",
    "images": [
      "https://ae-pic-a1.aliexpress-media.com/kf/Sf2ee010c6dc74fcf8b2cd486718444e8J.jpg",
      "https://ae-pic-a1.aliexpress-media.com/kf/S4e82ac2fbf43463e86217e5f28cd7126W.jpg"
    ],
    "price": 0.33,
    "originalPrice": 3.65,
    "priceText": "US $0.33",
    "currency": "USD",
    "discountPct": 90,
    "rating": 4.6,
    "ordersCount": 3348,
    "ordersText": "3,000+ sold",
    "freeShipping": false,
    "shippingText": null,
    "badges": [
      "Choice",
      "Big Sale",
      "Dollar Express"
    ],
    "isAd": true,
    "isChoice": true,
    "aggregatedListing": null,
    "categoryId": "202229005",
    "keyword": "phone case",
    "page": 1,
    "position": 1,
    "listingDataLevel": "full",
    "scrapedAt": "2026-11-03T10:09:53.950Z"
  },
  {
    "type": "product",
    "id": "1005007823486360",
    "url": "https://www.aliexpress.com/item/1005007823486360.html",
    "title": "Luxury Transparent Case For iPhone 16 15 11 12 13 14 Pro Max Soft TPU Silicone For iPhone XR XS Max 8 Plus Back Cover Clear Case",
    "imageUrl": "https://ae-pic-a1.aliexpress-media.com/kf/Sba03fd9e2b8d40aea726e1a6bdd0f922i.jpg",
    "images": [
      "https://ae-pic-a1.aliexpress-media.com/kf/Sba03fd9e2b8d40aea726e1a6bdd0f922i.jpg"
    ],
    "price": 0.33,
    "originalPrice": 2.95,
    "priceText": "US $0.33",
    "currency": "USD",
    "discountPct": 88,
    "rating": 4.9,
    "ordersCount": 65289,
    "ordersText": "50,000+ sold",
    "freeShipping": false,
    "shippingText": null,
    "badges": [
      "Choice",
      "Big Sale",
      "Dollar Express"
    ],
    "isAd": true,
    "isChoice": true,
    "aggregatedListing": true,
    "categoryId": "380230",
    "keyword": "phone case",
    "page": 1,
    "position": 3,
    "listingDataLevel": "full",
    "scrapedAt": "2026-11-03T10:09:53.950Z"
  }
]
```

### How much does it cost?

This Actor uses **pay per event** pricing. You pay only for the products you get:

| Event | Price | When |
|---|---|---|
| `product` | **$0.002** per product ($2 per 1,000) | Every product saved to the dataset |

Worked examples:

- **1,000 products** ≈ **$2.00**.
- **The prefill** (10 phone cases) ≈ **$0.02**.
- **A daily monitor** that finds about 20 new products per keyword outputs about 600 products a month ≈ **$1.20 a month**.

These are never charged: products already output by earlier runs in **Only new products** mode, duplicates found again on another page or keyword in the same run, and blocked searches. Set **Maximum cost per run** in the run options and the Actor stops cleanly when it reaches it.

### Tips and limits

- **Up to ~60 products per page.** Use **Max pages per keyword** and **Max products** to control the size of a run.
- **Two kinds of result cards.** For most keywords, AliExpress sends full cards with rating, orders, badges and shipping text. For some keywords and sort orders it sends lightweight cards that only have title, image and price. Those items have `listingDataLevel: "basic"`, and the run summary tells you how many there were. Try another sort order or a more specific keyword if you need ratings and orders.
- **No price on some cards.** New-shopper promo cards ("FREE with any purchase", welcome deals) show no regular price on the search page. Then `price` is `null` and the promo is listed in `badges`.
- **Search results only.** The Actor reads search result pages. Store details, reviews, SKU variants, stock and shipping options from product pages are not included.
- **Ship to and currency** change prices and availability, as on the website. Prices are what a logged-out visitor sees, before coupons that need an account.
- **Aggregated listings:** some results ("super links") pool sales of similar items from several sellers. Their rating and order counts are AliExpress's pooled numbers.
- **Not included:** individual reviews, seller contact data and any personal data.

### FAQ

**Is it legal to scrape AliExpress?**
This Actor collects only publicly visible search results that anyone can see on AliExpress without logging in. It does not log in, it doesn't solve or bypass captchas, and it doesn't collect personal data. You are responsible for how you use the data: follow AliExpress's terms, the GDPR and other laws that apply to you. If in doubt, ask a lawyer.

**Do I need an AliExpress account or cookies?**
No. The Actor visits AliExpress like a logged-out shopper, with only the normal locale preference cookie (ship-to country, currency, language).

**What happens if AliExpress shows a captcha?**
The Actor recognises AliExpress's "unusual traffic" / slider-captcha page and never tries to solve it. With a proxy configured, it retries once on a new IP. Without one, it stops that keyword with a clear warning in the log, the status message and `RUN_SUMMARY`, then goes on to the next keyword. Everything scraped before that is kept, and the run fails only if nothing at all could be scraped.

**Do I need a proxy? Can I use residential proxies?**
Usually no proxy is needed. If a run reports AliExpress's anti-bot page, enable **Proxy configuration** with Apify Proxy's automatic (datacenter) proxies. Residential proxies are not supported: if you select the RESIDENTIAL group, the Actor logs a warning and uses Apify datacenter proxy instead. Your own proxy URLs are used as given.

**How does "Only new products" decide what is new?**
The Actor remembers the IDs of the products it has output in a key-value store (`aliexpress-scraper-state`) under your **State key**. Each run outputs, and charges for, only IDs it hasn't seen before. All keywords in the run share that list. IDs not seen for 90 days are forgotten.

**Why is `ordersCount` sometimes more precise than the text?**
AliExpress shows "9K+ sold" but often includes the exact count in the page data. The Actor uses the exact number when it is there and otherwise parses the text (9K+ → 9000).

**I got fewer products than expected.**
Check `RUN_SUMMARY` in the key-value store. For each keyword it shows how many results AliExpress reported, how many products were listed, the duplicates, the already-seen products and any blocking.

### Integrations

- **Apify API:** start runs and download datasets from any language ([API docs](https://docs.apify.com/api/v2)), or use the JavaScript and Python clients.
- **Make, Zapier, n8n:** run the Actor on a schedule and push products to Google Sheets, Airtable, Slack or e-mail.
- **Webhooks:** trigger your own endpoint when a run finishes.
- **MCP / AI agents:** call the Actor from Claude, ChatGPT or any MCP client through the Apify MCP server, e.g. "find the best-selling USB-C cables on AliExpress".

### Changelog

- **0.1 (November 2026):** First release. Keyword search with sort, price range, ship-to country and currency; numeric orders and discounts; badges and sponsored flag; Only new products monitor; explicit anti-bot detection with partial results.

### More scrapers by the same developer

- [AI Visibility Tracker: ChatGPT, Perplexity, Gemini, Claude](https://apify.com/rjmacarthy/ai-search-visibility-tracker)
- [Google Ads Transparency Scraper](https://apify.com/rjmacarthy/google-ads-transparency-scraper)
- [Substack Scraper](https://apify.com/rjmacarthy/substack-scraper)
- [Telegram Channel Scraper](https://apify.com/rjmacarthy/telegram-channel-scraper)
- [ATS Jobs Scraper: Greenhouse, Lever, Ashby & Workday](https://apify.com/rjmacarthy/ats-jobs-scraper)
- [Dice Jobs Scraper](https://apify.com/rjmacarthy/dice-jobs-scraper)

Browse all my Actors on [my Apify Store profile](https://apify.com/rjmacarthy).

### Support

Found a keyword that doesn't work, or need an extra field? Open an issue on the **Issues** tab with your input. Fixes are usually quick.

# Actor input Schema

## `keywords` (type: `array`):

One search per keyword, as typed into the AliExpress search box (e.g. "phone case", "usb c cable").

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

Maximum number of products to output in total for the whole run (0 = no limit).

## `maxPagesPerKeyword` (type: `integer`):

How many search result pages to read per keyword (up to ~60 products per page). 0 = until the results end.

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

Order of search results.

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

Only products priced at or above this (in the selected currency).

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

Only products priced at or below this (in the selected currency).

## `shipTo` (type: `string`):

2-letter country code (US, GB, DE, FR, AU, ...). Sets AliExpress's ship-to country, which changes prices, shipping info and availability in the results.

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

3-letter currency code (USD, EUR, GBP, ...) for prices.

## `onlyNew` (type: `boolean`):

Skip (and don't charge for) products already output by earlier runs with the same State key. Use with a schedule to monitor keywords for new listings. The first run outputs everything and becomes the baseline.

## `stateKey` (type: `string`):

Name of this monitor. Runs with the same key share the list of already-seen products.

## `stateStoreName` (type: `string`):

Named key-value store that keeps the seen-product lists.

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

Usually not needed. If AliExpress shows its anti-bot "unusual traffic" page (the run summary says so), enable Apify Proxy with automatic (datacenter) proxies: the Actor then retries once on a new IP. Residential proxies are not supported: if you select the RESIDENTIAL group, the Actor uses Apify datacenter proxy instead.

## Actor input object example

```json
{
  "keywords": [
    "phone case"
  ],
  "maxItems": 10,
  "maxPagesPerKeyword": 1,
  "sortBy": "default",
  "shipTo": "US",
  "currency": "USD",
  "onlyNew": false,
  "stateKey": "default",
  "stateStoreName": "aliexpress-scraper-state",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Title, price, discount, rating, orders, badges and URL.

## `productsFull` (type: `string`):

Every field.

## `summary` (type: `string`):

Per-input status, counts, request statistics and any blocking warnings.

# 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 = {
    "keywords": [
        "phone case"
    ],
    "maxItems": 10,
    "maxPagesPerKeyword": 1,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("rjmacarthy/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 = {
    "keywords": ["phone case"],
    "maxItems": 10,
    "maxPagesPerKeyword": 1,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("rjmacarthy/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 '{
  "keywords": [
    "phone case"
  ],
  "maxItems": 10,
  "maxPagesPerKeyword": 1,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call rjmacarthy/aliexpress-scraper --silent --output-dataset

```

## MCP server setup

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