# AliExpress Product Details Scraper: Variants, Stock & Shipping (`serenido/aliexpress-product-details`) Actor

Full AliExpress product data from links or ids: every variant with price and stock, discount, rating, sold count, shipping fee and delivery days for your country, store facts, specs and images. Free rows for missing products.

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

## Pricing

from $0.70 / 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 Details Scraper do?

Paste AliExpress product links (or just product ids) and get one clean row per product: every variant with its own price and stock, discount, rating, reviews, sold count, shipping fee and delivery days for your country, store facts, specifications, images and video. Download as Excel, CSV or JSON, or use the API.

No login, no browser, no cookies from you.

### Why this one?

- **Your country, your currency.** Pick the ship-to country (89 countries), the currency (41) and the language (16). Prices, stock, availability and shipping are what a shopper in that country sees.
- **New-shopper prices are flagged.** AliExpress shows logged-out shoppers special first-order prices on many items (for example $1.09). Other scrapers return them as normal prices. Here every product and every variant has `isNewShopperDeal`, so you know which prices only new buyers get.
- **Shipping as the page shows it.** Free shipping, the fee, "free shipping over 10,00€", delivery days and dates, ship-from country, and `canShip: false` when AliExpress cannot ship the product to your country.
- **Free rows for problems.** Products that do not exist, are not sold to your country, or were taken off sale come back as rows with a `status` and a message. **They are not charged.** Bad links are free too.
- **Excel friendly.** The main facts are flat columns (price, stock, rating, store name...). Variants, shipping options and specs are full lists for JSON users.
- **Tested.** 1,000 random products in one run: 994 saved, 6 free problem rows, 0 failed, in 5 minutes.

### What data do you get?

| Group | Fields |
|---|---|
| Product | title, url, productId, images, video, specs, categoryId, categoryPath, isChoice |
| Price | price (cheapest variant in stock), priceMax, originalPrice, discountPct, currency, isNewShopperDeal |
| Demand | rating, reviewCount, soldCount, sellerSoldCount, soldText, wishlistCount |
| Stock | inStock, totalStock, skuCount |
| Variants (`skus`) | skuId, attributes (Color, Size, Ships From...), price, originalPrice, discountPct, stock, available, purchaseLimit, bulkPrices, unitText, image, isNewShopperDeal |
| Shipping | canShip, shippingFee, freeShipping, freeShippingOver, shippingMethod, deliveryDaysMin, deliveryDaysMax, estimatedDelivery, shipFrom, shippingOptions |
| Store | storeName, storeId, storeUrl, sellerId, storePositiveRate, storeScores, storeFollowers, storeCountry, storeOpenedAt, isTopRatedSeller |
| Extras | descriptionUrl, description and descriptionImages (optional), documents (manuals) |

### How much does it cost?

You pay per product saved with `status: "ok"`. Check the **Pricing** tab for the current price. Proxies and platform costs are included. Problem rows are free.

### How to use it

1. Paste product links or ids into **Product links or ids**, one per line.
2. Pick **Ship to**, **Currency** and **Language**.
3. Optional: turn on **Also get the seller's description**.
4. Click **Start**. Download the results or connect them to Google Sheets, Make, Zapier or your app.

Works well after a search tool: search for products, then send their links here for the full details.

### Input example

```json
{
  "productUrls": [
    "https://www.aliexpress.com/item/1005007857239353.html",
    "3256811374070548"
  ],
  "shipTo": "US",
  "currency": "USD",
  "language": "en",
  "includeDescription": false
}
```

### Output example

Shortened: real rows carry every image, spec, variant and shipping option.

```json
{
  "status": "ok",
  "productId": "3256811374070548",
  "url": "https://www.aliexpress.com/item/3256811374070548.html",
  "title": "46 Inch Burmese Curly Human Hair Wig 7x6 13x6 HD Lace Frontal 200 Density ...",
  "price": 40.78,
  "priceMax": 248.16,
  "originalPrice": 108.7,
  "discountPct": 62,
  "currency": "USD",
  "isNewShopperDeal": true,
  "rating": 4.9,
  "reviewCount": 724,
  "soldCount": 1000,
  "soldText": "This seller: 1,000+ sales | Total sales: 1,000+",
  "inStock": true,
  "totalStock": 32497,
  "skuCount": 90,
  "canShip": true,
  "shippingFee": 0,
  "freeShipping": true,
  "deliveryDaysMin": 4,
  "deliveryDaysMax": 9,
  "estimatedDelivery": "Oct. 15 - Oct. 20",
  "shipFrom": "United States",
  "storeName": "Shop1105233629 Store",
  "storeUrl": "https://www.aliexpress.com/store/1105246100",
  "skus": [
    {
      "skuId": "12000055922089666",
      "attributes": {"Stretched Length": "30inches", "Density": "180%", "Hair Color": "13x4", "Ships From": "United States"},
      "price": 77.77,
      "originalPrice": 193.72,
      "stock": 115,
      "available": true,
      "isNewShopperDeal": true
    }
  ],
  "shipTo": "US",
  "scrapedAt": "2026-10-11T11:09:08Z"
}
```

A product that could not be loaded looks like this, and costs nothing:

```json
{"status": "unavailable_in_region", "productId": "1005006436715997", "message": "AliExpress does not sell this product to the chosen country.", "shipTo": "GB"}
```

### Status values

| status | Meaning | Charged |
|---|---|---|
| ok | Full product data | Yes |
| not_found | No product with this id | No |
| unavailable_in_region | Not sold to the chosen country | No |
| no_longer_sold | The seller took it off sale | No |
| unavailable | AliExpress hides the product (the message says why) | No |
| invalid_id, invalid_link | Not an AliExpress product link or id | No |
| failed | AliExpress refused every try. Run it again later | No |

### Good to know

- **New-shopper prices:** logged-out shoppers see first-order prices on many items. In our US tests about 6 in 10 products had them. AliExpress does not show the regular price for returning buyers to logged-out visitors, so use `isNewShopperDeal` to filter or mark these rows.
- **Sold counts** are AliExpress's rounded numbers ("5,000+" becomes 5000). Some pages show two numbers, this seller and all sellers: `sellerSoldCount` and `soldCount`.
- **EU countries:** AliExpress often hides the old (crossed-out) price in the EU, so `originalPrice` can be empty there.
- **Proxy:** keep the default residential proxy. AliExpress blocks datacenter IPs.
- Prices, stock and delivery dates change often. Schedule the run to track them over time.

### Use cases

- **Dropshipping:** sync variants, stock and prices into your store, on a schedule.
- **Price and stock monitoring** for your products or a competitor's.
- **Supplier checks:** store rating, store age, followers and sales before you order.
- **Shipping research:** real fees and delivery times for each country.
- **Listings and AI:** titles, specs, images and variant tables ready for Shopify, WooCommerce or an AI pipeline.

### Is it legal?

It collects only public product information that AliExpress shows to any logged-out visitor. It does not log in, solve captchas or collect personal data. Check that your use follows AliExpress's terms and the law where you are.

# Actor input Schema

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

One per line. Any AliExpress product link (aliexpress.com, .us, mobile, other languages) or just the product id, for example 1005007857239353.

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

Prices, stock, availability and shipping are shown as a shopper in this country sees them.

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

Currency for all prices and shipping fees.

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

Language of titles, variant names and specifications.

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

Adds the description text and its images. Same price per product, a bit slower.

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

Stop after this many products from the list.

## `maxConcurrency` (type: `integer`):

How many products load at the same time.

## `proxy` (type: `object`):

Keep the default. AliExpress blocks datacenter IPs.

## Actor input object example

```json
{
  "productUrls": [
    "https://www.aliexpress.com/item/1005007857239353.html",
    "1005006436715997"
  ],
  "shipTo": "US",
  "currency": "USD",
  "language": "en",
  "includeDescription": false,
  "maxItems": 1000,
  "maxConcurrency": 10,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

No description

## `all` (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/1005007857239353.html",
        "1005006436715997"
    ],
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("serenido/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": [
        "https://www.aliexpress.com/item/1005007857239353.html",
        "1005006436715997",
    ],
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("serenido/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": [
    "https://www.aliexpress.com/item/1005007857239353.html",
    "1005006436715997"
  ],
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call serenido/aliexpress-product-details --silent --output-dataset

```

## MCP server setup

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