# AliExpress Product Details Scraper & Shipping (`myth84/aliexpress-product-scraper`) Actor

AliExpress product details by URL or ID: every variant (SKU) with its price, stock and purchase limit, new-shopper prices flagged, shipping cost and delivery time to your country, specs, photos, video, rating, units sold and business store. One flat row per product, no personal data.

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

## Pricing

from $2.10 / 1,000 product details

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 Details Scraper: Variants, Prices, Stock & Shipping – no personal data, no seller identity, no reviews

- Verified daily by an automated run on Apify with the default input.
- Price: $3.60 per 1,000 products on the Free plan; on paid plans, from $2.10 for 1,000 (Business plan).
- Start fee: $0.00005 per run (Apify's minimum).

AliExpress Product Details Scraper: paste AliExpress product URLs or ids and get every variant (SKU) with its own price, stock and purchase limit, the shipping cost and delivery time to your country, specifications, photos, video, rating, units sold and the business store, as a clean table or through an API. Use it as an AliExpress product scraper for dropshipping catalogs, price and stock tracking per variant, and delivery checks by country.

**No login, no cookies, no personal data:** nothing to sign in to, no cookies to paste, no seller identity and no reviews in the output.

- **What you get:** one flat row per AliExpress product for the ship-to country, currency and language you choose: price range over the variants that can be bought, strike-through price and discount, stock, every variant with its own price, stock and purchase limit, new-shopper prices flagged, every shipping option with cost and delivery dates, specifications, photos, video, rating, review count, units sold and the business store's rating. No personal data.
- **For whom:** dropshippers and resellers (catalogs, stock and delivery checks), price-tracking and competitive-intelligence tools, market analysts, AI agents through MCP.
- **How much:** a fixed price per product saved and nothing else (see the Pricing tab); products that do not exist or are not sold in your country are free; `maxResults` caps every run.

**Sample output**: one real product shipped to the United States, key columns only (the full row, with its variants and shipping options, is under *Output example*):

```json
{
  "platformProductId": "1005006959700436",
  "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": 27.97,
  "originalPrice": 83.68,
  "discountPercent": 67,
  "stockQuantity": 2599,
  "rating": 4.8,
  "soldCount": 10000,
  "shippingFree": true,
  "deliveryEstimate": "Oct. 27 - Nov. 05",
  "priceMax": 78.18
}
```

Paste product URLs from any AliExpress site (www, language sub-domains, mobile, aliexpress.us) or bare product ids and get **one flat row per product**: the lowest and highest price over the variants on sale, the strike-through price and discount, the total stock, **every variant** (color, size, ships-from warehouse…) with its price, strike-through price, stock, purchase limit and picture, **every shipping option** to the ship-to country with its carrier, cost, delivery days and dates and ship-from country, the specifications, all photos and the video, the rating, review count and units sold, the wishlist count and, for business stores, the store's name, rating, share of positive reviews and followers. Prices, stock and shipping follow the **ship-to country, currency and language you choose**.

**No personal data, by design.** The scraper never reads the seller's identity: store name and reputation are kept only for stores AliExpress lists as businesses (not as local sellers), no review text or reviewer is collected (average rating and count only), and every row goes through a privacy filter before it is saved. The dataset is safe to store, share and feed to AI agents.

### What can you do with AliExpress product data?

- **Build a dropshipping or resale catalog**: titles, specifications, every photo and the video, variants with their pictures, prices and stock, for the market you sell to.
- **Track prices and stock per variant**: schedule the run on your product list and compare `variants` from day to day (price, strike-through price, stock, sold-out variants, purchase limits), not just the "from" price of a search card.
- **Check shipping before you promise a delivery date**: carriers, shipping cost, delivery days and dates and the ship-from warehouse for the ship-to country you choose; products that cannot be delivered there are flagged.
- **Vet suppliers**: rating, review count, units sold, wishlist saves and, for business stores, the store rating, share of positive reviews and followers.
- **Feed AI agents, spreadsheets and BI tools** with a stable, documented schema shared by the other scrapers of this e-commerce studio: the first columns are those of the AliExpress search scraper, so search results and product details join on `platformProductId`.

### What data does AliExpress Product Details Scraper extract?

Every row has every column: a value AliExpress does not show is `null` (or `[]` / `{}` for lists and objects), so CSV and Excel exports keep the same columns from run to run.

| Group | Columns |
|---|---|
| Identity | `schemaVersion`, `platform`, `platformProductId`, `variantId`, `url`, `title`, `brand`, `category`, `categoryPath`, `categoryId`, `categoryIds`, `language` |
| Prices and stock | `currency`, `price`, `priceMax`, `originalPrice`, `discountPercent`, `newShopperDeal`, `inStock`, `stockQuantity` |
| Variants | `variantCount`, `variants` (per variant: `skuId`, `attributes`, `price`, `originalPrice`, `currency`, `stock`, `available`, `maxPerOrder`, `imageUrl`, `newShopperDeal`, `newShopperSaving`) |
| Shipping | `shippable`, `shippingFree`, `shippingCost`, `deliveryEstimate`, `shipsFrom`, `shippingOptions` (per option: `code`, `carrier`, `free`, `cost`, `currency`, `minDays`, `maxDays`, `estimatedFrom`, `estimatedTo`, `shipsFrom`, `shipsTo`, `tracking`), `viewCountryCode` |
| Popularity | `rating`, `ratingMax`, `reviewCount`, `reviewsAggregated`, `soldCount`, `wishlistCount` |
| Store (businesses only) | `storeType`, `storeName`, `storeId`, `storeUrl`, `storeRating`, `storePositiveFeedbackPercent`, `storeFollowers` |
| Media and specifications | `imageUrl`, `imageCount`, `imageUrls`, `videoUrl` (business stores only), `attributes` |
| Search and monitoring columns of the studio | `isSponsored`, `isBestSeller`, `isChoice`, `listedAt`, `searchQuery`, `searchRank`, `searchPage`, `changeType`, `previousPrice`, `priceDelta`, `priceDeltaPercent` (always `null` for this Actor) |
| Run | `scrapedAt` |

A product page holds more than a search card, and a few columns of the shared schema have no source here: `variantId` is null (the row is the whole product, its variants are in `variants`), `category` and `categoryPath` are null and empty (AliExpress product pages carry category ids only: `categoryId`, `categoryIds`), and the search and price-monitoring columns are always null. `brand` comes from the "Brand Name" specification when the page has one. `attributes` holds the specifications as name → value, in the requested language.

### How to scrape AliExpress product details

1. **Paste product URLs or ids** in `productUrls`, one per line: links copied from any AliExpress site (www, fr., de., m., /i/ links, aliexpress.us) or bare ids. Up to 1,000 products per run; duplicates are fetched once.
2. **Choose the ship-to country, the currency and the language.** Prices, stock, shipping options, delivery dates and the warehouse follow the ship-to country.
3. **Run** and open the **Output** tab: the *Overview*, *Variants*, *Shipping* and *Store and ratings* views show the main columns; export everything as JSON, CSV, Excel or through the API.
4. **To follow prices and stock**, save the input as a task and schedule it: every run returns the current state of each product.

### Input

Give at least one product URL or id in `productUrls`. Field names and defaults are those of the input form.

The input of our validation run: products shipped to the United States in USD with English texts, an id that does not exist (no row, not charged), and two more products than the three rows asked for, in case one is no longer for sale (the run stops at `maxResults`; products not needed are neither fetched nor charged):

```json
{
  "productUrls": [
    "https://www.aliexpress.com/item/1005006959700436.html",
    "1005000000000001",
    "https://www.aliexpress.com/item/1005006639944031.html",
    "https://www.aliexpress.com/item/1005009383937691.html",
    "https://www.aliexpress.com/item/1005012666563901.html",
    "https://www.aliexpress.com/item/1005011932610559.html"
  ],
  "country": "US",
  "currency": "USD",
  "language": "en",
  "maxResults": 3
}
```

Every field, with its type and default:

| Field | Type | Default | Description |
|---|---|---|---|
| `productUrls` | string\[] | — | AliExpress product URLs (any language sub-domain, m., /i/, aliexpress.us) or product ids, one per line; 1 to 1,000, duplicates fetched once. aliexpress.ru and search pages are not accepted. Prefilled with five stable products (three rows asked, two in reserve). |
| `country` | string | `"US"` | Ship-to (delivery) country, ISO 3166-1 alpha-2 code (US, GB, FR, DE…). Prices, stock, shipping options, delivery dates and the warehouse follow it. Recorded in `viewCountryCode`. |
| `currency` | string | `"USD"` | Currency for every price, ISO 4217 code (USD, EUR, GBP…). |
| `language` | string | `"en"` | Language of the titles, variant names and specifications: en, fr, de, es, it, pt, nl, pl, tr, ja, ko, ru, uk, th, vi, id, ar, he. |
| `maxResults` | integer | `100` | Stop after this many products saved; you are never charged for more. Unknown products, products no longer for sale and products not sold to the country do not count. Prefilled with 3 in the form. |
| `maxVariants` | integer | `200` | Variants kept in the `variants` column of each row, in AliExpress order; 0 keeps them all. `price`, `priceMax`, `stockQuantity` and `variantCount` always cover every variant. |
| `proxyConfiguration` | object | `{"useApifyProxy":true,"apifyProxyGroups":["RESIDENTIAL"]}` | The default proxy configuration (Apify proxies, `RESIDENTIAL` group, no country) is the only one validated for AliExpress product pages and its traffic is included in the price: keep it, and do not set a proxy country. Your own proxy URLs of the same kind are accepted. |
| `concurrency` | integer | `4` | Browsing sessions working at the same time, each on its own IP address. |
| `productsPerIp` | integer | `5` | Products fetched on one IP address before moving to a new one (AliExpress stops answering an IP after about 6 products). |
| `delayMs` | integer | `1000` | Pause between two requests of the same session, in milliseconds. |
| `maxRequests` | integer | `5000` | Safety cap on the requests of one run, session openings included. |
| `debugStoreResponses` | boolean | `false` | Debugging only: save every raw AliExpress response in the key-value store. |

### Output example

One real row, produced by the Actor from the product page of a pair of wireless earbuds shipped to the United States (USD, English). The capture was shortened for our tests to 6 of the product's 133 variants and 25 of its 55 specifications; a live run returns them all (`variantCount` 133, up to `maxVariants` entries in `variants`). All columns are present, in this order, for every product:

```json
{
  "schemaVersion": "ecommerce-product/1.2",
  "platform": "aliexpress",
  "platformProductId": "1005006959700436",
  "variantId": null,
  "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",
  "brand": null,
  "category": null,
  "categoryPath": [],
  "currency": "USD",
  "price": 27.97,
  "originalPrice": 83.68,
  "discountPercent": 67,
  "inStock": true,
  "stockQuantity": 2599,
  "rating": 4.8,
  "ratingMax": 5,
  "reviewCount": 5137,
  "soldCount": 10000,
  "storeType": "business",
  "storeName": "QCY Official Store",
  "storeId": "1100955127",
  "storeUrl": "https://www.aliexpress.com/store/1100955127",
  "storeRating": 4.9,
  "shippingFree": true,
  "shippingCost": 0,
  "deliveryEstimate": "Oct. 27 - Nov. 05",
  "shipsFrom": "CN",
  "imageUrl": "https://ae-pic-a1.aliexpress-media.com/kf/Sf3383a35bac041acad10e4c903fa6804V.jpg",
  "imageCount": 6,
  "attributes": {
    "Department": "Unisex-adult",
    "High-concerned chemical": "none",
    "Material": "PVC,ABS",
    "Battery Capacity[mAh]": "350mAh",
    "Battery life up to[hours]": "34 hours",
    "Voice assistant built-in": "Yes",
    "Maximum wireless range[m]": "10m-20m",
    "NFC Technology": "no",
    "Sound Isolating": "Yes",
    "Category": "Earphones & Headphones",
    "Earcups Type": "Sealed",
    "Number Of Drivers": "6",
    "Charging Method": "Charging case",
    "Driver Diameter": "12mm",
    "Bluetooth Version": "5.3",
    "Package List": "User Manual,Charging case,Charging Cable",
    "Features": "Waterproof,Active Noice Cancelling,Dual Connection",
    "Codecs": "LDAC",
    "With Microphone": "Yes",
    "Is wireless": "Yes",
    "Support APP": "Yes",
    "Audio latency": "80ms",
    "Control Method": "Touch,App",
    "Waterproof": "Yes",
    "whether electrical": "No"
  },
  "isSponsored": null,
  "isBestSeller": null,
  "isChoice": null,
  "listedAt": null,
  "searchQuery": null,
  "searchRank": null,
  "searchPage": null,
  "viewCountryCode": "US",
  "scrapedAt": "2026-10-20T10:43:08.866Z",
  "changeType": null,
  "previousPrice": null,
  "priceDelta": null,
  "priceDeltaPercent": null,
  "priceMax": 78.18,
  "newShopperDeal": true,
  "variantCount": 6,
  "variants": [
    {
      "skuId": "12000045348692436",
      "attributes": {
        "Color": "GOLDEN",
        "Ships From": "Brazil"
      },
      "price": 27.97,
      "originalPrice": 83.68,
      "currency": "USD",
      "stock": 26,
      "available": true,
      "maxPerOrder": 1,
      "imageUrl": "https://ae-pic-a1.aliexpress-media.com/kf/S9abae4ad7bdf4d00913acb459886034fZ.jpg",
      "newShopperDeal": true,
      "newShopperSaving": 55.71
    },
    {
      "skuId": "12000045348692434",
      "attributes": {
        "Color": "BLACK",
        "Ships From": "Brazil"
      },
      "price": 27.97,
      "originalPrice": 83.68,
      "currency": "USD",
      "stock": 31,
      "available": true,
      "maxPerOrder": 1,
      "imageUrl": "https://ae-pic-a1.aliexpress-media.com/kf/Sf3383a35bac041acad10e4c903fa6804V.jpg",
      "newShopperDeal": true,
      "newShopperSaving": 55.71
    },
    {
      "skuId": "12000045348692435",
      "attributes": {
        "Color": "WHITE",
        "Ships From": "Brazil"
      },
      "price": 27.97,
      "originalPrice": 83.68,
      "currency": "USD",
      "stock": 29,
      "available": true,
      "maxPerOrder": 1,
      "imageUrl": "https://ae-pic-a1.aliexpress-media.com/kf/Sd972ff9f572b486cab88b493d1d7d25ay.jpg",
      "newShopperDeal": true,
      "newShopperSaving": 55.71
    },
    {
      "skuId": "12000039477279759",
      "attributes": {
        "Color": "BLACK",
        "Ships From": "Mexico"
      },
      "price": 78.18,
      "originalPrice": 83.68,
      "currency": "USD",
      "stock": 199,
      "available": true,
      "maxPerOrder": 1,
      "imageUrl": "https://ae-pic-a1.aliexpress-media.com/kf/Sf3383a35bac041acad10e4c903fa6804V.jpg",
      "newShopperDeal": true,
      "newShopperSaving": 5.5
    },
    {
      "skuId": "12000039477279758",
      "attributes": {
        "Color": "BLACK",
        "Ships From": "Poland"
      },
      "price": 78.18,
      "originalPrice": 83.68,
      "currency": "USD",
      "stock": 199,
      "available": true,
      "maxPerOrder": 1,
      "imageUrl": "https://ae-pic-a1.aliexpress-media.com/kf/Sf3383a35bac041acad10e4c903fa6804V.jpg",
      "newShopperDeal": true,
      "newShopperSaving": 5.5
    },
    {
      "skuId": "12000045348692444",
      "attributes": {
        "Color": "Black with Case03",
        "Ships From": "Brazil"
      },
      "price": 82.94,
      "originalPrice": 88.44,
      "currency": "USD",
      "stock": 0,
      "available": false,
      "maxPerOrder": 0,
      "imageUrl": "https://ae-pic-a1.aliexpress-media.com/kf/S10dd3489a9f144b68ae72cb3e247235fq.jpg",
      "newShopperDeal": true,
      "newShopperSaving": 5.5
    }
  ],
  "shippable": true,
  "shippingOptions": [
    {
      "code": "CAINIAO_FULFILLMENT_STD",
      "carrier": "AliExpress Selection Standard",
      "free": true,
      "cost": 0,
      "currency": "USD",
      "minDays": 7,
      "maxDays": 16,
      "estimatedFrom": "Oct. 27",
      "estimatedTo": "Nov. 05",
      "shipsFrom": "CN",
      "shipsTo": "US",
      "tracking": true
    }
  ],
  "imageUrls": [
    "https://ae-pic-a1.aliexpress-media.com/kf/Sf3383a35bac041acad10e4c903fa6804V.jpg",
    "https://ae-pic-a1.aliexpress-media.com/kf/S2b5178dbf83a4032b28968c4c8fab7dfH.jpg",
    "https://ae-pic-a1.aliexpress-media.com/kf/Sc014ebc1d50940caa677456f2b3465b0J.jpg",
    "https://ae-pic-a1.aliexpress-media.com/kf/S11f4b09791f346e68d419eba6dc3b909L.jpg",
    "https://ae-pic-a1.aliexpress-media.com/kf/S2819c35ff3a24cd5bf6d5f11c71de46b1.jpg",
    "https://ae-pic-a1.aliexpress-media.com/kf/Sb51a7ad983354239a574fd028cec9cddj.jpg"
  ],
  "videoUrl": "https://video.aliexpress-media.com/play/u/ae_sg_item/2227548615/p/1/e/6/t/10301/5000117320950.mp4",
  "categoryId": "63705",
  "categoryIds": [
    "44",
    "100000306",
    "63705"
  ],
  "storePositiveFeedbackPercent": 97.3,
  "storeFollowers": 2054538,
  "wishlistCount": 43504,
  "reviewsAggregated": false,
  "language": "en"
}
```

`price` (27.97) is the cheapest variant that can be bought and `priceMax` (78.18) the most expensive one; `originalPrice` and `discountPercent` are the strike-through price and the percentage off of that cheapest variant. The sold-out variant ("Black with Case03") has `available` false, `stock` 0 and `maxPerOrder` 0 and is left out of `price` and `priceMax`. `soldCount` is the lower bound of the "10,000+ sold" label. The store is a business store, so its name, rating (4.9), share of positive reviews (97.3 %) and followers are kept.

The **Output** tab offers four views of the same rows: **Overview** (title, price range, currency, original price, discount, new-shopper flag, stock, variants, rating, reviews, units sold, shipping, delivery, ships from, link, image), **Variants** (product id, title, currency, price range, stock, variant count, new-shopper flag, the variants list, link), **Shipping** (ship-to country, deliverable, free shipping, cost, delivery estimate, ships from, every shipping option) and **Store and ratings** (rating, reviews, aggregation flag, units sold, wishlist saves, store type, name, rating, positive reviews, followers, store link).

### New-shopper prices

Outside the European Union, AliExpress shows visitors who are not signed in a **first-order price for new customers** on many products ("New shoppers save $55.71"): the displayed price is then the strike-through price minus that saving, and a regular customer pays more. The scraper never hides or corrects these prices, it **flags them**:

- on each variant, `newShopperDeal` is true and `newShopperSaving` holds the saving in `currency` (the example above: 83.68 − 55.71 = 27.97, to the cent);
- on the row, `newShopperDeal` is true when at least one variant has such a price, so `price` may be a first-order price.

To track regular prices, use `originalPrice` (the price before the new-customer saving) or filter on `newShopperDeal`. In our captures every variant of the US and UK pages carried one, French and German pages none.

### Shipping and delivery by country

AliExpress computes shipping for the **ship-to country** of the input (`country`): the same product can ship for free from China to the United States, from a local warehouse in France or Germany in 2 to 5 days, at a cost to another country, or not at all. The row gives every option in `shippingOptions` (carrier, free or cost, currency, delivery days, estimated dates as worded by AliExpress, ship-from and ship-to countries, tracking) and copies the option AliExpress selects by default into `shippingFree`, `shippingCost`, `deliveryEstimate` and `shipsFrom`. When AliExpress says the product **cannot be delivered** to the country, `shippable` is false, `shippingOptions` is empty and the shipping columns are null; the row is still saved, since the product exists and has prices.

A product that AliExpress **does not sell** to the ship-to country at all, a product still listed but **no longer for sale** (no variant left), and a product id that **does not exist** (removed product, typo) give no row and are not charged: the run log names them with the reason and `RUN_STATS.extra` counts them (`unavailableInCountry`, `unavailable`, `notFound`).

Checked at build time: United States (USD, English), United Kingdom (GBP, English), France (EUR, French) and Germany (EUR, German). Other countries, currencies and languages use the same parameters and are expected to work the same way; tell us in the **Issues** tab if one does not.

### Proxies included in the price

AliExpress answers only a few product requests per IP address and refuses many addresses, so the scraper spreads the products over short browsing sessions, each on its own IP address (at most `productsPerIp` products each, 5 by default), and simply moves to a new session when an address is refused. The default proxy configuration (Apify proxies, `RESIDENTIAL` group, no country) is the only one validated for AliExpress product pages; its traffic, including the refused attempts, is **included in the price per product**: you pay per product saved, nothing more. Keep the default and do not set a proxy country: the ship-to country of the input decides prices and shipping, whatever the IP. Your own proxy URLs of the same kind are accepted too.

### How much does it cost to scrape AliExpress product details?

This Actor uses **pay-per-event pricing: you pay a fixed price per product** saved to your dataset, and nothing else. The price of every plan tier is on the **Pricing tab** of this page.

| What you pay for | How it is counted | Price |
|---|---|---|
| `result` event: one product saved to your dataset | once per unique product of the run, capped by `maxResults` | Pricing tab, per plan tier |
| Products that do not exist, are no longer for sale or are not sold to your country | not saved | free |
| Run start | a symbolic amount, once per run | Pricing tab |
| Compute, proxies, storage and data transfer | included: no platform usage is passed on to you | — |

The cost of a run is known before you start: 100 products cost at most 100 times the `result` price of your tier, whatever the number of variants. With the default settings a product takes one to two seconds per session and four sessions work in parallel: 100 products take about a minute.

### What is not included

- **The description text** written by the seller (a separate request AliExpress loads after the page; not in this version).
- **Category names**: product pages carry category ids only (`categoryId`, `categoryIds`); `category` and `categoryPath` stay empty.
- **Reviews**: no review text, reviewer, photo or country is collected; only the average rating and the review count.
- **The seller's identity**: no seller name, id, profile, contact or company details; store name and reputation only for business stores.
- **Coupons, bundles and the "Choice" badge** of the page; the AliExpress search scraper of the studio reads the Choice badge on search cards.

### Limits and behaviour worth knowing

- **One request per product.** All the variants come with the product: a product with 133 variants costs the same as a product with one. `maxVariants` only trims the `variants` column.
- **Ratings may cover several sellers.** On some pages AliExpress merges several sellers of the same item: `rating` and `reviewCount` then cover all of them and `reviewsAggregated` is true, while `soldCount` is this seller's figure ("This seller: 147 sales | Total: 1,000+").
- **Prices and stock change all the time**, and depend on the ship-to country; rows obtained with different countries or currencies are not comparable.
- **Store columns and video only for businesses.** When AliExpress lists the seller as a local seller (possibly a private person), the store columns stay empty (`storeType` unknown) and so does `videoUrl`: the video address contains the account number of whoever uploaded it.
- **Specifications are those of the page**, in the requested language; a specification whose name looks like personal data (such as "Gender") is dropped by the privacy filter.
- **Refusals.** AliExpress decides request by request whether to answer, and its policy may change. A refused session is replaced by a new one without counting against your products; a product refused three times is reported in the log and not charged. After 30 refused sessions in a row the run stops: if no product could be fetched it ends as failed with an explicit message; try again later, keep the default proxy configuration, or open an issue with your run id.
- **No empty successes.** A run that saves no product ends as failed with an explicit message, so that your schedules and integrations notice. The one exception is a run where every product asked for does not exist, is no longer for sale or is not sold to the country: it succeeds with an empty dataset and nothing charged.
- **Need an exact number of rows?** Products disappear from AliExpress every day. List a few more products than `maxResults`: the run stops as soon as `maxResults` products are saved, and the products left over are neither fetched nor charged (`RUN_STATS.extra.productsLeftAtLimit`).

### Integrations and API

Start the Actor from Apify Console, schedule it, or call it from the [Apify API](https://docs.apify.com/api/v2) with any language (the **API** tab shows ready-made code for Node.js, Python and curl). Webhooks notify your systems when a run finishes; the dataset can be pulled as JSON, CSV, Excel, XML or RSS, or pushed to Google Sheets, Make, Zapier, n8n, Slack, Airtable, Google Drive and more through the Apify integrations.

### For AI agents (MCP)

Through the [Apify MCP server](https://docs.apify.com/mcp) this Actor is a tool that answers questions such as *"what does this AliExpress product cost in each color, and is it in stock?"* or *"how long does delivery to Germany take for these three products, and from where do they ship?"*.

**Minimal input** (every other field keeps its default):

```json
{
  "productUrls": [
    "https://www.aliexpress.com/item/1005006959700436.html"
  ],
  "country": "DE",
  "currency": "EUR",
  "language": "en",
  "maxVariants": 20
}
```

- **Key output fields**: `platformProductId`, `title`, `url`, `price`, `priceMax`, `originalPrice`, `currency`, `stockQuantity`, `variants` (per variant: `attributes`, `price`, `stock`, `available`, `newShopperDeal`), `shippable`, `shippingFree`, `shippingCost`, `deliveryEstimate`, `shipsFrom`, `shippingOptions`, `rating`, `reviewCount`, `soldCount`, `storeName`, `storeRating`, `viewCountryCode` (delivery country). Every column is always present, in a fixed order; `null` means AliExpress did not show the value. The full list is in *What data does AliExpress Product Details Scraper extract?* above.
- **Use it when** you have AliExpress product URLs or ids and need their variants, prices, stock, shipping to a given country, specifications, photos or store rating. Pass `productUrls`, `country`, `currency`, `language`, and `maxVariants` when a product has hundreds of variants and the answer needs only a few.
- **Do not use it for** searching AliExpress by keyword (use the AliExpress search scraper of the studio), for reviews, seller information or anything behind a login: it reads public product data and collects no personal data.
- **Cost per 1,000 results**: 1,000 `result` events at the price of your plan tier (Pricing tab); unknown products and products not sold to the country are free, and nothing else is charged.
- **Typical time**: a few seconds for a handful of products, about a minute per 100 products.

### FAQ

#### Does AliExpress Product Details Scraper collect personal data?

No. The scraper never reads the seller's identity and collects no review: the rows hold product facts, prices, stock, shipping and, for business stores only, the store's name and reputation. Every row goes through a privacy filter before it is saved.

#### Is it legal to scrape AliExpress?

The Actor only reads product data that AliExpress serves to any visitor without an account, and it stores no personal data. Scraping public data is generally lawful, but you are responsible for how you use the results and for complying with AliExpress' terms of use and the laws that apply to you (including copyright on product texts and images). Use the data for analysis, not to republish listings.

#### Which URLs and ids can I paste?

Product pages of aliexpress.com in any form (www, language sub-domains such as fr. or de., m.aliexpress.com, /i/ links, with or without query parameters), aliexpress.us product pages (their ids are converted to the global id) and bare product ids. aliexpress.ru is a separate platform and is not supported; search and store pages are not product pages.

#### Why is the price lower than what I pay when I log in?

On many products AliExpress shows visitors a first-order price for new customers. The scraper flags it: `newShopperDeal` is true and each variant's `newShopperSaving` gives the saving. `originalPrice` is the price before that saving. See *New-shopper prices*.

#### Which countries, currencies and languages are supported?

Any ship-to country AliExpress delivers to (`country`, ISO code), any currency it displays (`currency`) and 18 languages (`language`). Prices, stock, shipping and the warehouse follow the ship-to country. The United States, the United Kingdom, France and Germany were checked at build time.

#### What happens with products that no longer exist or are not sold in my country?

They give no row and cost nothing, and they are not tried again: the log names them and `RUN_STATS.extra` counts them (`notFound`, `unavailable` for a product still listed with no variant left for sale, `unavailableInCountry`). A product that exists but cannot be delivered to the country is saved with `shippable` false and no shipping option.

#### Why are some store columns empty?

Store name, rating, share of positive reviews and followers are kept only when AliExpress lists the store as a business. For other sellers, who may be private persons, the store columns stay empty and `storeType` is unknown. The product video (`videoUrl`) follows the same rule, because its address contains the account number of whoever uploaded it.

#### How often should I run it, and how do I track price or stock changes?

Every run fetches live data. Save your product list as a task and schedule it (daily is typical), then compare the rows of two runs by `platformProductId`, `viewCountryCode` and `currency`, variant by variant with `variants[].skuId`.

#### How do I export or integrate the results, and where do I get support?

From the run's Output tab (JSON, CSV, Excel, XML, RSS) or automatically: Apify API, webhooks, scheduled runs and integrations with Google Sheets, Make, Zapier, n8n, Slack and others; AI agents can call the Actor through the Apify MCP server. For bugs or questions, open an issue in the **Issues** tab of this Actor with your run id and input: page changes are fixed as a priority.

If this Actor saved you time, a short review helps others find it.

### Legal note

This Actor reads publicly available AliExpress product data without logging in and collects no personal data. You are responsible for your use of the data and for complying with AliExpress' terms and the laws that apply to you.

Not affiliated with, endorsed or sponsored by AliExpress or Alibaba. AliExpress is a trademark of Alibaba Group.

# Changelog

This Actor's version history is a separate document: https://apify.com/myth84/aliexpress-product-scraper/changelog.md

# Actor input Schema

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

One product per line, copied from your browser: <code>https://www.aliexpress.com/item/1005006959700436.html</code> (any language sub-domain such as fr. or de., m.aliexpress.com, /i/ links and query parameters are fine; aliexpress.us links are converted) or just the product id <code>1005006959700436</code>. 1 to 1,000 products; duplicates are fetched once. aliexpress.ru is a separate platform and is not supported; search pages are not accepted (use the AliExpress search scraper of the studio).

## `country` (type: `string`):

ISO 3166-1 alpha-2 code of the delivery (ship-to) country: US, GB, FR, DE, ES… Prices, stock, shipping options, delivery dates and the warehouse follow it. Pick one from the list or type any code; recorded in viewCountryCode. Default US, matching the default currency USD; use FR or DE with EUR, GB with GBP.

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

ISO 4217 code of the currency for every price (USD, EUR, GBP…). Pick one from the list or type any code AliExpress supports. Default USD: pair it with the country (EUR for FR or DE, GBP for GB).

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

Language of the titles, variant names and specifications. Default en: English texts whatever the ship-to country, easiest to compare.

## `maxResults` (type: `integer`):

Stop the run after this many products saved; you are never charged for more. Products that do not exist, are no longer for sale or are not sold to the ship-to country are not saved and do not count. Default 100: caps the bill of a long list; at most 1,000, the most productUrls a run accepts. The form is prefilled with 3: a quick first run that stops after three of the five prefilled products.

## `maxVariants` (type: `integer`):

Variants (SKUs) kept in the variants column of each row, in AliExpress order; 0 keeps them all. Prices, stock and variantCount always cover every variant. Default 200: keeps the row of a product with thousands of SKUs to a manageable size.

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

Default: Apify residential proxies (RESIDENTIAL group, no country), required for AliExpress product pages and included in the price. Do not set a proxy country: the ship-to country above decides prices and shipping, whatever the IP. You can also provide your own residential proxy URLs.

## `concurrency` (type: `integer`):

Browsing sessions working at the same time, each on its own IP address, from 1 to 10. Default 4: the setting of our validation and control runs; lower it if many sessions are refused.

## `productsPerIp` (type: `integer`):

Products fetched on one IP address before the scraper moves to a new one. AliExpress refuses an IP after about 6 products. Default 5: one below that limit, so that a session ends before its IP is refused.

## `delayMs` (type: `integer`):

Pause between two requests of the same session, in milliseconds; 0 disables the pause. Default 1000: one second, the pace of our validation and control runs; raise it if many products are retried.

## `maxRequests` (type: `integer`):

Safety cap on the requests of one run, session openings included. Default 5000: far above what 1,000 products need.

## `debugStoreResponses` (type: `boolean`):

Debugging only: save every raw AliExpress response in the run's key-value store. Uses storage. Default false: the raw responses only help to diagnose a problem.

## 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",
    "https://www.aliexpress.com/item/1005012666563901.html",
    "https://www.aliexpress.com/item/1005011932610559.html"
  ],
  "country": "US",
  "currency": "USD",
  "language": "en",
  "maxResults": 3,
  "maxVariants": 200,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "concurrency": 4,
  "productsPerIp": 5,
  "delayMs": 1000,
  "maxRequests": 5000,
  "debugStoreResponses": false
}
```

# Actor output Schema

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

All extracted products as dataset items, one flat row per product. Append ?format=csv or ?format=xlsx for spreadsheets. The Overview view is selected by default.

## `runStats` (type: `string`):

Gateway calls, sessions opened and refused, tokens, products not found, no longer for sale or not sold to the country, bytes transferred and the estimated platform cost of the run.

# 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",
        "https://www.aliexpress.com/item/1005012666563901.html",
        "https://www.aliexpress.com/item/1005011932610559.html"
    ],
    "maxResults": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("myth84/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",
        "https://www.aliexpress.com/item/1005012666563901.html",
        "https://www.aliexpress.com/item/1005011932610559.html",
    ],
    "maxResults": 3,
}

# Run the Actor and wait for it to finish
run = client.actor("myth84/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",
    "https://www.aliexpress.com/item/1005012666563901.html",
    "https://www.aliexpress.com/item/1005011932610559.html"
  ],
  "maxResults": 3
}' |
apify call myth84/aliexpress-product-scraper --silent --output-dataset

```

## MCP server setup

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