# Kruidvat Scraper — Belgian Drugstore Products & Prices (`studio-amba/kruidvat-scraper`) Actor

Scrape products from Kruidvat.be, Belgium's biggest drugstore chain with 700+ locations. Beauty, personal care, baby products, health supplements, and household goods.

- **URL**: https://apify.com/studio-amba/kruidvat-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

## Kruidvat Scraper -- Belgian Drugstore Products, Prices & Deals

Scrape product data from Kruidvat.be -- Belgium's largest drugstore chain with over 700 locations. Get structured data on beauty products, personal care, baby items, health supplements, and household essentials at everyday low prices.

### What is Kruidvat Scraper?

Kruidvat is the dominant drugstore brand in Belgium and the Netherlands, owned by AS Watson Group. They stock thousands of products across beauty, personal care, health, baby, and household categories -- from EUR 1.99 shampoo to high-end skincare lines. Their aggressive promotions and "1+1 gratis" deals make price tracking especially valuable.

Who uses this scraper:

- **Price comparison platforms** -- Kruidvat sets the benchmark for drugstore pricing in the Benelux. Track their prices to power comparison features across beauty, health, and personal care.
- **Brand managers & manufacturers** -- Monitor how your products are priced and positioned at Belgium's biggest drugstore chain. Detect unauthorized discounting or track promotional cycles.
- **E-commerce competitors** -- If you run a pharmacy, beauty store, or health shop in Belgium, Kruidvat is your pricing floor. Know when they run promotions before your customers do.
- **Market researchers** -- Analyze Belgium's drugstore market: category sizes, price distributions, brand representation, and seasonal patterns.
- **Deal tracking & couponing** -- Kruidvat's frequent promotions (1+1, 2e halve prijs, 25% korting) create opportunities for deal-focused content and apps.

### What data does Kruidvat Scraper extract?

- 🧴 **Product name** -- full product title
- 🏷️ **Brand** -- Nivea, L'Oreal, Kruidvat eigen merk, Pampers, etc.
- 💰 **Current price** in EUR
- 💸 **Original price** -- before promotions
- 🔢 **EAN barcode** -- 13-digit product identifier
- 📦 **SKU** -- Kruidvat product number
- ✅ **Stock status** -- in stock or out of stock
- ⭐ **Customer rating** -- average review score
- 💬 **Review count** -- number of customer reviews
- 🖼️ **Product images** -- main and gallery images
- 📝 **Description** -- product details
- 📂 **Category breadcrumbs** -- full hierarchy (e.g., Haar > Shampoo > Droog haar)

### How to scrape Kruidvat.be

#### Search by keyword

The fastest way to find specific products:

```json
{
    "searchQuery": "shampoo",
    "maxResults": 100
}
````

#### Browse a category

Scrape an entire product category. Grab category URLs from kruidvat.be navigation:

```json
{
    "categoryUrl": "https://www.kruidvat.be/nl/haar/shampoo/c/20002",
    "maxResults": 200
}
```

#### Combine search with category

If a `categoryUrl` is provided, it takes priority. Otherwise the `searchQuery` is used.

**Tip:** Kruidvat's category tree is deep. Target leaf categories (like "Shampoo > Droog haar") for focused scraping, or parent categories (like "Haar") for broader coverage.

### Output

A realistic Kruidvat product record:

```json
{
    "name": "Andrélon Shampoo Levendig Lang",
    "brand": "Andrélon",
    "price": 3.49,
    "currency": "EUR",
    "url": "https://www.kruidvat.be/nl/andrelon-shampoo-levendig-lang/p/4305728",
    "scrapedAt": "2025-04-03T09:15:00.000Z",
    "originalPrice": 4.99,
    "ean": "8710447321942",
    "sku": "4305728",
    "inStock": true,
    "rating": 4.3,
    "reviewCount": 87,
    "imageUrl": "https://static.kruidvat.be/medias/product/4305728-front.jpg",
    "imageUrls": [
        "https://static.kruidvat.be/medias/product/4305728-front.jpg",
        "https://static.kruidvat.be/medias/product/4305728-back.jpg"
    ],
    "description": "Andrélon Shampoo Levendig Lang maakt je haar zacht en glanzend. Speciaal ontwikkeld voor lang haar dat snel dof en pluizig wordt.",
    "category": "Shampoo",
    "categories": ["Haar", "Shampoo"]
}
```

### How much does it cost?

| Scenario | Estimated cost |
|----------|---------------|
| 100 products (search) | ~$0.02 |
| 500 products (category) | ~$0.08 |
| 2,000 products (multiple categories) | ~$0.30 |
| Large catalog crawl | ~$0.50+ |

Kruidvat Scraper uses CheerioCrawler for lightweight, efficient scraping. No browser is launched, keeping costs low.

### Can I integrate?

Connect Kruidvat data to your tools:

- **Google Sheets** -- track Belgian drugstore prices in a spreadsheet
- **Webhooks** -- trigger alerts when promotions start or prices drop
- **Zapier / Make** -- build automated workflows around price changes
- **Slack** -- daily notifications on Kruidvat deals in specific categories
- **Amazon S3 / Google Cloud Storage** -- archive weekly pricing snapshots
- **PostgreSQL / MySQL** -- feed data into your analytics database

### Can I use it as an API?

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")

run = client.actor("studio-amba/kruidvat-scraper").call(run_input={
    "searchQuery": "zonnebrand",
    "maxResults": 50,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    price_info = f"EUR {item['price']}"
    if item.get('originalPrice'):
        price_info += f" (was EUR {item['originalPrice']})"
    print(f"{item['brand']} - {item['name']} -- {price_info}")
```

#### JavaScript

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

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

const run = await client.actor('studio-amba/kruidvat-scraper').call({
    searchQuery: 'zonnebrand',
    maxResults: 50,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach(item => {
    const sale = item.originalPrice ? ` (was EUR ${item.originalPrice})` : '';
    console.log(`${item.brand} - ${item.name} -- EUR ${item.price}${sale}`);
});
```

### FAQ

**Does this scrape Kruidvat Belgium or Netherlands?**
This scraper targets Kruidvat.be (Belgium). The Dutch site (kruidvat.nl) has a different URL structure and product catalog.

**Can I track promotions like "1+1 gratis"?**
The scraper captures `originalPrice` when a product is on promotion. The specific promotion type (1+1, 2e halve prijs, etc.) is reflected in the price difference but not as a separate field.

**How do I find the right category URL?**
Browse kruidvat.be, navigate to the category you want, and copy the URL from your browser's address bar. Category URLs follow the pattern `/nl/{category}/c/{code}`.

**What language is the data in?**
Product data comes in Dutch (Nederlands), matching the Belgian Dutch language version of the site.

**How often do Kruidvat prices change?**
Kruidvat runs weekly promotions (folder deals). Scraping weekly on Monday or Tuesday captures the new promotion cycle. Daily scraping catches flash deals.

**Are Kruidvat's own-brand products included?**
Yes. Kruidvat eigen merk products appear in results like any other brand.

### Limitations

- The scraper targets kruidvat.be (Belgium). kruidvat.nl (Netherlands) is a separate site not covered by this scraper.
- Product data is extracted from HTML. If Kruidvat changes their page structure, some fields may temporarily return empty.
- Kruidvat's in-store promotions and member-only deals may differ from what appears online.
- Stock status reflects online availability, not individual store inventory.
- Very large category scrapes may take longer due to pagination and per-product detail page visits.

### Other retail and fashion scrapers

Build comprehensive Belgian and European retail intelligence:

- [ICI PARIS XL Scraper](https://apify.com/studio-amba/iciparisxl-scraper) -- Belgian beauty and perfume (premium segment)
- [Rituals Scraper](https://apify.com/studio-amba/rituals-scraper) -- Luxury cosmetics and home fragrance
- [Action Scraper](https://apify.com/studio-amba/action-scraper) -- Pan-European discount retailer
- [Mytheresa Scraper](https://apify.com/studio-amba/mytheresa-scraper) -- Luxury fashion from 200+ designers
- [AS Adventure Scraper](https://apify.com/studio-amba/asadventure-scraper) -- Outdoor and adventure gear
- [Bergfreunde Scraper](https://apify.com/studio-amba/bergfreunde-scraper) -- Climbing and hiking equipment
- [Intersport Scraper](https://apify.com/studio-amba/intersport-scraper) -- European sports retail
- [Helly Hansen Scraper](https://apify.com/studio-amba/hellyhansen-scraper) -- Outdoor and sailing apparel

### Your feedback

Found an issue or want a new feature? Let us know through the Apify Store actor page. We fix bugs quickly and actively maintain this scraper.

# Actor input Schema

## `categoryUrl` (type: `string`):

A Kruidvat.be category page URL to scrape. Example: https://www.kruidvat.be/nl/haar/shampoo/c/20002

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

Search for products by keyword. Used if no categoryUrl is provided.

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

Maximum number of products to return.

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

Proxy settings for better reliability on large runs.

## Actor input object example

```json
{
  "categoryUrl": "https://www.kruidvat.be/nl/search?q=shampoo",
  "searchQuery": "shampoo",
  "maxResults": 100
}
```

# 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 = {
    "categoryUrl": "https://www.kruidvat.be/nl/search?q=shampoo",
    "searchQuery": "shampoo"
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/kruidvat-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 = {
    "categoryUrl": "https://www.kruidvat.be/nl/search?q=shampoo",
    "searchQuery": "shampoo",
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/kruidvat-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 '{
  "categoryUrl": "https://www.kruidvat.be/nl/search?q=shampoo",
  "searchQuery": "shampoo"
}' |
apify call studio-amba/kruidvat-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Kruidvat Scraper — Belgian Drugstore Products & Prices",
        "description": "Scrape products from Kruidvat.be, Belgium's biggest drugstore chain with 700+ locations. Beauty, personal care, baby products, health supplements, and household goods.",
        "version": "0.1",
        "x-build-id": "IYvpOUCdHv0RTCfzZ"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/studio-amba~kruidvat-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-studio-amba-kruidvat-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~kruidvat-scraper/runs": {
            "post": {
                "operationId": "runs-sync-studio-amba-kruidvat-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~kruidvat-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-studio-amba-kruidvat-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": {
                    "categoryUrl": {
                        "title": "Category URL",
                        "type": "string",
                        "description": "A Kruidvat.be category page URL to scrape. Example: https://www.kruidvat.be/nl/haar/shampoo/c/20002"
                    },
                    "searchQuery": {
                        "title": "Search Query",
                        "type": "string",
                        "description": "Search for products by keyword. Used if no categoryUrl is provided."
                    },
                    "maxResults": {
                        "title": "Max Results",
                        "minimum": 1,
                        "maximum": 50000,
                        "type": "integer",
                        "description": "Maximum number of products to return.",
                        "default": 100
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Proxy settings for better reliability on large runs."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
