# Alibaba Scraper — Products, Prices, MOQ & Suppliers (`tortuga/alibaba-scraper`) Actor

Scrape Alibaba.com search results and product pages: title, price range, minimum order quantity, supplier name, years on Alibaba, verified status, response rate, ratings, images and product URL. Any keyword or category URL.

- **URL**: https://apify.com/tortuga/alibaba-scraper.md
- **Developed by:** [Trevor Ortega](https://apify.com/tortuga) (community)
- **Categories:** E-commerce
- **Stats:** 32 total users, 17 monthly users, 99.1% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 product scrapeds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## Alibaba Product Scraper

Scrape Alibaba.com wholesale listings from any keyword search or category: product title, price range, minimum order quantity (MOQ), rating, review and sold counts, images, shipping badges and the supplier's name, country, years on Alibaba and verified status. Turn on **Include product details** to also get price tiers by quantity, all product attributes, variants, lead times, packaging, description, FAQ, video and the full supplier profile (business type, staff size, response time, on-time delivery rate, store rating).

Built for reliability: plain HTTP with browser TLS fingerprinting, no headless browser, no login. Alibaba embeds its search results and product data as JSON in every page, so the scraper reads structured data instead of fragile CSS selectors. You pay only for the products you get.

### What data does Alibaba Product Scraper extract?

Every product from a search or category page:

| Field | Description |
|---|---|
| `productId` | Alibaba product ID (the number at the end of the product URL) |
| `title` | Product title |
| `url` | Clean product URL (tracking parameters removed) |
| `priceMin`, `priceMax` | Lowest and highest unit price shown (equal when there is a single price) |
| `currency` | ISO currency code of the prices (USD by default) |
| `priceUnit` | Unit the price applies to: piece, set, box, unit, … |
| `priceText` | Price as displayed, e.g. `$7.80-10.30` |
| `promotionPriceMin`, `promotionPriceMax`, `discount`, `isOnPromotion` | Sale price and discount label when the product is on promotion |
| `moq`, `moqUnit`, `moqText` | Minimum order quantity as a number, its unit and the raw text (`Min. order: 500 pieces`) |
| `rating`, `reviewCount` | Product rating (0-5) and number of reviews |
| `soldCount`, `soldText` | Units sold as shown on the card (`26 sold`) |
| `reorderRate` | Supplier reorder rate in percent when shown |
| `imageUrl`, `images` | Full-size main image and gallery image URLs |
| `isReadyToShip` | Product has local stock or an x-day delivery/dispatch promise |
| `hasLocalStock` | Ships from a warehouse in the buyer's region |
| `isAlibabaGuaranteed` | Carries the Alibaba Guaranteed badge |
| `isCustomizable` | Supplier offers customization (logo, packaging, colours, …) |
| `isSponsored` | Paid placement in the results |
| `shippingInfo` | Delivery promise text (`7-day delivery`, `Delivery by Oct 03`) |
| `sellingPoints`, `badges`, `certifications` | Card labels (`Easy Return`, `180-day lowest prices`), badge codes and certification names (CE, RoHS, FCC, …) |
| `leaderboardRank` | Manufacturer leaderboard rank when shown |
| `supplier.name`, `supplier.id`, `supplier.url`, `supplier.logo` | Supplier company name, ID, profile page and logo |
| `supplier.yearsOnAlibaba` | Years as an Alibaba supplier |
| `supplier.country` | Supplier country code (CN, US, IN, …) |
| `supplier.isVerified`, `supplier.isGoldSupplier` | Verified Supplier tick and Gold Supplier membership |
| `supplier.rating`, `supplier.starLevel` | Supplier service score and star level |
| `searchTerm`, `sourceUrl`, `scrapedAt` | Which search term / start URL produced the item and the run timestamp |
| `changeType`, `previousValues` | Only with **Only new or changed items** on: `new` or `changed`, and for changed products the old values of the fields that changed |

With **Include product details** on, each item also gets:

| Field | Description |
|---|---|
| `priceTiers` | Price ladder by quantity: `[{minQty, maxQty, price, promotionPrice, priceText}]` (`maxQty` is `null` for the open-ended top tier) |
| `attributes` | All product specifications as a `{name: value}` dictionary (brand, model, material, power, origin, …) |
| `variants` | SKU options, e.g. `[{"name": "color", "values": ["Black", "Red"]}]` |
| `leadTime` | Production lead time by quantity: `[{minQty, maxQty, days}]` |
| `packaging` | `unitSizeCm`, `unitWeightKg`, `unitVolume` and any packaging properties |
| `description`, `faq` | Structured product description text and the supplier's FAQ entries |
| `videoUrl` | Product video (MP4) when the listing has one |
| `category`, `categoryPath` | Alibaba category breadcrumb |
| `certifications` | Product and inspection-report certificates (CE, RoHS, UN38.3, …) |
| `customizationOptions` | Customization types, options and their MOQ |
| `tradePriceType`, `hasTradeAssurance`, `shipFrom` | FOB/EXW etc., Trade Assurance flag, dispatch country |
| `samplePrice`, `freeSample` | Sample availability |
| `supplier.businessType`, `supplier.employees` | Manufacturer / trading company and staff-size band |
| `supplier.responseTime`, `supplier.onTimeDeliveryRate` | Average response time (`≤3h`) and on-time dispatch rate in percent |
| `supplier.rating`, `supplier.reviewCount` | Store rating and number of store reviews |
| `supplier.ordersLast6Months`, `supplier.revenueLast6MonthsText`, `supplier.tradeAssuranceLimit` | Transaction volume and Trade Assurance limit shown on the page |
| `supplier.isVerifiedManufacturer`, `supplier.intro` | Verified manufacturer flag and the "About this supplier" text |
| `isAvailable`, `detailError` | `true` when the product page was loaded. `false` + `"product not available"` when the product does not exist (any more), or is not offered in the proxy country you chose; `detailError` starting with `"blocked:"` when no attempt could load the page. Listing data is always kept, and failed product pages are never charged |

### How to use Alibaba Product Scraper

1. Enter one or more **Search terms** (e.g. `bluetooth speaker`, `stainless steel water bottle`), or paste **Start URLs**: search result pages, category pages (`https://www.alibaba.com/catalog/speakers_cid518`), showroom pages (`https://www.alibaba.com/products/bluetooth_speaker.html`) or single product pages.
2. Set **Max items** and **Max pages per search** to cap the run (and the cost). Pages hold 48 products each.
3. Optionally choose **Sort by** (relevance, sales volume, supplier response rate) and switch on **Include product details**.
4. Click **Start**. Results appear in the **Dataset** tab; export as JSON, CSV or Excel, or read them through the API.

### Input example

```json
{
  "searchTerms": ["bluetooth speaker", "portable power station"],
  "startUrls": [{ "url": "https://www.alibaba.com/catalog/speakers_cid518" }],
  "maxItems": 200,
  "maxPagesPerSearch": 5,
  "sortBy": "salesVolume",
  "includeDetails": true
}
```

### Output example

```json
{
  "productId": "1601809832875",
  "title": "USA Stock 2026 TG117 Portable Bluetooth Speaker Waterproof Wireless Mini Subwoofer Outdoor Party BT 5.3 USB TF Card Speaker",
  "url": "https://www.alibaba.com/product-detail/USA-Stock-2026-TG117-Portable-Bluetooth_1601809832875.html",
  "priceMin": 9.9,
  "priceMax": 10.0,
  "currency": "USD",
  "priceUnit": "piece",
  "promotionPriceMin": 6.5,
  "discount": "35% off",
  "moq": 1,
  "moqUnit": "piece",
  "rating": 4.6,
  "reviewCount": 177,
  "soldCount": 26,
  "isReadyToShip": true,
  "shippingInfo": "7-day delivery",
  "certifications": ["Declaration of Conformity", "EAA Exemption Statement"],
  "imageUrl": "https://s.alicdn.com/@sc04/kf/H508c3966959149e4b787e56726321767p.jpg",
  "priceTiers": [
    { "minQty": 1, "maxQty": 999, "price": 10.0, "promotionPrice": 6.5 },
    { "minQty": 1000, "maxQty": 9999, "price": 9.98, "promotionPrice": 6.49 },
    { "minQty": 10000, "maxQty": null, "price": 9.9, "promotionPrice": 6.43 }
  ],
  "leadTime": [{ "minQty": 1, "maxQty": 1424, "days": 2 }],
  "packaging": { "unitSizeCm": "8X8X17", "unitWeightKg": 0.44 },
  "attributes": { "BT Wireless": "Bluetooth v5.3", "Output Power": "5-10W", "brand name": "T&G", "place of origin": "Guangdong, China" },
  "category": "Portable Speakers",
  "supplier": {
    "name": "Shenzhen Siruixing Technology Co., Ltd.",
    "url": "https://szkeywords.en.alibaba.com/company_profile.html",
    "yearsOnAlibaba": 6,
    "country": "CN",
    "isVerified": true,
    "isGoldSupplier": true,
    "businessType": "Trading Company",
    "employees": "5-10",
    "responseTime": "≤3h",
    "onTimeDeliveryRate": 96.3,
    "rating": 4.6,
    "reviewCount": 3307
  }
}
```

### How much does it cost?

Pay per result: a small price per product from a search or category page, plus a small extra per product when **Include product details** is on (one extra page fetch each). No subscription; Apify's free plan is enough to try it. Scraping 1,000 products with full details costs a few dollars.

### Why are some Alibaba products "not available" on the product page?

Alibaba shows a "Product Not Available" page when a product is not offered in the country your IP address is in (many products are locked out of the US or the EU, for certification or shipping reasons), even though the same product appears in the search results. With the default proxy settings the scraper notices this and opens that product page again from another country (UK first, then Brazil, US, Germany) through Apify residential proxy, so you still get the price ladder, attributes and supplier profile. Price numbers (`priceMin`, `priceMax`, `priceTiers[].price`) are always in USD; `priceText` shows the price as displayed on the page that was loaded. This adds a little residential proxy traffic (about 80 KB per product that needs it, well under a cent), billed by Apify at its usual residential rate. If you set a proxy country yourself, the scraper respects it and reports such products with `isAvailable: false` instead.

### How do I scrape all products in an Alibaba category?

Use the category URL as a start URL, e.g. `https://www.alibaba.com/catalog/speakers_cid518` or `https://www.alibaba.com/trade/search?categoryId=518&SearchText=`. Raise **Max items** and **Max pages per search**; the scraper follows `page=2, 3, …` until the category runs out (Alibaba serves at most about 100 pages, i.e. roughly 4,800 products, per query). Combine a category with a keyword (`…/trade/search?categoryId=518&SearchText=karaoke`) to narrow it down.

### Can I get Alibaba price tiers and MOQ per product?

Yes. Every result carries the price range and MOQ shown on the search card. With **Include product details** the scraper opens the product page and returns the full quantity price ladder (`priceTiers`), lead time by quantity, packaging dimensions and weight, and the supplier's response time and on-time delivery rate, which is what you need for landed-cost comparisons.

### Why do some products have no price?

Alibaba renders the price of some cards (sponsored placements, promotions and a few others) client-side on category-style result pages, so a share of listing items can have `priceMin: null` while title, MOQ, supplier and rating are still filled. Switch on **Include product details** to fill the full price ladder from the product page.

### Monitor changes on a schedule

Turn on **Only new or changed items** and the Actor remembers what earlier runs of the same input returned: each run outputs only products that are new in the watched results or whose price range, promotion price, minimum order quantity (MOQ) or currency changed. Unchanged products are dropped on the search page, before any product page is opened, so they are not charged; product URLs are compared after their page is read and are not charged when unchanged. **Max items** becomes the window checked on every run, e.g. the first 48 results (one page) of a search. Save the input as a task and add a Schedule to it in Apify Console (Schedules → Create new, for example daily). Every output product carries `changeType` (`new` or `changed`); changed ones carry `previousValues`, e.g. `{"priceMin": 7.8}` for a product now listed from $7.20. A card that shows no price (it happens on Alibaba's fallback catalog pages) is treated as "price unknown", not as a change. Sold counts, reorder rates and ratings move all the time and do not count. Alibaba also rotates which products fill the first result pages from one request to the next, so the first runs of a new watch report a share of the window as `new` (each product only once, the first time it rotates in); this settles as the watch remembers more of the rotating products. Use **Monitoring key** to keep several schedules on the same input separate.

### Does it work without login or a browser?

Yes. All data comes from public pages Alibaba serves to anonymous visitors. No account, cookies or headless browser are needed, which keeps runs fast and cheap. Prices are shown in USD by default.

### Can I scrape Alibaba supplier contact details?

The Actor returns the supplier's business profile (company name, profile URL, country, business type, years on Alibaba, ratings, verified status). Alibaba's search and product pages do not display a contact person, phone number or e-mail address (contact goes through Alibaba's chat and inquiry form), so there are none in the output; use the supplier profile URL to contact them on Alibaba.

### Integrations and API

Use the run in Zapier, Make, n8n, Google Sheets, or call it from Python/Node with the Apify client. See the **API** tab for ready-made snippets. Schedule it to monitor prices, MOQs or new suppliers for your keywords.

### Is it legal to scrape Alibaba.com?

This Actor collects only data Alibaba shows publicly to signed-out visitors: product listings, prices, MOQs, ratings and supplier business information. It does not collect anything behind a login, click-to-reveal values, or values that exist only in hidden page data (such as the sales contact's name and portrait, which the product page carries for its chat widget but does not display). You are responsible for how you use the data and for complying with Alibaba's terms and applicable law.

### Support

Found a bug or need a field added? Open an issue in the **Issues** tab; it is usually answered within a day.

# Actor input Schema

## `searchTerms` (type: `array`):

Keywords to search on Alibaba.com, one per line (e.g. "bluetooth speaker", "yoga mat wholesale"). Each term is searched separately and paginated automatically (48 products per page).

## `startUrls` (type: `array`):

Alibaba URLs to scrape instead of (or in addition to) search terms: search result pages (https://www.alibaba.com/trade/search?SearchText=led+strip), category pages (https://www.alibaba.com/catalog/speakers_cid518 or .../trade/search?categoryId=518), showroom pages (https://www.alibaba.com/products/bluetooth_speaker.html) or single product pages (https://www.alibaba.com/product-detail/...\_1601809832875.html, returned with full details).

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

Stop after this many products in total (across all search terms and URLs). Keeps cost predictable.

## `maxPagesPerSearch` (type: `integer`):

How many result pages to open per search term or start URL (48 products each). Alibaba serves at most about 100 pages per query.

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

Also open every product page to get price tiers by quantity, all product attributes, variants, lead time, packaging, description, FAQ, video and the full supplier profile (business type, staff, response time, on-time delivery rate, store rating, verified status). Slower and charged extra per product (see pricing).

## `sortBy` (type: `string`):

Result order for search terms and search URLs. Alibaba offers relevance (default), sales volume (last 180 days) and supplier response rate.

## `onlyNewOrChanged` (type: `boolean`):

Remember what earlier runs of this search returned and output only new items or items whose price/status changed. Use with a Schedule; unchanged items are not charged. Compared: price range, promotion price, minimum order (MOQ) and currency; sold counts, reorder rate and ratings are ignored. With this on, Max items is the number of products checked each run (the watched window, e.g. the first 48 results), and product pages are opened only for new or changed products.

## `monitoringKey` (type: `string`):

Name for this watch, so several schedules on the same search stay separate; defaults to a key derived from the search input.

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

Apify Proxy is recommended. Alibaba shows a captcha page to suspicious traffic; if the run reports captcha pages, switch to residential proxies.

## Actor input object example

```json
{
  "searchTerms": [
    "bluetooth speaker"
  ],
  "startUrls": [],
  "maxItems": 100,
  "maxPagesPerSearch": 10,
  "includeDetails": false,
  "sortBy": "relevance",
  "onlyNewOrChanged": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (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 = {
    "searchTerms": [
        "bluetooth speaker"
    ],
    "startUrls": [],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("tortuga/alibaba-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 = {
    "searchTerms": ["bluetooth speaker"],
    "startUrls": [],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("tortuga/alibaba-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 '{
  "searchTerms": [
    "bluetooth speaker"
  ],
  "startUrls": [],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call tortuga/alibaba-scraper --silent --output-dataset

```

## MCP server setup

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