# AliExpress Search Scraper — Prices, Sold Count & Ratings (`crawloop/aliexpress-search-scraper`) Actor

AliExpress search scraper for keyword and search-URL product cards. Get item ID, title, sale price, exact sold count when exposed, rating, Choice and free-shipping flags, store name, and ship-from. Fast HTTP — no browser. Built for dropshipping research and price monitoring.

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

## Pricing

from $1.49 / 1,000 search results

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?

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, Sold Count & Ratings

> **Disclaimer:** Unofficial tool — not affiliated with, sponsored by, or endorsed by AliExpress, Alibaba, or their affiliates. Data is read from publicly accessible search pages only. No login. You are responsible for complying with applicable law (including GDPR where personal data appears) and the site’s terms. No warranty on accuracy or availability. Provided for informational and research use.

Search AliExpress by **keyword** or **search URL** and extract **product cards** with **item ID**, **title**, **sale / original price**, **exact sold count** when the storefront exposes it, **rating**, **Choice / free-shipping flags**, **store name**, **ship-from**, and **delivery window**. This **AliExpress scraper** is an **API alternative** for **dropshipping research**, **price monitoring**, and **catalog discovery**. Run it from **Python**, **Node.js**, or **MCP**; export JSON / CSV / dataset. Fast **HTTP** (`curl_cffi`) — no headless browser.

> **Crawloop Marketplace & E-commerce Suite** — AliExpress keyword SERP plus Amazon, Shopee, Mercado Libre, and China wholesale.

| **AliExpress Search Scraper** ◄── *you are here* | [Amazon Search Scraper](https://apify.com/crawloop/amazon-search-scraper) | [Shopee Search Scraper](https://apify.com/crawloop/shopee-search-scraper) | [Mercado Libre Listings Scraper](https://apify.com/crawloop/mercado-libre-listings-scraper) |
| :---: | :---: | :---: | :---: |
| AliExpress keyword / URL cards, sold count, Choice | Amazon keyword SERP, badges, sponsored | Shopee marketplace search | LATAM Mercado Libre listings |

Also see: [1688 Scraper](https://apify.com/crawloop/1688-scraper) · [Alibaba Product Scraper](https://apify.com/crawloop/alibaba-product-scraper) · [Naver Search Scraper](https://apify.com/crawloop/naver-search-scraper) · [eBay Sold Listings Scraper](https://apify.com/crawloop/ebay-sold-listings-scraper)

***

### When to use this Actor

- **Product research** — keyword SERP with prices, ratings, and units sold
- **Price / offer tracking** — schedule the same query and compare `price` + `soldCount`
- **Choice / free-shipping shortlists** — keep only cards with those selling points
- **Paste a filtered search URL** — keep AliExpress query-string filters and paginate

### When not to use this Actor

- **Full product detail / SKU matrix** — search cards only; no per-SKU stock or shipping rate table
- **Buyer review text** — rating is included; individual review bodies are not
- **Store catalog dumps** — keyword and search-URL mode, not `/store/{id}` crawls
- **Amazon / Shopee / Mercado Libre** — use the sibling Actors in the table above
- **1688 factory MOQ or Alibaba.com FOB PDPs** — use [1688 Scraper](https://apify.com/crawloop/1688-scraper) or [Alibaba Product Scraper](https://apify.com/crawloop/alibaba-product-scraper)

***

### Key Features

- **Keyword search** — `query` or batch `queries` (up to 4 in parallel)
- **Paste search URLs** — `/w/wholesale-…html` and `/wholesale?SearchText=` keep existing filters
- **Pagination + caps** — up to **20 pages** per query (~60 cards/page), or stop at `maxItems`
- **Sort** — best match, orders / popular, price asc/desc, newest
- **Locale cookies** — `shipTo` + `currency` + `language` via `aep_usuc_f` (pin proxy geo to the same country)
- **Exact sold count** — `soldCount` from AliExpress `real_trade_count` when present, plus bucket `soldText`
- **Sponsored detection** — `isSponsored` from paid cards; optional drop
- **Choice / free shipping** — flags plus optional keep-only filters
- **Fast HTTP** — Chrome TLS impersonation; datacenter proxy first, optional residential escalate on block

***

### How to scrape AliExpress search results

1. Set a keyword in `query` (or paste wholesale URLs in `searchUrls`).
2. Pick `shipTo` and `currency` so prices match the market you care about.
3. Cap volume with `maxItems` / `maxPages` (about 60 cards per page).
4. Run the Actor on Apify. Download the default dataset as JSON, CSV, or Excel — or call it from Python, Node.js, or MCP.

***

### Input Parameters

| Parameter | Type | Default | Description |
| :--- | :--- | :--- | :--- |
| `query` | String | — | Primary search keyword |
| `queries` | Array | — | Batch keywords (up to 4 in parallel via `maxConcurrency`) |
| `searchUrls` | Array | — | AliExpress wholesale search URLs (filters preserved) |
| `maxPages` | Integer | `1` | Pages per query/URL (1–20) |
| `maxItems` | Integer | — | Optional product cap **per** query/URL |
| `startPage` | Integer | `1` | First page (overrides URL `page` when > 1) |
| `shipTo` | String | `"US"` | Ship-to country; pins proxy geo |
| `currency` | String | `"USD"` | Display currency |
| `language` | String | `"en_US"` | UI / title locale |
| `sortBy` | String | `"default"` | Sort for keyword searches |
| `includeSponsored` | Boolean | `true` | Keep paid/ad cards |
| `choiceOnly` | Boolean | `false` | Keep Choice cards only |
| `freeShippingOnly` | Boolean | `false` | Keep free-shipping cards only |
| `minPrice` / `maxPrice` | Number | — | Drop cards outside this listing-currency range |
| `minStars` | Number | — | Minimum average rating (0–5) |
| `deduplicateIds` | Boolean | `true` | Skip duplicate `productId`s across batch queries |
| `maxConcurrency` | Integer | `2` | Parallel keywords/URLs (1–4) |
| `autoEscalateOnBlock` | Boolean | `true` | Retry on Apify Residential after a punish/empty page |
| `proxyConfiguration` | Object | Datacenter | Apify Proxy; geo matched to `shipTo` |

#### Quick start

```json
{
  "query": "bluetooth earbuds",
  "shipTo": "US",
  "currency": "USD",
  "maxPages": 1,
  "maxItems": 60
}
```

#### Paste a search URL

```json
{
  "searchUrls": ["https://www.aliexpress.com/w/wholesale-phone-case.html?SortType=total_tranpro_desc"],
  "shipTo": "DE",
  "currency": "EUR",
  "maxItems": 40
}
```

***

### Output Format

Each dataset row is one product card from AliExpress search.

| Field | Type | Description |
| :--- | :--- | :--- |
| `productId` | String | AliExpress numeric item id |
| `title` | String | Product title |
| `price` / `priceFormatted` | Number / String | Sale price |
| `originalPrice` | Number | List / strikethrough price |
| `discountPercent` | Integer | Displayed discount |
| `currency` | String | ISO currency |
| `rating` | Number | Average stars (0–5) |
| `soldCount` | Integer | Exact units sold when exposed |
| `soldText` | String | Bucket text (e.g. `4,000+ sold`) |
| `storeName` | String | Seller store name when present |
| `shipFrom` / `shipTo` | String | Warehouse country / run locale |
| `isChoice` / `isSponsored` / `freeShipping` | Boolean | Badge flags |
| `sellingPoints` | Array | Badge texts |
| `deliveryMinDays` / `deliveryMaxDays` | Integer | Card delivery window |
| `skuId` | String | Default SKU on the card |
| `productUrl` / `imageUrl` | String | Item page and main image |
| `page` / `position` | Integer | SERP coordinates |
| `searchQuery` | String | Keyword that produced the row |
| `scrapedAt` | String | UTC ISO timestamp |

#### Output example

```json
{
  "source": "aliexpress_search",
  "searchQuery": "bluetooth earbuds",
  "page": 1,
  "position": 1,
  "productId": "3256811621288203",
  "skuId": "12000056622341651",
  "title": "Bluetooth Wireless Earbuds with Active Noise Cancellation",
  "price": 23.34,
  "priceFormatted": "US $23.34",
  "originalPrice": 64.01,
  "discountPercent": 63,
  "currency": "USD",
  "rating": 4.9,
  "soldCount": 4035,
  "soldText": "4,000+ sold",
  "storeName": "Shop1105233629 Store",
  "shipFrom": "US",
  "shipTo": "US",
  "isChoice": false,
  "isSponsored": false,
  "freeShipping": true,
  "productUrl": "https://www.aliexpress.com/item/3256811621288203.html",
  "scrapedAt": "2026-09-19T17:00:00Z"
}
```

***

### Use Cases

| Use case | What you get | Why it helps |
| :--- | :--- | :--- |
| **Dropshipping research** | Price, sold count, Choice, free shipping | Shortlist products with demand before opening PDPs |
| **Price monitoring** | `price`, `originalPrice`, `currency`, `scrapedAt` | Track promo depth on a keyword |
| **Cross-border checks** | Same query with `shipTo` / `currency` | Compare US vs DE vs BR storefronts |
| **Ad vs organic mix** | `isSponsored` + position | See which SKUs AliExpress is pushing |
| **Data pipelines** | One JSON row per card | Feed sheets, warehouses, and MCP agents |

***

### Integration examples

#### Node.js

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('crawloop/aliexpress-search-scraper').call({
  query: 'bluetooth earbuds',
  shipTo: 'US',
  maxPages: 1,
  maxItems: 30
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.slice(0, 5));
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient(token)
run = client.actor("crawloop/aliexpress-search-scraper").call(
    run_input={"query": "bluetooth earbuds", "shipTo": "US", "maxPages": 1, "maxItems": 30}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item.get("productId"), item.get("title"), item.get("price"), item.get("soldCount"))
```

#### cURL

```bash
curl "https://api.apify.com/v2/acts/crawloop~aliexpress-search-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"query":"bluetooth earbuds","shipTo":"US","maxPages":1,"maxItems":30}'
```

### MCP and AI assistants

Use this Actor from AI tools via [Apify MCP](https://docs.apify.com/platform/integrations/mcp). Connect your Apify account, then call this Actor by Store ID `crawloop/aliexpress-search-scraper`.

Example prompts:

- "Run AliExpress Search Scraper for bluetooth earbuds in US, 1 page, return productId, title, price, soldCount"
- "Scrape AliExpress DE for phone case, EUR, drop sponsored cards, summarize the top 20 by soldCount"
- "Chain AliExpress Search Scraper then 1688 Scraper or Alibaba Product Scraper for factory MOQ on the same niche"

### Suite next step

After an AliExpress keyword dump, source factories with [1688 Scraper](https://apify.com/crawloop/1688-scraper) or export PDPs with [Alibaba Product Scraper](https://apify.com/crawloop/alibaba-product-scraper). For US SERP comps, run [Amazon Search Scraper](https://apify.com/crawloop/amazon-search-scraper); for completed-sale prices, use [eBay Sold Listings Scraper](https://apify.com/crawloop/ebay-sold-listings-scraper).

***

### FAQ

**What input do I need?**\
A keyword in `query` (or a list in `queries`), or AliExpress wholesale URLs in `searchUrls`. Everything else is optional.

**How many products per page?**\
Typically **60**. Cap with `maxItems`. Hard cap is **20 pages** per query.

**Can I paste an AliExpress search URL?**\
Yes — `searchUrls` keeps `SearchText`, `SortType`, and other query filters. Pagination updates `page`.

**Why is currency wrong?**\
AliExpress follows the proxy IP unless `shipTo` / `currency` cookies and proxy geo match. Pin `apifyProxyCountry` via `shipTo`.

**Does it scrape product detail pages?**\
No. Cards only — title, prices, sold, rating, store, shipping badges.

**Is this an AliExpress API alternative?**\
Yes for search cards: keyword or URL in, structured JSON out (id, prices, sold count, rating). No official API key. It does not replace the full product-detail / SKU API.

**Can I scrape AliExpress with Python or Node.js?**\
Yes — use the Apify client examples in Integration examples, or call the Actor from MCP.

**What if the dataset is empty?**\
Datacenter IPs sometimes hit a punish page. Leave `autoEscalateOnBlock` on, or set `proxyConfiguration.apifyProxyGroups` to `RESIDENTIAL`.

***

### Troubleshooting

| Issue | Likely cause | What to try |
| :--- | :--- | :--- |
| Empty dataset | Punish page / x5sec | Enable residential proxy in the same `shipTo` country |
| SAR / unexpected currency | Proxy geo ≠ `shipTo` | Set `shipTo` and let the Actor pin proxy country |
| Missing `soldCount` | AliExpress only sent bucket text | Use `soldText`; exact count is not on every card |
| Duplicate IDs in a batch | Dedupe off | Keep `deduplicateIds: true` |

***

### Limitations

- **Search cards only** — no SKU stock matrix, freight table, or review bodies
- **Locale follows cookies + IP** — always pair `shipTo` / `currency` with proxy geo
- **Sold count** — exact `soldCount` when `real_trade_count` is present; otherwise `soldText` only

***

### Related Actors

| Actor | Best for |
| :--- | :--- |
| [1688 Scraper](https://apify.com/crawloop/1688-scraper) | China wholesale offers, MOQ, factory flags |
| [Alibaba Product Scraper](https://apify.com/crawloop/alibaba-product-scraper) | Alibaba.com FOB ladders, MOQ, Gold / Verified |
| [Amazon Search Scraper](https://apify.com/crawloop/amazon-search-scraper) | Amazon keyword SERP, ASIN, Prime, sponsored |
| [Shopee Search Scraper](https://apify.com/crawloop/shopee-search-scraper) | Shopee regional search |
| [Mercado Libre Listings Scraper](https://apify.com/crawloop/mercado-libre-listings-scraper) | LATAM Mercado Libre listings |
| [Naver Search Scraper](https://apify.com/crawloop/naver-search-scraper) | Korean 통합검색 rank / Powerlink |
| [eBay Sold Listings Scraper](https://apify.com/crawloop/ebay-sold-listings-scraper) | Completed eBay sold comps |

**Tags:** aliexpress scraper, aliexpress search scraper, aliexpress product scraper, aliexpress api alternative, scrape aliexpress python, aliexpress sold count, aliexpress price scraper, dropshipping product research, aliexpress choice scraper

# Actor input Schema

## `query` (type: `string`):

Primary AliExpress keyword or phrase (e.g. bluetooth earbuds).

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

Optional extra keywords. Each query uses the same ship-to, currency, sort, and filters. Up to 4 run in parallel (`maxConcurrency`).

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

Paste /w/wholesale-… or /wholesale?SearchText= URLs. Query-string filters are kept; pagination updates the page parameter.

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

Search pages per query or URL (1–20). AliExpress typically returns 60 cards per page. Stops earlier if maxItems is reached.

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

Optional cap on products saved per keyword or search URL. Combined with maxPages — scraping stops at whichever limit is reached first.

## `startPage` (type: `integer`):

First search results page (1-based).

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

ISO country that sets shipping locale and is sent as aep\_usuc\_f region. Also pins Apify Proxy geo when proxy is enabled.

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

ISO currency for displayed prices (aep\_usuc\_f c\_tp). Pair with shipTo / proxy geo so AliExpress does not override it from the IP.

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

UI / title locale (b\_locale cookie).

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

AliExpress search sort. Keyword searches only — pasted searchUrls keep their own SortType.

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

Keep paid/ad cards (`productType=ad`). Turn off for organic cards only.

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

Keep only AliExpress Choice cards (also sent as a search switch when scraping by keyword).

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

Keep only cards tagged Free shipping (also sent as a search switch when scraping by keyword).

## `minPrice` (type: `number`):

Drop cards cheaper than this amount in the listing currency. Also sent on keyword search URLs.

## `maxPrice` (type: `number`):

Drop cards more expensive than this amount in the listing currency. Also sent on keyword search URLs.

## `minStars` (type: `number`):

Keep cards with at least this average rating (0–5). Cards without a rating are dropped when this filter is set.

## `deduplicateIds` (type: `boolean`):

When enabled, each productId is saved only once across all queries in the run.

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

How many keywords/URLs to scrape in parallel (1–4). Each query uses its own sticky proxy session. Keep low — AliExpress rate-limits aggressively.

## `autoEscalateOnBlock` (type: `boolean`):

If a datacenter response is empty or punished, retry the session on Apify Residential (same ship-to country).

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

Apify Proxy. Default is datacenter; geo is pinned to shipTo. Enable the RESIDENTIAL group if you see empty pages. Currency follows shipTo + this geo.

## Actor input object example

```json
{
  "query": "bluetooth earbuds",
  "maxPages": 1,
  "maxItems": 60,
  "startPage": 1,
  "shipTo": "US",
  "currency": "USD",
  "language": "en_US",
  "sortBy": "default",
  "includeSponsored": true,
  "choiceOnly": false,
  "freeShippingOnly": false,
  "deduplicateIds": true,
  "maxConcurrency": 2,
  "autoEscalateOnBlock": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

Default dataset items.

# 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 = {
    "query": "bluetooth earbuds",
    "maxItems": 60,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawloop/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 = {
    "query": "bluetooth earbuds",
    "maxItems": 60,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("crawloop/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 '{
  "query": "bluetooth earbuds",
  "maxItems": 60,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call crawloop/aliexpress-search-scraper --silent --output-dataset

```

## MCP server setup

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