# Alibaba Product Scraper (`apt_marble/alibaba-product-scraper`) Actor

Turn Alibaba product links into a clean table of wholesale terms: every quantity-break price in US dollars, minimum order quantity, lead times, variants, certificates and the manufacturer behind the listing. Compare suppliers side by side and build a sourcing shortlist in one sheet.

- **URL**: https://apify.com/apt\_marble/alibaba-product-scraper.md
- **Developed by:** [Hamza](https://apify.com/apt_marble) (community)
- **Categories:** E-commerce
- **Stats:** 5 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 product scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Alibaba Product Scraper

Paste Alibaba product links and get back the whole commercial picture of each
listing: every quantity break the supplier publishes, in US dollars, with the
minimum order quantity, order unit, lead times, variants, certificates,
customisation options, images and the full supplier record behind the listing.
Built for sourcing managers, importers, private-label brands and market analysts
who need wholesale terms in a spreadsheet instead of in forty browser tabs.

Prices come back in US dollars for every product, whichever country you choose,
so two suppliers on two continents can be compared in one column. The listing's
own local price is kept alongside it, and only ever with the currency it was
published in attached — an amount is never shown without its unit.

***

### What you can do with it

- **Compare quotes properly.** Put ten suppliers' quantity ladders side by side
  in one sheet and see where the price actually breaks — at 2 units, at 200, at
  1,000 — instead of reading each listing by hand.
- **Build a sourcing shortlist.** Every result carries the manufacturer behind
  it: company name, country, years selling, business type, inspected staff
  count, factory floorspace, on-time delivery record and half-year trading
  volume — as the exact figure, not the rounded band the page displays.
- **Track wholesale price movements.** Schedule the same list of products daily
  or weekly and keep a history of tier prices, minimum order quantities and lead
  times.
- **Check compliance before you order.** Certificates come back with their
  number, type, ownership and validity string, so a CE or ISO claim can be
  verified against the certificate itself.
- **Feed a product catalogue.** Titles, category trail, specification table,
  variant options, gallery images and the supplier's own write-up are ready to
  import.
- **Qualify manufacturers as leads.** Each result is effectively a B2B lead
  record: who makes the product, where, at what price, at what minimum quantity
  and how quickly they ship.

***

### What you get

One result per product. Abridged real example:

```json
{
  "productId": "1601739545402",
  "title": "JIANHA Single Arm C-Type Hydraulic Press Machine for Bearing Pressing and Straightening",
  "categoryPath": ["Industrial Machinery", "Machine Tool Equipment", "Hydraulic Presses"],
  "categoryLeaf": "Hydraulic Presses",
  "currency": "USD",
  "minPriceUsd": 7800,
  "maxPriceUsd": 8800,
  "priceHidden": false,
  "priceTiers": [
    { "minQuantity": 1, "maxQuantity": 1,    "quantityLabel": "1-1", "unitPriceUsd": 8800, "unitPriceLocal": 88627.44, "localCurrency": "MAD" },
    { "minQuantity": 2, "maxQuantity": null, "quantityLabel": "2+",  "unitPriceUsd": 7800, "unitPriceLocal": 78556.14, "localCurrency": "MAD" }
  ],
  "localCurrency": "MAD",
  "localPriceRange": "MAD 78,556.14-88,627.44",
  "minOrderQuantity": 1,
  "orderUnit": "piece",
  "orderIncrement": 1,
  "leadTimes": [{ "minQuantity": 1, "maxQuantity": 1, "processingDays": 30 }],
  "tradeTerm": "FOB",
  "dispatchCountry": "CN",
  "unitWeightRaw": "3.0",
  "unitSizeRaw": "72X40X207.7",
  "attributes": [
    { "name": "machine type", "value": "Single Column Hydraulic Press" },
    { "name": "voltage", "value": "380V" }
  ],
  "variantOptions": [
    { "name": "nominal force (kn)", "optionId": 225309385, "type": "TEXT",
      "values": [{ "valueId": 75370268, "name": "630", "available": true, "imageUrl": null }] }
  ],
  "certifications": [
    { "name": "CE", "number": "No.367-ET-12024", "type": "PRODUCT",
      "ownership": "Supplier-owned", "validPeriod": "01/11/2024 - 01/10/2029" }
  ],
  "customizationAvailable": true,
  "mainImage": "https://s.alicdn.com/kf/H62ac79c93d874fcdbe75c961c2810f54w.png",
  "video": { "videoId": "6000308672136" },
  "supplier": {
    "companyName": "Shandong Jianha Baofa Heavy Industry Machinery Co., Ltd.",
    "companyId": 273706047,
    "countryCode": "CN",
    "location": "Located in Zaozhuang, Shandong, CN",
    "yearsOnPlatform": 5,
    "businessType": "Manufacturer,Trading Company",
    "employeeBand": "11-50",
    "inspectedStaffCount": 39,
    "floorspace": "3000m²",
    "goldSupplier": true,
    "verificationText": "Verified by SGS Group",
    "responseTime": "≤2h",
    "onTimeDeliveryRate": "100.0%",
    "onlineRevenueHalfYearUsd": 47774,
    "onlineRevenueHalfYearBand": "40,000+",
    "onlineOrdersHalfYear": 5,
    "storeUrl": "https://jianha.en.alibaba.com"
  },
  "storeReviewCount": 2,
  "storeRating": null,
  "productReviewsPublished": false,
  "supplierCategoryRanking": "#6 most popular in Hydraulic Presses",
  "afterSaleService": { "name": "Free replacement parts" },
  "countryRequested": "US",
  "priceCountry": "MA",
  "dataNotes": [
    "Local prices on this row were published for MA, not US. The US dollar figures are unaffected."
  ],
  "scrapedAt": "2026-08-10T09:14:22.145Z"
}
```

***

### Input reference

| Field | Type | Default | What it does |
| --- | --- | --- | --- |
| `productUrls` | list of text | one example product | Alibaba product page addresses, or bare product numbers, one per line. Anything that is not a product is skipped and reported back to you. |
| `country` | select | `us` | Which country's version of the site to read. Prices also always come back in US dollars, so results stay comparable whichever country you pick. |
| `includeDescription` | boolean | `false` | Attach the supplier's own product write-up, with its illustrations, to every result. Charged as full product details on top of the base result. |
| `includeSimilarProducts` | boolean | `false` | Attach a short list of comparable products the site shows next to each item — useful for benchmarking a quote. |
| `maxSimilarProducts` | integer | `12` (max 100) | How many comparable products to attach to each result. |
| `maxProducts` | integer | `50` (max 300) | Safety cap on how many products one run reads. Anything past the cap is reported as not attempted rather than dropped in silence. |
| `gapBetweenProductsSeconds` | integer | `5` (min 5, max 120) | Minimum pause between one product and the next. Alibaba serves these detailed wholesale pages slowly, so this cannot be set lower than five seconds. Raise it for very large lists. |
| `productsAtOnce` | integer | `1` (max 2) | How many products may be in progress at the same time. One is recommended and is the default. |

***

### Output fields

| Field | Description |
| --- | --- |
| `productId`, `productUrl`, `title` | The product and its stable link. |
| `categoryPath`, `categoryLeaf`, `categoryId` | Full category trail and the leaf category. |
| `currency`, `minPriceUsd`, `maxPriceUsd` | Cheapest and dearest published unit price, in US dollars. |
| `priceTiers[]` | One entry per quantity break: `minQuantity`, `maxQuantity`, `quantityLabel`, `unitPriceUsd`, `unitPriceLocal`, `localCurrency`. An open-ended top tier has `maxQuantity: null`. |
| `priceHidden`, `priceHiddenReason` | True when the supplier publishes no price and invites buyers to ask for a quote, so a hidden price can never be mistaken for a failed read. |
| `localCurrency`, `localPriceRange` | The supplier's price in the currency the listing was published in, always stamped with that currency. Blank when the listing gives no currency, so an amount is never shown without its unit. |
| `minOrderQuantity`, `orderUnit`, `orderUnitPlural`, `orderIncrement` | Minimum order and the unit it is counted in. |
| `leadTimes[]` | Processing days per quantity band, exactly as the supplier publishes them. |
| `tradeTerm`, `dispatchCountry`, `dispatchPlaces[]` | Trade term and where goods ship from. |
| `unitWeightRaw`, `unitVolumeRaw`, `unitSizeRaw` | Shipping measurements as the supplier typed them. Blank when not published. |
| `packagingDetails` | Packaging data when the supplier publishes it, otherwise blank. |
| `variantOptions[]`, `variantCombinations[]` | Every option dimension, its values, and each buildable combination with published stock. |
| `attributes[]` | The specification table, name and value. |
| `certifications[]` | Certificate name, number, type, ownership, validity string and image. |
| `customizationAvailable`, `customizationOptions[]` | Customisation types, their minimum quantities and any surcharge. |
| `images[]`, `mainImage`, `video` | Gallery and video. |
| `supplier{}` | Company name, identifiers, country, location, years selling, business type, employee band, inspected staff count, floorspace, verification status, response time, on-time delivery record, store link, and half-year trading: `onlineRevenueHalfYearUsd` (the exact figure, in US dollars), `onlineRevenueHalfYearBand` (the rounded band the listing displays) and `onlineOrdersHalfYear`. |
| `storeReviewCount`, `storeRating`, `supplierRating`, `reviewedOrderCount` | The supplier store's rating and review counts — labelled as the store's, because they are the store's. |
| `productReviewsPublished` | Always `false`: this product's own reviews are not published for public reading. |
| `supplierCategoryRanking` | The **supplier's** popularity rank within the category, when the site shows one. It ranks companies, not individual products, and is named accordingly. |
| `afterSaleService` | After-sale promise, name and details. |
| `orderableOnline`, `tradeAssurance` | Whether the item can be ordered on the spot and whether it is covered by the site's assurance programme. |
| `searchKeywords[]` | Keywords the listing itself is targeting. |
| `description` | The supplier's own write-up, as text plus its illustrations. Only when you turn it on. |
| `similarProducts[]` | Comparable products with title, price band, minimum order and link. Only when you turn it on. |
| `countryRequested`, `priceCountry` | The country you chose, and the country the listing was actually served for. When the two differ, `dataNotes` says so on that row. |
| `dataNotes[]` | Plain-English notes about anything unusual in this result. |
| `scrapedAt` | Collection timestamp. |

A run summary is written to the run's `OUTPUT` record: how many products were
scraped, how many were unavailable, how many failed, how many were never
attempted, and whether the run stopped early.

***

### Pricing

Pay per event.

| You are charged | When | Price |
| --- | --- | --- |
| Product scraped | For each product result added to the dataset | $0.0015 each ($1.50 per 1,000) |
| Full product details | Only when you turn on the supplier's full write-up, and only when the supplier actually publishes one | $0.0008 each ($0.80 per 1,000) |

Worked example: 200 products with the supplier write-up switched on costs
200 × $0.0015 + 200 × $0.0008 = **$0.46**. The same 200 products without the
write-up costs **$0.30**. Products that turn out to be removed, and products the
run never got to, are never charged.

***

### Limits & what this actor cannot do

- **This actor is deliberately slow.** Alibaba serves these detailed wholesale
  pages grudgingly and stops answering when they are asked for too quickly, so
  products are read one at a time with a minimum five-second pause between them.
  A list of 100 products takes at least ten minutes, and a very large list is
  better split across scheduled runs.
- **If the site stops answering, the run stops with it.** Everything collected up
  to that point is saved, and the products that were never tried are reported as
  not attempted — never as failures. Re-run them later, or raise the pause.
- **Reviews of the product itself are not published for public reading.** What
  the site publishes is the supplier store's rating and its review counts, and
  that is what you get, labelled as the store's. No product review text is
  available, and `productReviewsPublished` says so on every result.
- **There is no buyer question-and-answer section** on this kind of page, so none
  is returned.
- **Some fields simply do not exist as data**, however prominently the page seems
  to show them: supply ability, payment terms, port of loading and — for most
  suppliers — packaging details are platform boilerplate rather than this
  supplier's own terms. They come back blank instead of being invented from the
  wording on the page.
- **Not every supplier publishes every credential.** Floorspace, inspected staff
  count, certificates, customisation options and after-sale terms appear only
  for the suppliers who publish them; for everyone else they come back blank
  rather than guessed at.
- **Prices are the supplier's published asking price.** The price actually agreed
  in a negotiated order is not published anywhere and is not returned.
- **Some suppliers publish no price at all** and ask buyers to enquire. Those
  come back flagged, not as a zero price.
- **Lead times are published as their own quantity bands** and those bands do not
  line up with the price bands. They are returned as their own table and are
  never merged into the price table.
- **Stock is only reported when the supplier publishes a real number.** Most
  suppliers run open-ended inventory, which comes back blank rather than as a
  fabricated nine-million-unit stock level.
- **Prices, availability, rankings and supplier statistics are a snapshot** taken
  at the moment of collection and keep moving afterwards.
- **Products that were removed or are restricted** are reported as unavailable
  rather than returned as an empty result.
- **Prices and availability differ by country**; the US dollar figure is
  provided so results stay comparable whichever country you select. The
  supplier's local price is the one the source site published for the country it
  served, and that is not always the country you picked — when it differs, the
  row says so in plain English and the US dollar figures are unaffected.
- **Turning on the supplier's write-up also changes the local price column.**
  That version of the listing is published in US dollars, so on those results the
  local price and the US dollar price are the same figure. The dollar column is
  the same either way.
- **The category ranking belongs to the supplier, not to the product.** The
  source site publishes a "most popular in this category" position for the
  company behind the listing; it is returned under a name that says so, and
  there is no per-product popularity rank to return.
- **Speed depends on the size of the job and on the source site's own
  responsiveness.** No fixed number of products per minute is promised.
- **The source site's terms govern automated access.** You are responsible for
  using the data lawfully and in line with those terms, and for handling any
  personal data in line with applicable privacy law.

***

### FAQ

**Do I need an account on the source site?**
No. Nothing is logged into and nothing is signed up for.

**Does it need my login or password?**
No. There is nothing to connect and nothing to authorise — paste product links
and run it.

**Can I schedule it?**
Yes. Point it at a fixed list of products and schedule it daily or weekly on
[apify.com](https://apify.com) to build a price history. Because each product is
read slowly, plan roughly a minute per twelve products when you set the schedule.

**Are the prices in my own currency?**
Every result carries the price in US dollars, and additionally in the currency
the listing itself was published in, stamped with that currency code. The dollar
column is the one to compare on — it is the same figure whichever country you
choose, so comparing suppliers is always apples to apples.

**Why is a price sometimes missing?**
Because the supplier chose not to publish one and wants buyers to enquire first.
Those results are flagged so you can tell them apart from anything that went
wrong.

**Is the data complete?**
It is everything the product page publishes, and nothing beyond it. Product-level
reviews, buyer questions, negotiated prices, supply ability and payment terms are
not published on these pages, so they are not returned. Everything the supplier
does publish — tier prices, minimum order, lead times, specifications,
certificates, variants and company record — is.

# Actor input Schema

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

Product page addresses copied from Alibaba, or bare product numbers. One per line. Anything else in the list is skipped and reported.

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

Which country's version of the site to read. Wholesale prices are always returned in US dollars as well, so results stay comparable whichever country you pick.

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

Attach the supplier's own product write-up, with its images, to every result. Charged as a full product detail on top of the base result.

## `includeSimilarProducts` (type: `boolean`):

Attach a short list of comparable products the site shows next to each item, useful for benchmarking a quote.

## `maxSimilarProducts` (type: `integer`):

How many related products to attach to each result when the option above is on.

## `maxProducts` (type: `integer`):

Safety cap on how many products one run reads. Anything beyond the cap is reported as not attempted rather than silently dropped.

## `gapBetweenProductsSeconds` (type: `integer`):

Minimum pause between reading one product and the next. Alibaba serves detailed wholesale pages slowly and stops answering when they are asked for too quickly, so the pause cannot be set below five seconds. Raise it for very large jobs.

## `productsAtOnce` (type: `integer`):

How many products may be in progress at the same time. One is the recommended and default setting; two is the maximum this source supports before it starts refusing.

## Actor input object example

```json
{
  "productUrls": [
    "https://www.alibaba.com/product-detail/x_1601739545402.html",
    "https://www.alibaba.com/product-detail/x_1601558356756.html"
  ],
  "country": "us",
  "includeDescription": false,
  "includeSimilarProducts": false,
  "maxSimilarProducts": 12,
  "maxProducts": 50,
  "gapBetweenProductsSeconds": 5,
  "productsAtOnce": 1
}
```

# Actor output Schema

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

Every product read in this run, with tier pricing, minimum order quantity and supplier.

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

Counts of what was scraped, what was unavailable and what was not attempted.

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

The results in a browsable table.

# API

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

## JavaScript example

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

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

// Prepare Actor input
const input = {
    "productUrls": [
        "https://www.alibaba.com/product-detail/x_1601739545402.html",
        "https://www.alibaba.com/product-detail/x_1601558356756.html"
    ],
    "country": "us",
    "includeDescription": false,
    "includeSimilarProducts": false,
    "maxSimilarProducts": 12,
    "maxProducts": 50,
    "gapBetweenProductsSeconds": 5,
    "productsAtOnce": 1
};

// Run the Actor and wait for it to finish
const run = await client.actor("apt_marble/alibaba-product-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "productUrls": [
        "https://www.alibaba.com/product-detail/x_1601739545402.html",
        "https://www.alibaba.com/product-detail/x_1601558356756.html",
    ],
    "country": "us",
    "includeDescription": False,
    "includeSimilarProducts": False,
    "maxSimilarProducts": 12,
    "maxProducts": 50,
    "gapBetweenProductsSeconds": 5,
    "productsAtOnce": 1,
}

# Run the Actor and wait for it to finish
run = client.actor("apt_marble/alibaba-product-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "productUrls": [
    "https://www.alibaba.com/product-detail/x_1601739545402.html",
    "https://www.alibaba.com/product-detail/x_1601558356756.html"
  ],
  "country": "us",
  "includeDescription": false,
  "includeSimilarProducts": false,
  "maxSimilarProducts": 12,
  "maxProducts": 50,
  "gapBetweenProductsSeconds": 5,
  "productsAtOnce": 1
}' |
apify call apt_marble/alibaba-product-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,apt_marble/alibaba-product-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/jNrVGHi3E8HTbJoKA/builds/AfpBcECbAtCpZ7gAH/openapi.json
