# Coolblue Scraper — Belgian & Dutch Electronics & Appliances (`studio-amba/coolblue-scraper`) Actor

Scrape products from Coolblue.be — Belgium and Netherlands' top-rated electronics retailer. Get prices, reviews, specs, and detailed product comparisons.

- **URL**: https://apify.com/studio-amba/coolblue-scraper.md
- **Developed by:** [Jelle Desramaults](https://apify.com/studio-amba) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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

## Coolblue Scraper - Products & Prices from the Benelux's Top Electronics Retailer 🧊

Extract product data, prices, expert reviews, specifications, and stock availability from [Coolblue.be](https://www.coolblue.be) — the highest-rated consumer electronics retailer in Belgium and the Netherlands, famous for same-day delivery and "anything for a smile."

### What is Coolblue Scraper? 🔍

Coolblue Scraper collects structured product data from Coolblue's Belgian webshop. It navigates category pages, follows pagination, and visits individual product detail pages to extract rich JSON-LD structured data — including brand, pricing, availability, customer ratings (normalized from Coolblue's 1-10 scale to a standard 0-5), and full breadcrumb categories.

Coolblue is not your average electronics retailer. With 2.5+ billion EUR in annual revenue across Belgium and the Netherlands, 10,000+ employees, and a fanatical focus on customer experience, they're the Amazon-proof success story of Benelux e-commerce. Their product data is curated — expert reviews, clear comparison tools, and detailed specs make their catalog one of the highest-quality data sources for Belgian electronics market analysis.

**Popular use cases:**

- 💰 **Price monitoring** — Coolblue often has exclusive bundle deals and "Coolblue's keuze" recommendations at special prices. Track these alongside standard pricing to spot the best deals in real-time.
- 📊 **Competitor intelligence** — Coolblue competes head-to-head with Vanden Borre and Krefel in Belgium. Compare product overlap, pricing strategies, and promotional timing across all three.
- 🏷️ **MAP enforcement & brand protection** — Match products by EAN/GTIN across Belgian retailers to monitor Minimum Advertised Price compliance. Coolblue's JSON-LD schema provides clean GTIN-13 barcodes.
- 🔬 **E-commerce research** — Study how Coolblue structures product data, categories, and pricing. Their data quality is a benchmark for Belgian e-commerce.
- ⭐ **Review analysis** — Coolblue's 1-10 rating system with detailed reviews provides valuable customer sentiment data for consumer electronics in the Belgian market.

### What data does Coolblue Scraper extract? 📋

When `scrapeDetails` is enabled (default), each product includes:

- 🏷️ **name** — Product name from Coolblue's JSON-LD schema
- 🏭 **brand** — Manufacturer name (Samsung, Apple, LG, Dyson, etc.)
- 💶 **price** — Current selling price in EUR
- 💸 **originalPrice** — Pre-discount price (from listing page, when available)
- 🔢 **sku** — Coolblue's product SKU
- 🆔 **productId** — Coolblue's internal product ID (from URL)
- ✅ **inStock** — Availability based on schema.org stock status
- ⭐ **rating** — Customer rating normalized to 0-5 scale (Coolblue uses 1-10 internally)
- 💬 **reviewCount** — Total customer reviews
- 🖼️ **imageUrl** — Primary product image
- 🖼️ **imageUrls** — All available product images
- 📝 **description** — Full product description text
- 📁 **category** — Deepest category from breadcrumb trail
- 📁 **categories** — Full breadcrumb category tree as array
- 🚚 **deliveryInfo** — Delivery timeline info (when available from listing)
- 🌐 **url** — Canonical product URL on coolblue.be
- 🗣️ **language** — Data language (nl or fr)
- 🕐 **scrapedAt** — ISO timestamp of extraction

**Basic mode** (with `scrapeDetails` off) returns only listing-page data: name, price, originalPrice, imageUrl, productId, and reviewCount. Much faster for price-only monitoring.

### How to scrape Coolblue.be 🚀

#### Option 1: Search by keyword

Set `searchQuery` to any product name or keyword. Coolblue redirects searches to category filter pages, and the scraper follows automatically.

**Examples:** `"Samsung Galaxy S25"`, `"stofzuiger"`, `"koptelefoon"`, `"vaatwasser"`, `"gaming laptop"`

#### Option 2: Browse categories

Provide Coolblue category filter URLs. Use the `/filter` variant for product listings:

- `https://www.coolblue.be/nl/laptops/filter` — All laptops
- `https://www.coolblue.be/nl/televisies/filter` — All TVs
- `https://www.coolblue.be/nl/smartphones/filter` — All smartphones
- `https://www.coolblue.be/nl/wasmachines/filter` — All washing machines
- `https://www.coolblue.be/fr/aspirateurs/filter` — All vacuum cleaners (French)

You can also provide direct product URLs to scrape individual items.

#### Option 3: Fast listing mode

Set `scrapeDetails` to `false` for quick price sweeps. The scraper will extract basic data (name, price, image) from listing pages only, skipping individual product visits. This is 5-10x faster.

#### Input parameters

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `searchQuery` | String | — | Keyword search (Coolblue redirects to category results) |
| `categoryUrls` | Array | — | Category filter page URLs to scrape |
| `maxResults` | Integer | 100 | Maximum products to return (up to 100,000) |
| `maxPages` | Integer | 5 | Max pagination pages per category (~22 products/page) |
| `scrapeDetails` | Boolean | `true` | Visit product pages for full data (slower but richer) |
| `language` | Enum | `nl` | `nl` (Nederlands) or `fr` (Francais) |
| `proxyConfiguration` | Object | — | Proxy settings for reliability |

**Tips:**
- Coolblue uses AWS WAF for bot protection. The scraper handles this with browser-like headers, but proxies help for large runs.
- Each listing page contains roughly 22 products. With `maxPages: 5`, you get up to ~110 products per category.
- For big catalog dumps, increase `maxPages` to 50-100 and set a high `maxResults`.
- The `scrapeDetails` toggle is your speed/depth tradeoff. Off = 5x faster but basic data only. On = full specs, ratings, and descriptions.

### Output 📦

Here is realistic example output from Coolblue.be:

```json
[
  {
    "name": "Samsung Crystal UHD 50CU7170 (2024)",
    "brand": "Samsung",
    "price": 429,
    "currency": "EUR",
    "originalPrice": 499,
    "sku": "933847",
    "productId": "933847",
    "inStock": true,
    "rating": 4.28,
    "reviewCount": 186,
    "imageUrl": "https://image.coolblue.be/transparent/max/500xauto/products/933847",
    "imageUrls": [
      "https://image.coolblue.be/transparent/max/500xauto/products/933847",
      "https://image.coolblue.be/transparent/max/500xauto/products/933847-2",
      "https://image.coolblue.be/transparent/max/500xauto/products/933847-3"
    ],
    "description": "Met de Samsung Crystal UHD 50CU7170 kijk je in 4K UHD naar films en series. Dankzij de Crystal Processor 4K worden kleuren nauwkeurig weergegeven en wordt het beeld automatisch opgeschaald naar 4K kwaliteit.",
    "category": "Televisies",
    "categories": ["Beeld", "Televisies"],
    "language": "nl",
    "url": "https://www.coolblue.be/nl/product/933847/samsung-crystal-uhd-50cu7170-2024.html",
    "scrapedAt": "2026-04-03T10:30:15.000Z"
  },
  {
    "name": "Apple MacBook Air 13 inch M4 16/256 Middernacht (2025)",
    "brand": "Apple",
    "price": 1199,
    "currency": "EUR",
    "sku": "942156",
    "productId": "942156",
    "inStock": true,
    "rating": 4.72,
    "reviewCount": 423,
    "imageUrl": "https://image.coolblue.be/transparent/max/500xauto/products/942156",
    "description": "Met de Apple MacBook Air 13 inch M4 16/256 GB Middernacht werk je soepel in meerdere programma's tegelijk. De M4-chip biedt genoeg kracht voor veeleisende taken zoals fotobewerking en video editing.",
    "category": "Laptops",
    "categories": ["Computers & Laptops", "Laptops", "Apple MacBook"],
    "language": "nl",
    "url": "https://www.coolblue.be/nl/product/942156/apple-macbook-air-13-inch-m4-16-256-middernacht-2025.html",
    "scrapedAt": "2026-04-03T10:30:18.000Z"
  },
  {
    "name": "Dyson V15 Detect Absolute (2024)",
    "brand": "Dyson",
    "price": 699,
    "currency": "EUR",
    "originalPrice": 749,
    "sku": "938291",
    "productId": "938291",
    "inStock": true,
    "rating": 4.55,
    "reviewCount": 892,
    "imageUrl": "https://image.coolblue.be/transparent/max/500xauto/products/938291",
    "description": "De Dyson V15 Detect Absolute heeft een laserdiode die stofdeeltjes zichtbaar maakt op harde vloeren. Het LCD-scherm toont realtime het aantal en formaat van de opgezogen deeltjes.",
    "category": "Steelstofzuigers",
    "categories": ["Huishouden", "Stofzuigers", "Steelstofzuigers"],
    "language": "nl",
    "url": "https://www.coolblue.be/nl/product/938291/dyson-v15-detect-absolute-2024.html",
    "scrapedAt": "2026-04-03T10:30:21.000Z"
  }
]
````

### How much does it cost? 💰

Coolblue Scraper uses CheerioCrawler (HTTP-only, no browser) which keeps costs low. The cost depends mainly on whether you enable product detail scraping.

| Scenario | Products | Detail pages | Estimated cost | Time |
|----------|----------|-------------|---------------|------|
| Quick listing sweep | 100 | Off | ~$0.01 | ~10 sec |
| Category with details | 100 | On | ~$0.05 | ~1 min |
| Large category | 500 | On | ~$0.20 | ~5 min |
| Multi-category dump | 2,000 | On | ~$0.70 | ~15 min |
| Price-only bulk run | 2,000 | Off | ~$0.05 | ~2 min |

The `scrapeDetails: false` mode is dramatically cheaper because it skips visiting individual product pages. Use it for price-only monitoring workflows.

### Can I integrate? 🔗

Coolblue Scraper connects to the full Apify integration ecosystem:

- **Apify API** — Trigger runs programmatically, stream results in real-time
- **Webhooks** — Notify your systems when scraping completes
- **Google Sheets** — Auto-export Coolblue product data for team access
- **Zapier / Make** — Build no-code automations triggered by new product data
- **Slack alerts** — Get notified when tracked product prices drop
- **Airbyte / BigQuery / Snowflake** — Stream to your data warehouse for analytics
- **Scheduled runs** — Set up daily price monitoring with Apify Schedules
- **Direct download** — CSV, JSON, XML, or Excel export from the Apify Console

### Can I use it as an API? 🔌

Use Coolblue Scraper as a Belgian electronics product API. Start runs, poll for results, and process data in your application.

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")

run = client.actor("studio-amba/coolblue-scraper").call(run_input={
    "searchQuery": "koptelefoon",
    "maxResults": 50,
    "scrapeDetails": True,
    "language": "nl",
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    rating = item.get("rating", "N/A")
    reviews = item.get("reviewCount", 0)
    print(f"{item['name']} — EUR {item['price']} ({rating}/5, {reviews} reviews)")
```

#### JavaScript

```javascript
import { ApifyClient } from "apify-client";

const client = new ApifyClient({ token: "YOUR_API_TOKEN" });

const run = await client.actor("studio-amba/coolblue-scraper").call({
  categoryUrls: [
    { url: "https://www.coolblue.be/nl/televisies/filter" },
  ],
  maxResults: 200,
  maxPages: 10,
  scrapeDetails: true,
  language: "nl",
});

const { items } = await client
  .dataset(run.defaultDatasetId)
  .listItems();

items.forEach((item) => {
  const discount = item.originalPrice
    ? ` (was EUR ${item.originalPrice})`
    : "";
  console.log(`${item.name} — EUR ${item.price}${discount}`);
});
```

### FAQ ❓

#### Why does Coolblue use a 1-10 rating scale?

It's a Dutch/Belgian convention (like school grades). The scraper automatically normalizes all ratings to a standard 0-5 scale so you can directly compare with other retailer data. A Coolblue score of 8.5/10 becomes 4.17/5.

#### What is the difference between detail mode and listing mode?

With `scrapeDetails: true` (default), the scraper visits each product's individual page to extract rich JSON-LD data: brand, description, SKU, full ratings, and image galleries. With `scrapeDetails: false`, it only parses the listing/filter pages — you get name, price, image, and product ID, but no brand, specs, or descriptions. Listing mode is 5-10x faster.

#### Can I scrape Coolblue.nl (Netherlands) too?

This actor targets Coolblue.be (Belgium). Coolblue's Dutch and Belgian sites share similar structures, but this scraper is configured for the Belgian domain. Contact us if you need a Dutch version.

#### How does Coolblue's anti-bot protection work?

Coolblue uses AWS WAF (Web Application Firewall). The scraper sends browser-like headers (User-Agent, Accept, Accept-Language) to pass WAF checks. This works reliably for normal usage. For very high-volume runs (1,000+ products), enabling Apify proxies adds an extra layer of reliability.

#### Can I scrape product reviews and detailed specifications?

The current version extracts the overall rating and review count. Full review text and detailed spec tables from product pages can be added in future versions. Let us know if this is important for your use case.

#### What are "Coolblue's keuze" products?

Coolblue marks certain products as "Coolblue's keuze" (Coolblue's choice) — their recommended pick in a category based on expert testing. These products often have special pricing. The scraper captures their standard catalog data.

### Limitations ⚠️

- **JavaScript-rendered content** — Some promotional banners and dynamic elements on Coolblue require JavaScript. The scraper uses HTTP-only CheerioCrawler for speed, which means some dynamic promotional pricing may not be captured.
- **Coolblue.nl** — This actor is configured for coolblue.be only. The Dutch site has a slightly different URL structure.
- **Spec tables** — Product detail pages contain detailed specification tables, but the current version focuses on JSON-LD data. Full spec extraction is planned.
- **WAF blocks** — AWS WAF may occasionally block requests during very aggressive scraping. Use Apify proxies and moderate concurrency for runs above 1,000 products.
- **Pagination limits** — Coolblue caps filter page pagination. Very large categories may not expose all products through pagination. Use search queries or multiple sub-category URLs to work around this.
- **Rating normalization** — Ratings are converted from a 1-10 scale to 0-5. Products with very few reviews may show slightly different normalized scores than expected.

### Other Belgian electronics scrapers 🇧🇪

Build a complete view of Belgian electronics pricing by combining Coolblue data with these companion scrapers:

- 🏪 **[Vanden Borre Scraper](https://apify.com/studio-amba/vandenborre-scraper)** — Belgium's #1 electronics chain (Fnac Darty group). Blazing-fast Algolia API scraper that dumps 13,000+ products with full specs in 60 seconds flat.
- 🛒 **[Krefel Scraper](https://apify.com/studio-amba/krefel-scraper)** — Belgium's #2 electronics retailer. Unique stock level data, EAN barcodes, and 30+ specs per product from Krefel's internal API.

Match products across all three retailers using EAN/GTIN barcodes to create the most comprehensive Belgian electronics price comparison dataset available.

### Your feedback 💬

Coolblue changes their site frequently — new designs, updated WAF rules, restructured categories. If you notice any data quality issues, missing fields, or broken runs, let us know immediately through the Apify Console or GitHub. We monitor and update this scraper actively to keep pace with Coolblue's changes.

# Actor input Schema

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

Coolblue category filter URLs to scrape. Use the /filter page for product listings (e.g., https://www.coolblue.be/nl/laptops/filter). You can also provide direct product URLs.

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

Search for products by name. Coolblue redirects searches to category pages, so this will follow the redirect and scrape matching results.

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

Maximum number of products to return.

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

Maximum number of pagination pages to scrape per category URL. Each page has ~22 products.

## `scrapeDetails` (type: `boolean`):

Visit each product page to get full details (description, specs, brand, rating). Slower but gives richer data. If false, only basic data from listing pages is returned.

## `language` (type: `string`):

Language for product data. Coolblue.be supports Dutch (nl) and French (fr).

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

Proxy settings. Coolblue uses AWS WAF but browser-like headers are usually sufficient without proxies.

## Actor input object example

```json
{
  "categoryUrls": [
    {
      "url": "https://www.coolblue.be/nl/laptops/filter"
    }
  ],
  "maxResults": 100,
  "maxPages": 5,
  "scrapeDetails": true,
  "language": "nl"
}
```

# 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 = {
    "categoryUrls": [
        {
            "url": "https://www.coolblue.be/nl/laptops/filter"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/coolblue-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 = { "categoryUrls": [{ "url": "https://www.coolblue.be/nl/laptops/filter" }] }

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/coolblue-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 '{
  "categoryUrls": [
    {
      "url": "https://www.coolblue.be/nl/laptops/filter"
    }
  ]
}' |
apify call studio-amba/coolblue-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Coolblue Scraper — Belgian & Dutch Electronics & Appliances",
        "description": "Scrape products from Coolblue.be — Belgium and Netherlands' top-rated electronics retailer. Get prices, reviews, specs, and detailed product comparisons.",
        "version": "0.1",
        "x-build-id": "1CddgERf6nYFKjkDy"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/studio-amba~coolblue-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-studio-amba-coolblue-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/studio-amba~coolblue-scraper/runs": {
            "post": {
                "operationId": "runs-sync-studio-amba-coolblue-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/studio-amba~coolblue-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-studio-amba-coolblue-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": {
                    "categoryUrls": {
                        "title": "Category URLs",
                        "type": "array",
                        "description": "Coolblue category filter URLs to scrape. Use the /filter page for product listings (e.g., https://www.coolblue.be/nl/laptops/filter). You can also provide direct product URLs.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "searchQuery": {
                        "title": "Search Query",
                        "type": "string",
                        "description": "Search for products by name. Coolblue redirects searches to category pages, so this will follow the redirect and scrape matching results."
                    },
                    "maxResults": {
                        "title": "Max Results",
                        "minimum": 1,
                        "maximum": 100000,
                        "type": "integer",
                        "description": "Maximum number of products to return.",
                        "default": 100
                    },
                    "maxPages": {
                        "title": "Max Pages per Category",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Maximum number of pagination pages to scrape per category URL. Each page has ~22 products.",
                        "default": 5
                    },
                    "scrapeDetails": {
                        "title": "Scrape Product Details",
                        "type": "boolean",
                        "description": "Visit each product page to get full details (description, specs, brand, rating). Slower but gives richer data. If false, only basic data from listing pages is returned.",
                        "default": true
                    },
                    "language": {
                        "title": "Language",
                        "enum": [
                            "nl",
                            "fr"
                        ],
                        "type": "string",
                        "description": "Language for product data. Coolblue.be supports Dutch (nl) and French (fr).",
                        "default": "nl"
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Proxy settings. Coolblue uses AWS WAF but browser-like headers are usually sufficient without proxies."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
