# JD.com Product Scraper — Search, Detail, Reviews (`sian.agency/jd-com-product-scraper`) Actor

Scrape JD.com (Jingdong) into clean structured datasets — keyword search with real prices, product details, customer reviews, shop catalogs, and bulk price lookups. Five operations in one actor. No account, no API key, no setup.

- **URL**: https://apify.com/sian.agency/jd-com-product-scraper.md
- **Developed by:** [SIÁN OÜ](https://apify.com/sian.agency) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 8 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 product search results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## JD.com Product Scraper — Search, Prices, Reviews & Shop Catalogs 🚀

[![SIÁN Agency Store](https://img.shields.io/badge/Store-SI%C3%81N%20Agency-1AE392)](https://apify.com/sian.agency?fpr=sian) [![SIÁN Taobao & Tmall](https://img.shields.io/badge/SI%C3%81N-Taobao%20%26%20Tmall-FF4F00)](https://apify.com/sian.agency/taobao-tmall-product-scraper?fpr=sian) [![SIÁN Kwai & Kuaishou](https://img.shields.io/badge/SI%C3%81N-Kwai%20%26%20Kuaishou-FF4906)](https://apify.com/sian.agency/kwai-kuaishou-scraper?fpr=sian) [![SIÁN Xiaohongshu RedNote](https://img.shields.io/badge/SI%C3%81N-Xiaohongshu%20RedNote-FF2442)](https://apify.com/sian.agency/xiaohongshu-rednote-scraper?fpr=sian)

#### 🎉 Five scrapers in one — keyword search with real prices, deep product data, reviews, shop catalogs, and bulk price lookups
##### Built for China e-commerce researchers, dropshippers, brand analysts, and pricing teams who need clean JD.com (Jingdong) data without scraping headaches

---

### 📋 Overview

**Stop fighting JD.com's anti-bot defenses.** This actor turns Jingdong (京东) — China's largest B2C marketplace — into a clean, structured data feed across five complementary operations.

**Why thousands of professionals choose us:**
- ✅ **Real CNY prices via Product Search**: 48 products per page with live sale prices, sales counts, ratings, and shop info — no decoding required
- ⚡ **Dedicated bulk price endpoint**: refresh prices on thousands of SKUs for the cheapest per-row rate on the market
- 🎯 **Transparent detail data**: when JD masks unit prices, we expose a `priceMasked` flag so you know to switch to Search or Price endpoints
- 💰 **Pay-per-result pricing**: only charged for successful rows, never for errors or empty pages
- 💎 **No account, no API key, no setup**: paste your input, hit Start, get JSON
- ✨ **NEW**: Bulk Product Price operation — the fastest, cheapest way to keep an SKU catalog in sync with live JD pricing

---

### ✨ Features

- 🔎 **Keyword Search**: 48 real-price products per page with shop, sales, rating, and canonical URLs
- 📦 **Product Detail**: deep SKU, stock, dimensions, category, shop floor, and variant data
- 💬 **Product Comments**: customer reviews with rating, content, appended review, reviewer profile, and photo URLs
- 🏬 **Shop Catalog**: a merchant's full product list by Shop ID
- 💱 **Bulk Product Price**: dedicated single-product price lookup — the cheapest endpoint in the actor
- 🇨🇳 **Native Chinese support**: handles 中文 keywords, titles, and review content cleanly
- 📸 **Normalized image URLs**: JD CDN paths upgraded to fully-qualified HTTPS URLs
- 📄 **HTML run report**: every run drops a `report.html` summary into the key-value store
- 🧾 **Apify-native dataset**: export to JSON, CSV, Excel, RSS, or XML in one click
- 🛡️ **Error rows never charged**: invalid IDs, removed products, and rate limits are flagged in the dataset but cost nothing

---

### 🎬 Quick Start

Pick an operation, plug in a keyword or item ID, and run. No login, no proxy setup, no captcha solving.

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~jd-com-product-scraper/runs?token=YOUR_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{"operation":"productSearch","keyword":"华为手机","maxPages":1}'
````

***

### 🚀 Getting Started (3 Simple Steps)

#### Step 1: Choose an operation

Pick one of `productSearch`, `productDetail`, `productComments`, `shopCatalog`, or `productPrice` based on what you need.

#### Step 2: Plug in the input

- Keyword or item ID
- Optional `maxPages` (for paginated operations: search, comments, catalog)

#### Step 3: Hit Start and grab the dataset

Export to JSON, CSV, or Excel — or pull rows live through the Apify API.

**That's it! In under 60 seconds, you'll have:**

- Clean, flat rows ready for analytics
- Real CNY prices, sales counts, and shop info
- Normalized image URLs you can hotlink directly

***

### 📥 Input Configuration

One operation per run. Fields required depend on which operation you pick.

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `operation` | enum | Yes | One of `productSearch`, `productDetail`, `productComments`, `shopCatalog`, `productPrice` |
| `keyword` | string | If `productSearch` | Search term (supports Chinese, e.g. `华为手机`) |
| `itemId` | string | If detail / comments / price | JD product ID (e.g. `100012043978`) |
| `shopId` | string | If `shopCatalog` | JD shop ID |
| `maxPages` | integer | No | Cap pages fetched for paginated ops (search / comments / catalog). Default 1. |

**Example — Keyword Search:**

```json
{
  "operation": "productSearch",
  "keyword": "iPhone 16 Pro",
  "maxPages": 3
}
```

**Example — Bulk Price Refresh:**

```json
{
  "operation": "productPrice",
  "itemId": "100012043978"
}
```

**Example — Customer Reviews:**

```json
{
  "operation": "productComments",
  "itemId": "100012043978",
  "maxPages": 5
}
```

***

### 📤 Output

Results land in the Apify dataset with curated camelCase fields plus the raw upstream payload spread alongside, so you never lose data.

| Field | Type | Description |
|-------|------|-------------|
| `operation` | string | Which operation produced the row |
| `itemId` | string | JD product ID |
| `productTitle` | string | Product name |
| `price` | number | Current sale price in CNY (Search + Price ops only) |
| `priceCents` | number | Price in cents — bulk Price endpoint returns this raw |
| `priceYuan` | number | Price converted to ¥ (Price endpoint) |
| `priceMasked` | boolean | `true` when JD masks the price on the detail endpoint |
| `salesText` | string | Sales count text (e.g. `5万+`) |
| `goodRate` | number | Positive review rate percentage |
| `shopId` / `shopName` | string | Merchant identifiers |
| `itemUrl` | string | Canonical JD product URL |
| `reviewContent` | string | Review body (comments op) |
| `reviewPhotos` | array | Reviewer-uploaded photo URLs |
| `available` | boolean | `false` when JD has delisted or hidden the SKU |
| `status` | string | `success` or `error` |

**Example — Product Search row:**

```json
{
  "operation": "productSearch",
  "itemId": "100012043978",
  "productTitle": "华为 HUAWEI Mate 60 Pro 12GB+512GB",
  "price": 6499.00,
  "salesText": "10万+",
  "goodRate": 99,
  "shopId": "1000004259",
  "shopName": "华为京东自营官方旗舰店",
  "itemUrl": "https://item.jd.com/100012043978.html",
  "status": "success"
}
```

> **Important — JD price masking:** JD.com masks unit prices on its detail endpoint as an anti-scraping countermeasure (you'll see strings like `1??9`, `4??9`). For real prices, use **Product Search** (returns 48 priced rows per call) or **Bulk Product Price** (cheapest way to refresh a known SKU). Detail is best for SKU specs, stock, dimensions, and shop info.

***

### 💼 Use Cases & Examples

#### 1. Competitor Price Monitoring on JD.com

**E-commerce managers tracking rivals' pricing on Jingdong's biggest categories.**

**Input:** category keyword (e.g. `蓝牙耳机`), maxPages 5
**Output:** 240+ priced products per run with shop, sales, and rating data
**Use:** schedule daily, diff against yesterday's snapshot, alert on price drops

#### 2. Dropshipping Product Sourcing

**Drop-ship operators discovering hot products and trustworthy shops.**

**Input:** keyword like `家用智能投影仪`
**Output:** real prices, sales volumes, and shop ratings to spot winners
**Use:** export the dataset, sort by sales × rating, and import into your store

#### 3. Customer Review Mining at Scale

**Brand analysts running sentiment analysis on Chinese reviews.**

**Input:** itemId for a flagship SKU, maxPages 20
**Output:** review text, ratings, reviewer profiles, and photo URLs
**Use:** pipe into an LLM for theme extraction and competitive teardowns

#### 4. Brand Catalog Mapping

**Researchers mapping a Chinese brand's full JD.com footprint.**

**Input:** shopId for the brand's flagship store
**Output:** every itemId + title + product URL the shop currently lists
**Use:** combine with Product Detail to enrich each row with specs

#### 5. Bulk SKU Price Refresh

**Pricing teams keeping internal CRM/ERP product feeds in sync with JD.**

**Input:** loop a list of itemIds through `productPrice` (one ID per run, fanned out)
**Output:** current CNY price + `available` flag for delisted SKUs
**Use:** cheapest endpoint we offer — built for thousands of SKUs

#### 6. Dropshipper SKU Variant Mapping

**Sellers cataloging variants and stock per color/storage.**

**Input:** itemId via `productDetail`
**Output:** SKU table, stock state, category breadcrumbs, shop floor metadata
**Use:** generate variant matrices for your storefront

#### 7. China Market Intelligence

**Analysts benchmarking Chinese brands against Western alternatives.**

**Input:** keyword searches across the target category
**Output:** sales counts and price bands across the JD long tail
**Use:** weight by sales volume to build a true market-share view

***

### 🔗 Integration Examples

#### JavaScript / Node.js

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });

const run = await client.actor('sian.agency/jd-com-product-scraper').call({
  operation: 'productSearch',
  keyword: 'iPhone 16 Pro',
  maxPages: 3,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0]);
```

#### Python

```python
from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')

run = client.actor('sian.agency/jd-com-product-scraper').call(
    run_input={
        'operation': 'productPrice',
        'itemId': '100012043978',
    }
)

for item in client.dataset(run['defaultDatasetId']).iterate_items():
    print(item['priceYuan'], item['available'])
```

#### cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~jd-com-product-scraper/runs?token=YOUR_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{"operation":"productComments","itemId":"100012043978","maxPages":2}'
```

#### Automation Workflows (N8N / Zapier / Make)

1. **Trigger**: schedule or webhook (new SKU added, weekly refresh, etc.)
2. **HTTP Request**: call the actor's run endpoint with your input JSON
3. **Process**: read the dataset items via the Apify API
4. **Action**: write to your DB, alert Slack on price drops, or push into a BI dashboard

***

### 📊 Performance & Pricing

Pay-per-event pricing — only charged for successful rows. Error rows never cost anything.

#### FREE Tier (Try It Now)

- Full access to all five operations with your monthly Apify FREE credit
- No credit card required
- Perfect for testing keywords, validating IDs, and prototyping

#### PAID Tier (Production Ready)

- Unlimited rows per run with tier-volume discounts that auto-apply as you scale
- Faster turnaround on bulk batches
- Pay only for successful, deduped rows

💰 **Best-in-class per-row pricing on JD.com data**, with a dedicated cheap bulk Product Price operation built for SKU refresh workflows at scale.

🔗 [View current pricing](https://apify.com/sian.agency/jd-com-product-scraper?fpr=sian)

***

### ❓ Frequently Asked Questions

**Q: Why are prices missing on Product Detail rows?**
A: JD.com masks unit prices on its product-detail endpoint as an anti-scraping defense (you'll see `1??9`, `4??9`, etc.). Use **Product Search** for real prices across a category, or **Bulk Product Price** to refresh a known SKU. We expose a `priceMasked: true` flag on detail rows so you always know which path to take.

**Q: Do I need a JD.com account or API key?**
A: No. Paste your input, hit Start, get rows. We handle authentication, retries, and CDN normalization for you.

**Q: Can I search in Chinese?**
A: Yes — `keyword` accepts Chinese characters natively (e.g. `华为手机`, `蓝牙耳机`). Results return Chinese titles, sales text (e.g. `5万+`), and review content as-is.

**Q: How many results does Product Search return per page?**
A: 48 products per page. Use `maxPages` to fan out further.

**Q: What output formats are available?**
A: JSON, CSV, Excel, RSS, or XML — export directly from the Apify dataset UI or pull live via the API.

**Q: Can I bulk-process a list of product IDs?**
A: Yes — loop your IDs into the `productPrice` operation (one ID per run, fanned via the Apify API). It's our cheapest endpoint by design and built exactly for that workflow.

**Q: How fast is processing?**
A: Most runs finish in seconds. Bulk catalog or comment scrapes scale linearly with `maxPages`.

**Q: Is this legal?**
A: We only extract publicly available data. See the [legal section](#-is-it-legal-to-scrape-data) below.

***

### 🐛 Troubleshooting

**No rows returned from Product Search**

- Double-check your keyword spelling (Chinese characters preferred for Chinese categories)
- Confirm `maxPages` is at least 1
- Some niche queries return zero results — try a broader keyword

**"Item not found" or empty Product Detail / Price**

- The SKU may have been delisted by JD — check `available: false` in the response
- Verify your `itemId` is a numeric JD product ID (not a Tmall ID)

**Prices look masked on Detail**

- Expected behavior — JD masks prices on the detail endpoint. Switch to `productSearch` or `productPrice` for real numbers. The `priceMasked` flag confirms this on every detail row.

**Shop Catalog returns thin rows**

- By design — the catalog endpoint returns `itemId + title + URL` only. Fan each itemId out to `productDetail` or `productPrice` to enrich.

**Run was charged but I see error rows**

- Error rows are never charged. Only `status: success` rows count toward billing.

***

### ⚠️ Trademark Disclaimer

This is an **independent scraping tool** for publicly available JD.com data. It is not affiliated with, endorsed by, or sponsored by JD.com, Inc., 京东 (Jingdong), or any of their subsidiaries or affiliates. All product names, brand names, trademarks, and logos referenced are the property of their respective owners. The JD.com® and Jingdong® names appear under nominative fair use solely to describe the public source of the data this tool helps you access.

***

### ⚖️ Is it legal to scrape data?

Our actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.

However, you should be aware that your results could contain personal data. Personal data is protected by the **GDPR** in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

You can also read Apify's blog post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

***

### 🤝 Support

[![Telegram Support](https://img.shields.io/badge/Telegram-Support%20Group-0088cc?logo=telegram)](https://t.me/+vyh1sRE08sAxMGRi)

**Join our active support community**

- For issues or feature requests, open an issue from the actor's page
- Browse the [SIÁN Agency Store](https://apify.com/sian.agency?fpr=sian) for more China e-commerce and short-video automation tools
- 📧 <apify@sian-agency.online>
- ⭐ Love the actor? [Leave a 5-star review](https://apify.com/sian.agency/jd-com-product-scraper/reviews) — it helps us ship more features

***

**Built by [SIÁN Agency](https://www.sian-agency.online)** | **[More Tools](https://apify.com/sian.agency?fpr=sian)**

# Actor input Schema

## `operation` (type: `string`):

Pick what you want to scrape. Each run does one operation.

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

Search query. Chinese or English supported (Chinese gives best results — try 华为, iPhone, 茅台). Required for Product Search.

## `itemId` (type: `string`):

The numeric JD.com product ID from the item URL — `https://item.jd.com/{itemId}.html`. Required for Product Detail, Product Comments, and Product Price.

## `shopId` (type: `string`):

The numeric JD.com shop ID from the shop URL — `https://mall.jd.com/index-{shopId}.html`. Required for Shop Catalog.

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

Max pages to scrape. Applies only to paginated operations (Product Search, Product Comments, Shop Catalog). Default 5. Range 1-50.

## Actor input object example

```json
{
  "operation": "productSearch",
  "keyword": "华为手机",
  "itemId": "100256400499",
  "shopId": "1000004259",
  "maxPages": 5
}
```

# Actor output Schema

## `output` (type: `string`):

Products, reviews, shop catalogs, or prices — one flat row per upstream item with curated camelCase aliases (itemId, productTitle, price, shopName, salesText, goodRate, itemUrl, …) plus the raw upstream fields spread alongside.

## `report` (type: `string`):

HTML report with run status, success/error row counts, success rate, pages fetched, duration, and the inputs used — written even on fatal crash.

# 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("sian.agency/jd-com-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 = {}

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

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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 sian.agency/jd-com-product-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=sian.agency/jd-com-product-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "JD.com Product Scraper — Search, Detail, Reviews",
        "description": "Scrape JD.com (Jingdong) into clean structured datasets — keyword search with real prices, product details, customer reviews, shop catalogs, and bulk price lookups. Five operations in one actor. No account, no API key, no setup.",
        "version": "1.1",
        "x-build-id": "EeqGPFd5xzElxj2Hc"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/sian.agency~jd-com-product-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-sian.agency-jd-com-product-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/sian.agency~jd-com-product-scraper/runs": {
            "post": {
                "operationId": "runs-sync-sian.agency-jd-com-product-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/sian.agency~jd-com-product-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-sian.agency-jd-com-product-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "operation"
                ],
                "properties": {
                    "operation": {
                        "title": "Operation",
                        "enum": [
                            "productSearch",
                            "productDetail",
                            "productComments",
                            "shopCatalog",
                            "productPrice"
                        ],
                        "type": "string",
                        "description": "Pick what you want to scrape. Each run does one operation.",
                        "default": "productSearch"
                    },
                    "keyword": {
                        "title": "Search Keyword (for Product Search)",
                        "type": "string",
                        "description": "Search query. Chinese or English supported (Chinese gives best results — try 华为, iPhone, 茅台). Required for Product Search."
                    },
                    "itemId": {
                        "title": "Item ID (for Product Detail / Comments / Price)",
                        "type": "string",
                        "description": "The numeric JD.com product ID from the item URL — `https://item.jd.com/{itemId}.html`. Required for Product Detail, Product Comments, and Product Price."
                    },
                    "shopId": {
                        "title": "Shop ID (for Shop Catalog)",
                        "type": "string",
                        "description": "The numeric JD.com shop ID from the shop URL — `https://mall.jd.com/index-{shopId}.html`. Required for Shop Catalog."
                    },
                    "maxPages": {
                        "title": "Max pages (for paginated operations)",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Max pages to scrape. Applies only to paginated operations (Product Search, Product Comments, Shop Catalog). Default 5. Range 1-50.",
                        "default": 5
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
