# Wehkamp Scraper (`unfenced-group/wehkamp-scraper`) Actor

Scrape products, prices and details from Wehkamp.nl, the largest Dutch online department store. Search by keyword or category, filter by price, brand, rating, discount and stock, and get EAN, specifications, variants and reviews. Fashion, home, electronics and more.

- **URL**: https://apify.com/unfenced-group/wehkamp-scraper.md
- **Developed by:** [Unfenced Group](https://apify.com/unfenced-group) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.39 / 1,000 product listings

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

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

## What's an Apify Actor?

Actors are 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

## Wehkamp Scraper

![Wehkamp Scraper](https://api.apify.com/v2/key-value-stores/lJlifu6C8YQfZMPKE/records/wehkamp-scraper)

Extract products from wehkamp.nl at scale, in a clean, consistent structure ready for price monitoring, market research, catalogue analysis and resale tooling. No API key required.

---

### Why this scraper?

#### 🎯 Built for wehkamp.nl
A dedicated Dutch scraper tuned for wehkamp.nl — its categories, price formats and currency (EUR), not a generic tool pointed at it.

#### 💶 Structured pricing
Current price as a clean number in EUR, plus discounts and previous prices where the source shows them. Items without a published price return `null`, never a guess.

#### 📦 Stock status
Availability on every record, so you can monitor stock and catch restocks.

#### 🤝 Seller and condition
Seller details and item condition in structured fields, ready for filtering.

#### ⭐ Review signals
Average rating and review count for every item that has them.

#### 📄 Full item content
Complete description and title for every record, with a direct link back to the source.

#### 🔁 Repost & change detection
Every record carries `isRepost` and `changeStatus`, so daily feeds return genuinely new items instead of reposted duplicates.

---

### Input parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `searchQuery` | string | `"laptop"` | Keyword to search on wehkamp.nl (e.g. "laptop", "nike schoenen"). Leave empty to use Start URLs or Category URLs instead. |
| `startUrls` | array | (empty) | Wehkamp listing, search or category page URLs to scrape directly. Pagination is followed automatically. |
| `categoryUrls` | array | (empty) | Wehkamp category/PLP URLs (e.g. https://www.wehkamp.nl/accessoires-brillen/). Same behaviour as Start URLs; provided separately for clarity. |
| `minPrice` | integer | (empty) | Only return products priced at or above this amount, in euros. |
| `maxPrice` | integer | (empty) | Only return products priced at or below this amount, in euros. |
| `brands` | array | (empty) | Only return products from these brands (case-insensitive exact match, e.g. "Nike", "Samsung"). |
| `minRating` | integer | (empty) | Only return products with an average rating at or above this value (0-5). |
| `onlyDiscounted` | boolean | `false` | Return only products currently on sale (scratch price higher than the selling price). |
| `inStockOnly` | boolean | `false` | Return only products that are currently in stock. |
| `excludeSponsored` | boolean | `false` | Skip sponsored / promoted product placements. |
| `sortBy` | string | `"relevance"` | Result ordering applied on the listing pages. |
| `maxItems` | integer | `1000` | Maximum number of products to return across all URLs. Hard ceiling for the run. |
| `maxPagesPerUrl` | integer | `20` | Maximum listing pages to follow per start/category/search URL (about 96 products per page). |
| `fetchDetails` | boolean | `false` | Visit each product page to add description, EAN, specifications, colour variants, full image gallery and review statistics. Slower and billed per detail. |
| `maxResults` | integer | `5` | Soft cap for quick test runs. Set to 0 to disable and use Max items instead. |

---

### Output schema

Every field below is present on every record. Fields the source does not publish for a given item are returned as `null` rather than omitted.

| Field | Type | Description |
|---|---|---|
| `productNumber` | string | Product number. |
| `title` | string | Item title as published. |
| `brand` | string | Brand as published. |
| `brandLine` | string | Brand line. |
| `url` | string | Direct link to the item. |
| `price` | number | Current price (null when no price is published). |
| `scratchPrice` | number | Scratch price. |
| `appPrice` | number | App price. |
| `currency` | string | Currency code of the price. |
| `onSale` | boolean | On sale. |
| `discountPercentage` | number | Discount percentage. |
| `rating` | number | Average review rating (null when there are no reviews). |
| `reviewCount` | number | Number of reviews on the source. |
| `inStock` | boolean | `true` when the item is in stock. |
| `itemsInStock` | number | Items in stock. |
| `availabilityText` | string | Availability text. |
| `colorCount` | number | Color count. |
| `isSponsored` | boolean | Is sponsored. |
| `labels` | array | Labels. |
| `imageUrl` | string | Image url. |
| `sizes` | array | Sizes. |
| `ean` | string | EAN barcode where published. |
| `articleType` | string | Article type. |
| `description` | string | Full item description in plain text. |
| `descriptionMarkdown` | string | Description markdown. |
| `color` | string | Color. |
| `material` | string | Material. |
| `materialComposition` | string | Material composition. |
| `category` | string | Category on the source. |
| `breadcrumbs` | array | Breadcrumbs. |
| `variants` | array | Variants. |
| `scrapedAt` | string | **With `fetchDetails: true`:** |
| `source` | string | Source. |
| `isRepost` | boolean | `true` when the listing is a repost of an earlier ad (detected by content hash). |
| `subtitle` | string | Subtitle. |
| `specifications.Merk` | string | Merk. |
| `specifications.Merklijn` | string | Merklijn. |
| `specifications.Stijlnaam` | string | Stijlnaam. |
| `specifications.Kleur` | string | Kleur. |
| `specifications.Materiaal samenstelling` | string | Materiaal samenstelling. |
| `specifications.Materiaal buitenkant` | string | Materiaal buitenkant. |
| `specifications.Materiaal voering` | string | Materiaal voering. |
| `specifications.Sluiting` | string | Sluiting. |
| `specifications.Leest` | string | Leest. |
| `specifications.Hoogte schoen` | string | Hoogte schoen. |
| `specifications.Hak- of zoolvorm` | string | Hak- of zoolvorm. |
| `specifications.Uitneembaar voetbed` | string | Uitneembaar voetbed. |
| `specifications.Materiaal binnenzool` | string | Materiaal binnenzool. |
| `specifications.Materiaal buitenzool` | string | Materiaal buitenzool. |
| `specifications.Eigenschappen zool` | string | Eigenschappen zool. |
| `specifications.Leveranciers artikelnummer` | string | Leveranciers artikelnummer. |
| `specifications.Leverancierskleur` | string | Leverancierskleur. |
| `condition` | string | Item condition as published (e.g. new, used). |
| `reviewStats.total` | number | Total. |
| `reviewStats.averageRating` | number | Average rating. |

#### Example record

```json
{
  "productNumber": "17490759",
  "title": "adidas Sportswear Technochaos 2000 mesh sneakers zwart/antraciet",
  "brand": "adidas",
  "brandLine": "adidas Sportswear",
  "url": "https://www.wehkamp.nl/adidas-sportswear-technochaos-2000-mesh-sneakers-zwart-antraciet-17490759/",
  "price": 51,
  "scratchPrice": 85,
  "appPrice": 51,
  "currency": "EUR",
  "onSale": true,
  "discountPercentage": 40,
  "rating": 4,
  "reviewCount": 1,
  "inStock": false,
  "itemsInStock": 0,
  "availabilityText": "morgen in huis",
  "colorCount": 0,
  "isSponsored": false,
  "labels": [
    "Sale"
  ],
  "imageUrl": "https://images.wehkamp.nl/i/wehkamp/17490759_pb_01/adidas-sportswear-technochaos-2000-mesh-sneakers-zwart-antraciet-17490759.jpg",
  "sizes": [
    "391",
    "400",
    "402",
    "411"
  ],
  "ean": "4068807093799",
  "articleType": "Sneaker",
  "description": "Deze adidas Sportswear sneaker is gebaseerd op de hardloopschoen Techonochaos 2000. De buitenkant is gemaakt van mesh met PU en de voering van mesh. Met vetersluiting, OrthoLite voetbed en platte zool …",
  "descriptionMarkdown": "Deze adidas Sportswear sneaker is gebaseerd op de hardloopschoen Techonochaos 2000. De buitenkant is gemaakt van mesh met PU en de voering van mesh. Met vetersluiting, OrthoLite voetbed en platte zool …",
  "color": "Zwart/antraciet",
  "material": "Mesh",
  "materialComposition": "Mesh-PU/voering: mesh/voetbed: EVA",
  "category": "Sneakers",
  "breadcrumbs": [
    "Shop",
    "Herenmode",
    "Schoenen",
    "Sneakers"
  ],
  "variants": [
    {
      "productNumber": "17490745",
      "value": "Ecru/donkerblauw/platina",
      "url": "https://www.wehkamp.nl/adidas-sportswear-technochaos-2000-mesh-sneakers-ecru-donkerblauw-platina-17490745/",
      "status": "normal",
      "imageUrl": "https://images.wehkamp.nl/i/wehkamp/17490745_pb_01/adidas-sportswear-technochaos-2000-mesh-sneakers-ecru-donkerblauw-pla …"
    },
    {
      "productNumber": "17532110",
      "value": "Ecru/donkergroen",
      "url": "https://www.wehkamp.nl/adidas-sportswear-technochaos-2000-mesh-sneakers-ecru-donkergroen-17532110/",
      "status": "normal",
      "imageUrl": "https://images.wehkamp.nl/i/wehkamp/17532110_pb_01/adidas-sportswear-technochaos-2000-mesh-sneakers-ecru-donkergroen-ecr …"
    },
    {
      "productNumber": "17490758",
      "value": "Grijsgroen/wit/zilver",
      "url": "https://www.wehkamp.nl/adidas-sportswear-technochaos-2000-mesh-sneakers-grijsgroen-wit-zilver-17490758/",
      "status": "normal",
      "imageUrl": "https://images.wehkamp.nl/i/wehkamp/17490758_pb_01/adidas-sportswear-technochaos-2000-mesh-sneakers-grijsgroen-wit-zilve …"
    },
    {
      "productNumber": "17532108",
      "value": "Wit/rood/platina",
      "url": "https://www.wehkamp.nl/adidas-sportswear-technochaos-2000-mesh-sneakers-wit-rood-platina-17532108/",
      "status": "normal",
      "imageUrl": "https://images.wehkamp.nl/i/wehkamp/17532108_pb_01/adidas-sportswear-technochaos-2000-mesh-sneakers-wit-rood-platina-wit …"
    }
  ],
  "scrapedAt": "2026-07-02T16:21:05.513Z",
  "source": "detail",
  "isRepost": false,
  "subtitle": "adidas Sportswear",
  "specifications": {
    "Merk": "adidas",
    "Merklijn": "adidas Sportswear",
    "Stijlnaam": "Technochaos",
    "Kleur": "Zwart/antraciet",
    "Materiaal samenstelling": "Mesh-PU/voering: mesh/voetbed: EVA",
    "Materiaal buitenkant": "Mesh met PU",
    "Materiaal voering": "Mesh",
    "Sluiting": "Veter",
    "Leest": "Normaal",
    "Hoogte schoen": "Laag",
    "Hak- of zoolvorm": "Platte zool",
    "Uitneembaar voetbed": "Ja",
    "Materiaal binnenzool": "EVA",
    "Materiaal buitenzool": "Rubber",
    "Eigenschappen zool": "Dempend",
    "Leveranciers artikelnummer": "JR7229",
    "Leverancierskleur": "CBLACK/CBLACK/IRONMT"
  },
  "condition": "NewCondition",
  "reviewStats": {
    "total": 1,
    "averageRating": 4
  }
}
````

***

### Examples

**Search for jurk:**

```json
{
  "searchQuery": "jurk",
  "maxItems": 100
}
```

**Cap the price:**

```json
{
  "searchQuery": "jurk",
  "maxItems": 100,
  "maxPrice": 24.5
}
```

**Scrape a specific search URL:**

```json
{
  "startUrls": [
    {
      "url": "https://www.wehkamp.nl/elektronica/"
    }
  ],
  "maxItems": 200
}
```

**Daily monitoring (run on a schedule):**

```json
{
  "searchQuery": "jurk",
  "maxItems": 500
}
```

Schedule this input to run once a day in the Apify Scheduler to track prices, stock and new items over time.

***

### 💰 Pricing

**$1.39 per 1,000 results** — you only pay for successfully retrieved products. Failed retries are never charged.

| Results | Cost |
|---|---|
| 100 | ~$0.14 |
| 1,000 | ~$1.39 |
| 10,000 | ~$13.90 |
| 100,000 | ~$139 |

> Flat-rate alternatives typically charge $29–$49/month regardless of usage.

Subscription tiers lower the rate further, down to $1.39 per 1,000 at the highest tier. Use the **Max results** cap in the input to control your spend exactly.

***

### Performance

| Run size | Typical time |
|---|---|
| 100 results | under 1 minute |
| 1,000 results | 2–4 minutes |
| 10,000 results | 20–35 minutes |

***

### Known limitations

- Some fields (brand, condition, shipping) are only returned when the seller or source publishes them — expect `null` on a share of records.
- Prices and stock change constantly; records reflect the moment of scraping.
- Very large result sets are bounded by the source's own paging limits.
- Items can sell or be withdrawn at any time, so a small share of URLs may expire shortly after scraping.

***

### Technical details

- **Source:** wehkamp.nl
- **Coverage:** everything the public search exposes, filterable via the input parameters above
- **Retry:** automatic retry on network errors with exponential backoff

***

### Need a custom scraper?

**[Unfenced Group](https://www.unfencedgroup.nl)** builds Apify actors for any website — for free.

If the site you need isn't in our portfolio yet, just ask. We scope, build, and publish it at no cost to you. You only pay for results — we absorb the compute and proxy costs ourselves. Same pay-per-result pricing, same quality, same standards as every actor in this portfolio.

**Get in touch:** [www.unfencedgroup.nl](https://www.unfencedgroup.nl)

# Actor input Schema

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

Keyword to search on wehkamp.nl (e.g. "laptop", "nike schoenen"). Leave empty to use Start URLs or Category URLs instead.

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

Wehkamp listing, search or category page URLs to scrape directly. Pagination is followed automatically.

## `categoryUrls` (type: `array`):

Wehkamp category/PLP URLs (e.g. https://www.wehkamp.nl/accessoires-brillen/). Same behaviour as Start URLs; provided separately for clarity.

## `minPrice` (type: `integer`):

Only return products priced at or above this amount, in euros.

## `maxPrice` (type: `integer`):

Only return products priced at or below this amount, in euros.

## `brands` (type: `array`):

Only return products from these brands (case-insensitive exact match, e.g. "Nike", "Samsung").

## `minRating` (type: `integer`):

Only return products with an average rating at or above this value (0-5).

## `onlyDiscounted` (type: `boolean`):

Return only products currently on sale (scratch price higher than the selling price).

## `inStockOnly` (type: `boolean`):

Return only products that are currently in stock.

## `excludeSponsored` (type: `boolean`):

Skip sponsored / promoted product placements.

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

Result ordering applied on the listing pages.

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

Maximum number of products to return across all URLs. Hard ceiling for the run.

## `maxPagesPerUrl` (type: `integer`):

Maximum listing pages to follow per start/category/search URL (about 96 products per page).

## `fetchDetails` (type: `boolean`):

Visit each product page to add description, EAN, specifications, colour variants, full image gallery and review statistics. Slower and billed per detail.

## `maxResults` (type: `integer`):

Soft cap for quick test runs. Set to 0 to disable and use Max items instead.

## Actor input object example

```json
{
  "searchQuery": "laptop",
  "startUrls": [],
  "categoryUrls": [],
  "brands": [],
  "onlyDiscounted": false,
  "inStockOnly": false,
  "excludeSponsored": false,
  "sortBy": "relevance",
  "maxItems": 1000,
  "maxPagesPerUrl": 20,
  "fetchDetails": false,
  "maxResults": 5
}
```

# Actor output Schema

## `results` (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 = {
    "searchQuery": "laptop"
};

// Run the Actor and wait for it to finish
const run = await client.actor("unfenced-group/wehkamp-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 = { "searchQuery": "laptop" }

# Run the Actor and wait for it to finish
run = client.actor("unfenced-group/wehkamp-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 '{
  "searchQuery": "laptop"
}' |
apify call unfenced-group/wehkamp-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Wehkamp Scraper",
        "description": "Scrape products, prices and details from Wehkamp.nl, the largest Dutch online department store. Search by keyword or category, filter by price, brand, rating, discount and stock, and get EAN, specifications, variants and reviews. Fashion, home, electronics and more.",
        "version": "9.9",
        "x-build-id": "FA9JamqvRyPWQnro4"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/unfenced-group~wehkamp-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-unfenced-group-wehkamp-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/unfenced-group~wehkamp-scraper/runs": {
            "post": {
                "operationId": "runs-sync-unfenced-group-wehkamp-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/unfenced-group~wehkamp-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-unfenced-group-wehkamp-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",
                "properties": {
                    "searchQuery": {
                        "title": "Search query",
                        "type": "string",
                        "description": "Keyword to search on wehkamp.nl (e.g. \"laptop\", \"nike schoenen\"). Leave empty to use Start URLs or Category URLs instead."
                    },
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "Wehkamp listing, search or category page URLs to scrape directly. Pagination is followed automatically.",
                        "default": [],
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "categoryUrls": {
                        "title": "Category URLs",
                        "type": "array",
                        "description": "Wehkamp category/PLP URLs (e.g. https://www.wehkamp.nl/accessoires-brillen/). Same behaviour as Start URLs; provided separately for clarity.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "minPrice": {
                        "title": "Minimum price (EUR)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only return products priced at or above this amount, in euros."
                    },
                    "maxPrice": {
                        "title": "Maximum price (EUR)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only return products priced at or below this amount, in euros."
                    },
                    "brands": {
                        "title": "Brands",
                        "type": "array",
                        "description": "Only return products from these brands (case-insensitive exact match, e.g. \"Nike\", \"Samsung\").",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "minRating": {
                        "title": "Minimum rating",
                        "minimum": 0,
                        "maximum": 5,
                        "type": "integer",
                        "description": "Only return products with an average rating at or above this value (0-5)."
                    },
                    "onlyDiscounted": {
                        "title": "Only discounted products",
                        "type": "boolean",
                        "description": "Return only products currently on sale (scratch price higher than the selling price).",
                        "default": false
                    },
                    "inStockOnly": {
                        "title": "In stock only",
                        "type": "boolean",
                        "description": "Return only products that are currently in stock.",
                        "default": false
                    },
                    "excludeSponsored": {
                        "title": "Exclude sponsored",
                        "type": "boolean",
                        "description": "Skip sponsored / promoted product placements.",
                        "default": false
                    },
                    "sortBy": {
                        "title": "Sort by",
                        "enum": [
                            "relevance",
                            "priceAsc",
                            "priceDesc",
                            "newest",
                            "rating",
                            "popular"
                        ],
                        "type": "string",
                        "description": "Result ordering applied on the listing pages.",
                        "default": "relevance"
                    },
                    "maxItems": {
                        "title": "Max items",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of products to return across all URLs. Hard ceiling for the run.",
                        "default": 1000
                    },
                    "maxPagesPerUrl": {
                        "title": "Max pages per URL",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum listing pages to follow per start/category/search URL (about 96 products per page).",
                        "default": 20
                    },
                    "fetchDetails": {
                        "title": "Fetch detail pages",
                        "type": "boolean",
                        "description": "Visit each product page to add description, EAN, specifications, colour variants, full image gallery and review statistics. Slower and billed per detail.",
                        "default": false
                    },
                    "maxResults": {
                        "title": "Max results (QA cap)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Soft cap for quick test runs. Set to 0 to disable and use Max items instead.",
                        "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
