# AliExpress Search Scraper - Products, Prices, Ratings & Sales (`lukehunter/aliexpress-scraper`) Actor

Search AliExpress by keyword (or supply your own search URL) and get titles, prices, discounts, ratings, sold counts and images from the results pages. For dropshippers and product researchers.

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

## Pricing

$1.00 / 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?

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, Ratings & Sales

**For dropshippers doing product research, price monitoring, and anyone who needs structured AliExpress search results without a browser.** Give it one or more keywords (or your own AliExpress search URL) and it returns every product on the results page — title, price, discount, rating, sold count and image — read straight from the search page itself. No login, no API key, no browser.

Pay-per-result: **$0.001 per delivered product — 1,000 products = $1.**

### Quick start (1 minute)

1. Open the **Input** tab and list the keyword(s) you want, e.g. `phone case`.
2. Click **Start**. Export the resulting dataset to CSV/Excel/JSON, or pull it through the API shown below.

```json
{
  "searchTerms": ["phone case"],
  "maxItems": 20
}
```

That prefilled example finishes in well under a minute and costs $0.04.

### How it works

An AliExpress search-results page (`/wholesale?SearchText=...`) embeds its own product list as JSON inside the page — this Actor requests that page, locates that JSON, and maps it to a flat row per product. This Actor:

1. Checks AliExpress's own `robots.txt` for the exact search path it is about to read, once per run, and skips a search (reporting why, in the run's status message) if that path is disallowed.
2. Fetches up to `maxPagesPerSearch` result pages per keyword or supplied URL, about one request every 2 seconds.
3. Normalises every product on each page into one flat dataset row.
4. If a page comes back as a captcha/interstitial ("please verify you're human") or without the expected results data, it stops that one search and reports it honestly in the run's status message — this Actor never tries to solve a captcha or evade a block.

### Use cases

- **Dropshippers**: pull current prices, discounts and sold counts for a niche keyword before sourcing.
- **Price monitoring**: run the same keywords on a schedule and track `price`/`discountPercent` over time.
- **Product research**: compare rating, sold count and price across everything AliExpress surfaces for a search term.

### Input

```json
{
  "searchTerms": ["phone case"],
  "startUrls": [],
  "maxPagesPerSearch": 1,
  "maxItems": 60
}
```

| Field | Type | Default | Description |
|---|---|---:|---|
| `searchTerms` | string\[] | *(none)* | Keywords to search, e.g. `"phone case"`. Provide this, `startUrls`, or both. |
| `startUrls` | string\[] | *(none)* | Full AliExpress `/wholesale` or `/w/` search-results URLs to use as-is. Individual item pages are not supported. |
| `maxPagesPerSearch` | integer | 1 | 1–10. Result pages fetched per keyword/URL (about 60 products per page). |
| `maxItems` | integer | 60 | 1–3,000. Hard cap on rows delivered across the whole run — your cost cap. |

At least one of `searchTerms` or `startUrls` is required.

### Output fields

| Category | Fields |
|---|---|
| Identity | `productId`, `title`, `url` |
| Price | `price`, `originalPrice`, `currency`, `discountPercent` |
| Reputation | `rating`, `soldCount`, `soldText` |
| Media | `imageUrl` |
| Seller (see Limitations) | `storeName`, `storeId`, `storeUrl` |
| Shipping | `shippingText` |
| Search context | `searchTerm`, `page`, `position`, `scrapedAt` |

Missing values are returned as `null`. Nothing is invented.

### Output example

```json
{
  "productId": "3256809276917537",
  "title": "Ultra Thin Clear TPU Phone Cases For iPhone 18 17 16 15 14 13 12 11 Pro Max Plus Air 16E XR XS Max Transparent Silicone Cover",
  "url": "https://www.aliexpress.com/item/3256809276917537.html",
  "price": 1.55,
  "originalPrice": 15.1,
  "currency": "USD",
  "discountPercent": 89,
  "rating": 4.7,
  "soldCount": 10000,
  "soldText": "10,000+ sold",
  "imageUrl": "https://ae-pic-a1.aliexpress-media.com/kf/Sf898ce9c147a42edb66872faa1120d79n.jpg",
  "storeName": null,
  "storeId": null,
  "storeUrl": null,
  "shippingText": null,
  "searchTerm": "phone case",
  "page": 1,
  "position": 1,
  "scrapedAt": "2026-09-27T00:00:00.000Z"
}
```

(Real values from a live capture of an AliExpress search for "phone case".)

### Use it as an API

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

run = client.actor("lukehunter/aliexpress-scraper").call(
    run_input={
        "searchTerms": ["phone case", "drone"],
        "maxItems": 200,
    }
)

for product in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(product["title"], product["price"], product["soldCount"])
```

### Pricing and cost control

Pay per delivered product row.

**$0.001 per product — 1,000 products = $1.**

| Rows delivered | Cost |
|---:|---:|
| 20 | $0.02 |
| 1,000 | $1.00 |
| 10,000 | $10.00 |

There is no charge for starting a run, and no charge for a search that is blocked, skipped or produces nothing. `maxItems` gives you a hard upper bound on cost.

### Limitations

- **Search results only.** This Actor reads AliExpress search-results pages, not individual product pages — no full description, no per-variant pricing/SKUs, no seller/store name or reviews. AliExpress's own search cards do not expose seller name or id at all, so `storeName`/`storeId`/`storeUrl` are always `null` today.
- **Prices reflect whatever AliExpress served this session/region** at scrape time — shown in whatever currency and price tier AliExpress chose for that request (USD in every fixture verified so far). Prices can vary by account region, currency and ongoing promotions; this Actor reports exactly what the page showed, never a converted or estimated figure.
- **`soldCount` is AliExpress's own rounded figure**, parsed from text like "5,000+ sold" or "100K+ sold" — not an exact count, because AliExpress itself never publishes one.
- **No sort order control.** AliExpress's search URL does not have a publicly documented, verified sort parameter, so this Actor always reads AliExpress's own default result order rather than guess at an undocumented one.
- This Actor honours `robots.txt` and never bypasses a captcha, "verify you're human" interstitial, or block — a blocked search is reported, not evaded. No proxies, no User-Agent rotation.
- This is an independent tool, not affiliated with, endorsed by, or connected to AliExpress or Alibaba Group. You are responsible for using the collected data in accordance with AliExpress's terms and applicable law.

### FAQ

#### Can I use my own AliExpress search URL?

Yes — put it in `startUrls`. Only `/wholesale` and `/w/` search-results URLs are supported; item/product pages are not.

#### Does it scrape individual product pages for full descriptions or variants?

No. This Actor is scoped to search-results data only — see Limitations.

#### Why is `storeName` always null?

AliExpress's own search-results cards do not include the seller/store name or id anywhere in the page data this Actor reads — verified against three live captures. The field is kept in the schema in case a future page layout adds it.

#### What happens if AliExpress shows a captcha?

That search stops immediately, is reported in the run's status message, and nothing is charged for it. This Actor never attempts to solve or bypass a captcha.

### Related Actors

Other data tools from the same developer, built to the same standard: official or public sources, hard cost caps, and honest documentation of limits.

- **[Walmart Category Scraper](https://apify.com/lukehunter/walmart-category-scraper)**: product names, prices, was-prices and ratings from Walmart category pages.
- **[Shopify Store Products Scraper](https://apify.com/lukehunter/shopify-store-products-scraper)**: full product catalogues from any Shopify store, with prices, sale prices, variants and stock.
- **[Vinted Scraper](https://apify.com/lukehunter/vinted-scraper)**: Vinted search results with prices, brands, sizes and favourites, across any Vinted country.
- **[Google Play App Scraper](https://apify.com/lukehunter/google-play-scraper)**: ratings, installs, developer contact info and pricing for any Google Play app.
- **[Apple App Store Reviews Scraper](https://apify.com/lukehunter/app-store-reviews-scraper)**: Apple App Store reviews for any iOS app, across countries, with rating, version and date.
- **[Spotify Scraper](https://apify.com/lukehunter/spotify-scraper)**: play counts, monthly listeners and playlist track lists for any public Spotify artist, playlist, album or track.
- **[Hospital Price Transparency Enforcement Leads](https://apify.com/lukehunter/hospital-price-transparency-enforcement-leads)**: hospitals with recent CMS price transparency warning notices, CAP requests and CMP notices.
- **[Hospital Ownership Change Radar](https://apify.com/lukehunter/hospital-chow-radar)**: hospitals that just changed owner, with buyer, seller and effective date from CMS filings.

# Actor input Schema

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

Keywords to search on AliExpress, e.g. "phone case". Each keyword becomes its own search of AliExpress's own /wholesale search results. Provide this, startUrls, or both.

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

Full AliExpress search-results URLs to use as-is instead of (or in addition to) keywords, e.g. "https://www.aliexpress.com/wholesale?SearchText=drone" or an AliExpress "/w/..." search URL. Individual item/product pages are not supported.

## `maxPagesPerSearch` (type: `integer`):

How many result pages to fetch for each keyword/URL, 1-10. Each page is about 60 products.

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

Hard cap on the number of product rows delivered across all searches, 1-3000, default 60. You are charged $0.001 per delivered product, so this is your cost cap.

## Actor input object example

```json
{
  "searchTerms": [
    "phone case"
  ],
  "startUrls": [],
  "maxPagesPerSearch": 1,
  "maxItems": 20
}
```

# Actor output Schema

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

No description

# 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": [
        "phone case"
    ],
    "startUrls": [],
    "maxPagesPerSearch": 1,
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("lukehunter/aliexpress-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": ["phone case"],
    "startUrls": [],
    "maxPagesPerSearch": 1,
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("lukehunter/aliexpress-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": [
    "phone case"
  ],
  "startUrls": [],
  "maxPagesPerSearch": 1,
  "maxItems": 20
}' |
apify call lukehunter/aliexpress-scraper --silent --output-dataset

```

## MCP server setup

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