---
title: "AliExpress scraper"
description: "Scrape AliExpress products, sale and original prices, discounts, ratings, units sold and shipping tags as JSON. One API request from Python, Node.js, the CLI or MCP."
canonical: https://www.zenrows.com/scrape/aliexpress
updated: 2026-10-20
---

# AliExpress scraper

The Zenrows AliExpress scraper turns an AliExpress search URL into structured JSON: item ID, title, sale price, original price, discount, star rating, units sold, service tags such as free shipping, ad flag and related searches. You send the URL, Fetch in Adaptive Stealth Mode opens the page, and Extract returns the fields. Run it from an API call, the CLI or an AI agent.

- Site: aliexpress.com
- Returns: Products, prices, discounts, ratings and units sold

## Run it: one AliExpress search in, JSON out

```json Input
{
  "url": "https://pt.aliexpress.com/w/wholesale-fone-bluetooth.html",
  "mode": "auto",
  "extract": "auto"
}
```

```json Output
{
  "products": [
    {
      "currency": "$",
      "discount_percent": 70,
      "is_ad": null,
      "item_id": "3256811467917760",
      "original_price": 30.38,
      "product_url": "//www.aliexpress.us/item/3256811467917760.html?algo_pvid=…",
      "sale_price": 8.94,
      "service_tags": ["New shoppers save $21.44", "Free shipping"],
      "star_rating": 4.9,
      "thumbnail_url": "//ae-pic-a1.aliexpress-media.com/kf/Sebab286d68ac4d6183c1a1a8cce21316s.jpg_480x480q75.jpg_.avif",
      "title": "SK Small Headphones Wireless Bluetooth Headset Sport Sleeping Invisible Comfortable To Wear Bass Earbuds Earphone For All Phones",
      "units_sold": "5,000+ sold"
    }
  ],
  "search_context": {
    "canonical_url": "https://www.aliexpress.us/w/wholesale-fone-bluetooth.html",
    "page_title": "Fone bluetooth-AliExpress",
    "query": "fone bluetooth"
  }
}
```

Request and output of a live call to an AliExpress search page on Oct 20, 2026, trimmed for length. The full response held 12 products, related searches and ranking keywords. A field is returned when the card shows it.

## What data can you scrape from AliExpress?

An AliExpress search returns one record per product card, in the order AliExpress ranks them, plus the search context and the keyword suggestions around the results. These are the fields that come back, with the path where each lives in the JSON.

| Field | What it holds | Example |
|---|---|---|
| `products[].item_id` | AliExpress's product ID, the number in every `/item/` URL | `3256811467917760` |
| `products[].title` | Product title as the seller wrote it | `SK Small Headphones Wireless Bluetooth Headset…` |
| `products[].sale_price` | The price a shopper pays today | `8.94` |
| `products[].original_price` | The price before the discount | `30.38` |
| `products[].discount_percent` | Size of the discount | `70` |
| `products[].currency` | Currency symbol shown on the card | `$` |
| `products[].star_rating` | Product rating out of 5 | `4.9` |
| `products[].units_sold` | Orders shown on the card | `5,000+ sold` |
| `products[].service_tags[]` | Shipping, delivery and promotion labels | `Free shipping` |
| `products[].is_ad` | Whether the card is a promoted placement | `true` |
| `products[].product_url` | The product page, ready to request | `//www.aliexpress.us/item/3256811467917760.html…` |
| `products[].thumbnail_url` | The main product photo | `//ae-pic-a1.aliexpress-media.com/kf/…avif` |
| `search_context.query` | The query AliExpress searched for | `fone bluetooth` |
| `search_context.canonical_url` | The regional AliExpress page that served the results | `https://www.aliexpress.us/w/wholesale-fone-bluetooth.html` |
| `ranking_keywords[]` | Related keyword pages with their URLs | `{ "label": "fone bluetooth motorola", … }` |
| `related_searches[]` | Suggested searches linked from the page | `{ "label": "bluetooth earrings", … }` |

## How to scrape AliExpress with Zenrows

1. **Create a free Zenrows account** and copy your API key from the dashboard.
2. **Build the search URL.** AliExpress keyword pages follow `/w/wholesale-<keyword-with-hyphens>.html`, so "fone bluetooth" becomes `/w/wholesale-fone-bluetooth.html`. Sorting and filters you set on the site are added to the URL as parameters.
3. **Send it with the default configuration**: Adaptive Stealth Mode to open the page and Extract to return the fields. Add the country when you need prices, currency and delivery dates for a specific market.
4. **Read `parsed.products`** from the response. To keep only prices and sales, list those paths and the response returns just them.
5. **Run every keyword in Batch** once one search returns what you need, with the keyword as your `external_id`.

```python Python
# pip install requests
import json
import requests

params = {
    "apikey": "YOUR_ZENROWS_API_KEY",
    "url": "https://pt.aliexpress.com/w/wholesale-fone-bluetooth.html",
    "mode": "auto",      # Adaptive Stealth Mode
    "extract": "auto",   # structured JSON
}
response = requests.get("https://api.zenrows.com/v1/", params=params, timeout=180)
response.raise_for_status()

data = response.json()["parsed"]
for p in data["products"]:
    print(p["item_id"], p["sale_price"], p["discount_percent"], p["units_sold"])
print(json.dumps(data["search_context"], indent=2))
```

```javascript Node.js
// Node 18+ (built-in fetch)
const params = new URLSearchParams({
  apikey: "YOUR_ZENROWS_API_KEY",
  url: "https://pt.aliexpress.com/w/wholesale-fone-bluetooth.html",
  mode: "auto",
  extract: "auto",
});

const response = await fetch(`https://api.zenrows.com/v1/?${params}`, {
  signal: AbortSignal.timeout(180_000),
});
if (!response.ok) throw new Error(`${response.status}: ${await response.text()}`);

const { parsed } = await response.json();
const organic = parsed.products.filter((p) => !p.is_ad);
console.log(organic.map((p) => [p.item_id, p.sale_price, p.units_sold]));
```

```bash cURL
curl "https://api.zenrows.com/v1/?apikey=YOUR_ZENROWS_API_KEY&url=https%3A%2F%2Fpt.aliexpress.com%2Fw%2Fwholesale-fone-bluetooth.html&mode=auto&extract=auto"

# Only the fields you need
curl "https://api.zenrows.com/v1/?apikey=YOUR_ZENROWS_API_KEY&url=https%3A%2F%2Fpt.aliexpress.com%2Fw%2Fwholesale-fone-bluetooth.html&mode=auto&extract=auto&extract_fields=products.item_id%2Cproducts.sale_price%2Cproducts.units_sold%2Cproducts.star_rating"
```

```python Python SDK
# pip install zenrows
from zenrows import ZenRowsClient

client = ZenRowsClient("YOUR_ZENROWS_API_KEY")
response = client.get(
    "https://pt.aliexpress.com/w/wholesale-fone-bluetooth-motorola.html",
    params={"mode": "auto", "extract": "auto"},
)
for p in response.json()["parsed"]["products"]:
    print(p["title"][:60], p.get("sale_price"), p.get("service_tags"))
```

## Input

The scraper takes one AliExpress URL per request, plus the options below. A Batch job applies the same options to every task, so a sourcing sweep over 1,000 keywords is a list of search URLs with these settings.

| Parameter | Type | Default | Description |
|---|---|---|---|
| `url` | string | required | An AliExpress search page (`/w/wholesale-<keyword>.html`), on the main site or a language site such as pt.aliexpress.com |
| `mode` | string | `auto` | Adaptive Stealth Mode: starts with the lightest setup and adds rendering and protected-site handling only when the page needs them |
| `extract` | string | `auto` | Returns the page's fields as JSON in `parsed`, next to the raw `html` |
| `extract_fields` | string | all fields | Comma-separated paths to keep, such as `products.item_id,products.sale_price,products.units_sold` |
| `proxy_country` | string | any | Two-letter country code. AliExpress sends visitors to their regional site and sets currency, coupons and delivery dates by location |
| `wait_for` | string | none | A CSS selector to wait for before the page is read |
| `session_id` | integer | none | Keep the same session across several requests, up to 10 minutes |

```json Batch input
{
  "type": "regular",
  "status": "closed",
  "zenrows_params": {
    "mode": "auto",
    "extract": "auto"
  },
  "tasks": [
    { "url": "https://pt.aliexpress.com/w/wholesale-fone-bluetooth.html", "external_id": "kw-fone-bluetooth" },
    { "url": "https://pt.aliexpress.com/w/wholesale-fone-bluetooth-motorola.html", "external_id": "kw-fone-bluetooth-motorola" },
    { "url": "https://pt.aliexpress.com/w/wholesale-telephones-with-bluetooth.html", "external_id": "kw-telephones-bluetooth" }
  ]
}
```

## Output

Every response is JSON with two keys: `html`, the page as AliExpress served it, and `parsed`, the structured record. A search page returns `products[]`, `search_context`, `related_searches[]` and `ranking_keywords[]`. The sample below shows two more cards from the same live search, an organic product and a promoted one, with the keyword lists. Prices come as numbers and labels such as units sold stay as AliExpress prints them.

```json Search results
{
  "products": [
    {
      "currency": "$",
      "discount_percent": 86,
      "is_ad": null,
      "item_id": "3256809799847416",
      "original_price": 33.64,
      "product_url": "//www.aliexpress.us/item/3256809799847416.html?algo_pvid=…",
      "sale_price": 4.68,
      "service_tags": ["New shoppers save $28.96", "Free shipping"],
      "star_rating": 4.9,
      "thumbnail_url": "//ae-pic-a1.aliexpress-media.com/kf/Sc7e00ad6ceea40ae95b32b724322bea98.jpg_480x480q75.jpg_.avif",
      "title": "SK26 Bluetooth 5.4 Wireless Earphones Small Earbuds Sleeping Sport Invisible Headphones Bass Sound Quality Headset Sliding Cover",
      "units_sold": "500+ sold"
    },
    {
      "currency": "$",
      "discount_percent": 63,
      "is_ad": true,
      "item_id": null,
      "original_price": 35.98,
      "product_url": "https://www.aliexpress.com/ssr/300000512/BundleDeals2?productIds=1005007352046243:12000040",
      "sale_price": 13.19,
      "service_tags": ["Top selling on AliExpress", "Delivery: Oct 25 - 30"],
      "star_rating": 4.7,
      "thumbnail_url": "//ae-pic-a1.aliexpress-media.com/kf/S7c87e72bc63d4a09b63021491091fd7c6.jpg_480x480q75.jpg_.avif",
      "title": "Bluetooth Earphones Wireless Original Lenovo XT80 Sports Wireless Earphones with Mics, LED Power Display,Hifi Stereo Sound Bluetooth 5.3 TWS HeadphHeadphones",
      "units_sold": "10,000+ sold"
    }
  ],
  "ranking_keywords": [
    { "label": "telephones with bluetooth", "url": "https://www.aliexpress.us/w/wholesale-telephones-with-bluetooth.html" },
    { "label": "fone bluetooth motorola", "url": "https://www.aliexpress.us/w/wholesale-fone-bluetooth-motorola.html" }
  ],
  "related_searches": [
    { "label": "bluetooth earrings", "url": "https://www.aliexpress.us/item/1005005262682985.html" }
  ],
  "search_context": {
    "canonical_url": "https://www.aliexpress.us/w/wholesale-fone-bluetooth.html",
    "page_title": "Fone bluetooth-AliExpress",
    "query": "fone bluetooth"
  }
}
```

Need a spreadsheet? Load `products` into pandas with `pd.json_normalize(...)` and write CSV or Excel. Need the page for an LLM? Ask for Markdown instead of JSON.

## Scrape AliExpress from your coding agent

Claude Code, Cursor, Codex and any MCP client can scrape AliExpress from a prompt.

The agent calls the same Fetch and Extract request shown above and reads the same `products` array. Connect the Zenrows MCP server once, or install the CLI and let the agent run it in the terminal. No key is needed to try either: the first call creates a free account.

```bash Connect the MCP server (Claude Code)
claude mcp add zenrows -e ZENROWS_API_KEY=YOUR_ZENROWS_API_KEY -- npx -y @zenrows/mcp
```

```json MCP config (Cursor, Claude Desktop, Windsurf)
{
  "mcpServers": {
    "zenrows": {
      "command": "npx",
      "args": ["-y", "@zenrows/mcp"],
      "env": { "ZENROWS_API_KEY": "YOUR_ZENROWS_API_KEY" }
    }
  }
}
```

```bash Or run the CLI
npx -y @zenrows/cli init
zenrows extract "https://pt.aliexpress.com/w/wholesale-fone-bluetooth.html"
```

```text Then ask your agent
Use Zenrows to search AliExpress for "fone bluetooth" and "sleep earbuds".
Leave out promoted cards, then list the 10 products with the most units sold,
with sale price, original price, rating and whether shipping is free.
```

## Scrape AliExpress at scale with Batch and Crawl

**Batch** runs a list of AliExpress URLs as one job, in parallel, with your own ID on each result. Use it for product sourcing: one task per keyword, run daily or weekly, so you see which items gain sales and how their discounts change.

**Crawl** finds keyword pages for you. Start it on a search page of the regional site that serves you (the `canonical_url` of your first response), keep only links that contain `/w/wholesale-`, and it follows AliExpress's own related-keyword links to the next search pages. Send what it finds to Batch to keep tracking them.

```bash Batch (cURL)
curl -X POST "https://async.api.zenrows.com/v1/jobs" \
  -H "X-API-Key: YOUR_ZENROWS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "regular",
    "status": "closed",
    "zenrows_params": { "mode": "auto", "extract": "auto" },
    "tasks": [
      { "url": "https://pt.aliexpress.com/w/wholesale-fone-bluetooth.html", "external_id": "kw-fone-bluetooth" },
      { "url": "https://pt.aliexpress.com/w/wholesale-fone-bluetooth-motorola.html", "external_id": "kw-fone-bluetooth-motorola" }
    ]
  }'

# Read the results when the job finishes
curl "https://async.api.zenrows.com/v1/jobs/JOB_ID/results?status=successful" \
  -H "X-API-Key: YOUR_ZENROWS_API_KEY"
```

```bash Batch (CLI)
# aliexpress.jsonl: one {"url": "...", "external_id": "...", "extract": "auto"} per line
zenrows batch create aliexpress.jsonl --wait
zenrows batch results <job-id> --out aliexpress-products.jsonl
```

```bash Crawl (cURL)
curl -X POST "https://api.zenrows.com/v1/crawls" \
  -H "X-API-Key: YOUR_ZENROWS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://www.aliexpress.us/w/wholesale-fone-bluetooth.html",
    "depth": 1,
    "max_pages": 50,
    "include_patterns": ["/w/wholesale-"]
  }'
```

**Scheduled jobs** run the same Batch job on a timetable, on Zenrows' side: every few hours, once a day, at set times on chosen days, or once at a future date. Each run keeps its own results, a webhook can tell your app when a run finishes, and you can pause or resume the schedule at any time, with no cron server to keep alive.

```bash Scheduled job (cURL)
# Runs every day on Zenrows' side; each run keeps its own results
curl -X POST "https://async.api.zenrows.com/v1/jobs" \
  -H "X-API-Key: YOUR_ZENROWS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
      "type": "scheduled",
      "status": "closed",
      "schedule": {
        "rate": {
          "every": 1,
          "unit": "day"
        }
      },
      "zenrows_params": {
        "mode": "auto",
        "extract": "auto"
      },
      "tasks": [
        {
          "url": "https://pt.aliexpress.com/w/wholesale-fone-bluetooth.html",
          "external_id": "aliexpress"
        }
      ]
    }'

# Or at set times: "schedule": { "calendar": { "times_of_day": ["09:00"],
#   "cadence": { "weekly": { "days": ["mon", "thu"] } } }, "timezone": "Europe/Madrid" }
```

## What teams do with AliExpress data

| Use case | Data they pull | Who runs it |
|---|---|---|
| Dropshipping product research | Units sold, rating, sale price and free-shipping tags per keyword | Dropshippers and Shopify store owners |
| Supplier price benchmarking | Sale and original price for the same product type across sellers | Sourcing and procurement teams |
| Discount and promotion tracking | Discount percent, coupon tags and delivery promises over time | Marketplace sellers and pricing analysts |
| Keyword and demand research | Ranking keywords, related searches and how many cards sell well | Ecommerce marketers and SEO teams |
| Brand protection | Titles that use a brand name, prices far below retail and promoted cards | Brand owners and legal teams |
| Product data for AI agents | The search record, or the page as Markdown | AI and data teams |

## Tips for scraping AliExpress

- **Build keyword URLs from the pattern.** `/w/wholesale-` plus the keyword with hyphens for spaces, then `.html`. The `ranking_keywords` in each response give you more ready-made URLs.
- **Expect a regional redirect.** AliExpress sends each visitor to a regional site, and `search_context.canonical_url` shows which one served the page. Keep the country fixed across a dataset so currency and prices compare.
- **Separate promoted cards.** `is_ad` marks paid placements, and some of them point to a bundle page instead of an item, with `item_id` empty. Filter them out before you rank products by sales.
- **Join on `item_id`.** The same product shows up under many keywords. Use the item ID as your key so one product's sales and prices line up across searches.
- **Prefix protocol-relative URLs.** `product_url` and `thumbnail_url` often start with `//`. Add `https:` before you store or request them.
- **Parse `units_sold` as a range.** "5,000+ sold" is a bucket, not an exact count. Store the lower bound as a number and keep the label.

## Frequently asked questions

### Is it legal to scrape AliExpress?

Collecting public AliExpress data, such as product titles, prices, discounts, ratings and order counts shown to every visitor, is common practice for product research and price monitoring. Reviews and store pages can include buyers' and sellers' names, and personal data is protected by laws such as the GDPR and the CCPA, so collect only what you have a legitimate reason to use. Check AliExpress's terms of use for your use case and ask your lawyer if you are unsure.

### Is there an official AliExpress API?

AliExpress runs an Open Platform for registered partners. The affiliate API returns product and promotion links for approved affiliates, and the dropshipping API serves approved dropshipping apps placing orders. Both need an app key and approval, and both return what AliExpress shares with partners. Teams scrape AliExpress search pages when they need rankings, units sold and the cards exactly as shoppers see them.

### What AliExpress pages can I scrape?

Search pages ( /w/wholesale-<keyword>.html ) return the fields shown on this page, on the main site and on the language sites such as pt.aliexpress.com. Send the URL as it appears in your browser, with the sort and filters you set.

### Can I scrape AliExpress prices for a specific country?

Yes. Set the country in the request and Zenrows opens the page from that location, so the regional site, currency, coupons and delivery dates match what a shopper there sees. To compare markets, send the same keyword once per country.

### How do I find winning products on AliExpress?

Run your keyword list as a Batch job each week, then sort the organic cards by units_sold and star_rating . Products that climb in units sold between runs, at a stable sale price, are the ones dropshippers watch.

### How do I scrape AliExpress with Python?

Send a GET request to https://api.zenrows.com/v1/ with your API key, the AliExpress URL, Adaptive Stealth Mode and Extract turned on, as in the Python example above. The response's parsed key holds the products as a Python dictionary. The zenrows package on PyPI wraps the same request.

### How many AliExpress products can I scrape?

Send one URL per request, or a whole list as a Batch job that runs the URLs in parallel and keeps your own ID on each result. One Batch job accepts more than 10,000 URLs, sent inline or as a CSV file.

### Can AI agents scrape AliExpress with Zenrows?

Yes. Connect the Zenrows MCP server to Claude, Cursor, Codex or any MCP client, or give your agent the Zenrows CLI. Ask for the searches you want in plain language and the agent calls Fetch and Extract for you.

### Can I scrape AliExpress on a schedule?

Yes. Create a scheduled Batch job with your AliExpress URLs and the same settings as a single request, and Zenrows runs it on its side: every few hours, once a day, at set times on chosen days, or once at a future date. Each run keeps its own results, a webhook can notify your app when a run finishes, and the schedule can be paused or resumed at any time.

### Which integrations work with the AliExpress scraper?

Zenrows works with n8n, Make, Zapier, Clay, Dify, LangChain, LlamaIndex, CrewAI and Mastra, plus the Python, Node.js and Go SDKs and any HTTP client. Send products to Google Sheets, a Shopify import file or a database from the workflow tool you already use. See the integrations page for the full list.

### What format does the data come in?

JSON by default, with the structured record in parsed and the original page in html . You can also ask for the page as Markdown or plain text, which is what most LLM and RAG pipelines want.

All scrapers: https://www.zenrows.com/scrape. Start free: https://app.zenrows.com/register. Docs: https://docs.zenrows.com
