# AliExpress Product Scraper (`lowlanddata/aliexpress-product-scraper`) Actor

Scrape AliExpress search results - price, discount, star rating and the order count, the closest thing to a public sales figure. Pick the ship-to country: it decides the offers, not just the currency.

- **URL**: https://apify.com/lowlanddata/aliexpress-product-scraper.md
- **Developed by:** [Lowland Data](https://apify.com/lowlanddata) (community)
- **Categories:** E-commerce, MCP servers, Agents
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.80 / 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.
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 Product Scraper — search results with orders and ratings as clean JSON

Extract AliExpress search results — product id, title, sale price and currency, original price and the discount between them, star rating, **how many orders the listing has taken**, and a tracking-free product link — as flat JSON rows for sourcing, price research and market sizing. Sixty products per page, sorted any way AliExpress sorts them.

**Live health record:** [lowlanddata.com/status/aliexpress-product-scraper](https://lowlanddata.com/status/aliexpress-product-scraper/) - 30-day success rate and daily canary results, failures included. Full input/output reference: [tool page](https://lowlanddata.com/tools/aliexpress-product-scraper/).

**No personal data, ever.** Products come back whole. Stores do not: an AliExpress seller is frequently a sole trader, so the shop name — and the store id, which resolves straight back to the same person — are personal data. There is no store field and there never will be.

### Quick start (30 seconds)

1. Type what you would type into AliExpress into **keywords**.
2. Optionally set **sortBy** to *Most orders* — that is the one that shows what actually sells.
3. Click **Start**, then open the dataset's **Overview** tab or **Export** as CSV/Excel/JSON.

Optional: **minPrice**/**maxPrice** and **freeShipping**. Everything works on a daily Schedule.

### What you can build with it

- **Product sourcing.** Sort by orders, filter by price band, and you have the shortlist of what moves in a category — with the order counts to back it.
- **Price research.** `price`, `originalPrice` and `discountPercent` across a whole category in one run.
- **Demand sizing.** `ordersCount` is the closest thing to a public sales figure anywhere in e-commerce. Track it over time and you are watching a product's trajectory.
- **Dropshipping shortlists.** Rating, orders and price together, as rows you can rank however you like.

### What you get

One JSON object per product:

```json
{
  "productId": "1005012978081108",
  "title": "90 degree USB cable for iPhone 14 13 12 11 Pro Max 2m 3m fast charging",
  "url": "https://www.aliexpress.com/item/1005012978081108.html",
  "price": 1.95,
  "currency": "EUR",
  "priceFormatted": "€ 1,95",
  "originalPrice": null,
  "discountPercent": null,
  "rating": 4.9,
  "ordersCount": 10000,
  "ordersText": "10.000+ verkocht",
  "imageUrl": "https://ae-pic-a1.aliexpress-media.com/kf/S05197.jpg"
}
```

`ordersText` is kept exactly as AliExpress printed it, in whatever language it served — `ordersCount` is the same figure as a number you can sort on.

### How much does it cost?

Pay per product row plus a small start fee — no subscription. One page carries 60 products, so a 200-product run is four fetches. Free-plan users can try it capped at 5 products. Platform usage is billed by Apify; AliExpress needs a residential route, so runs cost a little more than a plain HTML site.

### Not technical? Let your AI assistant set it up

```
I want to use the AliExpress Product Scraper (lowlanddata/aliexpress-product-scraper) on Apify.

What I want: [E.G. "the 200 best-selling phone cases under 5 EUR"]

Guide me to:
1. Propose input values: keywords, sortBy, minPrice, maxPrice,
   freeShipping and maxItems.
2. Explain how to run it in the Apify Console and export CSV.
3. Suggest a daily Schedule so I can watch order counts move over time.
```

### Input reference

| Field                | Type    | Default     | Notes                                                           |
| -------------------- | ------- | ----------- | --------------------------------------------------------------- |
| `keywords`           | string  | `usb cable` | What you would type into AliExpress.                            |
| `sortBy`             | string  | relevance   | relevance, orders, newest, price-asc, price-desc.               |
| `minPrice`           | integer | —           | Lower bound, in the currency AliExpress serves you.             |
| `maxPrice`           | integer | —           | Upper bound.                                                    |
| `freeShipping`       | boolean | `false`     | Only listings flagged as free shipping.                         |
| `maxItems`           | integer | `200`       | Stop after this many products. A page carries 60.               |
| `proxyConfiguration` | object  | residential | AliExpress challenges suspicious requests — keep this as it is. |

### Scheduling and API use

```bash
curl -X POST "https://api.apify.com/v2/acts/lowlanddata~aliexpress-product-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"keywords": "phone case", "sortBy": "orders", "maxPrice": 5, "maxItems": 200}'
```

### Use it with AI agents (MCP)

Run it directly from Claude, Cursor and other MCP clients: [apify.com/lowlanddata/aliexpress-product-scraper/api/mcp](https://apify.com/lowlanddata/aliexpress-product-scraper/api/mcp).

### Is it legal to scrape AliExpress listings?

This actor reads only public search pages — what any shopper sees without logging in — and takes only product facts: identifier, title, price, rating, order count. No customer data, no reviewer identities, no seller names. How you use them downstream is yours to assess.

### FAQ

**Why is `ordersText` in Dutch/Russian/Spanish?** It is AliExpress's own wording, served in whatever language it decided to give the request, and kept unchanged. Sort on `ordersCount` instead — that is the same figure as a plain number.

**Why does `price` sometimes differ from what I see?** Because `shipTo` differs from where you are browsing. The same search returned EUR 1,70 to Germany, USD 4.09 to the United States and BRL 19,73 to Brazil on the same day — those are different offers, not one price converted. Set `shipTo` to the market you actually sell into. Within a listing, the sale price is its lowest SKU, and `priceFormatted` shows exactly what was served.

**Why no store name?** An AliExpress seller is frequently a sole trader, which makes the shop name personal data under GDPR. We do not emit it, or the store id, behind a flag or otherwise.

**Can I scrape one product's full detail page?** Not in v1. This reads search result pages, which already carry price, rating and orders.

### Troubleshooting

- **"answered without its search data"** — AliExpress served its slider challenge instead of results. The actor treats that as a block and rotates to a fresh route, rather than reporting an empty run as a success. Re-run in a few minutes if a whole run fails.
- **Fewer products than you expected** — past the last page the grid repeats itself rather than emptying, so the run stops as soon as a page adds nothing new.

If this saves you an afternoon, a **rating on this page** takes ten seconds and helps other buyers find the compliance-clean option.

# Actor input Schema

## `keywords` (type: `string`):

What to search for, exactly as you would type it into AliExpress.

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

Which country the prices are for. AliExpress shows different offers and a different currency per destination, so this decides what you get - not just the exchange rate.

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

How AliExpress should order the results. 'Most orders' is the useful one for finding what actually sells.

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

Only products at or above this price, in the currency AliExpress serves you.

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

Only products at or below this price.

## `freeShipping` (type: `boolean`):

Only products AliExpress flags as free shipping.

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

Stop after this many products. One page carries 60.

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

AliExpress challenges suspicious requests with a slider served as HTTP 200, and prices by destination - so the run pins a residential session to the Ship to country. Leave this as it is: a custom proxy without that targeting returns another country's offers.

## Actor input object example

```json
{
  "keywords": "usb cable",
  "shipTo": "US",
  "freeShipping": false,
  "maxItems": 200,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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 = {
    "keywords": "usb cable"
};

// Run the Actor and wait for it to finish
const run = await client.actor("lowlanddata/aliexpress-product-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": "usb cable" }

# Run the Actor and wait for it to finish
run = client.actor("lowlanddata/aliexpress-product-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": "usb cable"
}' |
apify call lowlanddata/aliexpress-product-scraper --silent --output-dataset

```

## MCP server setup

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