# AliExpress Product Scraper - Prices, Sales & Ratings (`cirkit/aliexpress-product-search-scraper`) Actor

Scrape AliExpress search results by keyword: price, original price, discount percent, exact units sold, star rating, warehouse country, launch date and a sponsored-listing flag. Sort by price or orders, filter by price range. No login needed.

- **URL**: https://apify.com/cirkit/aliexpress-product-search-scraper.md
- **Developed by:** [Crikit](https://apify.com/cirkit) (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 $0.90 / 1,000 products

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?

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

### What is AliExpress Product Scraper?

**AliExpress Product Scraper** lets you extract full product listings from AliExpress search results by keyword, helping you find winning products before your competitors do, track competitor pricing, and build supplier shortlists without opening a single browser tab.

It returns the numbers AliExpress hides behind rounded badges. Where the site shows you "4,000+ sold", this actor gives you **4,285**.

- 🎯 **Find winning products faster:** sort by order volume and read the exact units sold, the launch date and the discount depth on every listing, so you can spot a product that is selling hard and only launched six weeks ago.
- 💰 **Track competitor pricing:** pull current price, original price and discount percent across hundreds of listings for any keyword, then re-run it on a schedule to watch prices move.
- 🚚 **Filter by warehouse country:** every row says whether the item ships from a US, CN or other local warehouse, which is the difference between a 3-day and a 30-day delivery promise for your customers.
- 🧹 **Get clean data, not a mixed bag:** AliExpress quietly injects paid placements and "free with any purchase" gift cards into its own search results. Every row here is flagged, so you can drop them in one filter instead of wondering why a fifth of your rows look wrong.
- 📊 **Export anywhere:** JSON, CSV, Excel or Google Sheets, or pull it straight from the Apify API into your own pipeline.

**What the AliExpress site will not do for you:** the search UI gives you no export, no exact order counts, and no way to tell a sponsored card from an organic one. This actor gives you all three, at 60 products per page and up to about 3,600 products per keyword.

### What data does AliExpress Product Scraper extract?

- 🏷 Product title and product ID (`title`, `productId`)
- 🔗 Canonical product URL (`productUrl`)
- 💲 Current sale price, currency and formatted price (`price`, `currency`, `priceFormatted`)
- 🏷 Original pre-discount price and discount percent (`originalPrice`, `discountPercent`)
- 📦 **Exact units sold**, unrounded (`soldCount`), plus the rounded text AliExpress displays (`soldText`)
- ✅ A flag telling you whether that sold count is exact or rounded (`soldCountIsExact`)
- ⭐️ Star rating (`rating`)
- 🚚 Warehouse country the item ships from (`shipFromCountry`)
- 📅 Listing launch date (`launchedAt`), the field that lets you find new products
- 📣 Sponsored placement flag (`isSponsored`)
- 🎁 Promotion type and label for gift and channel cards (`promotionType`, `promotionLabel`)
- 🎖 Promo badges such as "Free shipping" and "Lowest price in 90 days" (`badges`)
- 📸 Main image plus the full image gallery (`imageUrl`, `images`)
- 🔑 SKU ID of the priced variant (`skuId`)
- 🔎 The search term, source URL, page and on-page position each row came from

### How to use AliExpress Product Scraper

1. Click **Try for free** to open the actor in Apify Console.
2. Type one or more keywords into **Search terms**, one per line. Any language works, including Chinese.
3. Set **Max results** to cap your spend. This is the number you are billed on.
4. Optionally pick a **Sort by** order, set a price range, or tick **Exclude sponsored listings**.
5. Click **Start**, then export the results as JSON, CSV or Excel, or fetch them from the API.

### Input

```json
{
  "searchTerms": ["wireless earbuds", "phone case"],
  "maxItems": 500,
  "sortBy": "ordersDesc",
  "minPrice": 5,
  "maxPrice": 50,
  "excludeSponsored": true,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

| Field | Type | Notes |
|---|---|---|
| `searchTerms` | array | Keywords to search. Each is walked page by page. |
| `maxItems` | integer | Total row cap across all terms. `0` means no limit. Defaults to 200. |
| `sortBy` | string | `relevance`, `ordersDesc`, `priceAsc` or `priceDesc`. |
| `minPrice` / `maxPrice` | integer | USD price range. Applied by AliExpress itself. |
| `excludeSponsored` | boolean | Drop paid placements entirely. |
| `maxPagesPerQuery` | integer | Cap page depth per term, 1 to 60. |
| `startUrls` | array | AliExpress `/w/wholesale-*.html` search URLs, if you would rather build the search on the site. |
| `proxyConfiguration` | object | Defaults to Apify datacenter proxy, which is enough here. |

### Output

One row per product. Trimmed to the interesting fields:

```json
{
  "productId": "3256811621288203",
  "title": "2026 New Air 3 Pro Bluetooth Wireless Earbuds, Active Noise Cancellation",
  "productUrl": "https://www.aliexpress.com/item/3256811621288203.html",
  "price": 24.12,
  "currency": "USD",
  "originalPrice": 63.89,
  "discountPercent": 62,
  "rating": 4.9,
  "soldCount": 4285,
  "soldCountIsExact": true,
  "soldText": "4,000+ sold",
  "shipFromCountry": "US",
  "launchedAt": "2026-03-09",
  "isSponsored": false,
  "promotionType": null,
  "badges": ["Free shipping"],
  "searchTerm": "wireless earbuds",
  "page": 1,
  "position": 1,
  "...": "..."
}
```

The dataset ships two ready-made table views: **Overview** for the whole result set, and **Product research** for the demand signals on their own (exact units sold, price, discount, rating, launch date and badges).

### How much does it cost to scrape AliExpress?

A flat **$0.90 per 1,000 products**. No monthly rental, no per-run minimum, no separate charge for pagination.

| Results | Cost |
|---|---|
| 1,000 | $0.90 |
| 10,000 | $9.00 |
| 100,000 | $90.00 |

You are billed per row returned, so `maxItems` is a hard spend cap. The cheapest comparable AliExpress actor on the Apify Store charges $2.00 per 1,000 and the most expensive charges $5.00, so this runs at roughly 45% of the cheapest alternative.

Gift-promo cards and sponsored rows are billed like any other row, which is why `excludeSponsored` exists. A search that finds nothing returns a single explanatory row rather than a page of unrelated suggestions, so a bad keyword costs you one row instead of sixty.

### Measured coverage

From 549 product rows across 19 QA cases, all run through the Apify datacenter proxy on 2026-09-08. The "real listings" column excludes the 109 unpriced gift-promo cards, which carry no price by design.

| Field | All rows | Real listings |
|---|---|---|
| `productId`, `title`, `productUrl`, `imageUrl` | 100% | 100% |
| `price`, `currency` | 80.1% | **100%** |
| `soldCount` | 100% | 100% |
| `soldCount` exact rather than rounded | - | **100%** |
| `shipFromCountry`, `skuId` | 80.1% | **100%** |
| `launchedAt` | 100% | 100% |
| `originalPrice`, `discountPercent` | 78.0% | 97.3% |
| `images` gallery | 99.6% | 99.5% |
| `badges` | 67.8% | 84.5% |
| `rating` | 87.2% | 84.1% |

`rating` is genuinely absent on new listings that have no reviews yet, and `originalPrice` is absent when an item is not discounted. Those are real gaps in AliExpress's data, not scraping failures, and they come back as `null` rather than as a dropped row.

Sponsored placements made up 19.7% of all rows returned across those runs.

### Limits

- **About 3,600 products per keyword.** AliExpress serves 60 products per page and stops at roughly 60 pages. For a bigger harvest, split the keyword into narrower ones or add a price range.
- **No "newest first" sort.** AliExpress does not honour one, so the actor does not pretend to offer it. Sort by `ordersDesc` and use the `launchedAt` field to find recent listings instead.
- **Search results only.** This actor reads search and category pages. It does not open individual product pages, so there are no per-variant SKU prices, shipping quotes, seller profiles or reviews.
- **Prices are what AliExpress shows your session.** AliExpress personalises pricing with new-shopper and bulk discounts, so a price here can differ from what a logged-in buyer sees at checkout.
- **`totalResults` is an estimate.** AliExpress's own result count drifts between requests for the same keyword, so the actor never uses it as a stopping condition and neither should you.
- **Very narrow keywords return one explanatory row.** When AliExpress has no strong match it offers unrelated suggestions; those are suppressed on purpose so you are not billed for them.

### FAQ

#### Is it legal to scrape AliExpress?

This actor reads only public product listings that AliExpress serves to any visitor with no login and no cookies. It collects no personal data and no account data. Scraping publicly available information is broadly lawful in the US and EU, but you are responsible for how you use the data, including complying with AliExpress's terms and with copyright and database rights in your jurisdiction. If you are unsure, take legal advice.

#### Do I need an AliExpress account or API key?

No. There is no login step, no cookie to paste and no API key. Paste a keyword and run it.

#### Can I use AliExpress Product Scraper as an API?

Yes. Every Apify actor is callable over REST. See the [Apify API docs](https://docs.apify.com/api/v2) and the **API** tab on the actor page for ready-made snippets with your token filled in.

#### Can I use this in Python?

Yes, with `apify-client`:

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cirkit/aliexpress-product-search-scraper").call(
    run_input={"searchTerms": ["wireless earbuds"], "maxItems": 500, "sortBy": "ordersDesc"}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["title"], item["price"], item["soldCount"])
```

#### How do I schedule AliExpress Product Scraper to run automatically?

Use Apify **Schedules** to run it hourly, daily or on any cron expression, then have each run append to the same dataset or fire a webhook. Scheduling a daily run on your key keywords is how you build a price-history series.

#### Can I integrate it with other apps?

Yes. Apify has native integrations for Google Sheets, Slack, Zapier, Make, GitHub and Airtable, plus generic webhooks that fire when a run finishes. You can push results straight into a sheet without writing any glue code.

#### Why did I get fewer results than expected?

The usual causes, in order of likelihood:

1. **`maxItems` capped the run.** It is a total across all search terms, and terms are processed in order, so a low cap can be used up entirely by the first keyword.
2. **A price range that almost nothing matches.** The actor stops after a few near-empty pages rather than paging through the whole catalogue on your budget. Widen the range.
3. **The keyword is too narrow.** AliExpress returned unrelated suggestions instead of matches, and those are suppressed. Try a broader term.
4. **You hit the roughly 3,600-product ceiling** for that keyword.

The run log names which of these applied.

#### Why is `price` null on some rows?

Those rows are AliExpress "free with any purchase" gift cards, which genuinely have no price. They are flagged with `promotionType: "buyFree"`, so you can filter them out in one step. Across QA runs, every single unpriced row was one of these, and every real listing had a price.

#### What is the difference between `soldCount` and `soldText`?

`soldText` is the rounded badge AliExpress displays, such as `"4,000+ sold"`. `soldCount` is the exact figure behind it, such as `4285`. `soldCountIsExact` tells you which you got. On real listings in QA, the exact number was available 100% of the time.

#### Can I get a field that is not listed?

If it appears on the AliExpress search results page, it can probably be added. Open an issue on the actor's **Issues** tab with the field and an example URL.

### You might also like

- [Amazon Product Scraper](https://apify.com/cirkit/amazon-product-scraper) for the same product research on Amazon
- [eBay Product Scraper](https://apify.com/cirkit/ebay-product-scraper) for resale and sold-comps pricing
- [Etsy Shop Product Scraper](https://apify.com/cirkit/etsy-shop-product-scraper) for handmade and print-on-demand niches
- [Google Shopping Scraper](https://apify.com/cirkit/google-shopping-scraper) to compare a product's price across retailers
- [Walmart Product Scraper](https://apify.com/cirkit/walmart-product-scraper) and [Target Product Scraper](https://apify.com/cirkit/target-product-scraper) for US retail benchmarks

### Changelog

#### 0.1 (2026-09-08)

- First release. Keyword and start-URL search, four sort orders, price-range filtering, sponsored-listing exclusion, exact sold counts, warehouse country, launch date and gift-promo detection.

# Actor input Schema

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

Keywords to search on AliExpress, one per line. Each term is walked page by page (60 products per page). Works with any language, including Chinese.

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

Stop after this many products in total, across all search terms. Set to 0 for no limit. This is what you are billed on, so it is the safest way to cap spend.

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

How AliExpress should order the results. 'Most orders' surfaces proven sellers, which is usually what you want for product research. There is no 'newest' option because AliExpress does not honour one; use the launchedAt field in the output to find new listings instead.

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

Only return products at or above this price. Leave empty for no minimum.

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

Only return products at or below this price. Leave empty for no maximum.

## `excludeSponsored` (type: `boolean`):

AliExpress mixes paid placements into organic search results. Turn this on to drop them and keep only organic listings. Every row carries an isSponsored flag either way.

## `maxPagesPerQuery` (type: `integer`):

Hard cap on how deep to page into one search term. 60 products per page, and AliExpress serves at most 60 pages per query (about 3,600 products). Leave empty to page until the results run out.

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

AliExpress search URLs to scrape directly, if you would rather build the search on the site and paste the link. Supports /w/wholesale-\*.html search pages and /category/ browse pages. Filters already in your URL are kept as-is. Single /item/ product pages are not supported.

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

Proxy settings. The default Apify datacenter proxy is enough for AliExpress and is the cheapest option; there is no need to pay for residential here.

## Actor input object example

```json
{
  "searchTerms": [
    "wireless earbuds"
  ],
  "maxItems": 100,
  "sortBy": "relevance",
  "excludeSponsored": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Everything this run collected as the Overview table: product, price, discount, units sold, rating, warehouse country, launch date and link.

## `productResearch` (type: `string`):

The demand signals on their own: exact units sold, whether that count is exact, price, discount, rating, launch date and promo badges.

## `resultsCsv` (type: `string`):

The full result set as CSV, ready for a spreadsheet or a BI tool.

## `consoleRun` (type: `string`):

The Apify Console page for this run, including the live log.

# 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 = {
    "searchTerms": [
        "wireless earbuds"
    ],
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("cirkit/aliexpress-product-search-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 = {
    "searchTerms": ["wireless earbuds"],
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("cirkit/aliexpress-product-search-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 '{
  "searchTerms": [
    "wireless earbuds"
  ],
  "maxItems": 100
}' |
apify call cirkit/aliexpress-product-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cirkit/aliexpress-product-search-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/OkjefevSagXAgeIRs/builds/kde3IbSd3FTBjihXu/openapi.json
