# AliExpress Scraper - Products, Prices & Orders (`alex_expert/aliexpress-search-scraper`) Actor

Scrape AliExpress search results without login: sale price, original price and discount percent, star rating, orders sold, images and direct product links. 33 currencies, 18 languages, ship-to country, rating and orders filters, and a hard max-items cap.

- **URL**: https://apify.com/alex\_expert/aliexpress-search-scraper.md
- **Developed by:** [Alexander Shulga](https://apify.com/alex_expert) (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 $0.30 / 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.
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?

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 Scraper — Products, Prices, Discounts & Orders

Scrape AliExpress search results without a login or an API key. Sale price, the price it
was before, the discount percent, star rating, how many were actually sold, images and a
direct product link — in 33 currencies and 18 languages.

### What you get per product

| | |
|---|---|
| **Identity** | product id, title, direct URL, SKU id |
| **Price** | sale price, original price, **discount percent**, formatted strings, currency |
| **Demand** | star rating, **orders sold as a number**, plus the original "1,000+ sold" text |
| **Media** | main image and up to 10 more |
| **Flags** | AliExpress Choice badge |

**Orders sold as a number** is the field most scrapers leave as text. `"4,000+ sold"` is
useless in a spreadsheet; `4000` sorts, filters and charts. Both are returned, so nothing
is lost.

### Quick start

1. Type one or more **Search terms**, exactly as you would on the site.
2. Pick a **Currency** and a **Ship to country** — availability and prices depend on both.
3. Press **Start**.

Defaults work with no configuration. You can also paste search URLs straight from your
browser and every filter you set on the site is kept.

### Why the currency setting matters

AliExpress decides the currency from where the request comes from, and a cloud run comes
from wherever the server happens to be. Without an explicit setting you can silently get
prices in a currency you never asked for.

The `?currency=` query parameter that looks like it should fix this is ignored by the
site — measured side by side, it left prices unchanged. This Actor sets the currency the
way the website itself does, through the locale cookie, which does work.

### Filters AliExpress does not offer

Two filters are applied to the results, because the site has no equivalent:

- **Min rating** — drop anything rated below your threshold.
- **Min orders sold** — keep proven sellers instead of brand-new listings.

Filtered-out products are never charged and the run summary reports how many were dropped.

### Output example

```
{
  "productId": "3256811621288203",
  "title": "2025 Air Pro Wireless Bluetooth Earphones TWS",
  "url": "https://www.aliexpress.com/item/3256811621288203.html",
  "price": 2.94, "originalPrice": 20.13, "discountPercent": 85,
  "currency": "USD",
  "rating": 4.9, "orders": 4000, "ordersText": "4,000+ sold",
  "isChoice": false, "imagesCount": 6
}
```

### Control what you pay for

You are charged per product, so the cost is always predictable.

| Run | Products | Cost on the Free tier |
|---|---|---|
| One page, one term | ~60 | ~$0.18 |
| Two pages (default) | ~120 | ~$0.36 |
| Three terms, one page each | ~180 | ~$0.54 |
| Anything with `maxItems: 50` | 50 | ~$0.15 |

Higher Apify plans get automatic volume discounts. The Actor also honours the maximum
charge you set on a run and stops cleanly instead of burning compute you are not paying
for. Duplicate products across pages are skipped and never billed twice.

### Input reference

| Field | Description | Default |
|---|---|---|
| `searchTerms` | What to search for, one or many | `["wireless earbuds"]` |
| `startUrls` | AliExpress search URLs pasted from the browser | empty |
| `currency` | 33 supported codes | `USD` |
| `language` | 18 locales for titles | `en_US` |
| `shipToCountry` | Two-letter ISO code; changes availability and price | `US` |
| `sortBy` | Best match, most orders, price up or down, newest | Best match |
| `priceMin` / `priceMax` | Price bounds in your currency | 0 / 0 |
| `minRating` | Drop products rated below this | 0 |
| `minOrders` | Drop products with fewer orders than this | 0 |
| `maxPages` | Pages per term, ~60 products each | 2 |
| `maxItems` | Hard cap on products. 0 = no limit | 0 |
| `proxyConfiguration` | Residential recommended for larger runs | Apify RESIDENTIAL |

### Troubleshooting

- **No products at all?** Check the spelling, or try a broader term. A search that
  genuinely has no results fails immediately with a clear message instead of running on.
- **Prices in an unexpected currency?** Set `currency` explicitly, see above.
- **Everything filtered out?** `minRating` of 5 is strict: most listings sit at 4.6-4.9.
  The run still succeeds and the log says how many products your filters removed, because
  a strict filter is your choice rather than a failure.
- **Larger runs slowing down?** Enable Apify Proxy with the `RESIDENTIAL` group.

### Built for runs that do not fall over

AliExpress does not always fail loudly. It answers with HTTP 200 and either a page with
no data block, or a data block with an empty product list — measured: the same query
returned 0 products on one attempt and 30 on the next. Both cases are treated as
transient: the Actor rotates to a fresh IP, backs off and tries again rather than
reporting an empty result you would have to notice yourself.

### Integrations

Results can be pushed to Google Sheets, Slack, Zapier and Make, or pulled via the Apify API and MCP.

# Actor input Schema

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

What to look for, exactly as you would type it in the AliExpress search box. Several terms are scraped one after another.

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

Paste search addresses copied straight from your browser. Every filter you set on the site is preserved. Works alongside Search terms.

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

Prices come back in this currency. Without it AliExpress uses whatever the server location implies, which for a cloud run is rarely what you want.

## `language` (type: `string`):

Titles and labels come back in this language.

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

Two-letter ISO code. Availability and prices differ by destination, so set the market you actually sell into.

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

How AliExpress orders the results.

## `priceMin` (type: `integer`):

In the currency selected above. 0 means no lower bound.

## `priceMax` (type: `integer`):

In the currency selected above. 0 means no upper bound.

## `minRating` (type: `integer`):

Drop products rated below this. AliExpress has no such filter, so it is applied to the results. 0 means keep everything.

## `minOrders` (type: `integer`):

Drop products with fewer orders than this. Useful for finding proven sellers rather than new listings. 0 means keep everything.

## `maxPages` (type: `integer`):

AliExpress returns about 60 products per page. 2 pages is roughly 120 products per term.

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

Hard cap on products, so you always know the maximum a run can cost. 0 means no limit.

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

Residential proxies are recommended. AliExpress serves challenge pages to datacenter IPs once a run grows.

## Actor input object example

```json
{
  "searchTerms": [
    "wireless earbuds",
    "phone case"
  ],
  "startUrls": [],
  "currency": "USD",
  "language": "en_US",
  "shipToCountry": "US",
  "sortBy": "default",
  "priceMin": 0,
  "priceMax": 0,
  "minRating": 0,
  "minOrders": 0,
  "maxPages": 2,
  "maxItems": 0,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

All collected products with prices, discounts, ratings and order counts.

## `csv` (type: `string`):

Same data as a spreadsheet-ready CSV file.

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

Which searches succeeded, what was filtered out, and why anything failed.

# 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",
        "phone case"
    ],
    "shipToCountry": "US"
};

// Run the Actor and wait for it to finish
const run = await client.actor("alex_expert/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 = {
    "searchTerms": [
        "wireless earbuds",
        "phone case",
    ],
    "shipToCountry": "US",
}

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

```

## MCP server setup

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