# BOL.com Marketplace Seller Leads Scraper: Offers and Monitoring (`getascraper/bol-com-seller-leads-scraper`) Actor

Collect public BOL.com seller leads from category and product pages. Export shop names, seller IDs, offer prices, EANs, ratings, product context, and change events to Apify datasets, CSV, JSON, or API workflows. Start at $3.50 per 1,000 rows without browser automation or external email enrichment.

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

## Pricing

from $2.63 / 1,000 seller leads

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## 🛒 BOL.com Marketplace Seller Leads Scraper: Offers and Monitoring

<table width="100%">
<tr>
<td style="padding:24px 28px;background:#EAF2F8;border:1px solid #AED6F1;border-top:4px solid #2874A6;border-radius:12px">
<span style="font-size:23px;font-weight:800;color:#123B56;line-height:1.3">Know who sells on BOL.com, without opening a single seller page</span><br>
<span style="font-size:15px;color:#3D5A6C;line-height:1.6">Turn public BOL product and category pages into a clean list of marketplace sellers, with their offer prices, ratings, and EANs beside each one.</span>
</td>
</tr>
</table>

<table width="100%">
<tr>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #AED6F1;border-radius:10px 0 0 10px;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#2874A6">🏪 Seller identity</span><br>
<span style="font-size:12px;color:#3D5A6C">Shop name, seller ID, and a profile reference on every lead.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #AED6F1;border-left:none;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#2874A6">💶 Offer context</span><br>
<span style="font-size:12px;color:#3D5A6C">Visible price, currency, availability, and offer count for the product.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #AED6F1;border-left:none;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#2874A6">🏷️ Product signals</span><br>
<span style="font-size:12px;color:#3D5A6C">Brand, EAN, rating, and review count when BOL shows them.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #AED6F1;border-left:none;border-radius:0 10px 10px 0;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#2874A6">🔄 Change tracking</span><br>
<span style="font-size:12px;color:#3D5A6C">Repeat runs return only new or updated sellers.</span>
</td>
</tr>
</table>

Find **BOL.com verkopers** (marketplace sellers) from public product, category, and sitemap pages. Export shop names, seller IDs, ratings, offer prices, and EANs to a spreadsheet, JSON, or your own workflow. No login, no email enrichment.

### 🔍 What does this Actor do?

Paste a public BOL category, product, or sitemap URL. The Actor opens a limited number of product pages from it and reads every seller shown next to the offers.

The same seller often appears on many products. The Actor merges those sightings into one lead row, so your list has no duplicates.

A seller profile link is kept as a reference for you to open yourself. The Actor does not visit it. Nothing is collected from outside BOL, and no hidden contact details are added.

### 💡 Who is this for?

- **I am a marketplace analyst.** I need to see which shops compete on a product category so that I can size up the field before I recommend a listing strategy.
- **I am a sourcing manager at a brand.** I need a list of the sellers carrying my EANs so that I can spot unauthorized resellers and price undercutting.
- **I am an ecommerce researcher.** I need seller, price, and rating data in flat columns so that I can drop it straight into a spreadsheet.
- **I am a wholesaler looking for retail partners.** I need to know which shops are active in a niche so that I can build a prospect list without browsing seller pages by hand.

### 🚀 How to use it

<table width="100%">
<tr>
<td style="padding:16px 14px;width:33%;background:#EAF2F8;border:1px solid #AED6F1;border-radius:10px 0 0 10px;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#2874A6;letter-spacing:1px">STEP 1</span><br>
<span style="font-size:14px;font-weight:700;color:#123B56">Choose a source</span><br>
<span style="font-size:12px;color:#3D5A6C">Paste a public BOL category, product, or sitemap URL.</span>
</td>
<td style="padding:16px 14px;width:33%;background:#EAF2F8;border:1px solid #AED6F1;border-left:none;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#2874A6;letter-spacing:1px">STEP 2</span><br>
<span style="font-size:14px;font-weight:700;color:#123B56">Set your limits</span><br>
<span style="font-size:12px;color:#3D5A6C">Pick how many sellers, products, and pages you want.</span>
</td>
<td style="padding:16px 14px;width:33%;background:#EAF2F8;border:1px solid #AED6F1;border-left:none;border-radius:0 10px 10px 0;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#2874A6;letter-spacing:1px">STEP 3</span><br>
<span style="font-size:14px;font-weight:700;color:#123B56">Export your leads</span><br>
<span style="font-size:12px;color:#3D5A6C">Download seller rows, or schedule runs to see only what changed.</span>
</td>
</tr>
</table>

The smallest useful run starts with one public product URL:

```json
{
    "startUrls": [
        {
            "url": "https://www.bol.com/nl/nl/p/lattafa-khamrah-edp-100ml-unisex/9300000127460781/"
        }
    ],
    "includeProductContext": true,
    "maxSellers": 10
}
```

For a category export, paste a public URL such as `https://www.bol.com/nl/nl/l/damesparfums/12429/`.

If `startUrls` is empty, the Actor uses a small women's fragrance category sample for the selected storefront. Search result URLs are not accepted.

### 🧾 Input

| Field | Type | Required | Description |
| --- | --- | :---: | --- |
| `startUrls` | array of URLs | No | Public BOL category, product, or sitemap URLs. These replace the default category source. |
| `store` | enum | No | `nl`, `be`, or `both` for the default category source. |
| `includeProductContext` | boolean | No | Adds product title, brand, EAN, price, availability, offer count, rating, and review count when visible. |
| `runMode` | enum | No | `snapshot` returns all unique sellers. `changes` returns new and updated sellers only. |
| `maxSellers` | integer | No | Maximum unique seller rows. The default is 5 and the maximum is 250. |
| `maxProductsPerSource` | integer | No | Maximum product pages opened from each source. The default is 10 and the maximum is 50. |
| `maxPages` | integer | No | Maximum category pages followed from each category source. The default is 3 and the maximum is 20. |
| `requestDelayMs` | integer | No | Pause between page requests, in milliseconds. The default is 1000. |
| `proxyConfiguration` | object | No | Optional connection settings. The default suits the allowed public pages. |

### 📊 Data table

| Field | Type | Description |
| --- | --- | --- |
| `rowType` | string | Record type, currently `seller`. |
| `shopName` | string | Seller shop name shown next to the offer. |
| `sellerId` | string | BOL seller ID when a public offer link shows it. |
| `sellerUrl` | URL | Seller profile reference found on the product page. It is not opened. |
| `storefrontUrl` | URL | Canonical seller profile reference. |
| `rating` | number | Seller rating when BOL shows it beside the offer. |
| `productId` | string | BOL product identifier. |
| `productTitle` | string | Product title when product context is on. |
| `productBrand` | string | Product brand when product context is on. |
| `productEan` | string | EAN when product context is on. |
| `productPrice` | number | Visible offer price when product context is on. |
| `productCurrency` | string | Offer currency when product context is on. |
| `productAvailability` | string | Visible offer availability when product context is on. |
| `offerCount` | number | Number of offers listed for the product. |
| `productRating` | number | Product rating when product context is on. |
| `productReviewCount` | number | Product review count when product context is on. |
| `productUrl` | URL | Public product page that showed the seller. |
| `discoveredVia` | string | Discovery source, currently `product-page`. |
| `sourceUrl` | URL | Public page used for the record. |
| `scrapedAt` | date-time | Time the row was collected. |
| `changeType` | string | `new` or `updated` in changes mode. |
| `changedFields` | string | Comma-separated fields that changed. |
| `firstSeenAt` | date-time | First time the seller was seen in changes mode. |
| `lastSeenAt` | date-time | Latest time the seller was seen in changes mode. |

Fields BOL does not show are left out. The Actor never fills in placeholder values.

### 🗂️ Dataset views

The dataset has three ready-made views:

1. **🔍 Seller leads:** shop identity, seller references, rating, source product, and collection time.
2. **📇 Trader details:** seller identity beside product, offer, EAN, rating, and review context.
3. **🔄 Changes:** new or updated sellers with timestamps and the fields that changed.

### 💰 Pricing

This Actor uses pay-per-event pricing: you pay per seller row delivered. Empty runs cost nothing, and there is no subscription. There is no separate startup or enrichment charge.

### ⭐ Enjoying BOL.com Marketplace Seller Leads Scraper?

<table width="100%" style="display:table;width:100%">
<tr>
<td style="padding:14px 16px;background:#EAF2F8;border:1px solid #AED6F1;border-radius:10px 0 0 0;color:#123B56;font-size:15px">
<span style="color:#F5B301;font-size:18px">★★★★★</span> &nbsp;If the dataset saves you research time, a short review helps other sellers and analysts find it.
</td>
</tr>
<tr>
<td style="padding:12px 16px;background:#2874A6;border:1px solid #2874A6;border-radius:0 0 10px 10px;text-align:center">
<a href="https://apify.com/getascraper/bol-com-seller-leads-scraper/reviews" style="color:#FFFFFF;font-weight:800;font-size:15px">Leave a review and tell us which seller fields you want next</a>
</td>
</tr>
</table>

### 🔧 Tips

- Start with `maxSellers` at 5 to check the output, then raise it once the fields look right.
- Turn on `includeProductContext` when you need EANs or prices next to each seller.
- Use `changes` in `runMode` on a schedule to see only new and updated sellers.
- Set `store` to `both` to cover the Netherlands and Belgium in one run when you rely on the default source.
- Keep `requestDelayMs` at 1000 or higher for steady runs on larger categories.

### ❓ FAQ

#### Can I paste a BOL search URL?

No. BOL's published crawler rules exclude search pages. Use a public category, product, or sitemap URL instead.

#### Waar kan ik bol.com verkopers vinden?

Paste a public bol.com category or product URL into `startUrls`. Each run returns the verkopers (sellers) shown on those products, with shop name, seller ID, and rating. The answer and the output are in English.

#### Does it open seller profile pages?

No. Seller profile links are kept as references when they appear on an allowed product page. You can open them yourself.

#### Why did a run return zero rows?

Check `RUN_SUMMARY` in the run's key-value store. `source-access-blocked` means BOL did not serve the pages to that run, so try again later. `no-seller-offers-found` means the pages you chose showed no seller offers within your limits.

#### How does changes mode work?

The Actor remembers the seller details from the last run of the same source setup. A repeat run returns only sellers that are new or have changed.

### 🛡️ Limits and data boundaries

The Actor requests only public HTTPS BOL category (`/l/`), product (`/p/`), and sitemap pages. BOL's published rules exclude search, seller storefronts, product and price overviews, accounts, orders, and private routes. The Actor does not request any of them.

It does not log in, visit seller websites, or look for hidden contact details. Pages that do not load normally are never saved as data. Use the data in line with BOL's terms and the privacy rules that apply to you.

### 🔗 Other actors

- [🔎 Kaufland seller scraper for public marketplace seller leads](https://apify.com/getascraper/kaufland-sellers-scraper) ↗ - Find public Kaufland marketplace seller information.
- [🛍️ Skroutz seller offers: Greek price monitor and Σκρουτζ changes](https://apify.com/getascraper/skroutz-seller-intelligence-scraper) ↗ - Monitor seller offers and changes on Skroutz.
- [🛍️ Mercari Seller Scraper: Shop Listings, Ratings & Item History](https://apify.com/getascraper/mercari-seller-scraper) ↗ - Collect seller listings and marketplace signals from Mercari.
- [Bizi.si Slovenia Scraper: Slovenska podjetja for Business Leads](https://apify.com/getascraper/bizi-si-business-scraper) ↗ - Build public Slovenian company lead lists.
- [🚗 2dehands Cars Scraper: Tweedehandse auto's](https://apify.com/getascraper/2dehands-cars-scraper) ↗ - Collect public marketplace listings and seller context from 2dehands.

# Changelog

This Actor's version history is a separate document: https://apify.com/getascraper/bol-com-seller-leads-scraper/changelog.md

# Actor input Schema

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

Optional public BOL category (/l/), product (/p/), or sitemap URL(s). When supplied, these replace the default product category source. BOL search (/s/), seller (/v/), product-overview (/w/), price-overview, account, and API URLs are rejected because they are disallowed by BOL's public robots policy.

## `store` (type: `string`):

Select the storefront used when the default category source is created. This does not override explicit Start URLs.

## `includeProductContext` (type: `boolean`):

Add the product title, product ID, visible offer price, currency, and product URL from the allowed product page that exposed the seller. Seller rows are still emitted without this optional context.

## `runMode` (type: `string`):

Snapshot emits every unique seller discovered in this run. Changes compares public source fields with persistent state and emits only new or updated sellers.

## `maxSellers` (type: `integer`):

Maximum number of unique seller rows to emit. The Actor stops adding new sellers after this cap.

## `maxProductsPerSource` (type: `integer`):

Maximum total product detail pages followed from each category or sitemap source. More product pages expose more seller offers but cost more requests.

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

Maximum category pagination pages followed for each category source. Sitemap sources and direct product URLs use one source page.

## `requestDelayMs` (type: `integer`):

Minimum delay between serialized HTTP requests. A delay of 1000 ms is the default for source courtesy and lower block risk.

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

Supported Apify proxy routing. The default UNBLOCKER group is used only for public BOL pages and does not solve CAPTCHAs or access robots-disallowed routes. Disable it only if your own network can fetch BOL successfully.

## Actor input object example

```json
{
  "startUrls": [],
  "store": "nl",
  "includeProductContext": false,
  "runMode": "snapshot",
  "maxSellers": 5,
  "maxProductsPerSource": 10,
  "maxPages": 3,
  "requestDelayMs": 1000,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "UNBLOCKER"
    ]
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `runSummary` (type: `string`):

No description

## `monitorState` (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": [],
    "store": "nl",
    "includeProductContext": false,
    "runMode": "snapshot",
    "maxSellers": 5,
    "maxProductsPerSource": 10,
    "maxPages": 3,
    "requestDelayMs": 1000,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "UNBLOCKER"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("getascraper/bol-com-seller-leads-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 = {
    "startUrls": [],
    "store": "nl",
    "includeProductContext": False,
    "runMode": "snapshot",
    "maxSellers": 5,
    "maxProductsPerSource": 10,
    "maxPages": 3,
    "requestDelayMs": 1000,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["UNBLOCKER"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("getascraper/bol-com-seller-leads-scraper").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": [],
  "store": "nl",
  "includeProductContext": false,
  "runMode": "snapshot",
  "maxSellers": 5,
  "maxProductsPerSource": 10,
  "maxPages": 3,
  "requestDelayMs": 1000,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "UNBLOCKER"
    ]
  }
}' |
apify call getascraper/bol-com-seller-leads-scraper --silent --output-dataset

```

## MCP server setup

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

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/kU2SLNP3QJ3afO99i/builds/Hwgv4HX2cAirAyqh8/openapi.json
