# Alibaba.com Rental Scraper (`w3crawler/alibaba-com-rental-scraper`) Actor

Bounded public Alibaba.com rental-search and product-detail extraction with price, supplier, and product metadata. Search pages are subject to Alibaba robots/access policy and are never bypassed.

- **URL**: https://apify.com/w3crawler/alibaba-com-rental-scraper.md
- **Developed by:** [w3crawler](https://apify.com/w3crawler) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.99 / 1,000 rental listings

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.com Rental Scraper

This Apify Actor extracts rich, source-backed rental listing data from public Alibaba.com search, category, country-search, wholesale, showroom, and product-detail pages.

Actor page: [parseforge/alibaba-com-rental-scraper](https://apify.com/parseforge/alibaba-com-rental-scraper)

The Actor reads public HTML, visible product cards, and published Schema.org Product JSON-LD. It supports multiple start URLs, per-source pagination, global deduplication, filters, sorting, optional product-detail enrichment, standard Apify Proxy routing, and deterministic local fixtures.

### What the Actor returns

Product rows are marketplace-focused and contain observed fields only. Actor debugging wrappers such as `recordId`, `recordType`, `status`, `success`, `fieldCoverage`, `dataQuality`, `extractionMethod`, `httpStatus`, `accessStatus`, `usedProxy`, and `observedAt` are not written to the dataset. Request counts, retries, blocked-source evidence, and enrichment counts are stored in the `OUTPUT_SUMMARY` and `DIAGNOSTICS` key-value records.

When available, product rows include:

- identity: `url`, `listingUrl`, `productId`, `title`, `description`, `category`, `brand`, `sku`, `mpn`
- source context: `source`, `sourceDomain`, `sourceUrl`, `pageNum`, `position`, `keyword`, `scrapedAt`
- pricing: `price`, `priceMin`, `priceMax`, `currency`, `priceText`, `priceFormatted`, `availability`
- supplier and engagement: `supplierName`, `supplierUrl`, `supplierProfileUrl`, `supplierCountry`, `supplierYears`, `rating`, `reviewCount`, `soldCount`, `transactionCount`
- order and merchandising: `minimumOrderQuantity`, `minimumOrderUnit`, `minimumOrderText`, `badges`, `isSponsored`, `hasTradeAssurance`, `leadTime`, `shipping`
- rental and product facts: `rentalMatch`, `rentalSignals`, `rentalEvidence`, `rentalPeriod`, `rentalPrice`, `rentalPriceMin`, `rentalPriceMax`, `rentalPriceCurrency`, `rentalPriceText`, `rentalAvailability`, `attributes`
- media: `images`, `imageUrls`, `thumbnail`, `imageCount`, and optional `detailUrl`/`detailEnriched`

Missing values are omitted instead of fabricated. When images are enabled, `images` and `imageUrls` are aligned, `thumbnail` is their first entry, and `imageCount` is their length. Image URLs are restricted to product-scoped Alibaba CDN assets; known logos, icons, avatars, placeholders, and “find similar” assets are discarded.

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

### Source and access policy

Supported public paths are `/trade/search`, `/catalog/`, `/category/`, `/countrysearch/`, `/wholesale/`, `/showroom/`, and `/product-detail/` on HTTPS Alibaba hosts. The Actor fetches `https://www.alibaba.com/robots.txt` before source requests and skips URLs disallowed by the published policy. It never logs in, calls private APIs, accesses seller contact endpoints, solves CAPTCHAs, or bypasses WAF/access controls.

`rentalOnly: true` is deliberately stricter than a keyword search. A product must contain a configured rental keyword and an independent published rental-service cue, such as `available for rent`, `rental service`, `short-term lease`, a rental period (`per day`, `hourly`, or similar), a rental rate/price, or a booking/availability statement. Generic sales language such as `rental equipment`, `for rental business`, an MOQ, or a product title containing `rental` alone is rejected. When accepted, `rentalEvidence` and the available period, rental price, and availability fields show which source-backed cues were observed.

The legacy default trade-search URL remains available for compatibility, but Alibaba may disallow `/trade/` in `robots.txt`. For live category extraction, provide a currently permitted public category URL such as `https://www.alibaba.com/countrysearch/CN/equipment-rental.html`. A blocked, unavailable, challenged, or empty source produces a minimal diagnostic only when `includeDiagnostics` is enabled:

```json
{
  "url": "https://www.alibaba.com/countrysearch/CN/equipment-rental.html",
  "error": "Alibaba returned a public anti-automation challenge page.",
  "errorCode": "ACCESS_BOUNDARY"
}
```

### Input

All examples below are valid JSON. `startUrls` and `productUrls` may also contain Apify-style objects with a `url` property; invalid or unsupported URLs are ignored and counted as `rejectedInputCount` in `OUTPUT_SUMMARY`.

#### Basic extraction

If `startUrls` is empty or omitted, `keyword` builds the default public Alibaba search URL.

```json
{
  "keyword": "equipment rental",
  "maxItems": 25,
  "maxPages": 3,
  "rentalOnly": true,
  "includeImages": true
}
```

#### Multiple sources and pagination

Every start URL is processed independently. Pages within one source are followed sequentially through observed numbered or “next” links. `maxItems` is global across all sources and pages. `maxPages` is per source; `0` means automatic pagination with a hard 100-page safety cap.

```json
{
  "startUrls": [
    "https://www.alibaba.com/countrysearch/CN/equipment-rental.html",
    "https://www.alibaba.com/showroom/party-rental-equipment.html"
  ],
  "maxItems": 100,
  "maxPages": 5,
  "deduplicate": true,
  "sortBy": "relevance",
  "includeDiagnostics": true
}
```

#### Filters and sorting

Filters use observed values. If a numeric filter is active and the page does not expose that value, the record does not pass the filter. `requiredBadges` requires every requested badge, case-insensitively. Sorting happens after filtering across all sources; `relevance` preserves source/page/card order, and missing numeric values sort after observed values.

```json
{
  "keyword": "generator rental",
  "maxItems": 50,
  "sortBy": "rating_desc",
  "textQuery": "portable",
  "category": "equipment",
  "minPrice": 50,
  "maxPrice": 5000,
  "minRating": 4.5,
  "minReviewCount": 20,
  "minSoldCount": 10,
  "minSupplierYears": 3,
  "minOrderQuantity": 1,
  "maxOrderQuantity": 100,
  "supplierCountry": "CN",
  "requiredBadges": ["CE"]
}
```

Supported `sortBy` values are `relevance`, `price_asc`, `price_desc`, `rating_desc`, `reviews_desc`, `sold_desc`, `supplier_years_desc`, `moq_asc`, and `title_asc`.

#### Direct products and optional detail enrichment

`productUrls` accepts public product-detail URLs. `enrichDetails` additionally follows product links discovered on permitted source pages. Detail requests are bounded by `maxDetailPages`, share the same request pacing/retry policy, and do not bypass robots or access boundaries.

```json
{
  "productUrls": [
    "https://www.alibaba.com/product-detail/Portable-Generator-Rental_1600123456789.html"
  ],
  "rentalOnly": false,
  "enrichDetails": false,
  "maxDetailPages": 0,
  "includeImages": false,
  "includeAttributes": false
}
```

#### Developer options and proxy

These controls are grouped as Developer options in the Apify input UI. `requestDelayMs` paces request starts, `maxConcurrency` bounds concurrent source/detail operations, `maxRequestRetries` retries transient failures with backoff, and `requestTimeoutSecs` sets the per-response limit. The legacy `timeoutMs` field is accepted for older saved inputs but new inputs should use `requestTimeoutSecs`.

```json
{
  "requestDelayMs": 1200,
  "maxConcurrency": 2,
  "maxRequestRetries": 3,
  "requestTimeoutSecs": 60,
  "maxResponseBytes": 20000000,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "US"
  }
}
```

Apify Proxy changes only the network route. It is optional, is not used in fixture mode, and does not authorize bypassing Alibaba's robots policy or access controls.

#### Deterministic fixture examples

Use one fixture for parser QA:

```json
{
  "startUrls": ["https://www.alibaba.com/countrysearch/CN/equipment-rental.html"],
  "maxItems": 1,
  "maxPages": 1,
  "requestDelayMs": 0,
  "maxConcurrency": 1,
  "maxRequestRetries": 0,
  "requestTimeoutSecs": 15,
  "fixtureFile": "fixtures/sample.html"
}
```

Use ordered fixtures to test pagination and multiple records. The first file is page 1, the second is page 2, and so on:

```json
{
  "startUrls": ["https://www.alibaba.com/countrysearch/CN/equipment-rental.html"],
  "maxItems": 10,
  "maxPages": 2,
  "sortBy": "price_asc",
  "fixtureFiles": [
    "fixtures/sample.html",
    "fixtures/sample-page-2.html"
  ]
}
```

`fixtureFile` and `fixtureFiles` are mutually exclusive and must be Actor-relative HTML paths.

### Output example

Example product row:

```json
{
  "url": "https://www.alibaba.com/product-detail/Portable-Generator-Rental_1600123456789.html",
  "listingUrl": "https://www.alibaba.com/product-detail/Portable-Generator-Rental_1600123456789.html",
  "productId": "1600123456789",
  "title": "Portable Generator Rental",
  "description": "Portable generator rental for events and construction.",
  "category": "Equipment Rental",
  "brand": "PowerHarbor",
  "sku": "1600123456789",
  "source": "Alibaba.com public rental listings",
  "sourceDomain": "www.alibaba.com",
  "sourceUrl": "https://www.alibaba.com/countrysearch/CN/equipment-rental.html",
  "pageNum": 1,
  "position": 1,
  "keyword": "rental",
  "price": 120,
  "priceMin": 120,
  "priceMax": 120,
  "currency": "USD",
  "priceText": "120.00",
  "priceFormatted": "120.00",
  "availability": "https://schema.org/InStock",
  "rentalEvidence": ["rental_service", "rental_period", "rental_price", "rental_availability"],
  "rentalPeriod": "day",
  "rentalPrice": 120,
  "rentalPriceMin": 120,
  "rentalPriceMax": 120,
  "rentalPriceCurrency": "USD",
  "rentalPriceText": "$120 per day",
  "rentalAvailability": "Available for rent by day",
  "supplierName": "PowerHarbor Equipment Co.",
  "rating": 4.8,
  "reviewCount": 12,
  "rentalMatch": true,
  "rentalSignals": ["rental"],
  "images": ["https://sc04.alicdn.com/kf/portable-generator.jpg"],
  "imageUrls": ["https://sc04.alicdn.com/kf/portable-generator.jpg"],
  "thumbnail": "https://sc04.alicdn.com/kf/portable-generator.jpg",
  "imageCount": 1,
  "scrapedAt": "2026-09-06T00:00:00.000Z"
}
```

Operational information is kept outside product rows:

```json
{
  "status": "SUCCEEDED",
  "requests": 2,
  "retries": 0,
  "successfulRequests": 2,
  "failedRequests": 0,
  "sourcesProcessed": 1,
  "pagesProcessed": 2,
  "recordsEmitted": 2,
  "diagnostics": 0,
  "completedAt": "2026-09-06T00:00:00.000Z"
}
```

### Dataset and key-value outputs

The default dataset contains product rows and, when enabled, minimal diagnostic rows. The default key-value store contains:

- `OUTPUT_SUMMARY`: counts, status, input limits, pagination totals, retry totals, and completion time
- `SOURCE_METADATA`: source URL, supported paths, robots URL, and public-source policy
- `DIAGNOSTICS`: `{ "count": number, "items": [{ "url": string, "error": string, "errorCode": string }] }`
- `OUTPUT`: the same run summary for compatibility with existing integrations

### Run and validate locally

From this Actor directory:

```bash
npm ci
npm test
apify validate-schema
apify run --purge --input-file .actor/input.json
npm run validate
```

The fixture inputs under `test/inputs/` exercise filters, sorting, multiple sources, pagination, image/detail options, developer settings, and rental-semantic false-positive rejection without making network requests. The live category URL may be blocked or robots-disallowed; in that case the Actor records the source diagnostic and does not fabricate rows.

### Cost and limits

Actor cost is driven primarily by request count, response size, and Apify platform compute/network usage. Use `maxItems`, `maxPages`, `maxDetailPages`, `maxConcurrency`, `requestDelayMs`, and `maxResponseBytes` to keep runs bounded. No supplier contact, checkout, account login, or paid Alibaba action is performed.

### Support and legal

Use this Actor only with public pages and in accordance with Alibaba's terms, robots policy, applicable law, and your data-protection obligations. It is not affiliated with Alibaba.com. For support, include the Actor run ID, sanitized input, source URL, and the relevant `errorCode`; never include credentials or private tokens.

# Actor input Schema

## `keyword` (type: `string`):

Keyword used to build the default public Alibaba search URL when startUrls is empty.

## `textQuery` (type: `string`):

Optional case-insensitive text match across observed title, description, category, location, and supplier name.

## `category` (type: `string`):

Optional case-insensitive match against the observed product category.

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

One or more public HTTPS Alibaba search, catalog, category, countrysearch, wholesale, showroom, or product-detail URLs. Pages are paginated per source and share one global maxItems limit.

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

Optional public Alibaba product-detail URLs to request directly. These are processed as bounded detail targets after source pages.

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

Global maximum number of product rows emitted across all sources and pages after filtering and sorting.

## `maxPages` (type: `integer`):

Pages followed for each start URL. Use 0 for automatic pagination up to the Actor's hard 100-page safety cap.

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

Sort after all permitted sources are extracted and filters are applied. Relevance preserves source/page/card order.

## `deduplicate` (type: `boolean`):

Merge repeated product IDs or canonical product URLs across pages and sources.

## `includeImages` (type: `boolean`):

Include only product-scoped public Alibaba CDN image URLs, with thumbnail equal to the first image.

## `includeAttributes` (type: `boolean`):

Keep published JSON-LD additional properties and common product attributes when available.

## `includeDiagnostics` (type: `boolean`):

When enabled, blocked, unavailable, empty, or invalid source events are written as minimal {url, error, errorCode} rows. Operational counts remain in OUTPUT\_SUMMARY.

## `rentalOnly` (type: `boolean`):

Emit only products with a configured rental keyword plus independent published rental-service evidence such as a rental period, rate, availability, or booking term.

## `rentalKeywords` (type: `array`):

Case-insensitive words or phrases used with source-backed rental-service evidence to calculate rentalMatch and enforce rentalOnly.

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

Keep records with an observed price at or above this value. Missing prices do not pass an active price filter.

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

Keep records with an observed price at or below this value. Missing prices do not pass an active price filter.

## `minRating` (type: `number`):

Keep records with an observed rating at or above this value.

## `minReviewCount` (type: `number`):

Keep records with an observed review count at or above this value.

## `minSoldCount` (type: `number`):

Keep records with an observed sold or transaction count at or above this value.

## `minSupplierYears` (type: `number`):

Keep records with an observed supplier tenure at or above this value.

## `minOrderQuantity` (type: `number`):

Keep records whose observed MOQ is at or above this value.

## `maxOrderQuantity` (type: `number`):

Keep records whose observed MOQ is at or below this value.

## `supplierCountry` (type: `string`):

Optional exact two-letter supplier country code, such as CN or US.

## `requiredBadges` (type: `array`):

Keep records whose observed badge list contains every requested value, case-insensitively.

## `enrichDetails` (type: `boolean`):

Follow a bounded number of public product-detail URLs found on permitted source pages.

## `maxDetailPages` (type: `integer`):

Maximum discovered product-detail pages requested when enrichment is enabled.

## `requestDelayMs` (type: `integer`):

Minimum delay between starts of public requests. Use respectful pacing for live sources.

## `maxConcurrency` (type: `integer`):

Maximum number of start URLs or detail URLs processed concurrently. Pagination within one source remains sequential.

## `maxRequestRetries` (type: `integer`):

Retries for transient network, timeout, 408, 425, 429, and 5xx failures. Challenge responses fail closed.

## `requestTimeoutSecs` (type: `integer`):

Maximum time allowed for one public response.

## `maxResponseBytes` (type: `integer`):

Safety cap for one HTML response.

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

Optional standard Apify Proxy route for permitted public requests. Proxying never bypasses robots, login, CAPTCHA, or access controls.

## `fixtureFile` (type: `string`):

Optional Actor-relative HTML fixture for deterministic local validation. No network requests are made in fixture mode.

## `fixtureFiles` (type: `array`):

Optional ordered Actor-relative HTML fixtures; array index 0 is page 1, index 1 is page 2, and so on. Mutually exclusive with fixtureFile.

## `timeoutMs` (type: `integer`):

Backward-compatible alias for requestTimeoutSecs. Prefer requestTimeoutSecs in new inputs.

## Actor input object example

```json
{
  "keyword": "rental",
  "productUrls": [],
  "maxItems": 25,
  "maxPages": 1,
  "sortBy": "relevance",
  "deduplicate": true,
  "includeImages": true,
  "includeAttributes": true,
  "includeDiagnostics": true,
  "rentalOnly": true,
  "rentalKeywords": [
    "rental",
    "rent",
    "hire",
    "leasing",
    "lease",
    "出租",
    "租赁"
  ],
  "requiredBadges": [],
  "enrichDetails": false,
  "maxDetailPages": 5,
  "requestDelayMs": 1000,
  "maxConcurrency": 1,
  "maxRequestRetries": 2,
  "requestTimeoutSecs": 30,
  "maxResponseBytes": 20000000,
  "fixtureFiles": []
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

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

No description

## `sourceMetadata` (type: `string`):

No description

## `diagnostics` (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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("w3crawler/alibaba-com-rental-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("w3crawler/alibaba-com-rental-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 '{}' |
apify call w3crawler/alibaba-com-rental-scraper --silent --output-dataset

```

## MCP server setup

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