# AliExpress Product Scraper: Variants, Stock, Shipping, No Login (`benthepythondev/aliexpress-product-scraper`) Actor

Returns the full record of AliExpress products by link, id or keyword: every variant with price and stock, 30-day lowest price, rating, units sold, shipping options to your country, seller, specifications, images, video and description text. Missing products cost nothing. No login or browser.

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

## Pricing

from $3.40 / 1,000 product records

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 Product Scraper: Variants, Stock, Shipping and Seller

Returns the full record of an AliExpress product: every variant with its price, stock and purchase limit, the 30-day lowest price, rating, review count and units sold, the shipping options to your country, the seller, the specification table, images, video and the description as text. Give product links, product ids or keywords, pick a ship-to country, currency and language. It needs no login and no browser. Export to JSON, CSV or Excel, run on a schedule, call via API, or connect to Make, Zapier or n8n.

**Price:** $4.00 per 1,000 products on the Apify Free plan, $3.80 on Bronze, $3.60 on Silver, $3.40 from Gold up. A product found by one of your keyword searches costs $1.50 per 1,000 on top ($1.20 from Gold up). **Not charged:** a product AliExpress does not have, one it does not sell to your country, one it did not answer for, and a link that is no product link. Those come back as a row with a `status` and a reason.

### What the leading Actors say about themselves, and what this one does

The issue tabs of the three most-used "AliExpress product" Actors were empty on October 6, 2026, so this table is built from their own READMEs.

| Stated there | This Actor |
|---|---|
| "Variant SKUs, shipping matrices, seller-level details … are not included" (two of the three return search cards) | Every variant with price, original price, stock, purchase limit and availability; the shipping options; the seller |
| The description is a link to a document | The description's text and the list of its pictures are in the row, next to the link |
| Search and product details are two Actors to chain | Keywords in, full records out, in one run |
| One price on every plan ($5.00 per 1,000) | $4.00 per 1,000, less on Bronze, Silver and Gold |
| A proxy setting to keep at "residential" | No proxy setting; the Actor picks its addresses itself |
| A product that cannot be shipped to the country is a free row | The same, under the same status name `unavailable_in_region`, and only after a second address gave the same answer |
| No 30-day lowest price among the output fields | `lowestPrice30Days` for the product and per variant, where AliExpress shows it (seen in Germany and France) |

### 🔎 What is the AliExpress Product Scraper?

An AliExpress product page is an empty shell that asks AliExpress's own data service for the product. This Actor asks the same service with plain requests and turns the answer into one row per product.

AliExpress serves one address about ten products and then asks for a slider check. The Actor gives every address ten products and then takes another one, six of them side by side, and drops an address at its first refusal. An answer that is no record is never saved as one.

#### What data does it extract?

- **Product:** id, link, title, category id and path, images, video, documents such as a manual
- **Price:** range of sale price and original price over the variants you can buy, discount, currency, 30-day lowest price
- **Variants:** id, options ("Color: Black", "Ships From: Spain"), price, original price, 30-day lowest price, stock, purchase limit, availability
- **Demand:** rating, review count, units sold as shown and as a number, total stock
- **Shipping to your country:** method, fee, ship-from country, delivery days, estimated dates, tracking
- **Seller:** store id, name, link, rating, share of positive reviews, units sold in 180 days, country, opening date
- **Content:** specification table, description text, description pictures

### ⬇️ Input

| Field | Type | Default | What it does |
|---|---|---|---|
| `productUrls` | array | | Product links of any AliExpress site, or bare product ids |
| `searchQueries` | array | | Keywords; the products a search finds are read like links |
| `maxProductsPerSearch` | integer | 10 | Products to read per keyword, up to 1,000 |
| `maxItems` | integer | 100 | Products in total, up to 5,000 |
| `shipTo` | string | `US` | Country that prices, stock and shipping are calculated for |
| `currency` | string | by country | For example `USD`, `EUR`, `GBP` |
| `language` | string | `en` | Language of titles, option names and specifications: `de`, `fr`, `es`, `pt`, `it` and others |
| `includeDescription` | boolean | true | Adds the description text and its pictures |
| `sortBy`, `minPrice`, `maxPrice` | | | Search only: order (`default`, `orders`, `priceAsc`, `priceDesc`) and price range |

An empty input reads three sample products.

#### Example input

Three products for a buyer in Germany, in euros and German:

```json
{
  "productUrls": [
    "https://www.aliexpress.com/item/1005006959700436.html",
    "https://www.aliexpress.us/item/3256806773385684.html",
    "1005006639944031"
  ],
  "shipTo": "DE",
  "language": "de"
}
```

The first two links are the same product under its two ids; it is read and charged once.

The five best sellers for a keyword in the UK, with their full records:

```json
{
  "searchQueries": ["usb c hub"],
  "maxProductsPerSearch": 5,
  "sortBy": "orders",
  "shipTo": "GB"
}
```

### ⬆️ Output

One row per product. Arrays are shortened here; this product has 133 variants, 6 images and 55 specification lines.

```json
{
  "status": "ok",
  "statusReason": null,
  "productId": "1005006959700436",
  "url": "https://www.aliexpress.com/item/1005006959700436.html",
  "title": "QCY MeloBuds Pro ANC Bluetooth 5.3 Earphones Wireless 46dB Hybrid ANC Hi-Res LDAC Earbuds 6 Mic Headphones 34H In-Ear Detection",
  "currency": "USD",
  "price": { "min": 25.47, "max": 31.74 },
  "originalPrice": { "min": 82.43, "max": 98.1 },
  "discountPercent": 69,
  "lowestPrice30Days": null,
  "rating": 4.8,
  "reviewCount": 5383,
  "sold": "10,000+ sold",
  "soldCount": 10000,
  "totalStock": 6275,
  "images": ["https://ae-pic-a1.aliexpress-media.com/kf/Sf3383a35bac041acad10e4c903fa6804V.jpg"],
  "video": "https://video.aliexpress-media.com/play/u/ae_sg_item/2227548615/p/1/e/6/t/10301/5000117320950.mp4",
  "categoryId": "63705",
  "categoryPath": "44/100000306/63705",
  "attributes": [{ "name": "Material", "value": "PVC,ABS" }],
  "skuProperties": [
    { "id": 14, "name": "Color", "values": [{ "id": 10, "name": "BLACK", "image": "https://ae-pic-a1.aliexpress-media.com/kf/Sf3383a35bac041acad10e4c903fa6804V.jpg", "color": "#FF0000" }] }
  ],
  "skus": [
    { "skuId": "12000045348692436", "attributes": { "Color": "GOLDEN", "Ships From": "Brazil" }, "price": 25.97, "originalPrice": 83.68, "lowestPrice30Days": null, "stock": 33, "maxBuyCount": 1, "available": true },
    { "skuId": "12000045348692444", "attributes": { "Color": "Black with Case03", "Ships From": "Brazil" }, "price": 27.88, "originalPrice": 88.44, "lowestPrice30Days": null, "stock": 0, "maxBuyCount": 0, "available": false }
  ],
  "shipping": [
    { "method": "Aliexpress Selection Standard", "code": "CAINIAO_FULFILLMENT_STD", "fee": 0, "freeShipping": true, "feeCurrency": null, "shipFrom": "China", "shipFromCode": "CN", "shipTo": "US",
      "deliveryDaysMin": 9, "deliveryDaysMax": 15, "estimatedDelivery": "Oct. 15 – Oct. 21", "tracking": true }
  ],
  "description": "QCY MeloBuds Pro ANC Bluetooth 5.3 Earphones Wireless 46dB Adaptive Hybrid ANC Hi-Res LDAC Earbuds 6 Mic Headphones 34H in-Ear Detection Adaptive Hybrid Active …",
  "descriptionImages": ["https://ae-pic-a1.aliexpress-media.com/kf/S2f63ffd89f5d4302bef3bbeac7542fef8.jpg"],
  "descriptionUrl": "https://pdp.aliexpress-media.com/product/description/pc/v2/en_US/desc.htm?productId=1005006959700436&key=…",
  "documents": [{ "type": "PDF", "url": "https://ae-pic-a1.aliexpress-media.com/kf/S70e7ebc46c1546058fc0b9b3262b293bz.pdf" }],
  "store": { "id": "1100955127", "name": "QCY Official Store", "url": "https://www.aliexpress.com/store/1100955127", "sellerId": "221859663", "rating": 4.9, "positiveRate": "97.4%",
             "soldLast180Days": "70,000+", "country": "China", "province": "Guangdong", "openedAt": "2014-09-23 02:02:16", "topRatedSeller": false },
  "shipTo": "US",
  "language": "en",
  "query": null,
  "position": null,
  "scrapedAt": "2026-10-07T06:58:13.484969+00:00"
}
```

A product without a record has the same columns, empty, with one of these in `status` and the reason in `statusReason`:

| `status` | Meaning |
|---|---|
| `not_found` | AliExpress has no product with this id |
| `unavailable_in_region` | AliExpress does not sell it to the `shipTo` country; another country may work |
| `unavailable` | AliExpress does not show it, for another reason it names |
| `failed` | No answer for this product in this run; run it again |
| `invalid_link` | The entry is no product link or id |

The record `SUMMARY` in the run's key-value store counts the rows by status and names what each search found.

### 📏 Measured

These times are from a test server outside Apify, on October 7, 2026, through residential addresses. On Apify they will differ.

| Run | Rows | Time |
|---|---|---|
| Sample input: three products, US | 3 records | 8 to 9 s |
| Seven entries for Germany in German: four products, two not sold there, one store link | 4 records, 3 status rows | 16 s |
| Keyword "usb c hub", five best sellers, plus one link, UK | 6 records | 14 s |
| 40 links, killed after 18 seconds and started again on the same dataset | 39 different products (one link was there twice), none saved twice | 18 s + 10 s |

Memory peaked at 96 MB. A record took about 40 KB of traffic, refused addresses counted in. Of 64 residential addresses the finished runs tried, AliExpress served 22; the others were refused on their first request and replaced.

### 🤖 For AI agents

Smallest useful call:

```json
{"productUrls": ["https://www.aliexpress.com/item/1005006959700436.html"], "shipTo": "US"}
```

Each row is one product. Check `status` first: only `ok` rows carry data and only they cost. Then read `title`, `price.min`, `price.max`, `currency`, `rating`, `reviewCount`, `sold`, `skus[]` (`attributes`, `price`, `stock`, `available`), `shipping[]` (`fee`, `deliveryDaysMin`, `deliveryDaysMax`) and `store`. `productUrls` and `searchQueries` take several entries. No credentials are needed. A missing product is a successful run with a status row. Cost: $0.004 per `ok` row, plus $0.0015 when a search found it.

### 💡 Use cases

- 📦 **Dropshipping catalog sync:** variants, stock and prices of the products in your store, refreshed on a schedule.
- 💶 **Price and stock monitoring:** per-variant prices and availability of your own or a competitor's products, per country.
- 🚚 **Shipping research:** fee, ship-from warehouse and delivery days to each country you sell in.
- 🏪 **Supplier vetting:** the same product across sellers by store rating, positive reviews, units sold in 180 days and store age.

### ⚠️ Limits, stated plainly

- **Prices are a visitor's prices.** They are what someone without an account sees for the country, welcome deals for new customers included. A signed-in buyer can see other prices.
- **`price` and `originalPrice` cover the variants that can be bought.** A sold-out variant keeps its own price in `skus`; sellers often park absurd prices there (139,080.19 for a USB hub in one test).
- **Units sold are rounded by AliExpress** ("10,000+ sold"); `soldCount` is that number. When the text names this seller's sales and the product's total, `soldCount` is the seller's.
- **Some fields exist in some markets only.** The German and French rows had a 30-day lowest price and no original price; the US and UK rows had it the other way round.
- **Shipping options are those AliExpress shows for one piece of the preselected variant:** one to three options in the tests. A product that cannot be delivered has an empty list.
- **No reviews.** The row has the rating and the review count, not the review texts.
- **Description text ends at 30,000 characters,** and a description made of pictures only has no text.
- **The store's rating is filled only when AliExpress lists all four store figures;** its share of positive reviews is always there.
- **`shipTo` in the row is the country AliExpress calculated for.** Markets tested: US, GB, DE, FR, BR. Languages tested: English, German, Portuguese.
- **Short share links** (`a.aliexpress.com/_…`) are not followed; they come back as `invalid_link`.
- **Speed depends on AliExpress.** It refuses most new addresses, so a run spends part of its time finding addresses that are served. A run that is refused 60 times in a row stops and says so; what it saved stays.
- **Keyword searches** are read from AliExpress's search page: results and their order depend on the visitor AliExpress assumes.

### ❓ FAQ

**Do I need an AliExpress account, cookies or an API key?** No.

**What is charged, exactly?** One event per product that comes back with `status: "ok"`. A product that one of your keyword searches found carries a second, smaller event. Status rows cost nothing. After 50 status rows plus four per record a run stops, so that a list of dead ids does not run for nothing.

**Can I get prices in my currency and shipping to my country?** Yes: `shipTo` and `currency`. Prices, stock, availability and shipping are calculated for that country.

**Why does a product come back as `unavailable_in_region`?** AliExpress does not sell it to that country. In the tests two products of a list were not sold to Germany and were sold to the US.

**I use another product Actor. What changes?** Field names follow the most-used one: `productId`, `status`, `price`, `originalPrice`, `discountPercent`, `rating`, `reviewCount`, `sold`, `totalStock`, `attributes`, `skuProperties`, `skus`, `shipping`, `descriptionUrl`, `documents`, `store`, `shipTo`, and the input names `productUrls`, `shipTo`, `currency`, `maxItems`. Added here: `statusReason`, `lowestPrice30Days`, `soldCount`, `description`, `descriptionImages`, `language`, `query`, `position`, a fee currency and ship-from code per shipping option, the store's province. Different: a product AliExpress does not have is `not_found`, and the price range leaves sold-out variants out. `startUrls`, `urls`, `productIds`, `keywords`, `queries` and `country` are read as well; `maxProducts` is read as the limit per search.

**Does it accept links from aliexpress.us or de.aliexpress.com?** Yes, links of every AliExpress site and both forms of a product id.

**How many products can one run read?** Up to 5,000. In the tests a run read one to two products a second.

**What happens at a spending limit or a timeout?** The run stops before it, keeps its rows and says in the status message where it stopped. Started again on the same dataset (resurrected), it continues without reading a product twice.

**How do I call it from code?** With the Apify API or the Python and JavaScript clients; every run returns a dataset you can fetch as JSON or CSV. It also works as a tool through Apify's MCP server.

**Is it legal?** The Actor reads product pages AliExpress shows to every visitor without login. A row holds product and store data, no data of buyers. Respect AliExpress's terms and the rights of sellers in product images and texts, and data protection law such as the GDPR where a seller is a private person.

### 🔗 You might also like

- [TikTok Shop Scraper](https://apify.com/benthepythondev/tiktok-shop-scraper): products, prices and sellers of TikTok Shop US
- [Shopify Store Scraper](https://apify.com/benthepythondev/shopify-store-scraper): every product of a Shopify store
- [Google Maps Scraper](https://apify.com/benthepythondev/google-maps-business-scraper): local businesses with phone, website and ratings

**Keywords:** aliexpress product scraper, aliexpress scraper, aliexpress product details, aliexpress api, aliexpress variants, aliexpress sku prices, aliexpress stock, aliexpress shipping cost, aliexpress seller data, aliexpress product data, aliexpress price monitoring, dropshipping product data, aliexpress to shopify, aliexpress product description, aliexpress product export, ecommerce product scraper, aliexpress no login

# Actor input Schema

## `productUrls` (type: `array`):

AliExpress product pages to read, one row each. Takes links of any AliExpress site (aliexpress.com, aliexpress.us, de.aliexpress.com and so on) and bare product ids such as 1005006959700436. A product named twice is read once.

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

Keywords to search AliExpress for, for example "wireless earbuds". The products a query finds are read like product links, up to the per-search limit below. Each of them costs the search result on top of the record.

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

Products to read for each search query, in the order AliExpress lists them.

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

Stops after this many products in total, links first, then search results. This is the cost lever: every product with a record is charged.

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

Two-letter country that prices, stock, availability and shipping options are calculated for, for example US, GB, DE, FR, BR. Default US.

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

Three-letter currency of all prices, for example USD, EUR, GBP. Left empty, the usual currency of the ship-to country is used.

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

Two-letter language of titles, specifications and variant names where AliExpress has them translated: en, de, fr, es, pt, it and others.

## `includeDescription` (type: `boolean`):

Adds the seller's description as plain text and the list of its pictures. It is a second, small document per product and costs nothing extra.

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

Order in which a search query lists its products. Only used with search queries.

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

Search only: products from this price, in the currency of the market. Applied by AliExpress.

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

Search only: products up to this price. Applied by AliExpress.

## `debug` (type: `boolean`):

Writes each request with its size and time to the log, for support.

## Actor input object example

```json
{
  "productUrls": [
    "https://www.aliexpress.com/item/1005006959700436.html",
    "https://www.aliexpress.com/item/1005006639944031.html",
    "https://www.aliexpress.com/item/1005009383937691.html"
  ],
  "maxProductsPerSearch": 10,
  "maxItems": 100,
  "shipTo": "US",
  "language": "en",
  "includeDescription": true,
  "sortBy": "default",
  "debug": false
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "productUrls": [
        "https://www.aliexpress.com/item/1005006959700436.html",
        "https://www.aliexpress.com/item/1005006639944031.html",
        "https://www.aliexpress.com/item/1005009383937691.html"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("benthepythondev/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 = { "productUrls": [
        "https://www.aliexpress.com/item/1005006959700436.html",
        "https://www.aliexpress.com/item/1005006639944031.html",
        "https://www.aliexpress.com/item/1005009383937691.html",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("benthepythondev/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 '{
  "productUrls": [
    "https://www.aliexpress.com/item/1005006959700436.html",
    "https://www.aliexpress.com/item/1005006639944031.html",
    "https://www.aliexpress.com/item/1005009383937691.html"
  ]
}' |
apify call benthepythondev/aliexpress-product-scraper --silent --output-dataset

```

## MCP server setup

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