# Bol.com Product Scraper Netherlands (`mrdoe/bol-product-scraper-nl`) Actor

Scrape Bol.com products and extract prices, EAN/GTIN, brands, ratings, sellers, offers, images, availability, and product details. Supports search, category, and direct product URLs with structured product data.

- **URL**: https://apify.com/mrdoe/bol-product-scraper-nl.md
- **Developed by:** [MrDoe](https://apify.com/mrdoe) (community)
- **Categories:** E-commerce, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.77 / 1,000 results

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 web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

**Turn Bol.com listings into structured data in minutes** - no coding, no manual copy-pasting. Get price, brand, EAN/GTIN, ratings, seller, and dozens of other fields for any product listed on Bol.com, the Netherlands' largest online marketplace.

### What does Bol.com Product Scraper Netherlands do?

Bol.com Product Scraper Netherlands collects product data from [Bol.com](https://www.bol.com). Give it one or more search, category, or direct product URLs and it discovers every product listed, then visits each product's own page to pull price, brand, GTIN/EAN, dimensions, ratings, seller, and offer details from Bol.com's own structured product data.

### Why use Bol.com Product Scraper Netherlands?

- **Price monitoring** - track price, offer count, and lowest/highest offer for products over time.
- **Catalog enrichment** - pull GTIN/EAN, brand, dimensions, and weight into your own product database.
- **Competitor research** - see which sellers list a product, their price, and shipping terms.
- **Market research** - track ratings and review counts across a category.

### How to use Bol.com Product Scraper Netherlands

1. On [Bol.com](https://www.bol.com), search or browse to a category and copy the resulting URL, or copy a specific product's URL.
2. Paste it into **Start URLs** in the Input tab. Add as many as you like.
3. Set **Max items** / **Max pages** if you want to cap the run, or leave empty to collect everything the search returns.
4. Click **Start** and wait for the run to finish.
5. Open the **Dataset** tab to preview, filter, and export your results.

### Input

| Field                | Type    | Description                                                                                    |
| -------------------- | ------- | ---------------------------------------------------------------------------------------------- |
| `startUrls`          | Array   | Bol.com search, category, or direct product URLs. **Required.**                                |
| `maxItems`           | Integer | Maximum products to collect across all start URLs (default: unlimited).                        |
| `maxPages`           | Integer | Safety cap on result pages per start URL (default: unlimited).                                 |
| `useCache`           | Boolean | Skip products already collected by a previous run (default: `true`).                           |
| `proxyConfiguration` | Object  | Proxy settings. Residential proxy is used by default - Bol.com blocks non-residential traffic. |

Example input:

```json
{
    "startUrls": [{ "url": "https://www.bol.com/nl/nl/s/?searchtext=laptop" }],
    "maxItems": 200,
    "useCache": true
}
```

### Output

Each product is saved as one item in the dataset, for example:

```json
{
    "productId": "9300000229932049",
    "sku": "9300000229932049",
    "ean": "8721001992126",
    "brand": "GMR",
    "title": "Office Laptop 15.6 Inch Full HD - Intel N95 - 12GB DDR5 RAM - 512GB SSD - Windows 11 Pro",
    "category": "Windows laptops",
    "categoryPath": ["Computer", "Laptops", "Windows laptops"],
    "price": 389.63,
    "currency": "EUR",
    "availability": "InStock",
    "offerCount": 2,
    "lowestOffer": 389.63,
    "highestOffer": 429.39,
    "sellerName": "GMRpc.nl",
    "sellerType": "third-party",
    "rating": 4,
    "reviewCount": 21,
    "images": ["https://media.s-bol.com/...", "..."],
    "url": "https://www.bol.com/nl/nl/p/gmr-.../9300000229932049/",
    "source": "bol.com",
    "scrapedAt": "2026-08-21T00:00:00.000Z"
}
```

#### Field reference

| Field                                                                        | Description                                                          |
| ---------------------------------------------------------------------------- | -------------------------------------------------------------------- |
| `productId` / `sku`                                                          | Bol.com's product ID                                                 |
| `ean` / `gtin`                                                               | The product's barcode, where published                               |
| `brand`, `title`, `description`, `color`, `material`, `dimensions`, `weight` | Product identity and specifications                                  |
| `category`, `categoryPath`                                                   | Category breadcrumb                                                  |
| `price`, `currency`, `availability`                                          | This offer's price and stock status                                  |
| `offerCount`, `lowestOffer`, `highestOffer`                                  | How many sellers offer this product, and the price range across them |
| `sellerName`, `sellerType`, `shippingCost`, `freeShipping`                   | The seller behind this specific offer                                |
| `rating`, `ratingCount`, `reviewCount`                                       | Aggregate customer rating                                            |
| `images`                                                                     | Product photo URLs                                                   |
| `url`, `source`, `scrapedAt`                                                 | Provenance                                                           |

Fields with no public data for a given product are returned as `null` (or `[]`/`{}` for arrays/objects) - never fabricated or guessed.

### Detail-page enrichment

Bol.com's search and category pages don't expose structured product data in a form that can be reliably read - they're a client-rendered app with no stable markup hooks. This Actor uses them only to discover each product's own URL, then reads Bol.com's own structured product data (the same schema.org data Google uses for Shopping results) from each product's page. Every product in the output has been through this enrichment step - there is no listing-only mode for this Actor.

### Pagination

The Actor pages through each start URL's search/category results (~30 products per page) until a page returns no new products, `maxPages`, or `maxItems` - whichever comes first.

### Cache behavior

With `useCache` on (default), every successfully collected product's ID is stored permanently in the Actor's key-value store - no expiration, no TTL. Re-running the Actor with the same or overlapping start URLs will skip products already collected and only return new ones. Disable `useCache` to re-collect everything.

### Cost / performance

Bol.com's bot protection requires a real browser session (see Troubleshooting), so this Actor uses a headless browser with a residential proxy rather than plain HTTP requests. This makes it costlier per request than a pure-HTTP Actor; the permanent cache keeps repeat runs cheap by skipping already-collected products.

### Troubleshooting

**A run returns fewer products than expected, or some fail.** Bol.com's bot protection occasionally blocks even residential-proxy sessions on specific product pages. The Actor retries with a fresh session automatically; a small fraction of pages may still fail on a given run without stopping the rest of the run. Re-running later (with `useCache` on) will pick up anything missed without re-collecting what already succeeded.

**A run returns 0 products.** Make sure the default residential `proxyConfiguration` is enabled, and double check the start URL is a valid `bol.com/nl/nl/s/...`, `bol.com/nl/nl/l/...`, or `bol.com/nl/nl/p/...` URL copied directly from the site.

### FAQ / Disclaimer

**Is this legal?** This Actor only collects publicly visible product data. You are responsible for using the data in accordance with Bol.com's Terms of Service and applicable law in your jurisdiction.

**Found a bug or have a feature request?** Please use the Issues tab on this Actor's page - feedback directly shapes future updates.

# Actor input Schema

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

Bol.com search-result URLs (e.g. <code>bol.com/nl/nl/s/?searchtext=laptop</code>) or category URLs (<code>bol.com/nl/nl/l/...</code>), or direct product URLs (<code>bol.com/nl/nl/p/...</code>).

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

Maximum number of products to scrape across all start URLs. Leave empty to collect every product the search URLs return.

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

Safety cap on how many result pages to page through per start URL (~30 products per page). Leave empty to page through all results.

## `useCache` (type: `boolean`):

Skip products already collected by a previous run of this Actor (matched by Bol.com's product ID). The cache is stored permanently and never expires. Disable to re-collect everything.

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

Bol.com blocks datacenter IPs. Residential proxy is strongly recommended and enabled by default.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.bol.com/nl/nl/s/?searchtext=GMR+15.6+inch+Full+HD+laptop+Intel+N95"
    }
  ],
  "useCache": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "NL"
  }
}
```

# Actor output Schema

## `listings` (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 = {
    "startUrls": [
        {
            "url": "https://www.bol.com/nl/nl/s/?searchtext=GMR+15.6+inch+Full+HD+laptop+Intel+N95"
        }
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "NL"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("mrdoe/bol-product-scraper-nl").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 = {
    "startUrls": [{ "url": "https://www.bol.com/nl/nl/s/?searchtext=GMR+15.6+inch+Full+HD+laptop+Intel+N95" }],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "NL",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("mrdoe/bol-product-scraper-nl").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.bol.com/nl/nl/s/?searchtext=GMR+15.6+inch+Full+HD+laptop+Intel+N95"
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "NL"
  }
}' |
apify call mrdoe/bol-product-scraper-nl --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mrdoe/bol-product-scraper-nl"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/a1s1NBvOPzPc0mKfW/builds/3ZsgUMOWj1MdNVUpL/openapi.json
