# Banggood Product & Price Scraper (`crawlerbros/banggood-scraper`) Actor

Scrape Banggood.com - search by keyword, browse by category, or fetch full product detail by URL. Titles, images, real-time prices, discounts, ratings, review counts, brand, and category breadcrumbs. No login, no cookies, no paid proxy.

- **URL**: https://apify.com/crawlerbros/banggood-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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

## Banggood Product & Price Scraper

Scrape **Banggood.com** — a global online marketplace for affordable electronics, phone accessories, RC/hobby gear, tools, home & garden, lighting, automotive parts, sports equipment, toys, and fashion shipped worldwide. Search by keyword (with sort control), browse any of Banggood's 11 top-level departments or a curated set of popular subcategories, or fetch complete product detail (price, discount, rating, review breakdown, specifications, shipping, images, brand, category) for a list of product URLs. No login, no cookies required.

### What this actor does

- **Three modes:** `search` (keyword, auto-paginated, sortable), `byCategory` (browse a department or subcategory), `productDetail` (full detail by URL)
- **Sort control:** order search results by popularity, newest, most reviews, or price (low-to-high / high-to-low)
- **Real-time pricing:** current price, list price, and discount percentage, fetched live on every run
- **Ratings & reviews:** review count on every product; star rating and a full 5-star-to-1-star review breakdown on product detail pages
- **Optional review sample:** a small set of featured customer reviews (reviewer, country, rating, date, text, helpful votes, photos) on request
- **Product specifications:** structured spec sheet, feature list, and package contents, when Banggood publishes them for that product
- **Shipping snapshot:** ship-from warehouse, shipping cost, destination, and estimated delivery window (detail mode)
- **Rich media:** main image plus a gallery of additional product photos (detail mode)
- **Filters:** price range, minimum discount, minimum review count, minimum rating, on-sale-only
- **Empty fields are omitted** — a product with no reviews yet simply has no `rating`/`reviewCount` field, never a fake `0`

### Output per product

- `productId` — Banggood's internal numeric product ID
- `title` — product name
- `brand` — manufacturer/brand name (detail mode)
- `description` — short product summary (detail mode)
- `price` — current/final price
- `listPrice` — original price before discount
- `discountPercent` — percentage off, if on sale
- `currency` — ISO 4217 currency code (e.g. `USD`)
- `rating` — average star rating, 0–5 (detail mode only; omitted if the product has no reviews yet)
- `reviewCount` — number of customer reviews
- `ratingDistribution[]` — review breakdown by star level, e.g. `{"stars": 5, "count": 1463, "percent": 93.9}` (detail mode; omitted with no reviews)
- `topReviews[]` — a small sample of featured reviews when `includeTopReviews` is enabled: `reviewerName`, `country`, `countryCode`, `rating`, `date`, `text`, `helpfulCount`, `images[]` (detail mode)
- `specifications` — key/value spec sheet, e.g. `{"Brand": "Baseus", "Color": "Black"}` (detail mode, when published for that product)
- `features[]` — bullet-point feature list (detail mode, when published)
- `packageContents[]` — what's included in the box (detail mode, when published)
- `imageUrl` — main product image
- `images[]` — additional gallery images (detail mode)
- `category` — full breadcrumb category path (detail mode)
- `breadcrumbs[]` — category path as an array (detail mode)
- `availabilityText` — stock/shipping status text, when shown (detail mode)
- `warehouse` — ship-from warehouse code, e.g. `CN` (detail mode)
- `shippingCost` — shipping cost text, e.g. `Free shipping` (detail mode)
- `shipToCountry` — destination country Banggood resolved for the request (detail mode; varies with the run's origin — see FAQ)
- `estimatedDelivery` — estimated delivery date range text (detail mode)
- `productUrl` — canonical Banggood product page URL
- `recordType: "product"`, `scrapedAt`, `sourceUrl`

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `search` | `search` / `byCategory` / `productDetail` |
| `searchQuery` | string | `phone case` | Free-text keyword (mode=search) |
| `categoryPath` | string (select) | `Wholesale-Electronics-ca-2001.html` | Department or curated subcategory to browse (mode=byCategory) — all 11 top-level departments plus 25 popular subcategories |
| `productUrls` | array | – | Full product page URLs to fetch (mode=productDetail) |
| `sortBy` | string (select) | `popular` | Result order for mode=search: `popular` / `newest` / `mostReviews` / `priceAsc` / `priceDesc`. No effect on mode=byCategory (Banggood's category pages have no sort control) |
| `minPrice` | number | – | Drop products priced below this |
| `maxPrice` | number | – | Drop products priced above this |
| `minDiscountPercent` | int | – | Only products discounted by at least this % |
| `minReviewCount` | int | – | Drop products with fewer reviews |
| `minRating` | number | – | Drop products rated below this (0–5); mode=productDetail only |
| `onSaleOnly` | boolean | `false` | Only currently-discounted products |
| `includeTopReviews` | boolean | `false` | Fetch a small sample of featured reviews per product (mode=productDetail only) — one extra page load per product, so it's opt-in |
| `maxItems` | int | `60` | Hard cap on emitted records (1–2000) |

#### Example: keyword search with a price ceiling

```json
{
  "mode": "search",
  "searchQuery": "led strip light",
  "maxPrice": 20,
  "onSaleOnly": true,
  "maxItems": 40
}
````

#### Example: keyword search sorted by price, low to high

```json
{
  "mode": "search",
  "searchQuery": "rc car",
  "sortBy": "priceAsc",
  "maxItems": 40
}
```

#### Example: browse a category for well-reviewed items

```json
{
  "mode": "byCategory",
  "categoryPath": "Wholesale-Sports-and-Outdoors-ca-6001.html",
  "minReviewCount": 5,
  "maxItems": 50
}
```

#### Example: browse a popular subcategory

```json
{
  "mode": "byCategory",
  "categoryPath": "Wholesale-Smart-Watch-ca-2210.html",
  "onSaleOnly": true,
  "maxItems": 30
}
```

#### Example: full detail (with a sample of reviews) for a specific product

```json
{
  "mode": "productDetail",
  "productUrls": [
    "https://www.banggood.com/Baseus-SkyRing-Series-Magnetic-Phone-Case-p-1998466.html"
  ],
  "includeTopReviews": true
}
```

### Use cases

- **Price monitoring** — track discounts and price drops across categories, sorted low-to-high or high-to-low
- **Dropshipping research** — find trending, highly-discounted products by niche, including RC/hobby, tools, and home & garden
- **Market intelligence** — compare pricing, ratings, and full review breakdowns across competing listings
- **Deal aggregation** — feed on-sale, highly-rated, newest-first products into a deals site or newsletter
- **Assortment analysis** — survey category breadth across all 11 top-level departments plus popular subcategories
- **Product page audits** — pull specifications, package contents, and shipping details for catalog/listing QA

### FAQ

**Is this affiliated with Banggood?**
No — this is an independent third-party actor that reads Banggood's public, unauthenticated storefront pages.

**Do I need to provide cookies, an account, or a proxy?**
No. All modes work from a fresh session with no login.

**Why do some products have no `rating` or `reviewCount`?**
`rating` is only ever present on `productDetail` results, and only when the product has at least one real review — a brand-new listing doesn't get a fake `0` rating. `reviewCount` is present in all modes.

**What currency are prices in?**
Prices reflect whatever currency Banggood serves for the request's origin (typically USD from US-based traffic). The `currency` field on each record tells you exactly which one.

**Why does `shipToCountry` change between runs?**
Like `currency`, the shipping snapshot (`shipToCountry`, `shippingCost`, `estimatedDelivery`) reflects whatever destination Banggood resolves for the request's origin. It's real, live data — just specific to where that particular run's traffic came from, not a fixed "home country" setting.

**Does `sortBy` work in every mode?**
No — only `mode=search`. Banggood's category browse pages don't have a sort control at all, so `sortBy` is ignored in `mode=byCategory` (and irrelevant to `mode=productDetail`).

**Why isn't every product's `specifications`/`features`/`packageContents` populated?**
Banggood only publishes a structured spec sheet for some categories (mostly electronics/hardware) — apparel, bags, and similar categories often don't have one. When it's not published, these fields are simply omitted rather than filled with guesses.

**Is `categoryPath` limited to top-level departments?**
No — it includes all 11 of Banggood's top-level departments plus a curated set of 25 popular, verified-active subcategories (smart watches, RC cars, security cameras, dash cams, and more). Banggood has hundreds of narrower subcategories beyond this list; the curated set focuses on the ones with consistently strong inventory.

**Is there a way to get flash deals, coupons, or top-seller rankings?**
Banggood's dedicated flash-deals/coupon/ranking pages use a different, AJAX-widget-driven layout than its standard search/category listing pages, so they aren't covered by this actor. You can get very similar results with the listing pages this actor already supports: `onSaleOnly: true` for deals, or `sortBy: "newest"` / `sortBy: "mostReviews"` for trending/new items, in either `search` or `byCategory` mode.

**Can I scrape a specific seller's/brand's storefront?**
Banggood operates primarily as a first-party retailer rather than a multi-seller marketplace, and doesn't expose a per-listing seller storefront page the way some marketplaces do — so there's no `byStore` mode.

**How many products can I get per run?**
`search` paginates automatically up to `maxItems` or until results are exhausted. `byCategory` returns a single page (Banggood's category browse doesn't expose reliable further-page navigation) — typically 40-64 products, capped by `maxItems`. `productDetail` returns exactly one record per URL you supply.

**Why does `productDetail` need full URLs instead of just product IDs?**
Banggood product URLs encode the SEO slug together with the ID; the slug isn't derivable from the ID alone, so a valid URL (from a search/category run, or copied from your browser) is required.

**How fresh is the price data?**
Prices are fetched live on every run directly from Banggood's pricing service — not cached.

**Why don't some `search`/`byCategory` results show `listPrice`/`discountPercent` even though the item is on sale?**
The current buyable `price` is always accurate. `listPrice` and `discountPercent` on listing results come from a reference price shown on the listing card itself, which Banggood doesn't always populate consistently. For a guaranteed, authoritative discount figure, use `mode=productDetail` on that product's URL.

# Actor input Schema

## `mode` (type: `string`):

What to fetch.

## `searchQuery` (type: `string`):

Free-text keyword search, e.g. `phone case`, `rc car`, `led strip light`.

## `categoryPath` (type: `string`):

Banggood department to browse — either one of the 11 top-level departments or a curated popular subcategory within one.

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

Full Banggood product page URLs, e.g. `https://www.banggood.com/Baseus-SkyRing-Series-Magnetic-Phone-Case-p-1998466.html`.

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

Result order for mode=search, matching Banggood's own sort dropdown/URL parameter exactly (verified against the live site's own sort links). Banggood's category browse pages (mode=byCategory) have no sort control, so this is ignored outside mode=search. Note on priceAsc/priceDesc: Banggood's own server-side price sort is not strictly monotonic — it blends price with relevance/sponsored placement (a common e-commerce pattern), so expect the general trend to hold rather than a mathematically exact ascending/descending sequence.

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

Drop products priced (current/final price) below this value.

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

Drop products priced (current/final price) above this value.

## `minDiscountPercent` (type: `integer`):

Only emit products discounted by at least this percentage. Discount data is most consistently available in mode=productDetail — search/byCategory listing cards don't always surface a reference (pre-discount) price for every market/region, so this filter can under-match in those modes.

## `minReviewCount` (type: `integer`):

Drop products with fewer reviews than this. Some category-page card layouts don't surface a review count at all — those products are not excluded by this filter (only products with a known, too-low review count are dropped).

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

Drop products rated below this. Banggood only shows a star rating on product detail pages, not on search/category listing cards, so this filter only has an effect in mode=productDetail (no-op pass-through for search/byCategory).

## `onSaleOnly` (type: `boolean`):

Only emit products currently discounted. Most reliable in mode=productDetail — see the note on Min discount %.

## `includeTopReviews` (type: `boolean`):

Fetch a small sample of featured customer reviews (reviewer, country, rating, date, text, helpful count, photos) for each product. Adds one extra page load per product, so it's off by default. No effect outside mode=productDetail.

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

Hard cap on emitted records. Note on mode=byCategory: Banggood's category browse pages don't expose further pagination (confirmed live -- `?page=N` silently re-renders page 1, and the `-N.html` suffix that works for `/search/` 404s for category URLs), so byCategory returns at most one page (~60 products) regardless of this value. mode=search paginates deeply and can approach this cap on broad/popular queries, though very narrow queries will exhaust their real result set first.

## Actor input object example

```json
{
  "mode": "search",
  "searchQuery": "phone case",
  "categoryPath": "Wholesale-Electronics-ca-2001.html",
  "productUrls": [],
  "sortBy": "popular",
  "onSaleOnly": false,
  "includeTopReviews": false,
  "maxItems": 60
}
```

# Actor output Schema

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

Dataset containing all scraped Banggood products.

# 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 = {
    "mode": "search",
    "searchQuery": "phone case",
    "categoryPath": "Wholesale-Electronics-ca-2001.html",
    "productUrls": [],
    "sortBy": "popular",
    "onSaleOnly": false,
    "includeTopReviews": false,
    "maxItems": 60
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/banggood-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 = {
    "mode": "search",
    "searchQuery": "phone case",
    "categoryPath": "Wholesale-Electronics-ca-2001.html",
    "productUrls": [],
    "sortBy": "popular",
    "onSaleOnly": False,
    "includeTopReviews": False,
    "maxItems": 60,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/banggood-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 '{
  "mode": "search",
  "searchQuery": "phone case",
  "categoryPath": "Wholesale-Electronics-ca-2001.html",
  "productUrls": [],
  "sortBy": "popular",
  "onSaleOnly": false,
  "includeTopReviews": false,
  "maxItems": 60
}' |
apify call crawlerbros/banggood-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Banggood Product & Price Scraper",
        "description": "Scrape Banggood.com - search by keyword, browse by category, or fetch full product detail by URL. Titles, images, real-time prices, discounts, ratings, review counts, brand, and category breadcrumbs. No login, no cookies, no paid proxy.",
        "version": "1.0",
        "x-build-id": "gJU2mAwxseqfXtDXZ"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/crawlerbros~banggood-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-crawlerbros-banggood-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/crawlerbros~banggood-scraper/runs": {
            "post": {
                "operationId": "runs-sync-crawlerbros-banggood-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/crawlerbros~banggood-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-crawlerbros-banggood-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": [
                    "mode"
                ],
                "properties": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "search",
                            "byCategory",
                            "productDetail"
                        ],
                        "type": "string",
                        "description": "What to fetch.",
                        "default": "search"
                    },
                    "searchQuery": {
                        "title": "Search query (mode=search)",
                        "type": "string",
                        "description": "Free-text keyword search, e.g. `phone case`, `rc car`, `led strip light`.",
                        "default": "phone case"
                    },
                    "categoryPath": {
                        "title": "Category (mode=byCategory)",
                        "enum": [
                            "Wholesale-Electronics-ca-2001.html",
                            "Wholesale-Phones-and-Accessories-ca-1001.html",
                            "Wholesale-Computers-and-Office-ca-5001.html",
                            "Wholesale-Automobiles-and-Motorcycles-ca-4001.html",
                            "Wholesale-Sports-and-Outdoors-ca-6001.html",
                            "Wholesale-Home-Appliance-and-Health-ca-18949.html",
                            "Wholesale-Lights-and-Lighting-ca-14001.html",
                            "Wholesale-Men-and-Womens-Clothing-ca-18941.html",
                            "Wholesale-Toys-Hobbies-and-Robot-c-133.html",
                            "Wholesale-Home,Garden-and-Furniture-ca-12001.html",
                            "Wholesale-Tools,Industrial-and-Scientific-ca-3001.html",
                            "Wholesale-Smart-Watch-ca-2210.html",
                            "Wholesale-Smart-Wristband-ca-1095.html",
                            "Wholesale-Bluetooth-Speakers-ca-1048.html",
                            "Wholesale-Earbud-Headphones-and-Earphones-ca-1049.html",
                            "Wholesale-Power-Banks-and-Stations-ca-1058.html",
                            "Wholesale-Wireless-Chargers-ca-1018.html",
                            "Wholesale-Security-Cameras-ca-2471.html",
                            "Wholesale-RC-Car-ca-7008.html",
                            "Wholesale-RC-Boat-ca-7009.html",
                            "Wholesale-Model-and-Building-Toys-ca-7109.html",
                            "Wholesale-LED-Solar-Lights-ca-14030.html",
                            "Wholesale-Flashlight-ca-14002.html",
                            "Wholesale-Robot-Vacuums-Cleaners-ca-9003.html",
                            "Wholesale-Humidifiers-ca-9023.html",
                            "Wholesale-Massager-Gun-ca-18961.html",
                            "Wholesale-Car-DVR-Camera-ca-4119.html",
                            "Wholesale-Jump-Starter-ca-4044.html",
                            "Wholesale-Code-Readers-and-Scan-Tools-ca-4050.html",
                            "Wholesale-Mechanical-Gaming-Keyboard-ca-5030.html",
                            "Wholesale-Monitor-ca-5016.html",
                            "Wholesale-Projectors-and-Theaters-ca-5084.html",
                            "Wholesale-Fishing-and-Hunting-ca-6023.html",
                            "Wholesale-Telescope-and-Binoculars-ca-6036.html",
                            "Wholesale-Shoes-and-Bags-ca-11001.html",
                            "Wholesale-Dresses-ca-16042.html"
                        ],
                        "type": "string",
                        "description": "Banggood department to browse — either one of the 11 top-level departments or a curated popular subcategory within one.",
                        "default": "Wholesale-Electronics-ca-2001.html"
                    },
                    "productUrls": {
                        "title": "Product URLs (mode=productDetail)",
                        "type": "array",
                        "description": "Full Banggood product page URLs, e.g. `https://www.banggood.com/Baseus-SkyRing-Series-Magnetic-Phone-Case-p-1998466.html`.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "sortBy": {
                        "title": "Sort by (mode=search only)",
                        "enum": [
                            "popular",
                            "newest",
                            "mostReviews",
                            "priceAsc",
                            "priceDesc"
                        ],
                        "type": "string",
                        "description": "Result order for mode=search, matching Banggood's own sort dropdown/URL parameter exactly (verified against the live site's own sort links). Banggood's category browse pages (mode=byCategory) have no sort control, so this is ignored outside mode=search. Note on priceAsc/priceDesc: Banggood's own server-side price sort is not strictly monotonic — it blends price with relevance/sponsored placement (a common e-commerce pattern), so expect the general trend to hold rather than a mathematically exact ascending/descending sequence.",
                        "default": "popular"
                    },
                    "minPrice": {
                        "title": "Min price",
                        "minimum": 0,
                        "maximum": 1000000,
                        "type": "number",
                        "description": "Drop products priced (current/final price) below this value."
                    },
                    "maxPrice": {
                        "title": "Max price",
                        "minimum": 0,
                        "maximum": 1000000,
                        "type": "number",
                        "description": "Drop products priced (current/final price) above this value."
                    },
                    "minDiscountPercent": {
                        "title": "Min discount %",
                        "minimum": 0,
                        "maximum": 99,
                        "type": "integer",
                        "description": "Only emit products discounted by at least this percentage. Discount data is most consistently available in mode=productDetail — search/byCategory listing cards don't always surface a reference (pre-discount) price for every market/region, so this filter can under-match in those modes."
                    },
                    "minReviewCount": {
                        "title": "Min review count",
                        "minimum": 0,
                        "maximum": 1000000,
                        "type": "integer",
                        "description": "Drop products with fewer reviews than this. Some category-page card layouts don't surface a review count at all — those products are not excluded by this filter (only products with a known, too-low review count are dropped)."
                    },
                    "minRating": {
                        "title": "Min rating (0-5, mode=productDetail only)",
                        "minimum": 0,
                        "maximum": 5,
                        "type": "number",
                        "description": "Drop products rated below this. Banggood only shows a star rating on product detail pages, not on search/category listing cards, so this filter only has an effect in mode=productDetail (no-op pass-through for search/byCategory)."
                    },
                    "onSaleOnly": {
                        "title": "On sale only",
                        "type": "boolean",
                        "description": "Only emit products currently discounted. Most reliable in mode=productDetail — see the note on Min discount %.",
                        "default": false
                    },
                    "includeTopReviews": {
                        "title": "Include top reviews (mode=productDetail only)",
                        "type": "boolean",
                        "description": "Fetch a small sample of featured customer reviews (reviewer, country, rating, date, text, helpful count, photos) for each product. Adds one extra page load per product, so it's off by default. No effect outside mode=productDetail.",
                        "default": false
                    },
                    "maxItems": {
                        "title": "Max items",
                        "minimum": 1,
                        "maximum": 2000,
                        "type": "integer",
                        "description": "Hard cap on emitted records. Note on mode=byCategory: Banggood's category browse pages don't expose further pagination (confirmed live -- `?page=N` silently re-renders page 1, and the `-N.html` suffix that works for `/search/` 404s for category URLs), so byCategory returns at most one page (~60 products) regardless of this value. mode=search paginates deeply and can approach this cap on broad/popular queries, though very narrow queries will exhaust their real result set first.",
                        "default": 60
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
