# Bol.com Buy Box Scraper (`dariomory/bol-com-buy-box-scraper`) Actor

Unofficial Bol.com scraper for Buy Box prices, sellers, availability, ratings, delivery estimates, and product details by EAN.

- **URL**: https://apify.com/dariomory/bol-com-buy-box-scraper.md
- **Developed by:** [Dario Mory](https://apify.com/dariomory) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $15.00 / 1,000 buy box 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

## Bol.com Buy Box Scraper

> **Unofficial Actor.** This independent tool is not affiliated with, sponsored by, or endorsed by Bol.com.

Monitor the current winning Bol.com offer without running a browser. Add product URLs, Bol.com product IDs, or EAN/GTIN identifiers and receive structured Buy Box snapshots containing the seller, price, stock status, shipping cost, delivery estimate, rating, brand, and product metadata.

### Why use this Actor?

- Track Buy Box ownership and price changes across scheduled runs
- Monitor marketplace availability and delivery promises
- Resolve EAN/GTIN identifiers through Bol.com search
- Feed repricing, assortment, and competitive-intelligence workflows
- Export results as JSON, CSV, Excel, XML, RSS, or through the Apify API

The Actor reads Bol.com's server-rendered Product JSON-LD. It avoids browser automation, which keeps runs fast and inexpensive.

### Private mobile proxy failover

The Store input never asks customers for the owner's proxy credentials. When a private mobile proxy is configured in the Actor's encrypted environment, Bol.com requests run directly first and use the mobile proxy only after a failed attempt. This keeps normal runs inexpensive while providing a stronger recovery path for throttling and block pages.

Set exactly one private environment variable in Apify Console:

- `INTERNAL_MOBILE_PROXY_URL_TEMPLATE` — a full sticky-session proxy URL containing `{sessionId}`, for example `http://customer-session-{sessionId}:password@gateway.example:8000`
- `INTERNAL_MOBILE_PROXY_URLS` — either a JSON array of full proxy URLs or one URL per line

Do not place proxy credentials in Actor input, source control, README examples with real values, or datasets. The run log reports only whether an internal proxy was available and total response megabytes; it never logs the proxy URL.

### Input

Provide one or more of:

- `productUrls` — direct Bol.com product pages
- `productIds` — Bol.com product IDs such as `9300000184507095`
- `eans` — EAN-8, UPC, EAN-13, or GTIN-14 identifiers

Choose `NL`, `BE_NL`, or `BE_FR` with `marketplace`. Use `maxItems` to cap results. A proxy is optional and disabled by default.

```json
{
  "eans": ["8719514458666"],
  "marketplace": "NL",
  "maxItems": 10,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

### Output

```json
{
  "productId": "9300000184507095",
  "ean": "8719514458666",
  "requestedEan": "8719514458666",
  "title": "Philips Hue Play HDMI sync box 8k - zwart",
  "brand": "Philips Hue",
  "imageUrl": "https://media.s-bol.com/example.jpg",
  "canonicalUrl": "https://www.bol.com/nl/nl/p/example/9300000184507095/",
  "marketplace": "NL",
  "price": 304,
  "currency": "EUR",
  "availability": "InStock",
  "inStock": true,
  "seller": "bol",
  "itemCondition": "NewCondition",
  "shippingPrice": 0,
  "freeShipping": true,
  "deliveryMinDays": 1,
  "deliveryMaxDays": 1,
  "rating": 4.3,
  "reviewCount": 26,
  "categories": ["Wonen", "Verlichting"],
  "source": "Bol.com product page JSON-LD",
  "scrapedAt": "2026-07-29T12:00:00.000Z"
}
```

One record represents the Buy Box displayed for one product at one point in time. Schedule the Actor and compare datasets to detect changes.

### Pay-per-event pricing

Configure these events in Apify Console:

| Event name | Title | Description | Recommended price |
| --- | --- | --- | --- |
| `buy-box-result` | Buy Box result | One current Bol.com product Buy Box snapshot saved to the dataset. | `$0.015` |

Keep the automatically charged `apify-actor-start` event at `$0.00005`. Remove `apify-default-dataset-item` to prevent double charging.

For owner-funded proxies, calculate the minimum sustainable event price as:

`(Apify platform cost per result + mobile proxy cost per result + desired profit per result) / 0.80`

For bandwidth billing:

`mobile proxy cost per result = average proxied GB per successful result × provider price per GB × retry factor`

Because this Actor uses mobile proxy traffic only on retries, use the measured percentage of requests that require failover when calculating average proxied GB. Revisit the price after enough production runs have produced representative traffic measurements.

The `$0.015` price assumes Decodo mobile traffic at up to `$4/GB`, approximately 1.5 MB for a proxied EAN lookup, a 1.2 retry factor, and the conservative case where every successful result eventually requires mobile failover. After Apify's revenue share, Decodo bandwidth, and estimated platform usage, this leaves a positive margin instead of depending on a low block rate.

### Limits and failure modes

- Bol.com may return a block page after unusually high request volumes. Enable Apify Proxy if this happens.
- EAN resolution returns the first matching product from Bol.com search.
- Products without a purchasable offer can have `null` seller and price fields.
- Bol.com can change its structured markup; failed pages are retried and reported in the run log.

### API

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('dariomory/bol-com-buy-box-scraper').call({
    eans: ['8719514458666'],
    marketplace: 'NL',
    maxItems: 10,
});

console.log(run.defaultDatasetId);
```

This Actor is an independent data-extraction tool and is not affiliated with or endorsed by Bol.com.

# Actor input Schema

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

Direct Bol.com product detail page URLs.

## `productIds` (type: `array`):

Bol.com product IDs, such as 9300000184507095.

## `eans` (type: `array`):

EAN-8, UPC, EAN-13, or GTIN-14 values. The Actor resolves each identifier through Bol.com search.

## `marketplace` (type: `string`):

Choose the Bol.com country and language storefront.

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

Maximum number of unique Buy Box snapshots to save.

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

Optional Apify Proxy or custom proxy settings. Start without a proxy and enable one if Bol.com blocks your requests.

## Actor input object example

```json
{
  "productUrls": [
    {
      "url": "https://www.bol.com/nl/nl/p/product/9300000184507095/"
    }
  ],
  "marketplace": "NL",
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# 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 = {
    "productUrls": [
        {
            "url": "https://www.bol.com/nl/nl/p/product/9300000184507095/"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("dariomory/bol-com-buy-box-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 = { "productUrls": [{ "url": "https://www.bol.com/nl/nl/p/product/9300000184507095/" }] }

# Run the Actor and wait for it to finish
run = client.actor("dariomory/bol-com-buy-box-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 '{
  "productUrls": [
    {
      "url": "https://www.bol.com/nl/nl/p/product/9300000184507095/"
    }
  ]
}' |
apify call dariomory/bol-com-buy-box-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/AqM0dist9Q1HAEK9z/builds/mpjdnat7ghKNxJYrJ/openapi.json
