# AliExpress Product Search Scraper & API - Prices, Orders (`rel8ble/aliexpress-search-scraper`) Actor

AliExpress scraper for product research and dropshipping: search by keyword, search URL or category and get price, original price, discount, rating, exact orders sold, store, Choice and ad flags, delivery days, images and URL. Any ship-to country and currency. 1,000 products = $1.50.

- **URL**: https://apify.com/rel8ble/aliexpress-search-scraper.md
- **Developed by:** [Giovanni Rich](https://apify.com/rel8ble) (community)
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 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 Product Search Scraper & API - Prices, Orders

**AliExpress scraper** for product research: give it keywords, AliExpress search URLs or category URLs and get the product list as clean JSON, CSV or Excel, with price, original price, discount, star rating, exact **orders sold**, store, AliExpress Choice and ad flags, delivery days and the product URL. It works as an **AliExpress search scraper**, an **AliExpress product scraper** for **dropshipping product research**, and an unofficial **AliExpress API**, with prices calculated for the ship-to country and currency you choose (US / USD by default).

It reads the page data AliExpress already sends over plain HTTP, with **no headless browser and no login**, so 600 products take about a minute.

### What you get

One dataset item per product, in the order AliExpress shows them:

- **Identity**: `productId`, `title`, `url` (`https://www.aliexpress.com/item/<id>.html`), `imageUrl`, `images` (all card images), `categoryId` and `categoryPath` (AliExpress category IDs), `listedAt` (date the listing went live).
- **Price**: `price` (the price on the card), `originalPrice` (strike-through), `discountPercent`, `currency`. AliExpress shows first-time buyers a welcome price on many cards; those rows have `priceIsNewShopperDeal: true`, `newShopperSavings` ("New shoppers save $21.89") and `regularPrice` (= price + savings) so you can compare like with like.
- **Demand**: `rating` (0-5), `ordersCount` (exact count when AliExpress exposes it, otherwise parsed from "10,000+ sold"), `ordersText`.
- **Seller and delivery**: `storeName` (when AliExpress includes it on the card), `isChoice`, `isAd`, `tags` ("Free shipping", "Top selling on AliExpress", "Delivery: Oct 13 - 16"...), `deliveryDaysMin` / `deliveryDaysMax` and `deliveryDateMin` / `deliveryDateMax` for the ship-to country.
- **Context**: `position` (overall rank across pages), `page`, `keyword`, `shipToCountry`, `searchUrl`, `scrapedAt`.

A `RUN_SUMMARY` record in the key-value store lists per-search counts, pages read, AliExpress's reported total and why each search stopped.

### Sample output

Real rows from a run for "mechanical keyboard", US / USD (from `sample-output.json`):

| title | price | originalPrice | rating | ordersCount | isChoice | deliveryDaysMax |
|---|---|---|---|---|---|---|
| AJAZZ AK820 and AK820PRO Mechanical Gaming Keyboard 75% Layout PBT ... | 21.70 | 60.83 | 4.9 | 34,938 | true | 13 |
| Akko MonsGeek FUN68 FUN60 PRO\&MAX HE Magnetic Keyboard 60% 65% Gaming ... | 32.55 | 69.24 | 4.9 | 22,237 | true | 13 |
| AJAZZ NK61 Wired Mechanical Gaming Keyboard, Supports Full-Key Hot-Swap ... | 11.87 | 41.22 | 4.9 | 16,991 | true | 13 |

### Use cases

- **Dropshipping research**: sort by orders, filter by price and free shipping, and shortlist products with 10,000+ orders and 4.7+ ratings.
- **Price monitoring**: schedule the same keywords daily and track `price`, `regularPrice` and `discountPercent` over time.
- **Market sizing**: compare `ordersCount` and the total result count across niches and countries.
- **Supplier sourcing**: collect listings for a category, then open the best product URLs.
- **AI agents**: one call returns structured product data an agent can rank, filter and summarise.

### Pricing

**$1.50 per 1,000 products** (pay per result; failed requests are never charged). The two most-used AliExpress scrapers on the Store charge $8.00 and $9.00 per 1,000.

| You scrape | You pay |
|---|---|
| 100 products | $0.15 |
| 1,000 products | $1.50 |
| 10,000 products | $15.00 |
| 100,000 products | $150.00 |

Plus a $0.00005 start fee per run. The Apify free plan's $5 monthly credit covers about 3,000 products. The prefilled input ("phone case", 20 products) finishes in about 8 seconds and costs about $0.03.

#### Why this one

- **Exact orders sold** per product, the number dropshippers use to spot proven winners (sort by `orders`).
- **Prices for your market**: any ship-to country and currency, with new-shopper deals flagged so you compare like with like.
- **AliExpress Choice and ad flags**, delivery days and store info on every row.
- **Fast and cheap**: no browser, about 600 products a minute.

### FAQ

**Is it legal to scrape AliExpress?**
It collects only publicly visible product listing data, no personal data and nothing behind a login. You're responsible for using it in line with AliExpress's terms and applicable law. This is not legal advice.

**Does it need a login, cookies or a browser?**
No. Plain HTTPS requests only, which keeps it fast and cheap.

**How fast is it and how many results can I get?**
About a minute for 600 products. AliExpress shows 60 products per page and at most 60 pages per search (up to 3,600 per keyword); duplicates are dropped and never charged.

**Can I get prices in euros or pounds, for another country?**
Yes. Set `currency` (EUR, GBP, CAD, AUD, BRL, PLN...) and `shipToCountry` (DE, GB, CA, AU...). Delivery estimates follow the ship-to country. Very low prices like $1.09 are usually new-shopper deals, flagged `priceIsNewShopperDeal: true`.

**Can I schedule it, use it via API, and which proxy do I need?**
Yes, run it on an Apify schedule or through the API, Make, Zapier, n8n or MCP. The default Apify datacenter proxy works; captcha or 403/429 replies are retried on a fresh IP (8 retries by default). Switch to RESIDENTIAL only if you see repeated captcha retries. It does not scrape product pages or reviews.

### How to use

1. Enter one or more **Search keywords** (e.g. `phone case`, `mechanical keyboard`) and pick a **Sort order** (`orders` finds proven best sellers). Optionally set **Min / Max price**, **Free shipping only** and **AliExpress Choice only**. Or paste full **AliExpress search or category URLs** with filters already applied.
2. Set **Ship-to country** and **Currency** (default US / USD), and **Max products per search** (default 60 = one page; up to 3,600). Untick **Include ads** for organic results only.
3. Click **Start**. Download the results as JSON, CSV, Excel or HTML from the **Output** tab, or pull them through the Apify API, Make, Zapier, n8n or an MCP client.

### Input example

```json
{
    "keywords": ["wireless earbuds", "led strip lights"],
    "sort": "orders",
    "shipToCountry": "DE",
    "currency": "EUR",
    "maxItemsPerSearch": 300,
    "includeAds": false
}
```

URLs work too:

```json
{
    "searchUrls": [
        "https://www.aliexpress.com/w/wholesale-phone-case.html?SortType=total_tranpro_desc",
        "https://www.aliexpress.com/category/100003109/women-clothing.html"
    ],
    "maxItemsPerSearch": 120
}
```

### Output example

Real item from a cloud run (`phone case`, US / USD):

```json
{
    "position": 1,
    "productId": "1005010018401645",
    "title": "Leather Phone Case For iPhone 17 Pro Max 16 18 Pro Max 13 11 15 14 Plus 12 17 Air 17Promax Shockproof Soft TPU Funda Cover Coque",
    "price": 1.33,
    "originalPrice": 3.31,
    "discountPercent": 60,
    "currency": "USD",
    "priceIsNewShopperDeal": true,
    "newShopperSavings": null,
    "regularPrice": null,
    "rating": 4.6,
    "ordersCount": 27061,
    "ordersText": "20K+ sold",
    "storeName": "Caynes Store",
    "isAd": false,
    "isChoice": true,
    "tags": [],
    "deliveryDaysMin": 7,
    "deliveryDaysMax": 13,
    "deliveryDateMin": "2026-10-16",
    "deliveryDateMax": "2026-10-22",
    "categoryId": "202229403",
    "categoryPath": ["202192403", "202228401", "202229403"],
    "listedAt": "2025-09-22",
    "imageUrl": "https://ae-pic-a1.aliexpress-media.com/kf/Sc2976671fe8c4f6b83e3de29cab49c3fH.jpg",
    "url": "https://www.aliexpress.com/item/1005010018401645.html",
    "page": 1,
    "keyword": "phone case",
    "shipToCountry": "US",
    "searchUrl": "https://www.aliexpress.com/w/wholesale-phone-case.html?SearchText=phone+case",
    "scrapedAt": "2026-10-09T17:19:38.184Z"
}
```

### API example

Python (`pip install apify-client`):

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("rel8ble/aliexpress-search-scraper").call(run_input={"keywords": ["phone case", "mechanical keyboard"], "sort": "orders", "maxItemsPerSearch": 60, "shipToCountry": "US", "currency": "USD"})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["title"][:60], item["price"], item["ordersCount"])
```

One HTTP call that runs the actor and returns the rows (curl):

```bash
curl -X POST "https://api.apify.com/v2/acts/rel8ble~aliexpress-search-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"keywords": ["phone case", "mechanical keyboard"], "sort": "orders", "maxItemsPerSearch": 60, "shipToCountry": "US", "currency": "USD"}'
```

### Integrations

- **API**: start runs and read datasets over the Apify REST API or the JavaScript / Python clients.
- **MCP / AI agents**: call it from Claude, ChatGPT or any MCP client through the Apify MCP server; inputs and outputs are documented field by field.
- **No-code**: Make, Zapier, n8n, Google Sheets, Airtable, Slack, webhooks.
- **Scheduling**: run hourly, daily or weekly in Apify Schedules to track prices and orders.

### Limits (read before large runs)

- AliExpress shows 60 products per page and at most 60 pages per search. Sorting by orders or narrowing by price returns more distinct products than one broad search.
- Pages can repeat a few products; duplicates are dropped (and not charged), so a page sometimes adds fewer than 60.
- `storeName` is only on cards where AliExpress includes it (mostly ads); open the product URL for full store data.

### How it works (for developers)

AliExpress search pages (`/w/wholesale-<keyword>.html?page=N`) and category pages embed the full result list as JSON in `window._dida_config_._init_data_`. The actor extracts that object with a string-aware brace scanner (no `eval`), reads `mods.itemList.content` and `pageInfo`, and maps each card: prices from `prices.salePrice` / `originalPrice` (or the tracking map when a welcome card hides them), exact orders from `real_trade_count`, delivery from `delivery_info`, category IDs from the card trace. Ship-to country, currency and language are set with the `aep_usuc_f` cookie. Pagination stops at `maxItemsPerSearch`, the last page, or when a page adds nothing new.

Run it locally:

```bash
npm install
npm test                 # parser tests on saved fixtures (US, DE/EUR, GB/GBP, category)
node src/main.js         # input in storage/key_value_stores/default/INPUT.json
```

# Actor input Schema

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

Provide these or searchUrls. One search per line, written as you would type it into the AliExpress search box: "phone case", "mechanical keyboard", "led strip lights". Each keyword returns up to maxItemsPerSearch products, sorted by sort and filtered by the price / shipping settings below. Default \["phone case"] (demo).

## `searchUrls` (type: `array`):

Optional. Full AliExpress URLs, one per line: search pages (https://www.aliexpress.com/w/wholesale-phone-case.html?SortType=total_tranpro_desc) or category pages (https://www.aliexpress.com/category/100003109/women-clothing.html). Filters already in the URL are kept; sort, price and shipping settings below do not apply to URLs. aliexpress.us links are accepted and read from aliexpress.com.

## `sort` (type: `string`):

Optional. "relevance" (AliExpress Best Match, default), "orders" (most orders first - best for finding proven sellers), "price-asc", "price-desc", "newest".

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

Optional. Lowest price in the chosen currency, whole units (e.g. 5). Empty = no minimum.

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

Optional. Highest price in the chosen currency, whole units (e.g. 50). Empty = no maximum.

## `freeShippingOnly` (type: `boolean`):

Optional boolean. true = only products with free shipping to shipToCountry. Default false.

## `choiceOnly` (type: `boolean`):

Optional boolean. true = only AliExpress Choice products (faster, consolidated delivery). Default false.

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

Optional. Two-letter country code that prices, shipping and delivery estimates are calculated for: "US", "GB", "DE", "FR", "ES", "IT", "NL", "PL", "CA", "AU", "BR", "MX", "KR", "JP", "SA", "AE", "IL"... Default "US".

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

Optional. Three-letter currency code for prices: "USD" (default), "EUR", "GBP", "CAD", "AUD", "BRL", "PLN", "KRW", "JPY"... Min/max price filters use this currency too.

## `maxItemsPerSearch` (type: `integer`):

Optional. Products to save per keyword or URL, integer 1-3600. Default 60 (one page). AliExpress shows 60 products per page and up to 60 pages; set 20 for a quick answer, 600 for a deep sweep. Ads and organic results count together.

## `includeAds` (type: `boolean`):

Optional boolean. true (default) = keep promoted (ad) listings, flagged isAd: true. false = organic results only.

## `maxConcurrency` (type: `integer`):

Optional, advanced. Parallel requests, integer 1-20. Default 5.

## `maxRequestRetries` (type: `integer`):

Optional, advanced. Retries per page on a new IP when AliExpress blocks or times out. Default 8.

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

Optional. Apify Proxy (datacenter) works for AliExpress and is the default. Switch to the RESIDENTIAL group if you see repeated captcha retries.

## Actor input object example

```json
{
  "keywords": [
    "phone case"
  ],
  "sort": "relevance",
  "freeShippingOnly": false,
  "choiceOnly": false,
  "shipToCountry": "US",
  "currency": "USD",
  "maxItemsPerSearch": 20,
  "includeAds": true,
  "maxConcurrency": 5,
  "maxRequestRetries": 8,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All products found: position, product ID, title, price, original price, discount, rating, orders, store, Choice/ad flags, delivery estimate, images and URL.

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

Per-search counts, pages read, the total AliExpress reports and stop reasons.

# 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"
    ],
    "maxItemsPerSearch": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("rel8ble/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 = {
    "keywords": ["phone case"],
    "maxItemsPerSearch": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

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

```

## MCP server setup

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