# AliExpress Product Details Scraper: SKUs & Stock (`scrapelark/aliexpress-product-details`) Actor

Get full AliExpress product details from product links: prices, every variant with its stock, shipping, specifications, photos and seller. Pay only for products that come back with data.

- **URL**: https://apify.com/scrapelark/aliexpress-product-details.md
- **Developed by:** [ScrapeLark](https://apify.com/scrapelark) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $7.00 / 1,000 product with data

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 Product Details Scraper: SKUs & Stock

Get the full details of any AliExpress product from its link: prices, every variant with its own price and
stock, the shipping option for your country, specifications, photos, video and the seller. One row per product, ready for
price tracking, product research, dropshipping catalogs or market analysis.

You pay only for products that come back with data. Products that no longer exist, are not sold to your country, or
could not be read are free.

### Why choose this actor

- **Every variant, not just the headline price.** Each color, size and "ships from" option comes with its own price,
  original price, stock and purchase limit.
- **Prices and shipping for your country.** Pick one of 39 ship-to countries and 28 currencies. You get the prices,
  availability and delivery option a shopper there would see.
- **Pay only for results.** Products that are gone, not sold to your country, or could not be read cost nothing.
- **Clear results.** Every product you send gets a row with a status, and the run ends with a plain summary: how many
  products were charged, how many were free, and how many were not read.
- **Easy to switch to.** Already use another AliExpress product details actor? The same input works here:
  `productUrls`, `shipTo`, `currency` and `maxItems`.

### What data you get

| Field                                       | What it is                                                                                                                                 |
| ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
| `productId`, `url`, `status`                | The product, its link, and whether it came back with data (see below)                                                                      |
| `title`, `currency`                         | Product title and the currency of all prices                                                                                               |
| `price`, `originalPrice`, `discountPercent` | Lowest and highest price over the variants you can buy, the price before discount, and the discount                                        |
| `rating`, `reviewCount`, `sold`             | Star rating, number of reviews, and sales as shown ("10,000+ sold")                                                                        |
| `totalStock`                                | Stock over all variants                                                                                                                    |
| `images`, `video`                           | Photo links and the product video link                                                                                                     |
| `categoryId`, `categoryPath`                | The AliExpress category and its path from the top                                                                                          |
| `attributes`                                | The specification table, as name and value                                                                                                 |
| `skuProperties`                             | The variant choices (color, size, ships from...) with their pictures                                                                       |
| `skus`                                      | Every variant: its choices, price, original price, stock, purchase limit and whether it can be bought                                      |
| `shipping`                                  | The delivery option the product page shows for your country: method, fee, free or not, ship from, delivery days, estimated dates, tracking |
| `descriptionUrl`, `documents`               | Link to the full description, and downloadable documents such as manuals                                                                   |
| `store`                                     | The seller: name, ID, link, rating, positive feedback, sales in 180 days, country, opening date, top-rated flag                            |
| `shipTo`, `scrapedAt`, `checkedAt`          | The ship-to country of the run, when the row was made, and when the product page was really opened (see the FAQ)                           |

Each row has a `status`:

- `ok`: full product data. **Charged.**
- `not_found`: the product no longer exists, or its listing is switched off. Free.
- `unavailable_in_region`: AliExpress does not sell this product to your ship-to country. Free.

A `not_found` or `unavailable_in_region` row can come from an earlier run, without opening the page again: then
`checkedAt` is earlier than `scrapedAt` (see the FAQ).

- `failed`: the product could not be read after 4 tries, or its page answered 3 times without the product and without
  a reason.
  Free; run it again later.

Variants that are sold out or switched off are still listed, with `"available": false`.

### How to use it

1. Paste product links into **Product links**. Links from aliexpress.com, aliexpress.us, other country sites and the
   mobile site all work. For a long list, use **Upload file** or **Link remote text file** with one product link or
   product ID per line. A product listed twice is read once.
2. Pick the **Ship to country** and the **Currency** from the lists. Prices, availability and shipping options are for
   that country.
3. Set **Max products** if you want to read only the first part of a long list.
4. Leave **Check known unavailable products again** off, unless you think a product that was not found or not sold to
   your country is back (see the FAQ).
5. Start the run. Rows appear in the dataset as products are read; download them as JSON, CSV or Excel. For CSV and
   Excel, pick the **One row per variant** or **Overview** view (see the FAQ).

#### Input example

```json
{
    "productUrls": [
        { "url": "https://www.aliexpress.com/item/32848744075.html" },
        { "url": "https://www.aliexpress.com/item/1005005433621337.html" }
    ],
    "shipTo": "GB",
    "currency": "GBP",
    "maxItems": 50
}
```

Each entry is a full product link. A text file with one link or product ID per line works too:
`{ "requestsFromUrl": "https://example.com/my-products.txt" }`.

#### Output example

A real row from a test run, shortened (only the first photos, attributes and variants are shown):

```json
{
    "productId": "32848744075",
    "url": "https://www.aliexpress.com/item/32848744075.html",
    "status": "ok",
    "title": "USB LED Light Bar 5V Rigid LED Strip for the Kitchen Dimmable Aluminum Light Bar for Under Cabinet Lighting Warm Cool White",
    "currency": "USD",
    "price": {
        "min": 1.31,
        "max": 4.6
    },
    "originalPrice": {
        "min": 4.31,
        "max": 7.6
    },
    "discountPercent": 70,
    "rating": 4.3,
    "reviewCount": 19,
    "sold": "181 sold",
    "totalStock": 439691,
    "images": [
        "https://ae-pic-a1.aliexpress-media.com/kf/Saad04c6cabb94fc6bddd52ac9a5ad877B.jpg",
        "https://ae-pic-a1.aliexpress-media.com/kf/S2ce336f823c9435c81ba38f81da79bb5x.jpg"
    ],
    "video": "https://video.aliexpress-media.com/play/u/ae_sg_item/2518958049/p/1/e/6/t/10301/5000553558249.mp4",
    "categoryId": "200001053",
    "categoryPath": "39/390501/200001053",
    "attributes": [
        {
            "name": "Luminous Flux",
            "value": "249-2000"
        },
        {
            "name": "Width",
            "value": "5cm"
        }
    ],
    "skuProperties": [
        {
            "id": 136,
            "name": "Emitting Color",
            "values": [
                {
                    "id": 173,
                    "name": "Blue",
                    "image": "https://ae-pic-a1.aliexpress-media.com/kf/Se978fd7b870b40db9023f69a666179228.jpg",
                    "color": "#0080FF"
                },
                {
                    "id": 1052,
                    "name": "Pink",
                    "image": "https://ae-pic-a1.aliexpress-media.com/kf/S9ec258aecc4048148657214e56b13128J.jpg",
                    "color": "#FFC0CB"
                }
            ]
        },
        {
            "id": 14,
            "name": "Color",
            "values": [
                {
                    "id": 29,
                    "name": "32cm A Switch",
                    "image": "",
                    "color": "#FFFFFF"
                },
                {
                    "id": 366,
                    "name": "32cm B Switch",
                    "image": "",
                    "color": "#FFFF00"
                }
            ]
        }
    ],
    "skus": [
        {
            "skuId": "65221629980",
            "attributes": {
                "Emitting Color": "Red",
                "Color": "52cm B Switch"
            },
            "price": 3.75,
            "originalPrice": 6.75,
            "stock": 9993,
            "maxBuyCount": 1,
            "available": true
        },
        {
            "skuId": "12000020428149796",
            "attributes": {
                "Emitting Color": "Natural White",
                "Color": "32cm B Switch"
            },
            "price": 2.65,
            "originalPrice": 5.65,
            "stock": 9996,
            "maxBuyCount": 1,
            "available": true
        }
    ],
    "shipping": [
        {
            "method": "AliExpress Selection Standard Shipping",
            "code": "CAINIAO_FULFILLMENT_STD",
            "fee": 1.99,
            "freeShipping": false,
            "shipFrom": "CN",
            "shipTo": "US",
            "deliveryDaysMin": 7,
            "deliveryDaysMax": 13,
            "estimatedDelivery": "Nov. 04 – Nov. 10",
            "tracking": true
        }
    ],
    "descriptionUrl": "https://pdp.aliexpress-media.com/product/description/pc/v2/en_US/desc.htm?productId=32848744075&key=Sc18378d93f134ef9a63f7acbe3770df38.zip&token=13f63f62376bdd189dee177a2c97ea56&sellerId=223946437",
    "documents": [],
    "store": {
        "id": "1800627",
        "name": "WIXOLighting Official Store",
        "url": "https://www.aliexpress.com/store/1800627",
        "sellerId": "223946437",
        "rating": 4.8,
        "positiveRate": "89.1%",
        "soldLast180Days": "7,000+",
        "country": "China",
        "openedAt": "2015-05-10 08:34:35",
        "topRatedSeller": false
    },
    "shipTo": "US",
    "scrapedAt": "2026-10-28T13:20:49.787Z",
    "checkedAt": "2026-10-28T13:20:49.787Z"
}
```

### Pricing

**$7 per 1,000 products** ($0.007 per product with data). The proxy and the server time are included: there is
nothing else to pay for.

Only `ok` rows are charged. `not_found`, `unavailable_in_region` and `failed` rows are free.

| Products with data | You pay |
| ------------------ | ------- |
| 50                 | $0.35   |
| 1,000              | $7      |
| 10,000             | $70     |

Set a spending limit when you start the run, and the run stops cleanly when it is reached. It never opens a product the
limit could not pay for, and it tells you how many products were not read.

### FAQ

**How fast is it?**
Each product page is opened in a real browser. Expect roughly 8 to 10 seconds per product at the default memory
(4 GB), so 50 products take about 8 minutes. With 8 GB of memory it is about twice as fast again.

**How many products can I send in one run?**
There is no fixed limit. Give big runs enough time: before the run's timeout, the run stops by itself and tells you how
many products were not read, so you can run those again. **Max products** caps how many are read.

**Why did a product come back as `failed`?**
AliExpress sometimes refuses a page, or answers without the product in it. The product is then tried again as a new
visitor, up to 4 tries in total (3 for a page without the product). If it still cannot be read, you get a free `failed`
row. You are never charged for a row without product data. Run those products again later.

**What is the difference between `not_found` and `unavailable_in_region`?**
`not_found` means the product no longer exists or its listing is switched off. `unavailable_in_region` means it
exists, but AliExpress does not sell it to the ship-to country you picked. Both are free.

**Does it open a product again that was not found last time?**
Not right away. The actor keeps a short list in your own Apify account, in a key-value store named
`scrapelark-aliexpress-known-unavailable`: products that were `not_found` in the last 30 days, and products that were
`unavailable_in_region` for your ship-to country in the last 3 days. A later run gives them their free row at once and
does not open their pages, so runs of the same list finish sooner. In those rows, `checkedAt` is the date of the real
check. Turn on **Check known unavailable products again** to open every product page. A product that comes back with
data leaves the list.

**Which shipping options do I get?**
The delivery option AliExpress shows on the product page for your ship-to country, usually its default one, with
fee, delivery days and tracking. Other options that appear only when a shopper opens the shipping menu are not
included yet.

**Do I get reviews or questions and answers?**
Not the review texts. You get the star rating, the number of reviews and the sales count.

**How do I get the data into Excel or Google Sheets?**
Use the **One row per variant** view: every variant gets its own row with its price, stock and choices. The
**Overview** view gives one row per product. The full record has more columns than a spreadsheet export allows, so
use JSON when you need every field.

**Does it download images?**
No. It gives image and video links only.

**Can I run it from my own code or tools?**
Yes. Like every Apify actor, you can start it through the Apify API, run it on a schedule, get a webhook when it ends,
and connect it to tools such as Make and Zapier.

**Does it keep any data about my runs?**
No cookies or browsing data are kept after a run ends. Your results stay in your own Apify dataset. The only
thing kept between runs is the list of known unavailable products (see above), in your own account: product IDs,
their status and the date of the check. You can delete that key-value store at any time; the next run starts a new
one.

**Is it legal to scrape AliExpress?**
This actor reads public product pages, the same pages anyone can open without logging in, and it collects product and
seller business information only. Check that your use of the data follows AliExpress's terms and the laws that apply
to you.

# Actor input Schema

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

Full AliExpress product links, for example https://www.aliexpress.com/item/32848744075.html. Links from aliexpress.us, other country sites and the mobile site work too. For a long list, use "Upload file" or "Link remote text file": a text file with one product link or product ID per line. The same product listed twice is read once.

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

Prices, availability and shipping options are for this country. Each run uses one country; run again for another.

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

The currency for all prices. If AliExpress does not show prices in this currency for the chosen country, each row's currency field says which one it used.

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

The run reads at most this many products from the list, in the order given.

## `recheckKnownUnavailable` (type: `boolean`):

The actor keeps a short list in your own Apify account of products that were not found (kept 30 days) or not sold to the ship-to country (kept 3 days). A later run gives those products their free row at once, with the date of the real check in checkedAt, and does not open their pages. Turn this on to open every product page again.

## Actor input object example

```json
{
  "productUrls": [
    {
      "url": "https://www.aliexpress.com/item/32848744075.html"
    },
    {
      "url": "https://www.aliexpress.com/item/1005005433621337.html"
    }
  ],
  "shipTo": "US",
  "currency": "USD",
  "maxItems": 50,
  "recheckKnownUnavailable": false
}
```

# 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 = {
    "productUrls": [
        {
            "url": "https://www.aliexpress.com/item/32848744075.html"
        },
        {
            "url": "https://www.aliexpress.com/item/1005005433621337.html"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapelark/aliexpress-product-details").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": [
        { "url": "https://www.aliexpress.com/item/32848744075.html" },
        { "url": "https://www.aliexpress.com/item/1005005433621337.html" },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("scrapelark/aliexpress-product-details").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": [
    {
      "url": "https://www.aliexpress.com/item/32848744075.html"
    },
    {
      "url": "https://www.aliexpress.com/item/1005005433621337.html"
    }
  ]
}' |
apify call scrapelark/aliexpress-product-details --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapelark/aliexpress-product-details"
        }
    }
}
```

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/1eU0u063vf12yDd3g/builds/eTp0CXIYc2NuhSwIQ/openapi.json
