# AliExpress Product Details Scraper & AliExpress Scraper API (`hyperbach/aliexpress-product-details-scraper`) Actor

AliExpress product data by product URL or item id, no login: price, original price and stock for every SKU, product variants with images, AliExpress shipping to your country with carrier, fee and dates, store and seller ids, rating, review count, orders sold, images, video, specs, category.

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

## Pricing

from $3.00 / 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 Details Scraper & AliExpress Scraper API

**AliExpress product details from a list of product URLs or item ids, logged out, for the country and currency you choose: every SKU with its own price, original price, stock and purchase limit; the variant matrix with swatch images and colours; the shipping options to your country with carrier, fee, delivery days and dates, or a clear `not_shippable`; both store ids, the store's rating, positive rate, followers and sales; rating, review count and orders sold; images, video, specifications, category ids and names; coupons, promotions and the return policy; the description links, the text on request, and the manuals.** One row per product and ship-to country, and a free row that says why for an id that does not exist or a product not sold there. Save your list as a task and run it every day: **[a price and stock check of 5 products](https://apify.com/hyperbach/aliexpress-product-details-scraper/examples/aliexpress-daily-price-and-stock-check-5-products)**. No login, no AliExpress account, no API key, no browser, proxies handled for you.

### Why this AliExpress product scraper

- **The shipping state is typed, never an empty box.** In our test of the lane, five of six full rows returned one shipping option with carrier, fee and days all null for a product the store does not ship to the US, and one gave a GBP fee for a US ship-to. Here `shipping_status` says `shippable` with the options (carrier, code, fee, free, ship-from, delivery days, the ETA dates, tracking, warehouse, the on-time guarantee) or `not_shippable` with the reason, and a product not sold in the country at all is a free `unavailable` row. Ready-made: [AliExpress prices and shipping to Germany in EUR, VAT included](https://apify.com/hyperbach/aliexpress-product-details-scraper/examples/aliexpress-prices-and-shipping-to-germany-in-eur).
- **Both store ids, each in its own column.** AliExpress carries two numbers for a store: the one in the store URL (`store_id`) and the seller's store entity (`store_number`). Three rivals put the second in a field called storeId and one put the seller id there. Here both are named, with the seller id, the store name and URL, the country, the opening date, the level, the positive-feedback rate and count, the feedback count, the store rating, the sales of the last 180 days and the followers.
- **Several countries and currencies in one run.** No rival takes a list of countries. Here `shipToCountries` reads each product once per country, each row in the country's own currency unless you set one: the price a shopper in Germany, Brazil or the UK sees, with that country's shipping options, side by side, and a free row where it is not sold. Ready-made: [One AliExpress product in 8 countries: sold there or not, price](https://apify.com/hyperbach/aliexpress-product-details-scraper/examples/aliexpress-product-in-8-countries-sold-or-not-and-price).
- **Every SKU, with its matrix.** Each variant with its own price, original price, stock, availability, purchase limit, image and, where the listing offers a choice of warehouse, its ship-from country (133 SKUs for a pair of earbuds, 208 for a filament); the attribute matrix with property ids, value ids, swatch images and hex colours where the seller set them. Ready-made: [AliExpress catalogue sync: every SKU with its price and stock](https://apify.com/hyperbach/aliexpress-product-details-scraper/examples/aliexpress-catalogue-sync-every-sku-price-and-stock).
- **No silent failures, no charge for a miss.** A dead id is a free `not_found` row (the source's own SITEM_NOT_EXIST); a product not sold in your country a free `unavailable` row; a value that is not a product a free `invalid` row; the US-site form of a product you already named a free `duplicate` row. The slider wall AliExpress puts on an IP after about ten records is passed by probing fresh exits and rotating, and a product that could not be read is never charged. `fields_not_shown` names what a record did not carry, so a null never reads as a broken field.
- **The price, said for whom it is.** AliExpress shows a visitor who is not logged in its new-shopper offer: the price of a first order, $1.09 on 20 of 24 ordinary products in our US sample. Each row says so in `new_shopper_price` and names the offer in `promotions`, next to the original price, so a deal for new shoppers never reads as the price everyone pays.
- **One call per product, no browser.** The record is one signed call to the product gateway (about 25 KB on the wire), so a run reads about 12 products a minute per exit and the price carries no browser or platform usage on top.

### Who it's for

- **Dropshippers and sellers** — sync a catalogue: every SKU with price, stock and purchase limit, the images and the variant matrix, the shipping options and days to your customers' country.
- **Price and stock monitors** — one product in several countries and currencies in one run, on a schedule; the discount, the lowest price of the last 30 days on EU views, coupons and promotions.
- **Sourcing and supplier vetting** — the store behind a product: both ids, level, positive rate, followers, sales in 180 days, opening date, country; the orders sold and the rating of the listing.
- **Developers and agents** — typed fields, one row per input in input order, a free labelled row for every miss, and a run summary with the entry rate to check a pipeline against.

### Quick start

**Products by URL or item id**

```json
{
  "products": [
    "https://www.aliexpress.com/item/1005009383937691.html",
    "1005006959700436"
  ]
}
```

**Prices for a country, in its currency**

```json
{
  "products": [
    "1005006959700436"
  ],
  "shipTo": "DE",
  "language": "de_DE"
}
```

**One product in three countries**

```json
{
  "products": [
    "1005006959700436"
  ],
  "shipTo": "US",
  "shipToCountries": [
    "GB",
    "DE"
  ]
}
```

**With the description text**

```json
{
  "products": [
    "1005009383937691"
  ],
  "includeDescription": true,
  "maxItems": 10
}
```

### Output

One row per product and ship-to country you asked (or a free row saying why there is none):

| field | meaning |
|---|---|
| `input` | The value as you gave it (the first form, when the same product was given several ways). |
| `input_index` | The input's 1-based position in your list. |
| `inputs_merged` | Later values of your list that named the same product (its URL after its id); read once, one row. |
| `status` | `ok` = the record was served (charged). Free rows: `not_found` (no product with this id: the source's SITEM_NOT_EXIST), `unavailable` (not sold in the ship-to country: SITEM_BAN_NO_AVAIL_SKU), `invalid` (not an item id or product URL), `duplicate` (the US-site form of a product another input already named), `failed` (the source's own error, a view of another country than the one asked, or no served exit in 40 fresh ones; read again later). |
| `status_detail` | Why a row has no record, in words; on an `ok` row, a note about the record (not shippable, read by its US local id, the description file not loaded). |
| `scraped_at` | When the row was read (UTC). |
| `product_id` | The product's global item id (`1005…`), read from the record even when you gave the US-site local id. |
| `product_id_given` | The id your input named (the global `1005…` form or the US-site local `3256…` form). |
| `url` | The product page: `https://www.aliexpress.com/item/<item id>.html`. |
| `ship_to` | The two-letter ship-to country this row was read for. |
| `currency` | The ISO currency of every price on this row (the one you asked, or the ship-to country's own). |
| `language` | The language of the texts on this row as asked (`en_US`, `de_DE`, …). The row is the ship-to country's own view (prices, currency, VAT note, stock, shipping) in this language. |
| `title` | The product title, in the language asked. |
| `brand` | The brand, from the specifications' brand attribute (`Brand Name`), when the seller set one. |
| `price_min` | The lowest sale price over the SKUs (sold-out SKUs included), as a number in `currency`: the price AliExpress shows a visitor who is not logged in, which on most US, UK, Brazil and Australia views is its new-shopper offer (`new_shopper_price`). |
| `price_max` | The highest sale price over the SKUs (sold-out SKUs included: `skus[].available` tells them apart). |
| `original_price_min` | The lowest original (strike-through) price over the SKUs; null when the view shows none (EU views show the 30-day lowest price instead). |
| `original_price_max` | The highest original price over the SKUs. |
| `discount_percent` | The discount the source states for the listing (its own figure), else the selected SKU's saving against its original price. |
| `price_text` | The selected SKU's sale price as the page writes it (`$28.24`, `￡21.96`, `29,79€`). |
| `original_price_text` | The selected SKU's original price as written. |
| `lowest_price_30d` | The lowest price of the last 30 days, when the view carries it (EU price rule: German, French … views). |
| `price_notes` | The notes under the price ("Price includes VAT", "Extra 2% off with coins"). |
| `new_shopper_price` | `true` when the view shows AliExpress's new-shopper offer on this product (a `promotions` entry of kind `new_user_platform_allowance_atm`, "New shoppers save $2.22"): the sale prices of the row are then the price of a first order by a new shopper; `original_price_*` is the price before it. `false` when the view shows no such offer. |
| `sku_count` | How many SKUs (variants) the product has. |
| `skus_available` | How many SKUs are available for sale (in stock and salable). |
| `stock_total` | The total available stock over the SKUs, as the source states it. |
| `max_buy` | The purchase limit per shopper for the selected SKU (`Max. 1 pcs/shopper`). |
| `sold_by_lot` | `true` when the product is sold by lot: every price is per lot, not per piece. The lot size is in the title or the SKU names; the row has no count of its own. |
| `selected_sku_id` | The SKU the product page opens on (its price is `price_text`). |
| `skus` | Every SKU: `sku_id`, `attributes` (property name → value), `ships_from` (the warehouse country code, when the listing has a Ships From choice), `price`, `original_price` (null on a SKU the view shows no strike price for), `price_text`, `original_price_text`, `lowest_price_30d`, `stock`, `available`, `max_buy`, `image`. |
| `sku_properties` | The variant matrix: each property with `property_id`, `name`, `ships_from` (true for the warehouse property) and its `values` (`value_id`, `name`, `catalog_name`, `image`, `color` hex, `ships_from_code`). |
| `rating` | The listing's star rating (0–5). |
| `review_count` | The number of reviews the rating is over. |
| `sold_text` | The orders-sold text as shown ("10,000+ sold"; on aggregate listings "This seller: 414 sales | Total sales: 10,000+"). |
| `sold_min` | The floor of the sold bucket ("10,000+" → 10000). |
| `seller_sold` | On an aggregate listing, this seller's own sales count. |
| `wishlist_count` | How many shoppers wish-listed the product. |
| `main_image` | The main product image (the CDN link). |
| `images` | The product's image gallery (CDN links, full size). |
| `video` | The product video when the listing has one: `url` (.mp4), `poster`, `video_id`. |
| `description_video_url` | A second video inside the description, when the listing has one. |
| `specs` | The specifications table: `name`, `value` (in the language asked). |
| `category_id` | The category leaf id. |
| `category_path` | The category id path, root first (`15`, `1541`, `100003887`). |
| `category_names` | The category names, root first, when the source fills the breadcrumb for the listing (about 1 product in 20); null otherwise. |
| `category_breadcrumb` | The breadcrumb items when the source fills them: `id`, `name`, `url`. Their ids are the storefront's display tree and can differ from `category_path` in number and value (one product: 4 breadcrumb levels, 3 path ids): match the names by `id`, never by position. |
| `shipping_status` | `shippable` (the options are in `shipping_options`), `not_shippable` (the store's warehouses do not deliver to the ship-to country), or null when the record carries no delivery entry. |
| `shipping_count` | How many shipping options the ship-to country has. |
| `shipping_options` | Each option: `carrier`, `company`, `code`, `fee` (0 when free), `fee_text`, `free`, `currency`, `ship_from` / `ship_from_code`, `ship_to` / `ship_to_code`, `delivery_days_min` / `delivery_days_max`, `eta_min` / `eta_max` (as shown), `tracking`, `warehouse`, `guaranteed_days`, `delay_compensation`, `stock`. |
| `store_id` | The store id as it appears in the store URL of the view (`1104486231` on the US view). |
| `store_number` | The seller's store entity number (`storeNum`: `1104484266` for the same store) — the other id rivals call storeId. |
| `store_name` | The store name. |
| `store_url` | The store's page. |
| `store_logo` | The store's logo (CDN link). |
| `seller_id` | The seller's member id (`sellerAdminSeq`). |
| `store_country` | The seller's country as the store block names it. |
| `store_opened_at` | When the store opened (the source's own timestamp). |
| `store_years` | Years the store has been open, as the source counts them. |
| `store_level` | The seller level code (`25-s`). |
| `store_top_rated` | `true` for a Top Rated Seller. |
| `store_positive_rate` | The share of positive feedback, in percent. |
| `store_positive_count` | The store's positive-feedback number as the source gives it (`sellerPositiveNum`). It is not the numerator of `store_positive_rate` (one store: 10,561 against 438,680 feedback and a 97.3 % rate): use the rate for the share. |
| `store_feedback_count` | The store's feedback number as the source gives it (`sellerTotalNum`; other tools call it ratingCount or feedbackCount). See `store_positive_count`. |
| `store_score` | The seller score the source states. |
| `store_rating` | The store rating (0–5) when the store card shows one: the card shows 2–4 lines, and 9 of 24 ordinary products in our sample had a rating line. |
| `store_sold_180d` | The store's sales in the last 180 days, as shown ("70,000+"). |
| `store_scores` | The store card's lines as the page shows them ("# sold in 180 days", "positive reviews", "store rating", "Communication" …). |
| `store_followers` | How many shoppers follow (wish-listed) the store. |
| `coupons` | The coupon block's offers when the listing has them: `text` ("$4.00 off on $35.00"), `code` (the promotion kind), `promotion_id`. |
| `promotions` | The price banner's promotions for the selected SKU: `kind`, `text` ("New shoppers save $54.15", "Save $58.62"), `ends_at` (ms since the epoch when the banner has a timer). Kind `new_user_platform_allowance_atm` is the new-shopper offer (`new_shopper_price`). |
| `return_policy` | The after-sale line ("Free returns within 15 days"). |
| `delivery_guarantee` | The delivery guarantee lines ("$1.00 coupon code if delayed", "Refund if package lost" …). |
| `description_url` | The signed link to the product description (desktop); valid for a while after the read. |
| `description_mobile_url` | The signed link to the mobile description. |
| `description_text` | With `includeDescription`: the description's text, paragraphs kept, tags stripped; null when the description is made only of images (11 of 24 ordinary products in our sample). |
| `description_images` | With `includeDescription`: the description's image links. |
| `documents` | The listing's manuals and documents: `title`, `type` (PDF), `url`. |
| `fields_not_shown` | The record's main fields that are null on this row (the source did not carry them), so a null never reads as a broken field. |

Example record:

```json
{
  "input": "3256809479333689",
  "input_index": 4,
  "inputs_merged": null,
  "status": "ok",
  "status_detail": "the id given (3256809479333689) is the US-site local id of this product: the record was read from the US site (fewer service blocks); the global id is 1005009665648441",
  "scraped_at": "2026-10-10T21:09:07Z",
  "product_id": "1005009665648441",
  "product_id_given": "3256809479333689",
  "url": "https://www.aliexpress.com/item/1005009665648441.html",
  "ship_to": "US",
  "currency": "USD",
  "language": "en_US",
  "title": "KINGROON 10KG PLA/ ABS/ PETG Filament 1.75mm Black White Gray , Wholesale 10 Rolls PLA ABS PETG Plastic For 3D Printer",
  "brand": "KINGROON",
  "price_min": 79.27,
  "price_max": 89.89,
  "original_price_min": 194.5,
  "original_price_max": 216.62,
  "discount_percent": 59,
  "price_text": "$79.27",
  "original_price_text": "$194.50",
  "lowest_price_30d": null,
  "price_notes": null,
  "new_shopper_price": true,
  "sku_count": 12,
  "skus_available": 10,
  "stock_total": 1642,
  "max_buy": 1,
  "sold_by_lot": false,
  "selected_sku_id": "12000055960060417",
  "skus": [
    {
      "sku_id": "12000055960060414",
      "attributes": {
        "Color": "PLA 10kg White",
        "Ships From": "United States"
      },
      "ships_from": "US",
      "price": 89.79,
      "original_price": 216.62,
      "price_text": "$89.79",
      "original_price_text": "$216.62",
      "lowest_price_30d": null,
      "stock": 280,
      "available": true,
      "max_buy": 1,
      "image": "https://ae-pic-a1.aliexpress-media.com/kf/Se140053a0a7a4119a12e2827b8478359J.jpg"
    },
    {
      "sku_id": "12000055960060415",
      "attributes": {
        "Color": "ABS 10kg White",
        "Ships From": "United States"
      },
      "ships_from": "US",
      "price": 87.89,
      "original_price": 209.76,
      "price_text": "$87.89",
      "original_price_text": "$209.76",
      "lowest_price_30d": null,
      "stock": 0,
      "available": false,
      "max_buy": 0,
      "image": "https://ae-pic-a1.aliexpress-media.com/kf/S1d3d1227f16c46a6b7c7120094e59a74P.jpg"
    },
    {
      "sku_id": "12000055960060412",
      "attributes": {
        "Color": "PETG 10kg Gray",
        "Ships From": "United States"
      },
      "ships_from": "US",
      "price": 81.9,
      "original_price": 196.44,
      "price_text": "$81.90",
      "original_price_text": "$196.44",
      "lowest_price_30d": null,
      "stock": 320,
      "available": true,
      "max_buy": 1,
      "image": "https://ae-pic-a1.aliexpress-media.com/kf/S90874171adbe40fdab5f40255a352f13d.jpg"
    },
    {
      "sku_id": "12000055960060413",
      "attributes": {
        "Color": "PLA 10kg Mix",
        "Ships From": "United States"
      },
      "ships_from": "US",
      "price": 88.97,
      "original_price": 216.48,
      "price_text": "$88.97",
      "original_price_text": "$216.48",
      "lowest_price_30d": null,
      "stock": 10,
      "available": true,
      "max_buy": 1,
      "image": "https://ae-pic-a1.aliexpress-media.com/kf/S93c627a4465e46cc92bbe7f57fa00d54x.jpg"
    },
    {
      "sku_id": "12000055960060410",
      "attributes": {
        "Color": "ABS 10kg Mix",
        "Ships From": "United States"
      },
      "ships_from": "US",
      "price": 88.97,
      "original_price": 216.48,
      "price_text": "$88.97",
      "original_price_text": "$216.48",
      "lowest_price_30d": null,
      "stock": 1,
      "available": true,
      "max_buy": 1,
      "image": "https://ae-pic-a1.aliexpress-media.com/kf/Se92f7c6b67d34850be31b9b6bea58668B.jpg"
    },
    {
      "sku_id": "12000055960060411",
      "attributes": {
        "Color": "ABS 10kg Black",
        "Ships From": "United States"
      },
      "ships_from": "US",
      "price": 87.79,
      "original_price": 212.12,
      "price_text": "$87.79",
      "original_price_text": "$212.12",
      "lowest_price_30d": null,
      "stock": 12,
      "available": true,
      "max_buy": 1,
      "image": "https://ae-pic-a1.aliexpress-media.com/kf/Sed1ad463362e4e4d81f1aa4b238dc932R.jpg"
    },
    {
      "sku_id": "12000055960060408",
      "attributes": {
        "Color": "PETG 10kg White",
        "Ships From": "United States"
      },
      "ships_from": "US",
      "price": 81.8,
      "original_price": 198.66,
      "price_text": "$81.80",
      "original_price_text": "$198.66",
      "lowest_price_30d": null,
      "stock": 390,
      "available": true,
      "max_buy": 1,
      "image": "https://ae-pic-a1.aliexpress-media.com/kf/S835299b5892444f286fea1800f4fdffdR.jpg"
    },
    {
      "sku_id": "12000055960060409",
      "attributes": {
        "Color": "ABS 10kg Gray",
        "Ships From": "United States"
      },
      "ships_from": "US",
      "price": 87.89,
      "original_price": 209.76,
      "price_text": "$87.89",
      "original_price_text": "$209.76",
      "lowest_price_30d": null,
      "stock": 0,
      "available": false,
      "max_buy": 0,
      "image": "https://ae-pic-a1.aliexpress-media.com/kf/S7a36cee721174d1c8c81fb511c448a06w.jpg"
    },
    {
      "sku_id": "12000055960060407",
      "attributes": {
        "Color": "PLA 10kg Black",
        "Ships From": "United States"
      },
      "ships_from": "US",
      "price": 87.03,
      "original_price": 212.08,
      "price_text": "$87.03",
      "original_price_text": "$212.08",
      "lowest_price_30d": null,
      "stock": 197,
      "available": true,
      "max_buy": 1,
      "image": "https://ae-pic-a1.aliexpress-media.com/kf/Sa351c63840c84806b4a11addd0807126W.jpg"
    },
    {
      "sku_id": "12000055960060418",
      "attributes": {
        "Color": "PETG 10kg Mix",
        "Ships From": "United States"
      },
      "ships_from": "US",
      "price": 83.8,
      "original_price": 203.14,
      "price_text": "$83.80",
      "original_price_text": "$203.14",
      "lowest_price_30d": null,
      "stock": 85,
      "available": true,
      "max_buy": 1,
      "image": "https://ae-pic-a1.aliexpress-media.com/kf/S88b41112f0bb4394a23e167b9e8b63843.jpg"
    },
    {
      "sku_id": "12000055960060416",
      "attributes": {
        "Color": "PLA 10kg Gray",
        "Ships From": "United States"
      },
      "ships_from": "US",
      "price": 89.89,
      "original_price": 214.2,
      "price_text": "$89.89",
      "original_price_text": "$214.20",
      "lowest_price_30d": null,
      "stock": 44,
      "available": true,
      "max_buy": 1,
      "image": "https://ae-pic-a1.aliexpress-media.com/kf/S766388ab24464c54be630c8d8a509a24F.jpg"
    },
    {
      "sku_id": "12000055960060417",
      "attributes": {
        "Color": "PETG 10kg Black",
        "Ships From": "United States"
      },
      "ships_from": "US",
      "price": 79.27,
      "original_price": 194.5,
      "price_text": "$79.27",
      "original_price_text": "$194.50",
      "lowest_price_30d": null,
      "stock": 303,
      "available": true,
      "max_buy": 1,
      "image": "https://ae-pic-a1.aliexpress-media.com/kf/Sa9a7f432d9a4415b842f010364da76bdw.jpg"
    }
  ],
  "sku_properties": [
    {
      "property_id": 14,
      "name": "Color",
      "ships_from": false,
      "values": [
        {
          "value_id": 350686,
          "name": "PLA 10kg Mix",
          "catalog_name": "Brown",
          "image": "https://ae-pic-a1.aliexpress-media.com/kf/S93c627a4465e46cc92bbe7f57fa00d54x.jpg",
          "color": null,
          "ships_from_code": null
        },
        {
          "value_id": 350852,
          "name": "PETG 10kg Black",
          "catalog_name": "Orange",
          "image": "https://ae-pic-a1.aliexpress-media.com/kf/Sa9a7f432d9a4415b842f010364da76bdw.jpg",
          "color": "#FFA500",
          "ships_from_code": null
        },
        {
          "value_id": 10,
          "name": "PETG 10kg White",
          "catalog_name": "Red",
          "image": "https://ae-pic-a1.aliexpress-media.com/kf/S835299b5892444f286fea1800f4fdffdR.jpg",
          "color": "#FF0000",
          "ships_from_code": null
        },
        {
          "value_id": 29,
          "name": "PLA 10kg White",
          "catalog_name": "WHITE",
          "image": "https://ae-pic-a1.aliexpress-media.com/kf/Se140053a0a7a4119a12e2827b8478359J.jpg",
          "color": "#FFFFFF",
          "ships_from_code": null
        },
        {
          "value_id": 173,
          "name": "PETG 10kg Gray",
          "catalog_name": "Blue",
          "image": "https://ae-pic-a1.aliexpress-media.com/kf/S90874171adbe40fdab5f40255a352f13d.jpg",
          "color": "#0080FF",
          "ships_from_code": null
        },
        {
          "value_id": 175,
          "name": "PETG 10kg Mix",
          "catalog_name": "green",
          "image": "https://ae-pic-a1.aliexpress-media.com/kf/S88b41112f0bb4394a23e167b9e8b63843.jpg",
          "color": "#007000",
          "ships_from_code": null
        },
        {
          "value_id": 193,
          "name": "PLA 10kg Black",
          "catalog_name": "black",
          "image": "https://ae-pic-a1.aliexpress-media.com/kf/Sa351c63840c84806b4a11addd0807126W.jpg",
          "color": "#000000",
          "ships_from_code": null
        },
        {
          "value_id": 366,
          "name": "ABS 10kg Black",
          "catalog_name": "YELLOW",
          "image": "https://ae-pic-a1.aliexpress-media.com/kf/Sed1ad463362e4e4d81f1aa4b238dc932R.jpg",
          "color": "#FFFF00",
          "ships_from_code": null
        },
        {
          "value_id": 496,
          "name": "ABS 10kg Gray",
          "catalog_name": "PURPLE",
          "image": "https://ae-pic-a1.aliexpress-media.com/kf/S7a36cee721174d1c8c81fb511c448a06w.jpg",
          "color": "#6C3365",
          "ships_from_code": null
        },
        {
          "value_id": 691,
          "name": "PLA 10kg Gray",
          "catalog_name": "GRAY",
          "image": "https://ae-pic-a1.aliexpress-media.com/kf/S766388ab24464c54be630c8d8a509a24F.jpg",
          "color": "#999",
          "ships_from_code": null
        },
        {
          "value_id": 1052,
          "name": "ABS 10kg Mix",
          "catalog_name": "Pink",
          "image": "https://ae-pic-a1.aliexpress-media.com/kf/Se92f7c6b67d34850be31b9b6bea58668B.jpg",
          "color": "#FFC0CB",
          "ships_from_code": null
        },
        {
          "value_id": 202559811,
          "name": "ABS 10kg White",
          "catalog_name": "Golden",
          "image": "https://ae-pic-a1.aliexpress-media.com/kf/S1d3d1227f16c46a6b7c7120094e59a74P.jpg",
          "color": null,
          "ships_from_code": null
        }
      ]
    },
    {
      "property_id": 200007763,
      "name": "Ships From",
      "ships_from": true,
      "values": [
        {
          "value_id": 201336106,
          "name": "United States",
          "catalog_name": null,
          "image": null,
          "color": null,
          "ships_from_code": "US"
        }
      ]
    }
  ],
  "rating": 4.9,
  "review_count": 600,
  "sold_text": "This seller: 4,000+ sales | Total sales: 5,000+",
  "sold_min": 5000,
  "seller_sold": 4000,
  "wishlist_count": 92,
  "main_image": "https://ae-pic-a1.aliexpress-media.com/kf/S6196462c42804df3bde6c0e3cdb932b4J.jpg",
  "images": [
    "https://ae-pic-a1.aliexpress-media.com/kf/S6196462c42804df3bde6c0e3cdb932b4J.jpg",
    "https://ae-pic-a1.aliexpress-media.com/kf/S9707e48f7cd145668e66b5dc9477c1baT.jpg",
    "https://ae-pic-a1.aliexpress-media.com/kf/S4b381151a12248449195f9742fc80d2aw.jpg",
    "https://ae-pic-a1.aliexpress-media.com/kf/S3d910ef34d53468fa72b456246043281x.jpg",
    "https://ae-pic-a1.aliexpress-media.com/kf/Sb03e64bea0684c909085303bbebc8518x.jpg",
    "https://ae-pic-a1.aliexpress-media.com/kf/Se02ffb5cb9974a97a5fd535e5a3b53a74.jpg",
    "https://ae-pic-a1.aliexpress-media.com/kf/S851625bf5d8644728c95c4270ef40a69m.jpg",
    "https://ae-pic-a1.aliexpress-media.com/kf/S5b94d5c5967a46ffbd99ff8908529af4U.jpg"
  ],
  "video": {
    "url": "https://video.aliexpress-media.com/play/u/ae_sg_item/3000903266424/p/1/e/6/t/10301/5000593110502.mp4",
    "poster": "https://ae-pic-a1.aliexpress-media.com/kf/S0f5ef2eb5c3b406780acae687d4a375e2.jpg",
    "video_id": "5000593110502"
  },
  "description_video_url": null,
  "specs": [
    {
      "name": "High-concerned chemical",
      "value": "none"
    },
    {
      "name": "Shelf Life",
      "value": "1years"
    },
    {
      "name": "Material",
      "value": "PLA/PETG/ABS"
    },
    {
      "name": "Form",
      "value": "Solid"
    },
    {
      "name": "Brand Name",
      "value": "KINGROON"
    },
    {
      "name": "Origin",
      "value": "Mainland China"
    }
  ],
  "category_id": "200003885",
  "category_path": [
    "7",
    "200003879",
    "200003885"
  ],
  "category_names": null,
  "category_breadcrumb": null,
  "shipping_status": "shippable",
  "shipping_count": 1,
  "shipping_options": [
    {
      "carrier": "CAINIAO LARGE PARCEL",
      "company": "CAINIAO LARGE PARCEL",
      "code": "CAINIAO_OVERSEAS_WH_US_LP",
      "fee": 0.0,
      "fee_text": "free",
      "free": true,
      "currency": "USD",
      "ship_from": "United States",
      "ship_from_code": "US",
      "ship_to": "United States",
      "ship_to_code": "US",
      "delivery_days_min": 3,
      "delivery_days_max": 9,
      "eta_min": "Oct. 13",
      "eta_max": "Oct. 19",
      "tracking": true,
      "warehouse": "own_warehouse",
      "guaranteed_days": 15,
      "delay_compensation": "$1.00",
      "stock": 303
    }
  ],
  "store_id": "1103665127",
  "store_number": "1103669004",
  "store_name": "Big Save Store",
  "store_url": "https://www.aliexpress.com/store/1103665127",
  "store_logo": "https://ae-pic-a1.aliexpress-media.com/kf/Se90fceedf9d34ad1a8979283c98a1e45I/144x144.png",
  "seller_id": "2681210425",
  "store_country": "China",
  "store_opened_at": "2024-04-03 01:06:31",
  "store_years": 2,
  "store_level": "0",
  "store_top_rated": false,
  "store_positive_rate": 0.0,
  "store_positive_count": 0,
  "store_feedback_count": 0,
  "store_score": 0,
  "store_rating": null,
  "store_sold_180d": null,
  "store_scores": null,
  "store_followers": 208,
  "coupons": null,
  "promotions": [
    {
      "kind": "girdle_bigsale_welcomedeal",
      "text": "Save $115.23",
      "ends_at": 1791777599000
    },
    {
      "kind": "new_user_platform_allowance_atm",
      "text": "Event",
      "ends_at": null
    }
  ],
  "return_policy": "Free returns within 90 days",
  "delivery_guarantee": [
    "$1.00 coupon code if delayed",
    "Refund if package lost",
    "Refund if items damaged",
    "Refund if no delivery in 20 days"
  ],
  "description_url": "https://pdp.aliexpress-media.com/product/description/pc/v2/en_US/desc.htm?productId=1005009665648441&key=S4ceeb6b3d67e4469a441fc7ab672bb37R.zip&token=c48aefd01bfcdebdb96a07f08e3f6665&sellerId=2681210425",
  "description_mobile_url": "https://pdp.aliexpress-media.com/product/description/msite/v2/en_US/desc.htm?productId=1005009665648441&key=S4ceeb6b3d67e4469a441fc7ab672bb37R.zip&token=c48aefd01bfcdebdb96a07f08e3f6665&sellerId=2681210425",
  "description_text": null,
  "description_images": null,
  "documents": [
    {
      "title": "User manual (PDF)",
      "type": "PDF",
      "url": "https://ae-pic-a1.aliexpress-media.com/kf/S8f154d11492942539b98b9af55ef685aw.pdf"
    }
  ],
  "fields_not_shown": [
    "store_rating",
    "coupons"
  ]
}
```

### Pricing

**Pay only for the product records a run delivers**, with no start fee and no platform usage billed to you. Prices fall with your Apify plan.

| per 1,000 | Free | Starter | Scale | Business |
|---|---|---|---|---|
| Product record (`product`) | $6.00 | $5.10 | $4.20 | $3.00 |

A product record is **$6.00 per 1,000** on the Free plan ($0.006 a product) and $3.00 on Business. One record is one product read for one ship-to country: a product read for three countries with `shipToCountries` is three records. A record that AliExpress served but that does not ship to your country is a record (`shipping_status` `not_shippable`, every other field filled). Free: an id that does not exist (`not_found`), a product not sold in the country (`unavailable`), a value that is not a product (`invalid`), the US-site form of a product you already named (`duplicate`), a record the source did not serve or served for another country (`failed`), and a run that failed before its first row. `maxItems` counts charged records; before the first request the log says the most the run can cost at your plan's prices. Enterprise plans have their own rates — the Actor's Pricing tab shows the price for your plan.

### Usage patterns

- **A list check** — Paste hundreds of product URLs or item ids: each comes back as one row in your order (`input_index`) or as a free `not_found` / `unavailable` / `invalid` row. The same product given as an id and as its URL is one row (`inputs_merged`); the US-site URL of a product (`aliexpress.us/item/3256…`) is read on its own and comes back as a free `duplicate` row when the product was already named.
- **Markets** — `shipTo` sets the country every price, stock figure and shipping option is computed for; `currency` sets the currency of every price (empty = the country's own); `language` the locale of the texts. `shipToCountries` adds a row per product for each listed country. Check `shipping_status` on each row: `shippable` comes with the options, `not_shippable` with the reason in `status_detail`. Each row is the ship-to country's own view (its prices, currency, VAT note, stock and shipping) in the language asked; an answer the source gives for another country is a free `failed` row, never charged. Ready-made: [AliExpress prices and shipping to Germany in EUR, VAT included](https://apify.com/hyperbach/aliexpress-product-details-scraper/examples/aliexpress-prices-and-shipping-to-germany-in-eur).
- **Variants** — Every row lists its SKUs (`skus`: id, attributes, price, original price, stock, availability, purchase limit, ship-from code, image) and the attribute matrix (`sku_properties`: property id and name, each value with its id, name, catalogue name, swatch image, hex colour, ship-from country code). `selected_sku_id` is the variant the page opens on; `price_min` / `price_max` are over all SKUs, sold-out ones included (`available` false on the SKU); `skus_available` counts the SKUs in stock.
- **On a schedule** — Save a task with your list and schedule it daily or hourly: each run reads every product again and charges each, with the time of the read in `scraped_at`; compare runs by `product_id` and `ship_to`. Ready-made: [AliExpress price and stock check: 5 products, run it daily](https://apify.com/hyperbach/aliexpress-product-details-scraper/examples/aliexpress-daily-price-and-stock-check-5-products), [AliExpress product details by URL: price, SKUs, shipping, store](https://apify.com/hyperbach/aliexpress-product-details-scraper/examples/aliexpress-product-details-by-url-price-skus-shipping).
- **Images, video and description** — Every row has the main image, the full-size gallery, the video (an MP4 link and its poster) when the listing has one, each SKU's image and the variant swatches: links to AliExpress's servers, no files downloaded. `includeDescription` adds the seller's description as text, paragraphs kept, and its image links, at no extra charge; a description made only of images gives no text. Ready-made: [AliExpress product images and video: gallery, MP4, swatches](https://apify.com/hyperbach/aliexpress-product-details-scraper/examples/aliexpress-product-images-video-and-variant-swatches), [AliExpress product description: the text and the images](https://apify.com/hyperbach/aliexpress-product-details-scraper/examples/aliexpress-product-description-text-and-images).

### Input configuration

| field | type | default | what it does |
|---|---|---|---|
| `products` | `array` | `[]` | One product per line, as a product URL on any AliExpress site (`https://www.aliexpress.com/item/1005009383937691.html`, `aliexpress.us/item/3256809197622939.html`, `de.aliexpress.com/item/…`) or as a bare item id (`1005009383937691`). The same product given several ways is one row. A value that is not a product (a search, category or store URL, a share link, a typo) gets a free row that says why. |
| `shipTo` | `string` | `"US"` | The two-letter country the products are read for (`US`, `GB`, `DE`, `BR`, …): prices, stock, availability and the shipping options are the ones a shopper there sees. A product the store does not ship there comes back with its full record and `shipping_status` = `not_shippable`; a product not sold there at all is a free `unavailable` row. |
| `shipToCountries` | `array` | `[]` | Compare one product across markets: each product is also read for every country listed here (two-letter codes), one row per product and country, each in that country's own currency unless `currency` is set. Empty = the ship-to country above only. |
| `currency` | `string` | `""` | A three-letter currency code for every price (`USD`, `EUR`, `GBP`, `BRL`, …). Empty = each row in its ship-to country's own currency (USD for US, GBP for GB, EUR for DE, …); the row says which one it used. |
| `language` | `string` | `"en_US"` | The locale of the texts (title, specifications, attribute names, shipping and service lines): `en_US`, `de_DE`, `es_ES`, `fr_FR`, `pt_BR`, `ru_RU`, … |
| `includeDescription` | `boolean` | `false` | Read the product's description file (one more small call per product) and add its text and image links to the row (`description_text`, `description_images`). The signed description links are on every row either way. |
| `maxItems` | `integer` | `0` | Stop after this many product records (charged rows; the free rows of misses do not count). 0 = no cap. |

### Errors

**A run does not fail because of your input.** When an input cannot be used — a date that is not a date, an id in the wrong form, two settings that contradict each other — the run ends **Succeeded**, charges nothing, and says what to change:

- the status message starts with `INPUT REJECTED`;
- the dataset holds one row, `{"error": true, "code": "…", "message": "…"}`, and no results;
- the key-value store record `ERROR` holds the same object.

From code, check `error` on the first row before reading results.

A search that matches nothing is not an error: the dataset is empty and nothing is charged. A run that ends **Failed** is a fault on our side, never your input; it charges nothing, and we are alerted.

### FAQ

**Why is `category_names` empty on most products?**

Because AliExpress fills the breadcrumb names for a few listings only (2 of 44 products in our measurement; the product page itself shows "This product belongs to Home" for the others). The category leaf id and the id path are on every row; the names come when the source carries them, and the category pages add none.

**What does `not_shippable` mean, and is it charged?**

The store's warehouses do not deliver to the country you asked: the source marks the delivery entry unreachable. The row is a full record (prices, SKUs, stock, store, images, specifications) and is charged as one; only the shipping options are missing. A product that is not sold in the country at all is a free `unavailable` row (the source's SITEM_BAN_NO_AVAIL_SKU).

**Why is the price $1.09 on so many products?**

Because AliExpress shows a visitor who is not logged in its new-shopper offer: the price of a first order (often $1.09, or the original price minus "New shoppers save $X"). In our sample of 24 ordinary US products 22 carried it; the UK, Brazil and Australia views show it too, the German, French, Spanish and Polish views did not. Each row says so in `new_shopper_price` and names the offer in `promotions`; `original_price_min` / `original_price_max` are the prices before it. The price a returning, logged-in shopper pays was not on the logged-out record in our tests, and this Actor uses no account.

**Is the sold count exact?**

No: AliExpress shows a bucket ("10,000+ sold") on a product, never the exact number; `sold_min` is the bucket's floor. On aggregate listings the text also names the seller's own count ("This seller: 414 sales | Total sales: 10,000+"): that number is `seller_sold`.

**Are reviews included?**

The rating and the review count are on every row. Review rows (text, photos, country) are another job with its own actors; this one reads the product record.

**Why do some runs take longer than others?**

AliExpress puts a slider wall on an IP after about ten product records and lets about 1 fresh IP in 6 through in a good hour, 1 in 14 in a bad one. The Actor probes fresh exits with an ordinary product and keeps a served one for 8 records, so a run's time depends on the hour's entry rate; the run summary (`entry_window`) shows the rate of your run. A run never waits on a refused IP.

**What is charged?**

A product record per row that carries one (`status` ok), per ship-to country asked. Free: `not_found`, `unavailable`, `invalid`, `duplicate` and `failed` rows, and a run that failed before its first row; a run that stops early (a timeout, an abort) is charged for the rows it delivered. `maxItems` is exact; before the first request the log says the most the run can cost at your plan's prices.

**Can an AI agent use it (MCP)?**

Yes. Apify's MCP server (`https://mcp.apify.com`) offers Store Actors as tools to Claude, Cursor and other MCP clients: add this Actor and the agent sends `products` and gets the rows back.

### Integration

#### JavaScript

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('hyperbach/aliexpress-product-details-scraper').call({"products": ["https://www.aliexpress.com/item/1005009383937691.html", "1005006959700436"]});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

#### Python

```python
from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')
run = client.actor('hyperbach/aliexpress-product-details-scraper').call(run_input={'products': ['https://www.aliexpress.com/item/1005009383937691.html', '1005006959700436']})
items = client.dataset(run['defaultDatasetId']).list_items().items
```

#### CLI

```bash
apify call hyperbach/aliexpress-product-details-scraper --input '{"products": ["https://www.aliexpress.com/item/1005009383937691.html", "1005006959700436"]}'
```

#### REST

```bash
curl -X POST "https://api.apify.com/v2/acts/hyperbach~aliexpress-product-details-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H 'Content-Type: application/json' -d '{"products": ["https://www.aliexpress.com/item/1005009383937691.html", "1005006959700436"]}'
```

### Support

apify@hyperbach.com

*This page is generated from the Actor's schemas and a live sample — it cannot describe a field the Actor does not have.*

# Actor input Schema

## `products` (type: `array`):

One product per line, as a product URL on any AliExpress site (`https://www.aliexpress.com/item/1005009383937691.html`, `aliexpress.us/item/3256809197622939.html`, `de.aliexpress.com/item/…`) or as a bare item id (`1005009383937691`). The same product given several ways is one row. A value that is not a product (a search, category or store URL, a share link, a typo) gets a free row that says why.

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

The two-letter country the products are read for (`US`, `GB`, `DE`, `BR`, …): prices, stock, availability and the shipping options are the ones a shopper there sees. A product the store does not ship there comes back with its full record and `shipping_status` = `not_shippable`; a product not sold there at all is a free `unavailable` row.

## `shipToCountries` (type: `array`):

Compare one product across markets: each product is also read for every country listed here (two-letter codes), one row per product and country, each in that country's own currency unless `currency` is set. Empty = the ship-to country above only.

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

A three-letter currency code for every price (`USD`, `EUR`, `GBP`, `BRL`, …). Empty = each row in its ship-to country's own currency (USD for US, GBP for GB, EUR for DE, …); the row says which one it used.

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

The locale of the texts (title, specifications, attribute names, shipping and service lines): `en_US`, `de_DE`, `es_ES`, `fr_FR`, `pt_BR`, `ru_RU`, …

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

Read the product's description file (one more small call per product) and add its text and image links to the row (`description_text`, `description_images`). The signed description links are on every row either way.

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

Stop after this many product records (charged rows; the free rows of misses do not count). 0 = no cap.

## Actor input object example

```json
{
  "products": [
    "https://www.aliexpress.com/item/1005009383937691.html",
    "1005006959700436"
  ],
  "shipTo": "US",
  "shipToCountries": [],
  "currency": "",
  "language": "en_US",
  "includeDescription": false,
  "maxItems": 0
}
```

# Actor output Schema

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

All scraped records in the default dataset. One row per product and ship-to country you asked (or a free row saying why there is none):

## `runSummary` (type: `string`):

How the run went: product records charged, free rows by status, rows per country, the entry window (fresh exits probed, exits served, the entry rate of this run) and the source counters (requests, records, probes, rotations, sliders, bytes).

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

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

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

```

## MCP server setup

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