# AliExpress Scraper (`tortuga/aliexpress-scraper`) Actor

Scrape AliExpress search results and product pages: price, original price, discount, rating, orders, shipping, SKUs, store name and rating, images. Any keyword, category URL or product URL.

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

## Pricing

from $2.00 / 1,000 product scrapeds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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 Scraper

Scrape AliExpress search results, category pages and product pages into a clean dataset: title, sale price, original price, discount, rating, review count, orders, shipping and delivery estimate, Choice / Plus badges, images, and (with details on) every SKU with its own price and stock, the specification table, description images, shipping options, warranty and the store profile. Any keyword, category URL or product URL, in the currency and ship-to country you choose.

Download as JSON, CSV or Excel, or pull it through the API into your own app, Google Sheets or an LLM pipeline. You pay only for the products you get.

### What data does AliExpress Scraper extract?

Every product from a search or category page (the `result` event):

| Field | Description |
|---|---|
| `productId` | AliExpress product id (global `1005...` id; `aliexpress.us` ids are converted) |
| `title` | Product title |
| `url` | Product page URL |
| `price` | Current sale price (number) |
| `originalPrice` | Price before discount |
| `currency` | ISO currency code of the prices (input `currency`) |
| `discountPercent` | Discount as shown by AliExpress |
| `priceText` | Price exactly as displayed, e.g. `US $23.47` |
| `rating` | Star rating, 0-5 (null when the product has no reviews yet) |
| `reviewCount` | Number of reviews (only with `includeDetails`) |
| `ordersCount`, `soldText` | Orders as a number (`16539`) and as displayed (`10,000+ sold`) |
| `shippingText`, `isFreeShipping`, `deliveryText` | Shipping badge / delivery estimate from the card |
| `deliveryDaysMin`, `deliveryDaysMax`, `deliveryDateMin`, `deliveryDateMax` | Estimated delivery window for the ship-to country |
| `shipFrom` | Ship-from country code of the displayed SKU |
| `isChoice`, `isPlus`, `isAd`, `badges` | AliExpress Choice badge, Plus (local warehouse) badge, sponsored card, all badge texts (`Free shipping`, `Lowest price in 90 days`, ...) |
| `categoryId`, `categoryIdPath` | Leaf category id and the id path (`44/100000306/518`) |
| `imageUrl`, `images` | Main image and all card images (full size) |
| `skuId`, `originProductId` | SKU shown on the card; the original listing id behind a "superlink" card |
| `store` | `{id, name, url, rating, positiveRate, followers, yearsActive}` - filled with `includeDetails` |
| `searchTerm`, `sourceUrl`, `scrapedAt` | Provenance |

With **Include product details** on (the extra `detail` event), each product also gets:

| Field | Description |
|---|---|
| `skus` | Every variant: `{skuId, attributes: {Color: "Blue", "Ships From": "United States"}, price, originalPrice, currency, stock, isAvailable, maxPurchaseQty, imageUrl}` |
| `variants` | Variant options: `[{name: "Color", values: ["Blue", "Navy with Black"]}]` |
| `priceMin`, `priceMax` | Cheapest / most expensive SKU |
| `specifications` | Specification table as a dict (`{"Battery Capacity[mAh]": "6600", ...}`), plus `brand` |
| `description`, `descriptionImages` | Description text and images |
| `shippingOptions` | `[{carrier, fee, feeText, currency, isFree, freeShippingThreshold, deliveryDaysMin, deliveryDaysMax, etaMin, etaMax, shipFrom, shipTo, hasTracking}]` |
| `warranty`, `deliveryGuarantee` | e.g. `Free returns within 90 days` |
| `videoUrl`, `userManualUrl` | Product video (MP4) and manual (PDF) when present |
| `stock`, `maxPurchaseQty`, `isAvailable`, `saleEndsAt`, `wishlistCount` | Availability and promotion end |
| `categoryPath` | Category breadcrumb names when the page has them |
| `store` | `id, name, url, rating, positiveRate, followers, yearsActive, openedAt, soldLast180Days, communicationRating, country, sellerId, isTopRated, logo` |

### How to use AliExpress Scraper

1. Type one or more **Search terms** (one per line) and/or paste **Start URLs** (search pages, category pages or product pages - `aliexpress.us` links work too).
2. Pick the **Currency** and **Ship-to country** you want prices and shipping for (default USD / US) and the **Sort** order (best match, orders, price).
3. Set **Max items** to cap the run (and the cost). Turn on **Include product details** if you need SKUs, specifications, shipping options or the store profile.
4. Click **Start**. Results appear in the **Dataset** tab; export from there or use the API.

### Input example

```json
{
  "searchTerms": ["bluetooth speaker"],
  "startUrls": [{ "url": "https://www.aliexpress.com/category/518/speakers.html" }],
  "maxItems": 200,
  "maxPagesPerSearch": 5,
  "includeDetails": false,
  "currency": "USD",
  "shipTo": "US",
  "sortBy": "orders"
}
```

### Output example

```json
{
  "productId": "1005012918250674",
  "title": "Ortizan Bluetooth Speakers 40W TWS Portable Speaker with Stereo Sound Bass, Bluetooth 5.3 Wireless USB Type C Outdoor, 6600mAh Battery",
  "url": "https://www.aliexpress.com/item/1005012918250674.html",
  "price": 23.47,
  "originalPrice": 79.86,
  "currency": "USD",
  "discountPercent": 70,
  "priceText": "US $23.47",
  "rating": 4.9,
  "reviewCount": null,
  "ordersCount": 16539,
  "soldText": "10,000+ sold",
  "shippingText": "Free shipping",
  "isFreeShipping": true,
  "deliveryText": "Delivery: Sep 13 - 20",
  "deliveryDaysMin": 4,
  "deliveryDaysMax": 11,
  "deliveryDateMin": "2026-09-13",
  "deliveryDateMax": "2026-09-20",
  "shipFrom": "US",
  "isChoice": false,
  "isPlus": true,
  "isAd": false,
  "badges": ["Free shipping", "Lowest price in 90 days"],
  "categoryId": "518",
  "categoryIdPath": "44/100000306/518",
  "imageUrl": "https://ae-pic-a1.aliexpress-media.com/kf/Sf17ee9faed23457e919cf721857821d3P.png",
  "images": ["https://ae-pic-a1.aliexpress-media.com/kf/Sf17ee9faed23457e919cf721857821d3P.png", "..."],
  "store": { "id": null, "name": null, "url": null, "rating": null, "positiveRate": null, "followers": null, "yearsActive": null },
  "searchTerm": "bluetooth speaker",
  "sourceUrl": null,
  "scrapedAt": "2026-09-09T12:30:00+00:00"
}
```

With `includeDetails: true` the same item additionally carries `skus`, `variants`, `specifications`, `description`, `descriptionImages`, `shippingOptions`, `warranty`, `videoUrl`, `stock` and a filled `store` object (`{"id": "1105448245", "name": "Ortizan EU Store", "url": "https://www.aliexpress.com/store/1105448245", "rating": 4.9, "positiveRate": 97.9, "followers": 29, ...}`).

### How to scrape AliExpress prices in a different currency or country

Set `currency` (e.g. `EUR`) and `shipTo` (e.g. `DE`). AliExpress then returns the prices, promotions and shipping options it would show a shopper in that country; products that cannot ship there are left out by the site itself. Prices are the ones shown to a not-logged-in visitor, so "new shopper" coupon prices are not applied.

### How to find AliExpress best sellers

Use `sortBy: "orders"` to rank by orders, then filter the dataset by `ordersCount`, `rating` and `isChoice`. `discountPercent` is computed by AliExpress from the (often inflated) `originalPrice`, so treat it as a marketing signal.

### Can I get product variants, SKU prices and stock?

Yes - turn on **Include product details**. Each product then carries `skus` (one entry per variant with its own `price`, `originalPrice`, `stock` and `maxPurchaseQty`), `variants` (the option names and values) and `specifications`. This opens one product page per item (through the product API the page itself uses, one request at a time, about 3 seconds per product) and is charged as the extra `detail` event.

### Does it work without login or a browser?

Yes. The Actor reads the JSON that AliExpress embeds in its pages and the product API the page itself calls; no browser and no account are needed, which keeps it fast (about 1 second per 60 products) and cheap.

### What about captchas and blocking?

AliExpress shows a slider captcha to traffic it does not like. The Actor detects it, retries on a fresh proxy session and reports the count in the run's `SUMMARY` record (`captchaPages`). Product details use AliExpress' product API, which allows roughly 50 requests per IP before it starts answering with the captcha; the Actor spaces those calls and moves to a new proxy session when it happens. If you see captcha pages, switch the proxy to residential (ideally in the ship-to country) and lower `maxItems` per run.

### Pricing

Pay per product: the `result` event for every product saved, plus the `detail` event for every product page opened when **Include product details** is on. There is no subscription; Apify's free plan is enough to try it.

### Integrations and API

Use the run in Zapier, Make, n8n, Google Sheets, or call it from Python/Node with the Apify client. See the **API** tab for ready-made snippets.

### Is it legal to scrape AliExpress?

This Actor collects only publicly available, non-personal data (product listings and store business profiles). It does not log in, does not collect buyer names or reviews, and does not touch personal data. You are responsible for how you use the data and for complying with AliExpress' terms and applicable law.

### Support

Found a bug or need a field added? Open an issue in the **Issues** tab; it is usually answered within a day.

# Actor input Schema

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

Keywords to search on AliExpress, one per line (e.g. "bluetooth speaker", "yoga mat"). Each term is searched separately and paginated automatically (60 products per page).

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

AliExpress URLs to scrape instead of (or in addition to) search terms: search result pages (https://www.aliexpress.com/w/wholesale-led-strip.html), category pages (https://www.aliexpress.com/category/518/speakers.html) or single product pages (https://www.aliexpress.com/item/1005012781721732.html, returned with full details). aliexpress.us links work too.

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

Stop after this many products in total (across all search terms and URLs). Keeps cost predictable.

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

How many result pages to open per search term or start URL (60 products each). AliExpress serves at most about 60-100 pages per query.

## `includeDetails` (type: `boolean`):

Also open every product's page data to get all SKUs / variants with their own price and stock, the specification table, description text and images, shipping options with fees and delivery estimates, warranty / returns, video, and the store profile (name, URL, rating, positive feedback rate, followers, opening date). Slower and charged extra per product (see pricing).

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

ISO currency code for prices (USD, EUR, GBP, BRL, ...). AliExpress converts prices itself; some promotions differ by currency/country.

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

Two-letter country code the products should be shippable to (US, DE, GB, BR, ...). Changes which products, prices and shipping options AliExpress shows.

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

Result order for search terms and search URLs: best match (default), most orders, or price ascending / descending. AliExpress offers no 'newest' sort.

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

Apify Proxy is recommended. AliExpress shows a slider captcha to suspicious traffic; if the run reports captcha pages, switch to residential proxies (ideally in the ship-to country).

## Actor input object example

```json
{
  "searchTerms": [
    "bluetooth speaker"
  ],
  "startUrls": [],
  "maxItems": 100,
  "maxPagesPerSearch": 10,
  "includeDetails": false,
  "currency": "USD",
  "shipTo": "US",
  "sortBy": "default",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (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": [
        "bluetooth speaker"
    ],
    "startUrls": [],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("tortuga/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": ["bluetooth speaker"],
    "startUrls": [],
    "proxyConfiguration": { "useApifyProxy": True },
}

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

```

## MCP server setup

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