# AliExpress Product Research Scraper - Winning Products & Sales (`skydata/aliexpress-product-research-scraper`) Actor

AliExpress product research and dropshipping tool: AliExpress-reported cumulative sold counts, prices, ratings and listing dates for every product in a search, best sellers first if you want, price bands, niche comparison and a price and sales tracker between runs.

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

## Pricing

from $1.28 / 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?

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

### 🛒 What does AliExpress Product Research Scraper do?

**AliExpress Product Research Scraper** is a product research and dropshipping tool for AliExpress. Enter keywords (or paste AliExpress search links) and get, for every product AliExpress shows, the numbers that matter for product research:

- 🔥 **AliExpress-reported cumulative sold count**, unrounded when AliExpress provides it (not just "1,000+ sold"), plus **listing date** and the **average sold per day since listing**
- 💲 **Normal price, list price, discount and the new-customer deal price**, in the currency and ship-to country you choose
- 🏆 **Best sellers first**: sort the search by most orders (AliExpress's own sort)
- ⭐ **Rating**, **listing date**, **Choice** and **sponsored (ad)** flags, ships-from country, category
- 📊 **A ready report per search**: price bands (how the products' cumulative sold counts split by today's price), top sellers, newer listings with a high average since listing, best value (4.6★+ and 500+ sold), share of Choice items
- 🆚 **Compare niches**: several keywords side by side (sold counts in the top results, number of listings, prices)
- 🔔 **Price and sales tracker**: run it daily or weekly and see **how many sold since the last run** (the real measure of recent sales), price drops and new products in the results

**💸 You only pay for searches that return products.** Empty or failed searches are always free.

### 👥 Who is it for?

| You are… | You use it to… |
|---|---|
| 🛍️ **Dropshipper / Shopify seller** | Shortlist products with proven sales, check prices, then track which ones keep selling |
| 📈 **E-commerce analyst** | Compare niches with AliExpress-reported sold counts and price bands, and measure recent sales with tracking |
| 🏷️ **Brand / private label** | See which designs, prices and features win before you order stock |
| 📢 **Agency** | Build product-research reports for clients in minutes |
| 🤖 **AI agent / developer** | Give your workflow fresh AliExpress product data through the API or MCP |

### 🚀 How to use it

1. Type your **search keywords**, one per line (for example `phone case`, `led strip lights`), or paste AliExpress search links with your filters.
2. Choose **max products per search** (60 = one page), how to **sort** (e.g. most orders = best sellers first) and your **ship-to country** and **currency**.
3. Click **Start**. Open **REPORT.html** in the Storage tab for the shareable report, or download the products as Excel or CSV.

💡 Want a head start? Open the **Example tasks** tab for ready-made setups (one click to run).

### 📥 Input example

```json
{
  "searchQueries": ["phone case", "led strip lights"],
  "maxProductsPerSearch": 120,
  "sortBy": "orders",
  "shipTo": "US",
  "currency": "USD",
  "monitorChanges": false
}
```

### 📤 Output (one row per product)

```json
{
  "type": "product",
  "search": "phone case",
  "rankInSearch": 3,
  "title": "Luxury Matte Leather Phone Case for iPhone 17 16 15 Pro Max",
  "price": 3.06,
  "originalPrice": 3.15,
  "discountPercent": 3,
  "newUserPrice": 1.09,
  "currency": "USD",
  "sold": 2757,
  "soldIsUnrounded": true,
  "soldText": "2,000+ sold",
  "rating": 4.6,
  "listedDate": "2023-08-16",
  "daysListed": 1175,
  "avgSoldPerDaySinceListed": 2.35,
  "isChoice": false,
  "isSponsored": false,
  "shipFrom": "CN",
  "categoryId": "380230",
  "url": "https://www.aliexpress.com/item/1005005953434537.html"
}
```

Each search also gets one **report** row (price bands, top sellers, newer listings with a high average, best value, insights) and, with tracking on, `soldSinceLastRun`, `soldPerDaySinceLastRun`, `soldSinceLastRunUnrounded`, `priceChangePercent` and `isNewSinceLastRun` per product.

### ⭐ Why choose this one?

| | This Actor | Typical AliExpress scrapers |
|---|---|---|
| Unrounded cumulative sold count (as reported by AliExpress) + listing date | ✅ | Often "1000+ sold" text only |
| Report per search (price bands, top sellers, best value) | ✅ | Raw rows only |
| Compare several niches side by side | ✅ | ❌ |
| Price and sales tracker (changes since last run) | ✅ | Rare |
| Sponsored products marked | ✅ | Rare |
| Charged only for searches with products | ✅ | Varies |

### 💰 Pricing

What you pay (Free plan prices; platform usage and proxies are included, no separate compute bill):

| Event | Price | When |
|---|---|---|
| Product | **$0.0015** ($1.50 per 1,000) | One product row in the output |
| Search report | **$0.01** | One report per search that returned products |
| Actor start | $0.00005 per run | Charged once per run (256 MB = 1 event) |

Paid Apify plans get lower prices automatically: **Bronze −5%, Silver −10%, Gold −15%** on the events above (the start fee is not discounted).

Searches without products, failed searches and incomplete AliExpress pages are **never charged**. Turn off "Include every product" to pay only for the reports.

**Examples (Free plan):** the default first run (1 keyword, 60 products) = $0.09 + $0.01 = **$0.10** (+ $0.00005 start). 3 keywords × 120 products = $0.54 + $0.03 = **$0.57**.

You can set a maximum cost per run and the Actor stops there. See the **Pricing** tab for the live prices.

### 🤖 Use it with AI agents

Works as a tool for AI agents (Claude, ChatGPT, Cursor and others) through the [Apify MCP server](https://mcp.apify.com), and with Zapier, Make, n8n and the Apify API.

### 🧰 More from SkyData Tools

- 📈 **[Google Trends Scraper](https://apify.com/skydata/google-trends-scraper)**: many keywords × many countries, insights, ONE scale for 50+ keywords, what's-new monitoring
- 🔍 **[Google Ads Transparency Scraper](https://apify.com/skydata/google-ads-transparency-scraper)**: competitor ad reports, long-running ads, countries, alerts
- 🎬 **[YouTube Transcript Scraper](https://apify.com/skydata/youtube-transcript-scraper)**: channels, playlists and search, AI-ready chunks, phrase search
- ⭐ **[App Reviews Scraper](https://apify.com/skydata/app-reviews-scraper)**: App Store + Google Play reviews with complaint reports and alerts
- 📇 **[Website Contact & Company Info Scraper](https://apify.com/skydata/website-contact-company-scraper)**: emails, phones, social profiles and tech stack from any list of websites

### ❓ FAQ

**Where does the data come from?** From AliExpress's public search pages, the same results any visitor sees. No login, no private data.

**Where does the sold count come from?** It is the cumulative count AliExpress reports for each product; we do not verify it independently. On the page AliExpress shows rounded text like "2,000+ sold", but most results also carry the full number, which this Actor uses (`soldIsUnrounded: true`). When only the rounded text exists, the lower bound is used and marked `soldIsUnrounded: false`.

**What do the numbers in the report mean?** They describe the products AliExpress showed for your search (its own ranking, up to your *max products per search*), not the whole market. `sold` is the **cumulative** count AliExpress reports since the product was listed, not sales in a recent period, and prices are **today's** prices. `avgSoldPerDaySinceListed` is cumulative sold ÷ days listed: a lifetime average, not a current sales rate. When AliExpress only gives a rounded count ("1,000+"), totals are lower bounds and the report says so. **Sponsored (ad) products are listed in the dataset (`isSponsored: true`) but left out of the report's statistics** (prices, sold counts, price bands, top sellers); each report shows the total, organic and sponsored counts (`productsAnalyzed`, `organicProductsAnalyzed`, `sponsoredInResults`), and its `statsScope` field says exactly which products the lowest/median/highest price and other statistics use, e.g. "organic products only: 45 of 60 products in the results (15 sponsored products excluded)". So the report's lowest price can be higher than the cheapest product in the dataset. If AliExpress returns only sponsored products, the statistics use them and `statsScope` says so. `listedDate` is the date AliExpress gives for the listing; it may be a re-listing date, so check very high averages for young listings on the product page.

**Which price is shown?** `price` is the normal price a returning shopper pays. AliExpress shows first-time visitors a much lower "welcome deal" price on many products; that one is in `newUserPrice`, so it never distorts your price research.

**Can I change country and currency?** Yes: set **Ship to** and **Currency**. Each product also shows the currency AliExpress actually returned.

**Why do results change between runs?** AliExpress reshuffles its search results between visits, like any marketplace that tests rankings. Each run is a true snapshot of what shoppers see at that moment. The "total results" number AliExpress reports also changes between visits, so treat it as a rough size of the niche. For steadier numbers, analyse more products per search (120–300) and compare reports over several runs.

**How do I find products that are selling now?** Turn on **tracking** and run it again a day or a week later: `soldSinceLastRun` shows real recent sales. The report's list of newer listings (last 120 days) is a quick shortlist, but it ranks by the average since listing, which says nothing about whether sales are growing or slowing today.

**Something missing or broken?** Open an issue. We answer within 12 hours.

# Changelog

This Actor's version history is a separate document: https://apify.com/skydata/aliexpress-product-research-scraper/changelog.md

# Actor input Schema

## `searchQueries` (type: `array`):

Products or niches to research, one per line (for example 'phone case', 'led strip lights'). Each keyword gets its own report.

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

Paste AliExpress search or category links, with any filters you set on the site (price range, free shipping, ships from). Each link gets its own report.

## `maxProductsPerSearch` (type: `integer`):

AliExpress shows about 60 products per page. 60 = the first page (fast and cheap for a first test), 120 = two pages.

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

Order in which AliExpress returns the products. 'Most orders' (best sellers first) uses AliExpress's own sort. Applies to search keywords; pasted links keep their own sort.

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

2-letter country code for prices and shipping (US, GB, DE, FR, AU, SA, AE ...).

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

3-letter currency code (USD, EUR, GBP ...). Each product also shows the currency AliExpress actually returned.

## `minSold` (type: `integer`):

0 = keep all products.

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

0 = keep all. Use 4 or 5 (whole stars) to keep only well-rated products.

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

Keep only products whose normal price is at least this (in your currency). AliExpress's own price filter in a pasted link can let through products outside the range by normal price; this one checks the normal price.

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

Keep only products whose normal price is at most this (in your currency).

## `excludeSponsored` (type: `boolean`):

AliExpress mixes about 15 ads into every 60 results. They are marked in the output either way.

## `includeProducts` (type: `boolean`):

Turn off to get only the search reports (cheaper).

## `monitorChanges` (type: `boolean`):

Remember the products between runs and add: sold since last run, sold per day since last run, price changes and new products in the results. This is the only way to measure recent sales (AliExpress shows all-time totals). Schedule it daily or weekly.

## `monitorName` (type: `string`):

Keeps separate memories for different keyword lists.

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

Apify datacenter proxy works for AliExpress and is included in the price.

## `fallbackToResidential` (type: `boolean`):

Included in the price.

## `pacingMs` (type: `integer`):

Average pause between page loads. Higher is gentler.

## `maxAttempts` (type: `integer`):

Retries with a new IP when a page fails. Failed searches are never charged.

## Actor input object example

```json
{
  "searchQueries": [
    "phone case"
  ],
  "maxProductsPerSearch": 60,
  "sortBy": "relevance",
  "shipTo": "US",
  "currency": "USD",
  "minSold": 0,
  "minRating": 0,
  "excludeSponsored": false,
  "includeProducts": true,
  "monitorChanges": false,
  "monitorName": "default",
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "fallbackToResidential": true,
  "pacingMs": 1500,
  "maxAttempts": 4
}
```

# Actor output Schema

## `html` (type: `string`):

Open in the browser and share.

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

One row per product.

## `reports` (type: `string`):

One row per search.

## `all` (type: `string`):

Products, reports and comparison (field 'type').

## `changes` (type: `string`):

Only with tracking.

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

What was charged.

# 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 = {
    "searchQueries": [
        "phone case"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

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

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,skydata/aliexpress-product-research-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/1ifThQ1k8W9ccjOq6/builds/xdl1XChET211QxI2D/openapi.json
