# AliExpress Scraper: Products, Prices and Shipping per Country (`agenttoolworks/aliexpress-scraper`) Actor

AliExpress scraper for keywords, category pages and product URLs: every SKU with its price and stock, the shipping options to each country you list, the store and ratings. One row per product and ship-to country; products not sold there are free. Price tracker mode: only new or changed products.

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

## Pricing

from $1.20 / 1,000 products

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### What is this AliExpress scraper?

This Actor is an **AliExpress scraper** for search, categories and product pages in one run: type keywords, paste category URLs or product URLs (or bare IDs), list the **countries you ship to**, and get one row per product and country with **every SKU's price and stock, the shipping options to that country (carrier, fee, delivery days, ship-from), the store, rating, reviews count, orders, images and specifications**. Turn details off for fast search rows only, or use it as an **AliExpress price tracker**: change mode returns only the products that are new or whose price or stock status changed since your last run.

**In short**

- **What you get**: one row per product and ship-to country, with every variant (SKU) and its options, price and stock, the price range and discount, the delivery options to that country, the store and its positive feedback rate, rating, reviews count, units sold, images, category and specifications. Or, with details off, one row per search card (price, rating, units sold, ship-from).
- **What it costs**: **$1.50 per 1,000 detailed product rows** (one per product and ship-to country) and **$0.50 per 1,000 search rows** without details, on the Free plan, less on higher Apify plans. Pay per row delivered, proxies included. **Free**: products AliExpress does not sell to a country, products not found, products that failed (each row says why), and duplicates.
- **Why this one** (measured in this Actor's own cloud runs on 2026-10-27; Store figures read 2026-10-26):
  - **Price**: $1.50 per 1,000 detailed products, against $8.00 for the leading details Actor (2,038 users in 30 days), and $0.50 per 1,000 search rows, against $2.00 to $9.00 elsewhere (the comparison table below).
  - **Several ship-to countries in one run**, each with its own price, availability and shipping options. The current leader takes one `shipTo` and one currency per run (piotrv1001/aliexpress-product-details-scraper, Store record read 2026-10-26).
  - **Search, categories and product URLs in one Actor**: the leader's details Actor takes product URLs or IDs only, and sells search in a separate Actor.
  - **Reliability**: **1,000 of 1,000 products delivered** on the default 8 parallel IPs (run 7QQ1p5Y1reU9NDx8x), and **998 of 1,000** on 4 (run hK0tyCOaGAXR5YzyQ); the 2 others were free rows with the reason, and 3 product IDs that do not exist came back as free `not_found` rows. The figure the Store shows for the leaders is another unit, the share of runs that succeeded in 30 days (96.38% for piotrv1001 details, 89.63% for kawsar search, 83.83% for khadinakbar).
  - **A short result is never silent**: when AliExpress refuses access more than usual, or more than 5% of the products fail, the run ends `partial` and says why in its status and summary, with the products not read (all counted, the first 200 listed by ID).

No AliExpress account, no API key, no login. Not affiliated with AliExpress or Alibaba Group.

### What data can you extract from AliExpress?

One row per product and ship-to country. Where AliExpress does not give a field, it is `null`, never guessed.

| Product and price | Variants and stock | Shipping, store and reviews |
|---|---|---|
| Product ID, URL, title | Every SKU (`skus`): its options with the seller's own names (`Color: Black`), price, original price, stock, availability, image | Delivery options to the ship-to country (`shipping`): carrier, fee and its currency, free or not, delivery days and dates, ship-from country, tracking |
| Price range (`price` to `priceMax`) and original price, in the currency asked for | Option lists (`options`: Color, Size, Ships From...) | Cheapest shipping fee, free shipping, ship-from, delivery days |
| Discount of the cheapest SKU | Total stock (`stockTotal`), placeholder stock flagged | Store name, ID, URL, positive feedback rate, opening date; seller ID |
| Category ID and path, specifications, description URL | In stock or sold out (`available`) | Rating, reviews count, units sold (`orders`, with its text), wishlist count |
| Images | | Where the row came from: keyword or URL, page, position, sponsored |

Field coverage measured on the 995 products of the access test (2026-10-26): title, price, currency, variants, stock, shipping, store, images and reviews count 100%; orders 92.2%; rating 73.7% (products without reviews have none).

### What can you use AliExpress data for?

- **Dropshipping and product research**: per-variant prices and stock, shipping cost and delivery days to each of your markets, in one table.
- **Price monitoring**: schedule a run with **Only new or changed products** and get only the SKUs whose price moved or that sold out.
- **Market comparison**: the same products priced and shipped to the US, the UK, Germany or Brazil, side by side (prices differ per country).
- **Supplier vetting**: store feedback rate, opening date, rating, reviews count and units sold.
- **Catalog building and data for AI agents**: one predictable JSON row per product and country.

### How to scrape AliExpress

1. Click **Try for free** (or **Start**) on this page and sign in to Apify.
2. Type **Keywords** (`wireless earbuds`), paste **Category or search URLs**, or paste **Product URLs or IDs**.
3. List the **Ship to** countries (`US`, `GB`, `DE`... or English names) and pick the **Currency**.
4. Set **Max products per keyword or category**. You pay per row delivered, so start small to look at the data.
5. Click **Start**. When the run finishes, open the **Output** tab, pick a view (Overview, Details, Shipping per country, Variants), and export as JSON, CSV, Excel or XML, or read it through the API.

### Input

| Field | What it does |
|---|---|
| `keywords` | Search terms, each read as AliExpress's search page lists it, 60 products per page. A product URL or ID typed here is read as a product, with a note. |
| `categoryUrls` | Category pages (`/category/63705/earphones-headphones.html`) or search pages (`/w/wholesale-...`), from any AliExpress country site. Their sort and filters are kept. |
| `productUrls` | Product pages (`/item/<id>.html` on aliexpress.com, aliexpress.us or country sites) or bare IDs. Each is read in detail for every ship-to country. Short share links are not followed. |
| `maxItems` | Products per keyword or category (default 100, up to 5,000). In our run, the "phone case" search stopped at page 60 with 2,978 distinct products, out of 183,827 results announced (run 3I6g9bQPiarhfZQBT): for more, split into categories or narrower keywords. |
| `includeDetails` | On by default: each product found is read in detail and gives a detailed row per country. Off: search rows only (faster). |
| `shipTo` | Countries, as codes or English names (default `US`). Each gives its own detailed row. With details off, search results are read for the first country only. |
| `currency` | Three-letter code (default `USD`, the one measured). Each row says the currency AliExpress answered in. |
| `onlyChanges`, `monitorName` | Change mode (see below). |
| `concurrency` | Products read at the same time, each from its own IP (default 8, up to 10). 1,000 products took 9 minutes on 8 and 20 minutes on 4 (runs 7QQ1p5Y1reU9NDx8x and hK0tyCOaGAXR5YzyQ). |

Example: three markets for two products.

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

Example: a keyword's first 200 products with details, shipped to France, priced in euros.

```json
{
  "keywords": ["neck fan"],
  "maxItems": 200,
  "shipTo": ["France"],
  "currency": "EUR"
}
```

Example: a weekly price monitor of a category.

```json
{
  "categoryUrls": ["https://www.aliexpress.com/category/63705/earphones-headphones.html"],
  "maxItems": 500,
  "onlyChanges": true,
  "monitorName": "earphones-weekly"
}
```

### Output

The dataset has five views:

- **Overview**: image, title, price, currency, ship-to, orders, rating, reviews, store, shipping fee, status.
- **Details**: price range, discount, stock, SKUs, delivery days, store and category.
- **Shipping per country**: one row per product, country and delivery option.
- **Variants (SKUs)**: one row per SKU, with its options, price, stock and availability.
- **All fields**: every field of every row.

A row from this Actor's cloud run of 2026-10-27 (run hKJqds2ocDKjr5kBT, ship to the UK), lists shortened (35 SKUs and 35 models in the full row).

```json
{
  "rowType": "product",
  "status": "ok",
  "productId": "3256809276917537",
  "url": "https://www.aliexpress.com/item/3256809276917537.html",
  "title": "Ultra Thin Clear TPU Phone Cases For iPhone 18 17 16 15 14 13 12 11 Pro Max Plus Air 16E XR XS Max Transparent Silicone Cover",
  "shipTo": "GB",
  "currency": "USD",
  "price": 2.09,
  "priceMax": 2.79,
  "originalPrice": 2.1,
  "originalPriceMax": 2.8,
  "discountPercent": 0,
  "available": true,
  "stockTotal": 45421,
  "skuCount": 35,
  "shippingFee": 1.99,
  "freeShipping": false,
  "shipFrom": "CN",
  "deliveryDaysMin": 4,
  "deliveryDaysMax": 7,
  "storeName": "Shop1102861803 Store",
  "storeId": "1102861803",
  "storeUrl": "https://www.aliexpress.com/store/1102861803",
  "storePositiveRate": 93.8,
  "rating": 4.7,
  "reviewsCount": 2988,
  "orders": 10000,
  "ordersIsLowerBound": true,
  "ordersText": "10,000+ sold",
  "categoryPath": "202192403/202228401/202228405",
  "options": [{ "name": "Color", "values": ["Clear"] }, { "name": "Compatibility by Model", "values": ["iPhone 18 Pro Max", "iPhone 18 Pro", "iPhone Air", "iPhone17"] }],
  "skus": [
    { "skuId": "12000049183381385", "options": { "Color": "Clear", "Compatibility by Model": "iPhone 16 Pro Max" }, "price": 2.56, "originalPrice": 2.57, "stock": 39, "stockIsPlaceholder": false, "available": true },
    { "skuId": "12000049183381384", "options": { "Color": "Clear", "Compatibility by Model": "iPhone 16 Plus" }, "price": 2.49, "originalPrice": 2.5, "stock": 2, "stockIsPlaceholder": false, "available": true }
  ],
  "shipping": [
    { "carrier": "AliExpress Selection Premium shipping", "code": "CAINIAO_FULFILLMENT_PRE", "fee": 1.99, "feeCurrency": "USD", "freeShipping": false, "minDays": 4, "maxDays": 7, "etaMin": "Oct. 31", "etaMax": "Nov. 03", "shipsFrom": "CN", "tracking": true }
  ],
  "source": "productUrls",
  "sourceType": "product",
  "input": "3256809276917537"
}
```

What the per-country rows look like, measured on one product on 2026-10-26 (run cNwNenzgH5H0ndVW8, USD): to the US 22.61 to 26.37 with AliExpress Selection Standard at $1.99 in 5 to 10 days; to the UK 20.33 to 23.74 with Premium shipping at $1.99 in 4 to 7 days; to Germany 33.49 to 37.33 and to France 35.34 to 39.47, $1.99 in 7 to 10 days; to Brazil 21.38 to 24.60, $3.50 in 11 to 18 days; to Australia 24.07 to 27.30, $1.99 in 5 to 10 days.

#### Only new or changed products (price tracker)

With `onlyChanges` on, the Actor remembers each product it read, per ship-to country and currency, in a key-value store of your own account named `aliexpress-monitor-<monitorName>`. Each run reads the products as usual and returns, and charges, only those that are new to the monitor or whose **price or stock status changed on a SKU** (a SKU sold out or back in stock, a price up or down). Each row lists its `changes`. The first run returns everything it reads. Stock counts going down with sales are not a change (only in stock against sold out). When a seller adds or removes SKUs (a relisting under new SKU ids, say), the product's lowest price and whether any SKU is in stock are compared too, as changes with `skuId` null. A product the spending limit kept back is not remembered, so the next run reports it. With details off, a search card's price is what is compared.

A monitor remembers up to 20,000 products per ship-to country and 1,100,000 SKU prices in all, shared among its countries. Past that, the products seen longest ago, and not read by the run, are forgotten (they are new again if read later): every product a run reads is kept, so a schedule that rereads the same products is never charged again for one that did not change. Only a run that alone reads more than twice its share of the SKU cap (2,200,000 SKU prices in one country, about 41,000 products at the average of 53 SKUs; a third of that in each of three countries) drops the products it read first, and its summary says so; split such a monitor in two (another `monitorName`).

Note: change mode reads every product to compare it, and charges only those that changed.

#### Run summary

The key-value store record `SUMMARY` holds the run's status (`ok`, `partial` with the reason, or `failed`), rows charged per event and free rows per reason, the products not read (all counted, the first 200 listed by ID, and why), each keyword's and category's pages read and products listed, and how many IPs were opened and refused. When the run stops early (AliExpress refusing more than usual, the run's time limit, your spending limit) or more than 5% of the products failed, the status message says so.

### Limits worth knowing before you run it

- **AliExpress lets some IPs through and refuses others**, decided per IP at its first product. In this Actor's 1,000-product run, about 1 in 5 new IPs was let through (116 of 555, the other 439 refused at their first call, run hK0tyCOaGAXR5YzyQ), and most of those then served 10 products (98 of 116). The Actor drops a refused IP for a new one, never answers the slider AliExpress shows, and retires each IP after 10 products, before the refusal measured on the 11th. Proxies are included at no extra charge to you.
- **If AliExpress tightens its access**, so that 60 new IPs in a row are refused, the run stops reading, says so, and lists what it did not read. It does not switch to a browser behind your back: in our measurement a headless browser cost more than 40 times as much per product than the plain requests this Actor sends, a price no one would choose.
- **Speed**: 1,000 products with details in 9 minutes on the default 8 parallel IPs (run 7QQ1p5Y1reU9NDx8x), about 55 s per 100; search rows without details go faster, 2,978 in under 5 minutes (run 3I6g9bQPiarhfZQBT).
- **Unavailable in a country**: products stocked in a local warehouse are often not sold to other countries, and some sellers are barred in EU countries (`SSELLER_BAN_DSA`). Those rows are free and say so: 17% to 28% of answers in our runs of 50 products to the US, the UK, Germany, France and Brazil (runs hKJqds2ocDKjr5kBT, 0ua4L6Ca2oTIK0Pie, vDkvlhFOg9ZEQ9eKy, BaE54xleKxb3SwuZr), none for the US.
- **New-user offer cards**: 15% to 21% of search cards are AliExpress's new-user offer ("{FREE} with any purchase", runs ivpzfa25Jju4YT7ng and 3I6g9bQPiarhfZQBT) and show no price block. Their row takes the welcome price and list price from the card's own data, the same welcome price the product page's data gives a logged-out visitor, and keeps the offer in `promotion`. If a page's other priced cards do not confirm that data's unit (at least 9 in 10 within 0.8 to 1.25 times the price they show), `price` stays null rather than guessed, and `SUMMARY` notes the page and why.
- **Placeholder stock**: some sellers type a stock meaning "plenty" (99,999, 200,000, 999,996). SKUs at or above 99,990 are flagged `stockIsPlaceholder` and left out of `stockTotal`.
- **No reviews**: review texts carry buyers' personal data and are not read. Rating and reviews count are.
- **Currencies**: passed to AliExpress as its own currency menu does. Measured in USD, EUR (France) and GBP (UK): every row and every shipping fee came back in the currency asked for (runs mmfimdMHePHeYJJ9W and Ps7BZp0rkpbak5kZR).
- **The run stops itself before its timeout**: a minute before (less on a short run), it starts nothing new, stores what it read, and ends with `SUMMARY` saying what was not covered. Only the rows in the dataset are charged.
- **If Apify moves the run to another server** (a migration, which restarts it), the run carries on there without pushing or charging again the rows it had already delivered.

### How it compares (Apify Store, read 2026-10-26)

Every AliExpress product or search scraper on the Store with 150 or more users in 30 days. Prices on the Free plan and 30-day figures as each Actor's public Store record showed them on 2026-10-26 (`pricingInfos` and `publicActorRunStats30Days`), per 1,000 rows. "Success" is the share of runs that succeeded, not of products delivered. We did not run these Actors, and what each returns was not compared on the same input. thirdwatch's Actor also has a monitoring mode on search cards (only new or price-changed); this one compares every SKU's price and stock status, per ship-to country.

| | Detailed product, per 1,000 | Search row, per 1,000 | Ship-to countries per run | Success, 30 days | Users, 30 days |
|---|---|---|---|---|---|
| piotrv1001/aliexpress-product-details-scraper | $8.00 (since 2026-10-24) | separate Actor ($2.50) | one | 96.38% | 2,038 |
| kawsar/aliexpress-search-scraper | none | $9.00 | by request origin | 89.63% | 1,280 |
| zen-studio/aliexpress-scraper | $2.49 + $3.99 details add-on | $2.49 | one | 98.95% | 317 |
| devcake/aliexpress-products-scraper | $2.00 (details optional, same event) | $2.00 | not checked | 99.70% | 272 |
| khadinakbar/aliexpress-all-in-one-scraper | $4.00 | $2.00 | not checked | 83.83% | 220 |
| thirdwatch/aliexpress-product-scraper | none | $3.00 | not checked | 96.72% | 220 |
| pro100chok/aliexpress-scraper | $6.00 | $2.00 | not checked | 99.30% | 150 |
| This Actor | **$1.50** | **$0.50** | several, one row each | new | new |

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

Pay per event, no subscription, platform usage and proxies included:

| Event | Price |
|---|---|
| Product row with details (one per product and ship-to country) | **$1.50 per 1,000** ($0.0015 each; $1.35 and $1.20 on higher Apify plans) |
| Search row without details | **$0.50 per 1,000** ($0.0005 each; $0.45 and $0.40 on higher Apify plans) |
| Products not sold to a country, not found, failed, duplicates | free |
| Run start | $0.00005 |

Examples:

- **1,000 products with details, shipped to the US**: $1.50.
- **The same 1,000 products for the US, the UK and Germany**: at most $4.50, less in practice, since a product AliExpress does not sell to a country gives a free row.
- **A keyword's full listing without details** (2,978 cards for "phone case" in our run): about $1.50.
- **Apify's free plan** includes $5 of monthly usage ([apify.com/pricing](https://apify.com/pricing)), enough for about **3,300 detailed products** a month.

Set a maximum cost per run in the run options and the Actor stops cleanly when it is reached: it reads no product it could not charge.

### Use the Actor through the Apify API

Run it and get the rows in one HTTP call (replace `YOUR_APIFY_TOKEN`, from **Settings > API & Integrations** in Apify Console):

```bash
curl -X POST "https://api.apify.com/v2/acts/agenttoolworks~aliexpress-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"productUrls": ["1005006678208098"], "shipTo": ["US", "GB"]}'
```

Node.js, with the official [`apify-client`](https://docs.apify.com/api/client/js/):

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('agenttoolworks/aliexpress-scraper').call({
    keywords: ['wireless earbuds'],
    maxItems: 50,
    shipTo: ['US', 'DE'],
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.filter((r) => r.status === 'ok').map((r) => [r.shipTo, r.title, r.price, r.shippingFee]));
```

Python, with the official [`apify-client`](https://docs.apify.com/api/client/python/):

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("agenttoolworks/aliexpress-scraper").call(
    run_input={"categoryUrls": ["https://www.aliexpress.com/category/63705/earphones-headphones.html"], "maxItems": 100, "includeDetails": False}
)
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(row["title"], row["price"], row["orders"])
```

The **API** tab on this page has ready-made snippets for every language and endpoint.

### FAQ

#### Do I need an AliExpress account or an API key?

No. The Actor reads AliExpress logged out, the way a visitor's browser does: search pages as they load, product details through the request the product page itself makes. It never logs in and never solves a captcha.

#### Can I get the price and shipping for several countries at once?

Yes: list them in **Ship to**. Each country gives its own row, with its own price, availability and delivery options.

#### Why is a product "unavailable_in_region"?

AliExpress answered that it does not sell that product to that country (often a product stocked in a local warehouse). The row is free.

#### How do I get only price changes every week?

Turn on **Only new or changed products**, give the schedule a **Monitor name**, and schedule the Actor (or a saved task) in Apify Console.

#### Can I get reviews?

Not in this version: review texts carry buyers' personal data. The rating and the reviews count are in every product row.

#### Can I use it with Make, Zapier, n8n or Google Sheets?

Yes, through Apify's integrations: the dataset works with every Apify integration, and a webhook can fire when a run finishes.

#### Can AI agents use it through MCP?

Yes. Apify's hosted MCP server exposes Store Actors to MCP clients such as Claude or Cursor: `https://mcp.apify.com?tools=agenttoolworks/aliexpress-scraper`.

#### Is it legal to scrape AliExpress?

The Actor reads only what AliExpress shows any visitor without logging in: product listings that sellers publish to be found. It uses no account, solves no captcha and reads no buyer's personal data (no reviews). AliExpress's terms of use prohibit systematic automated collection without its written permission and the commercial exploitation of its content; how you use the data is your responsibility. This Actor is not affiliated with AliExpress or Alibaba Group.

#### Something is missing or broken?

Open an issue in the **Issues** tab: we read every one.

### Other Actors by AgentToolWorks

- [Shopify & WooCommerce Scraper and Price Tracker](https://apify.com/agenttoolworks/shopify-woocommerce-scraper): every product of any Shopify or WooCommerce store, with variants, barcodes and stock.
- [Google Maps Scraper](https://apify.com/agenttoolworks/google-maps-places-scraper): places with phone, website, rating, opening hours and emails.
- [Google Trends Scraper](https://apify.com/agenttoolworks/google-trends-scraper): interest over time, by region and related queries, plus each country's Trending now list.
- [Google Ads Transparency Scraper](https://apify.com/agenttoolworks/google-ads-transparency-scraper): every Google ad of a brand or website, with text, reach and targeting.
- [Facebook Ad Library Scraper: Meta, Google and Bing Ads](https://apify.com/agenttoolworks/ad-library-scraper): three ad libraries in one run.
- [LinkedIn Jobs Scraper and Indeed Scraper](https://apify.com/agenttoolworks/linkedin-indeed-jobs-scraper): public job listings of both boards in one row format.

### Learn more

- [What this AliExpress scraper returns, with a real row and the shipping cost per country](https://agenttoolworks.com/scrapers/aliexpress-scraper)
- [How to scrape AliExpress: server-rendered search pages, the product page's signed call, and Alibaba's gate per IP](https://agenttoolworks.com/blog/how-to-scrape-aliexpress)

Built by [AgentToolWorks](https://agenttoolworks.com). Not affiliated with AliExpress or Alibaba Group.

# Actor input Schema

## `keywords` (type: `array`):

Search terms, one per line, each read as AliExpress's own search page lists it (60 products per page, most relevant first). A product URL or ID typed here is read as a product, with a note.

## `categoryUrls` (type: `array`):

AliExpress category pages (https://www.aliexpress.com/category/63705/earphones-headphones.html) or search pages you have open (/w/wholesale-...), from any AliExpress country site. Their own sort and filters are kept; the market is the first ship-to country below.

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

Product pages (https://www.aliexpress.com/item/1005006678208098.html, aliexpress.us and country sites too) or bare product IDs, one per line. Each is read in detail for every ship-to country. Short share links (a.aliexpress.com/...) are not followed: open them and paste the /item/ address.

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

Stop after this many products for each keyword or category page. With details on, each one gives a row per ship-to country, charged as a detailed product; with details off, a search row. AliExpress lists at most 60 pages per search (about 3,000 products): for more, split into categories or narrower keywords. Product URLs are always read.

## `includeDetails` (type: `boolean`):

On (the default): every product found by a keyword or category is read in detail, as a product URL is: all SKUs with price and stock, shipping options, store, rating, reviews count, orders, images and specifications, charged as a detailed product. Off: the search cards only (price, rating, units sold, ship-from), faster and charged as search results.

## `shipTo` (type: `array`):

Countries to read each product for: two-letter codes (US, GB, DE) or English names (Germany), any case. Each country gives its own row with its own price, availability and shipping options. A product AliExpress does not sell to a country gives a free row saying so. With details off, search results are read for the first country only.

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

Three-letter code, sent to AliExpress as its own currency menu does. Measured in USD, EUR and GBP: rows and shipping fees came back in the currency asked. Each row says the currency AliExpress answered in, and the run summary notes any difference.

## `onlyChanges` (type: `boolean`):

For scheduled runs: return and charge only the products this monitor has not seen before, or whose price or stock status (in stock, sold out) changed on a SKU since, per ship-to country. Each row lists its changes. The products seen are kept in a key-value store of your account named aliexpress-monitor-<monitor name>, up to 20,000 products per country and 1,100,000 SKU prices in all (past that, the ones seen longest ago and not read again are forgotten). The first run returns everything it reads.

## `monitorName` (type: `string`):

Names the memory of Only new or changed products, so separate schedules keep separate memories (letters, digits and hyphens). Empty means 'default'.

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

Products read at the same time, each from its own IP. 1,000 products took 9 minutes on 8 and 20 minutes on 4, with fewer refusals on 8 (2026-10-27). 9 and 10 are allowed and not measured.

## Actor input object example

```json
{
  "keywords": [
    "wireless earbuds",
    "phone case"
  ],
  "categoryUrls": [
    "https://www.aliexpress.com/category/63705/earphones-headphones.html"
  ],
  "productUrls": [
    "https://www.aliexpress.com/item/1005006678208098.html",
    "1005008070148600"
  ],
  "maxItems": 10,
  "includeDetails": true,
  "shipTo": [
    "US",
    "GB",
    "DE"
  ],
  "currency": "USD",
  "onlyChanges": false,
  "monitorName": "earbuds-weekly",
  "concurrency": 8
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `details` (type: `string`):

No description

## `shipping` (type: `string`):

No description

## `variants` (type: `string`):

No description

## `all` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "keywords": [
        "wireless earbuds"
    ],
    "maxItems": 10,
    "shipTo": [
        "US"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("agenttoolworks/aliexpress-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 = {
    "keywords": ["wireless earbuds"],
    "maxItems": 10,
    "shipTo": ["US"],
}

# Run the Actor and wait for it to finish
run = client.actor("agenttoolworks/aliexpress-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 '{
  "keywords": [
    "wireless earbuds"
  ],
  "maxItems": 10,
  "shipTo": [
    "US"
  ]
}' |
apify call agenttoolworks/aliexpress-scraper --silent --output-dataset

```

## MCP server setup

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