# AliExpress Search Scraper: Prices, Sold, Ratings (`mochiboo/aliexpress-search-scraper`) Actor

AliExpress search results for any keyword: sale price, original price, discount, star rating, sold count, listing date and sponsored flag, 60 products per page. Sort by best match or best-selling. No browser, no login.

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

## Pricing

from $1.00 / 1,000 results

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 - prices, discounts, ratings and sold counts for any search

Search AliExpress by keyword and get the product list as data: sale price, original price, discount, star rating, sold count, listing date and sponsored flag. Built for product research, dropshipping research and price tracking.

Pay per result, at the rate shown in the pricing panel of this page, plus a very small per-run start fee. You are charged only for the results delivered.

### What you get

- Any keyword, about 60 products per results page, sorted by best match or by most orders (best-selling first).
- Per product: `salePrice`, `originalPrice`, `discountPercent`, `currency`, `priceText`, `rating`, `soldText` and `soldCount` (parsed to a number), `listedDate`, `isSponsored`, `imageUrl`, `url`.
- Run context on every row: `query`, `page`, `position`, `sortBy`, `scrapedAt`.
- No browser and no login. Public search pages only.

### Input

| field | default | notes |
|---|---|---|
| `queries` | - (required) | up to 50 keywords per run |
| `maxPagesPerQuery` | 2 | 1 to 60 pages, 60 products each; a query stops early when a page adds nothing new |
| `sortBy` | `bestMatch` | `bestMatch` or `orders` (most orders first) |
| `includeSponsored` | true | switch off for organic listings only |
| `proxyConfiguration` | Apify datacenter proxy | the setting the actor was tested with |

### Example output row

```json
{
  "productId": "1005011920897434",
  "url": "https://www.aliexpress.com/item/1005011920897434.html",
  "title": "Even Sourdough Starter Warmer 1°F Precise Thermostat 70-104°F 198-Hour Timer Intelligent Heater for Yogurt & Beer Fermentation",
  "salePrice": 45.1,
  "originalPrice": 76.28,
  "discountPercent": 40,
  "currency": "SGD",
  "priceText": "SG$ 45.10",
  "rating": 5,
  "soldText": "6 sold",
  "soldCount": 6,
  "imageUrl": "https://ae-pic-a1.aliexpress-media.com/kf/S41aa4f43629f4edeaf9ce86e82195ad4F.jpg",
  "listedDate": "2026-03-22",
  "isSponsored": false,
  "query": "sourdough starter",
  "page": 1,
  "position": 2,
  "sortBy": "bestMatch",
  "scrapedAt": "2026-10-17T18:45:00.000Z"
}
```

### Measured on the platform

Two unfiltered runs on the platform (Apify datacenter proxy, US location), input `sourdough starter` + `phone stand`, 2 pages each, best match: 232 and 234 rows from 4 requests, none blocked, all prices in USD (a local run from Singapore returned SGD).

- Always filled: `productId`, `url`, `title`, `imageUrl`, `listedDate`.
- `salePrice`, `currency`, `priceText`: 86% to 100% of rows depending on the query (the share of unpriced rows measured at 0% to 22%). The rest are "free with any purchase" promo cards, which carry no price in AliExpress's data; they are kept with null price fields (still a real product with its sold count and rating).
- `rating`: 66.4% and 74.8%; `soldCount`: 81.0% and 88.5% (new listings have neither yet).
- `originalPrice` / `discountPercent`: 35.3% and 81.2% of rows (only products currently shown with a markdown have them).
- About 20% of rows are sponsored (`isSponsored: true`); switch `includeSponsored` off to drop them.
- Sorted by most orders (`phone stand`, 1 page): 60 rows, `soldCount` non-increasing over the first 10 rows (100000, 100000, 100000, 50000 ...). AliExpress shows sold counts in steps (1, 10, 50, 100 ... 100,000), so many rows tie.
- Speed: 4 requests and about 230 rows take roughly 25 to 150 seconds depending on proxy speed; a request that times out is retried twice (after 5 s and 15 s) before it is given up (a run of 20 queries and many pages is limited by the 2-second pause plus proxy latency).

### Good to know

- **Search results only.** No product descriptions, variants/SKUs, reviews or seller details: AliExpress serves those through a different, protected channel that this actor does not use.
- **Currency follows the run's location.** AliExpress picks the currency from the requesting IP's country; each row carries `currency` and the actor does not convert prices.
- **Some fields are empty on some products.** New listings often have no rating or sold count yet, and not every product has an original price. Those fields are `null`.
- **A run may stop early (a very large one, or one where a request keeps failing after its retries).** The actor stops starting new requests shortly before the run timeout and saves what it has. The `RUN_SUMMARY` record in the key-value store says whether the run was complete (`complete`, `terminationReason`, `rowsPushed`). If AliExpress blocks requests, the actor does not retry or work around it: blocked pages are listed in `FAILURES`, and the run stops when more than 20% of requests are blocked.
- Requests are made one at a time with a 2-second pause.

### Keywords

aliexpress scraper, aliexpress search scraper, aliexpress product research, aliexpress prices, dropshipping product research, aliexpress best sellers, aliexpress sold count, product sourcing

# Actor input Schema

## `queries` (type: `array`):

Keywords to search on AliExpress, one per entry (up to 50 per run).

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

How many result pages to read for each query. Each page holds up to 60 products. The run stops earlier when a page has nothing new.

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

Best match (AliExpress default) or most orders (best-selling first).

## `includeSponsored` (type: `boolean`):

Keep the paid placements (flagged isSponsored) in the results. Switch off for organic results only.

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

Proxy used for the requests. The default Apify datacenter proxy is what the actor was tested with.

## Actor input object example

```json
{
  "queries": [
    "sourdough starter"
  ],
  "maxPagesPerQuery": 2,
  "sortBy": "bestMatch",
  "includeSponsored": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

One row per product: sale and original price, discount, rating, sold count, listing date, sponsored flag.

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

What the run wrote and how it ended (the RUN_SUMMARY record in the default key-value store).

# 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 = {
    "queries": [
        "sourdough starter"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("mochiboo/aliexpress-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 = {
    "queries": ["sourdough starter"],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("mochiboo/aliexpress-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 '{
  "queries": [
    "sourdough starter"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call mochiboo/aliexpress-search-scraper --silent --output-dataset

```

## MCP server setup

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