# Alibaba Search Scraper (`apt_marble/alibaba-search-scraper`) Actor

Search Alibaba and get every wholesale offer as a clean row: the full quantity-break price ladder, minimum order, live discounts, and each supplier's verification, rating, response rate and trade history. Filter by country, price, order size or certificate. No account, no login.

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

## Pricing

$1.20 / 1,000 offer 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 Search Scraper

Turn any Alibaba search into a clean, structured wholesale table. For every
offer you get the full quantity-break price ladder, the minimum order and the
supplier's own credentials — verification status, Trade Assurance cover,
buyer rating, response rate, order history, factory size and export markets —
so you can compare hundreds of suppliers side by side instead of opening
hundreds of tabs. No account and no login are needed: type your search terms,
press start, and the results arrive ready to use.

### What you can do with it

- **Source a product properly.** Pull every offer for "bluetooth speaker",
  sort by the price at *your* order quantity rather than the headline figure,
  and see which supplier is cheapest at 500 units and which at 50,000.
- **Build a supplier shortlist.** Filter to verified suppliers in one country,
  holding a specific certificate, rated 4.5 and up, and export a lead list with
  contact pages, ratings and trade history attached.
- **Track wholesale price movements.** Schedule the same searches weekly and
  watch minimum orders, quantity breaks and live discounts change over time.
- **Check a market before you enter it.** Compare how many suppliers exist per
  country, what the price band looks like, and how deep the discounts go.
- **Benchmark your own listing.** See where you sit against competing offers
  for the same search term, with promoted placements flagged separately.
- **Feed a sourcing sheet or CRM.** Every field is a plain column — export to
  Excel, Google Sheets, CSV or JSON in one click.

### What you get

One row per offer. Abridged real example:

```json
{
  "keyword": "bluetooth speaker",
  "searchPosition": 1,
  "organicPosition": 1,
  "isPromoted": false,
  "matchesKeyword": true,
  "productId": "62401958878",
  "title": "Fabric Wireless Outdoor Speaker Waterproof IPX6 BT Mini Bluetooths Speaker Portable",
  "url": "https://www.alibaba.com/product-detail/Fabric-Wireless-Outdoor-Speaker-Waterproof-IPX6_62401958878…",
  "categoryName": "Speakers",
  "currency": "USD",
  "priceMin": 2.29,
  "priceMax": 2.89,
  "minOrderQuantity": 2,
  "minOrderUnit": "pieces",
  "quantityTiers": [
    { "minQuantity": 2,     "maxQuantity": 499,   "unit": "pieces", "price": 2.02, "listPrice": 2.89, "promotionPrice": 2.02, "currency": "USD" },
    { "minQuantity": 500,   "maxQuantity": 4999,  "unit": "pieces", "price": 1.88, "listPrice": 2.69, "promotionPrice": 1.88, "currency": "USD" },
    { "minQuantity": 5000,  "maxQuantity": 49999, "unit": "pieces", "price": 1.74, "listPrice": 2.49, "promotionPrice": 1.74, "currency": "USD" },
    { "minQuantity": 50000, "maxQuantity": null,  "unit": "pieces", "price": 1.60, "listPrice": 2.29, "promotionPrice": 1.60, "currency": "USD" }
  ],
  "tierCount": 4,
  "onPromotion": true,
  "promotionDiscountPercent": 30,
  "promotionPriceMin": 1.6,
  "readyToShip": true,
  "leadTimeDays": 7,
  "soldCount": 6792,
  "productCertificates": ["DECLARATION OF CONFORMITY"],
  "supplierName": "Shenzhen Yuzhuo Technology Co., Ltd.",
  "supplierUrl": "https://szyz.en.alibaba.com/",
  "supplierCountry": "China",
  "supplierYears": 13,
  "verifiedSupplier": true,
  "tradeAssurance": true,
  "responseRate": "90.4%",
  "orderCount": 356,
  "orderValueBandUsd": "360,000+",
  "factoryAreaSqm": 180,
  "storeReviewScore": 4.4,
  "storeReviewCount": 111,
  "scrapedAt": "2026-08-09T09:14:22.185Z"
}
```

### Input reference

| Field | Type | Default | What it does |
| --- | --- | --- | --- |
| `keywords` | list of text | `["bluetooth speaker"]` | The searches to run, exactly as you would type them on the site. Up to 20 per run. |
| `maxResultsPerKeyword` | number | `100` | How many offers to collect for each search term (maximum 10,000). |
| `country` | select | Any country | Return only offers from suppliers based in that country. |
| `sort` | select | Best match | Best match, sales volume (last 180 days), supplier response rate, or supplier transaction level. |
| `minPrice` | number | — | Lowest acceptable unit price, in US dollars. |
| `maxPrice` | number | — | Highest acceptable unit price, in US dollars. |
| `maxMinOrderQuantity` | number | — | Only offers you can buy in this quantity or fewer. Set `1` for single-unit offers. |
| `minStoreRating` | select | Any rating | Supplier rating floor: 4.0 and up, 4.5 and up, or 5.0 only. |
| `tradeAssurance` | true/false | `false` | Only offers covered by the site's order-protection programme. |
| `verifiedSupplier` | true/false | `false` | Only suppliers inspected by a third-party inspection company. |
| `verifiedProSupplier` | true/false | `false` | Only the site's top tier of inspected suppliers. |
| `readyToShip` | true/false | `false` | Only stock the supplier holds for immediate dispatch. |
| `productCertificate` | select | Any | Only products carrying the chosen certificate (CE, RoHS, FCC, …). |
| `companyCertificate` | select | Any | Only suppliers holding the chosen company certificate (ISO, BSCI, …). |
| `categoryId` | text | — | Restrict the search to one of the site's own categories, by its number. |
| `excludePromoted` | true/false | `false` | Drop promoted placements instead of flagging them. |
| `onlyKeywordMatches` | true/false | `false` | Drop offers whose title does not contain every word you searched for. |
| `parallelSearches` | number | `5` | How many search terms to work through at the same time (1–8). |

### Output fields

| Field | Type | Description |
| --- | --- | --- |
| `keyword` | text | The search term this offer came from. |
| `searchPosition` | number | Position in the results as the site served them. |
| `organicPosition` | number | Position with promoted placements removed; empty for a promoted row. |
| `isPromoted` | true/false | Whether this is a paid placement inside the site's own results. |
| `matchesKeyword` | true/false | Whether the title contains every word of the search term. |
| `productId` | text | The offer's identifier on the site. |
| `title` | text | Product title, without the search highlighting the site adds. |
| `url` | text | Direct link to the offer. |
| `categoryId`, `categoryName` | text | The site's own category for this offer. |
| `imageUrl`, `images` | text / list | Main picture and the other pictures on the listing. |
| `hasVideo` | true/false | Whether the listing includes a product video. |
| `currency` | text | Always `USD` — wholesale prices on this listing are quoted in US dollars. |
| `priceMin`, `priceMax` | number | The published asking-price band for one unit. |
| `priceText` | text | The same band exactly as the site prints it. |
| `minOrderQuantity`, `minOrderUnit` | number / text | Smallest order the supplier accepts, and the unit it is counted in. |
| `quantityTiers` | list | Every quantity break the supplier publishes: `minQuantity`, `maxQuantity` (empty means "and above"), `unit`, `price`, `listPrice`, `promotionPrice`. |
| `tierCount` | number | How many quantity breaks the offer has. |
| `onPromotion` | true/false | Whether a discount is running right now. |
| `promotionDiscountPercent` | number | Size of that discount. |
| `promotionPriceMin`, `promotionPriceMax` | number | Discounted band across the tiers. |
| `promotionEndsAt` | text | When the discount is scheduled to end. |
| `readyToShip` | true/false | Stock held for immediate dispatch. |
| `leadTimeDays` | number | Production lead time the supplier publishes. |
| `fulfillment` | text | Extra service the supplier advertises, such as easy return. |
| `soldCount` | number | Units sold, when the site publishes that figure. |
| `viewCount` | number | Listing views, when the site publishes views instead of sales. |
| `attributes` | list | Product specification pairs, such as `Use` / `Home Theatre`. |
| `productCertificates` | list | Certificates the product carries. |
| `companyCertificates`, `inspectionProvider` | list / text | Company-level certificates and who inspected them. |
| `supplierId`, `supplierName` | text | The supplier behind the offer. |
| `supplierUrl`, `supplierProductsUrl` | text | The supplier's store and its product list. |
| `supplierCountry`, `supplierCountryCode` | text | Where the supplier is based. |
| `supplierYears` | number | Years the supplier has been a paying member of the site. |
| `verifiedSupplier`, `verifiedProSupplier`, `goldSupplier` | true/false | The supplier's verification badges. |
| `tradeAssurance` | true/false | Whether orders are covered by the site's protection programme. |
| `responseRate`, `responseTime` | text | How often and how quickly the supplier replies to buyers. |
| `orderCount` | number | Number of orders the supplier has completed on the site. |
| `orderValueBandUsd` | text | Rounded total value of those orders, in US dollars. |
| `supplierTradeValueUsd` | number | The same total, unrounded. |
| `employees`, `factoryAreaSqm` | number | Staff count and floor area, when published. |
| `exportMarkets` | list | Countries the supplier says it exports to. |
| `supplierMainProducts` | text | The product lines the supplier lists as its main business. |
| `supplierLogo` | text | The supplier's logo picture. |
| `storeReviewScore`, `storeReviewCount` | number | The supplier's buyer rating and how many buyers rated it. |
| `storeServiceScore`, `storeShippingScore` | number | Service and delivery sub-scores for the supplier. |
| `productReviewScore` | number | The product's own score, when it has one. Empty means it has not been rated. |
| `scrapedAt` | text | When the row was collected. |

### Pricing

You pay per offer returned — nothing else, and nothing for a search that comes
back with nothing.

| What you pay for | Price |
| --- | --- |
| Each offer row | $1.20 per 1,000 |

**Worked example.** Five search terms × 200 offers each = 1,000 rows = **$1.20**
for the run. A one-off deep dive into a single term, 10,000 offers, costs $12.00.

### Limits & what this actor cannot do

- The site publishes a limited number of public results for any one search, so
  a very broad term returns what the site makes available — up to 10,000 offers
  — rather than an unlimited catalogue. Narrow the search with a category, a
  price band or a supplier country to reach a different slice.
- Wholesale prices are the supplier's published asking price. The price you
  actually agree in a negotiated order is not published and is not returned.
- Some suppliers publish no ladder at all and invite buyers to ask for a quote.
  Those come back with an empty tier list and no invented figures.
- Prices are quoted in US dollars for every supplier country. There is no
  option to have this listing quoted in another currency, so nothing in the
  output is ever converted or estimated.
- Prices, stock, ratings and rankings are a snapshot at the moment of
  collection and keep changing afterwards. Two runs minutes apart can return a
  slightly different mix of offers, because the site itself reshuffles them.
- Ratings and review counts belong to the **supplier's store**, not to the
  individual product; the product's own score is a separate field and most
  offers do not have one.
- The site returns something for almost any search term, including a misspelled
  one. Turn on "only offers whose title contains the search term" if you would
  rather drop the loose matches.
- There is no ordering by price or by newest — the site does not publish those
  orderings, so they are not offered. Sort the exported table yourself.
- Promoted placements appear inside the site's own results. They are flagged so
  you can keep or exclude them, and organic position is reported separately.
- Speed depends on the size of the job and on the source site's own response
  times; no fixed throughput 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 Alibaba?**
No. Nothing is signed in to and nothing is bought.

**Does it need my login or password?**
No. There is no place to enter one, and none is ever used.

**Can I schedule it?**
Yes. Save your search terms as a task and run it on any schedule Apify
supports — hourly, daily or weekly — then compare the results over time.

**Is the data complete?**
It is everything the site publishes for that search, up to 10,000 offers per
term. It is not the whole catalogue, because the site does not publish the
whole catalogue for any single search. Shard a big topic into several terms,
categories or price bands to go wider.

**Why is one offer's price $2.29 and its ladder $1.60?**
Because a discount was running. The asking-price band and the discounted tier
prices are both returned, so you always see what the supplier is advertising
and what a buyer would actually pay today.

**What is the difference between `orderCount` and `orderValueBandUsd`?**
`orderCount` is how many orders the supplier has completed; `orderValueBandUsd`
is the rounded money value of those orders. They sit next to each other on the
site under similar labels and are easy to confuse, so they are named for
exactly what they are.

# Actor input Schema

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

One or more product searches, exactly as you would type them on the site. Up to 20 per run.

## `maxResultsPerKeyword` (type: `integer`):

How many offers to collect for each search term. The site publishes a limited number of public results for any one search, so very broad terms stop before this number is reached.

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

Which country's version of the supplier list to read — only offers from suppliers based in that country are returned. Leave as Any country for the full list. Wholesale prices are quoted in US dollars for every country.

## `sort` (type: `string`):

How the site should order the results. Only the orderings the site actually publishes are offered here.

## `minPrice` (type: `number`):

Only return offers whose lowest published unit price is at or above this figure. Leave empty for no floor.

## `maxPrice` (type: `number`):

Only return offers whose published unit price is at or below this figure. Leave empty for no ceiling.

## `maxMinOrderQuantity` (type: `integer`):

Only return offers you can buy in this quantity or fewer — set 1 for offers that sell single units. Leave empty to accept any minimum order.

## `minStoreRating` (type: `string`):

Only return offers from suppliers rated at or above this score by their buyers.

## `tradeAssurance` (type: `boolean`):

Only return offers covered by the site's order-protection programme.

## `verifiedSupplier` (type: `boolean`):

Only return offers from suppliers whose credentials and capabilities were inspected by a third-party inspection company.

## `verifiedProSupplier` (type: `boolean`):

Only return offers from the site's top tier of inspected suppliers.

## `readyToShip` (type: `boolean`):

Only return offers the supplier holds in stock for immediate dispatch.

## `productCertificate` (type: `string`):

Only return offers whose product carries this certificate.

## `companyCertificate` (type: `string`):

Only return offers from suppliers holding this company-level certificate.

## `categoryId` (type: `string`):

Restrict the search to one of the site's own categories, by its numeric identifier. Leave empty to search everywhere.

## `excludePromoted` (type: `boolean`):

Leave off to keep promoted placements in the results — they are always flagged, and organic position is reported separately either way.

## `onlyKeywordMatches` (type: `boolean`):

The site always returns something, even for a misspelled term. Turn this on to drop offers whose title does not contain every word you searched for.

## `parallelSearches` (type: `integer`):

How many search terms to work through at the same time. Higher is faster; lower is gentler on the source site.

## Actor input object example

```json
{
  "keywords": [
    "bluetooth speaker"
  ],
  "maxResultsPerKeyword": 100,
  "country": "",
  "sort": "best_match",
  "minStoreRating": "",
  "tradeAssurance": false,
  "verifiedSupplier": false,
  "verifiedProSupplier": false,
  "readyToShip": false,
  "productCertificate": "",
  "companyCertificate": "",
  "excludePromoted": false,
  "onlyKeywordMatches": false,
  "parallelSearches": 5
}
```

# Actor output Schema

## `offers` (type: `string`):

Every wholesale offer collected in this run, with its price ladder and supplier record.

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

Counts per search term, including any term that could not be read.

# 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": [
        "bluetooth speaker"
    ],
    "maxResultsPerKeyword": 100,
    "country": "",
    "sort": "best_match",
    "parallelSearches": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("apt_marble/alibaba-search-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": ["bluetooth speaker"],
    "maxResultsPerKeyword": 100,
    "country": "",
    "sort": "best_match",
    "parallelSearches": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("apt_marble/alibaba-search-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": [
    "bluetooth speaker"
  ],
  "maxResultsPerKeyword": 100,
  "country": "",
  "sort": "best_match",
  "parallelSearches": 5
}' |
apify call apt_marble/alibaba-search-scraper --silent --output-dataset

```

## MCP server setup

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