# bol.com Product Scraper (`lowlanddata/bol-com-scraper`) Actor

bol.com is the online price the Netherlands and Belgium buy against, the number your own listing gets compared to. Rows carry price in cents, rating, review count, delivery promise, and a bol.com-vs-partner flag; details add EAN, brand and condition. No seller identity or reviewer data collected.

- **URL**: https://apify.com/lowlanddata/bol-com-scraper.md
- **Developed by:** [Lowland Data](https://apify.com/lowlanddata) (community)
- **Categories:** E-commerce, SEO tools, Automation
- **Features:** Limited permissions
- **Stats:** 7 total users, 3 monthly users, 94.4% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.40 / 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.
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 Product Scraper

bol.com is where the Netherlands and Belgium buy online, which makes it the price your own listing gets compared against. Checking that by hand means loading the search page, squinting at "1.049,-" and typing it somewhere.

The search comes back as rows: the promoted offer price on each tile parsed to cents, rating, review count, delivery promise, and a flag for whether bol.com itself or a marketplace partner is selling. Switch on details and every product carries its EAN barcode, brand, condition and availability, so you can join it to your own catalogue by barcode instead of matching titles.

**Live health record:** [lowlanddata.com/status/bol-com-scraper](https://lowlanddata.com/status/bol-com-scraper/) - 30-day success rate and daily canary results, failures included. Full input/output reference: [tool page](https://lowlanddata.com/tools/bol-com-scraper/).

**No personal data, ever.** This scraper is built GDPR-first: seller shop names, review texts and reviewer identities never appear in the output: not as an option you have to remember to switch off, but by design. The only seller information included is whether an offer comes from bol.com itself or from a marketplace partner. One honest edge: the listing's own text (title and description) is reproduced as the publisher wrote it. No person field is ever mapped, but if the publisher typed a name into their own prose, that text is in the row as published.

### Quick start (30 seconds)

1. Put what you'd type in the bol.com search box into **searchQuery**, e.g. `lego technic`.
2. Click **Start**. That's the whole minimum setup.
3. When the run finishes, open the dataset's **Overview** tab for a clean table, or **Export** it as CSV/Excel/JSON.

Optional knobs: a price band (`priceMinEur`/`priceMaxEur`), the Belgian storefront, and `scrapeDetails` for EAN barcodes and specs, and any input works on a daily Schedule.

### What you can build with it

- **Watch a product niche's price floor.** Run `searchQuery: "oled tv 55 inch"` with `priceMaxEur: 800` daily and chart `priceCents` over time. Every item carries the price already parsed to cents, no "1.049,-" string wrangling.
- **Build an EAN-keyed product feed.** With `scrapeDetails` on, each product ships its `ean` (GTIN-13), `brand`, `condition` and `availability`: join it against your own catalog or a competitor feed by barcode instead of fuzzy title matching.
- **Measure marketplace vs. bol.com share.** The `thirdPartySeller` flag tells you for any assortment which offers are fulfilled by bol.com and which come from partners: a market-structure snapshot no export button on the site will give you.
- **Feed an AI agent clean data.** Every field is structured, predictable and free of personal data, so an assistant or pipeline can consume it directly: no scrubbing, no compliance review before you store it.

### What you get

Each product is one dataset item:

```json
{
  "productId": "9300000119387570",
  "url": "https://www.bol.com/nl/nl/p/lego-technic-42151-bugatti-bolide/9300000119387570/",
  "title": "LEGO Technic Bugatti Bolide - 42151",
  "priceCents": 4499,
  "currency": "EUR",
  "ratingValue": 4.8,
  "reviewCount": 214,
  "snippet": "Bouw een schaalmodel van de Bugatti Bolide met opengaande vleugeldeuren en een W16-motor.",
  "deliveryText": "Op voorraad. Voor 23:59 uur besteld, morgen in huis",
  "thirdPartySeller": false,
  "imageUrl": "https://media.s-bol.com/example/550x626.jpg",
  "brand": "LEGO",
  "ean": "5702017424767",
  "condition": "NewCondition",
  "availability": "InStock",
  "variantCount": 0
}
```

With `scrapeDetails` enabled, each product page is opened once more for the structured-data block: `brand`, `ean`, `color`, `material`, `condition`, `availability` and `variantCount` come from there.

Field notes, so you know exactly what you are buying:

- `priceCents` is the price shown on the search page, in euro cents. A product whose tile shows no readable price carries `null`, and is excluded when you set a price filter, because it cannot prove it is in band.
- `ratingValue`/`reviewCount` are the aggregate score and count only. Review text and reviewer names are never collected.
- `deliveryText` is bol.com's own promise line, delivered verbatim (Dutch), e.g. "Op voorraad. Voor 23:59 uur besteld, morgen in huis".
- `thirdPartySeller` is `true` when the offer comes from a marketplace partner. The partner's name is never collected.
- `snippet` is the search-page description excerpt, not the full product description.
- Detail fields (`brand`, `ean`, `color`, `material`, `condition`, `availability`, `variantCount`) only appear with `scrapeDetails: true`; a product page without structured data yields `null` values rather than a failed run.

### How much does it cost to scrape bol.com?

$3.00 per 1,000 products delivered, pay-as-you-go, no subscription, and you pay per result rather than per hour. A run that finds nothing still costs the $0.005 actor start. In plain dollars:

- **100 products ≈ $0.30**: a daily niche watch.
- **500 products ≈ $1.50**: a solid assortment snapshot.
- **A 2,000-product crawl ≈ $6.00**: a full category, deduplicated.

The price is all-inclusive: your runs' platform usage, including the residential proxy, is covered by it. bol.com only answers requests from Benelux consumer networks, so the actor runs through a Netherlands residential proxy by default. A few hundred search results transfer well under 10 MB. `scrapeDetails` opens one extra page per product, so keep it for the runs where you need EANs and specs.

Free-plan runs are limited to a sample of 5 items, enough to evaluate the output format against your real query.

### Not technical? Let your AI assistant set it up

Copy this into ChatGPT, Claude or any AI assistant, fill in the one line, and follow the conversation:

```text
Help me set up the "bol.com Product Scraper" actor on Apify
(https://apify.com/lowlanddata/bol-com-scraper). Guide me one step at a time.

What I want to watch: [E.G. "prices of 55-inch OLED TVs under 800 euros"]

Guide me to:
1. Propose my input values: searchQuery (what I'd type in the bol.com search box),
   an optional priceMinEur/priceMaxEur band, storefront (bol.com/nl or bol.com/be),
   scrapeDetails if I need EAN barcodes, and maxItems.
2. Create a free Apify account (apify.com), open the actor page, paste the values
   into the Input form, and start a run.
3. Set up a daily Schedule in the Apify Console with the same input, plus an email
   or Slack integration so new results reach me automatically.
4. Show me how to export results as CSV/Excel, or read them from the API if I code.
5. If the results are what I wanted, remind me at the end to leave a quick rating on the actor page, and to report anything broken or missing on its Issues tab.
```

### Input

| Field                | Description                                                                                                                                                                                                                                                                                                                                                                                          |
| -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `searchQuery`        | What you'd type in the bol.com search box. Required, unless you only re-check products through `listingIds`.                                                                                                                                                                                                                                                                                         |
| `listingIds`         | Re-check products you already know instead of searching: product numbers (the digits at the end of every bol.com address, the `productId` of every row) or the products' full addresses, one per line. Each is read from its own page with the detail fields. A product that is gone from the site is skipped, named in the log and not billed. When given, the search fields are ignored. Up to 50. |
| `storefront`         | `bol.com/nl` (Netherlands, default) or `bol.com/be` (Belgium, Dutch). Assortment and prices can differ slightly.                                                                                                                                                                                                                                                                                     |
| `priceMinEur`        | Only include products costing at least this many euros.                                                                                                                                                                                                                                                                                                                                              |
| `priceMaxEur`        | Only include products costing at most this many euros.                                                                                                                                                                                                                                                                                                                                               |
| `scrapeDetails`      | Also open each product page for brand, EAN, colour, material, condition, availability and variant count. Slower.                                                                                                                                                                                                                                                                                     |
| `maxItems`           | Stop after this many products (default 200).                                                                                                                                                                                                                                                                                                                                                         |
| `proxyConfiguration` | Proxy settings; keep Apify proxy enabled.                                                                                                                                                                                                                                                                                                                                                            |

A run minimally needs a `searchQuery` or a list of `listingIds`; invalid combinations (like an inverted price band) fail immediately with the reason in the run's status message.

#### Re-checking products you already have

Put their numbers (or their addresses) into `listingIds` and nothing else: the run reads each product's own page on the chosen `storefront` and returns it in the shape a search result has - `productId`, `url`, `title`, `priceCents`, `currency`, `ratingValue`, `reviewCount`, `thirdPartySeller`, `imageUrl` - with every photo in `imageUrls` and the detail fields (`brand`, `ean`, `color`, `material`, `condition`, `availability`, `variantCount`) whether or not `scrapeDetails` is on. A price change shows up as a new `priceCents`; a product that is gone from the site is skipped, named in the log and the status, and not billed. The search tile's `snippet` and `deliveryText` have no counterpart on the product page and are absent on a row read this way. Product pages need the same residential proxy as searches.

### Use it from your code

Run the actor and get items straight back with one HTTP call (fine for scoped runs up to ~5 minutes):

```bash
curl "https://api.apify.com/v2/acts/lowlanddata~bol-com-scraper/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \
  -X POST -H "Content-Type: application/json" \
  -d '{"searchQuery": "lego technic", "maxItems": 100}'
```

Node.js:

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

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });
const run = await client.actor('lowlanddata/bol-com-scraper').call({
  searchQuery: 'lego technic',
  maxItems: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

Python:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("lowlanddata/bol-com-scraper").call(
    run_input={"searchQuery": "lego technic", "maxItems": 100})
items = client.dataset(run["defaultDatasetId"]).list_items().items
```

For bigger crawls, start the run asynchronously and fetch the dataset when the finished-run webhook fires. Schedules (e.g. a daily price snapshot), webhooks and the Make/Zapier/n8n integrations all work out of the box: this is a standard Apify actor.

### Use it with AI agents (MCP)

Claude, Cursor and other MCP-capable agents can run this scraper as a tool through Apify's hosted MCP server: the agent fills in the search itself, starts the run and reads the results: no glue code.

Claude Code:

```bash
claude mcp add apify --transport http "https://mcp.apify.com?actors=lowlanddata/bol-com-scraper"
```

Cursor or Claude Desktop (add a custom connector / MCP server with this URL):

```text
https://mcp.apify.com?actors=lowlanddata/bol-com-scraper
```

**Want the whole family at once?** Point one connector at every tool in the EU Marketplaces bundle:

```text
https://mcp.apify.com?actors=lowlanddata/kleinanzeigen-scraper,lowlanddata/marktplaats-scraper,lowlanddata/tweedehands-scraper,lowlanddata/olx-pl-scraper,lowlanddata/olx-ro-scraper,lowlanddata/olx-pt-scraper,lowlanddata/willhaben-scraper,lowlanddata/finn-no-scraper,lowlanddata/tori-fi-scraper,lowlanddata/blocket-se-scraper,lowlanddata/dba-dk-scraper,lowlanddata/gumtree-uk-scraper,lowlanddata/vinted-scraper,lowlanddata/bol-com-scraper,lowlanddata/subito-scraper,lowlanddata/bazos-cz-scraper,lowlanddata/bazos-sk-scraper,lowlanddata/olx-bg-scraper,lowlanddata/olx-ua-scraper,lowlanddata/willhaben-car-scraper,lowlanddata/kleinanzeigen-free-finds,lowlanddata/olx-listing-watch,lowlanddata/marktplaats-new-listing-alerts,lowlanddata/tweedehands-new-listing-alerts,lowlanddata/kleinanzeigen-deal-radar
```

Sign in with your Apify account when prompted. Runs are billed to it. Setup details per client: [Apify MCP docs](https://docs.apify.com/platform/integrations/mcp), or start from this actor's own MCP page: [apify.com/lowlanddata/bol-com-scraper/api/mcp](https://apify.com/lowlanddata/bol-com-scraper/api/mcp).

Prompts that work once connected:

- "Search bol.com for 55-inch OLED TVs under 800 euros and summarize the price range per brand."
- "Get the 100 top results for 'airfryer' on bol.com with details and tell me which EANs are sold by bol.com itself vs. marketplace partners."
- "Watch bol.com for 'lego technic 42151' and flag any offer below 40 euros."

### How deep does a crawl go?

The actor pages through search results until it reaches your `maxItems`, the end of the results, or bol.com's pagination limit for very broad queries (search pages stop serving products after a few thousand positions on six-figure result sets). For broad-market crawls, split by narrower queries or price bands. Each run dedupes products by `productId`, so overlapping runs merge cleanly.

### Is it legal to scrape bol.com?

Public product data (prices, titles, ratings, availability) is public commercial information, and this scraper is built so that the hard part of the question never arises: **no personal data enters your dataset in the first place.** The Dutch data-protection authority (Autoriteit Persoonsgegevens) is among Europe's strictest on personal data; an output that carries none is the point of this actor, not an afterthought.

Structurally, the extractor maps a fixed whitelist of product fields out of named page nodes. The seller line and the review section are never read into the output: the only derived value is the `thirdPartySeller` boolean. Requests are paced, load on the site is kept negligible, and no anti-bot protection is bypassed.

One honest limit: titles and snippets are shop-authored text, delivered as-is. The guarantee covers the data fields, not the content merchants publish about their products.

### Is there a bol.com API alternative?

bol.com's official Retailer API serves sellers managing their own listings. It does not offer public product search for everyone else. This actor is the practical alternative: the same product data as structured JSON through one HTTP call (`run-sync-get-dataset-items`), on a schedule, or as an MCP tool for AI agents, with the GDPR question already answered in the data itself.

### Does bol.com block scrapers?

bol.com serves its search and product pages as plain server-rendered HTML to ordinary consumer traffic, but answers requests from datacenter networks and from outside the Benelux with a block. This actor stays inside the site's welcome rather than fighting it: it routes through Netherlands residential connections (the default proxy setting), paces its requests, and keeps the load negligible. No CAPTCHA fights, no bot-wall cat-and-mouse, which is also why runs are reliable enough for daily schedules.

### How do I monitor bol.com prices?

Set your query with a `priceMaxEur` ceiling, cap `maxItems` to a page or two, and add a daily (or hourly) Schedule in the Apify Console with an email/Slack integration on the runs. Every matching product lands in your inbox with the price already parsed to cents. The AI-assistant prompt above walks a non-technical user through exactly this setup.

### FAQ

**Can I get seller shop names or review texts?** No, by design. That is the product: data you can store, share and process without a GDPR review. The output tells you only whether an offer comes from bol.com or a marketplace partner.

**Can I filter or sort by price on the site's side?** bol.com's search does not accept price or sort parameters from outside its own UI, so the actor filters your price band while it pages through results. On very broad queries, expect the actor to read more pages than it delivers items.

**How fresh is the data?** Live at run time: every run queries bol.com directly. For continuous freshness, schedule the actor.

**Can I export to Excel or CSV?** Yes, every dataset exports as CSV, Excel, JSON or XML from the Apify Console or API.

**Does it cover bol.com Belgium?** Yes, set `storefront: "bol.com/be"` for the Belgian (Dutch-language) storefront. Assortment and prices can differ from the Dutch one.

**What does `variantCount` mean?** How many variants (colours, sizes, capacities) the product page groups. `0` means a standalone product without variants.

**Does it work with Make, Zapier or n8n?** Yes, it is a standard Apify actor; all platform integrations, webhooks and schedules apply.

**Does bol.com have an API I could use instead?** Only the official Retailer API, which serves sellers managing their own listings. There is no public product-search API. This actor fills that gap with structured JSON per product.

**What does it cost per 1,000 products?** $3.00, pay-as-you-go, with nothing charged for empty or failed runs. `scrapeDetails` opens one extra page per product, so switch it on only for the runs where you need EANs and specs.

**Do I need residential proxies for bol.com?** Yes, bol.com only answers requests from Benelux consumer networks. The actor's default proxy setting is already an Apify residential proxy pinned to the Netherlands; leave it as it is.

**Why did I only get 5 products?** The Apify free plan caps this actor at a 5-item sample per run. Paid plans run to your `maxItems` (default 200).

**How do I get EAN barcodes from bol.com?** Set `scrapeDetails: true`. Each product then carries its `ean` (GTIN-13) along with brand, colour, material, condition, availability and variant count, ready for barcode-keyed catalog joins.

**What if a product page has no structured data?** You get `null` values for the detail fields on that product, not a failed run. The search-page fields are still delivered.

**Why is priceCents null on some products?** The product tile showed no readable price. When you set a price filter, such products are excluded: they cannot prove they are in band.

**Are customer reviews included?** Only the aggregate `ratingValue` and `reviewCount`. Review texts and reviewer identities are never collected: that is the GDPR-first design, not a gap.

**How do I tell bol.com offers from marketplace sellers?** Read the `thirdPartySeller` boolean: `true` means a marketplace partner, `false` means bol.com itself. The partner's shop name is never collected.

**Do I get the full product description?** No, `snippet` is the search-page excerpt. With `scrapeDetails` you additionally get the structured spec fields, but not the long-form description text.

**How many products can one run collect?** As many as `maxItems` allows, up to the end of the results, though on six-figure result sets bol.com stops serving products after a few thousand positions. Split broad crawls into narrower queries or price bands; runs dedupe on `productId` and merge cleanly.

**What happens when bol.com blocks a run partway?** The products collected before the block are delivered, the run status says the coverage was partial, and undelivered items are not billed. Re-run later or narrow the query.

**Can I plug this into an AI agent?** Yes, through Apify's hosted MCP server, Claude, Cursor and similar agents can search bol.com as a tool and work with the results directly.

**Is it legal to scrape bol.com?** Prices, titles, ratings and availability are public commercial information, and the extractor's fixed whitelist never reads the seller line or the review section, so your dataset contains no personal data to worry about.

**Do you also cover second-hand marketplaces?** Yes, the Marktplaats.nl and 2dehands/2ememain scrapers below bring the same GDPR-clean output discipline to the Benelux classifieds market.

### Related scrapers

Working the Benelux market? The same GDPR-clean guarantee, same output discipline:

- [Marktplaats.nl Scraper](https://apify.com/lowlanddata/marktplaats-scraper): the Netherlands' biggest classifieds marketplace, second-hand prices and listings.
- [2dehands & 2ememain Scraper](https://apify.com/lowlanddata/tweedehands-scraper): Belgium's classifieds duo, one actor for both language sites.

### Troubleshooting

The actor fails fast with the reason in the run's status message:

- **"priceMinEur must not be higher than priceMaxEur."**: swap the two values.
- **"bol.com blocked the run before any results could be fetched. This is usually temporary - retry in a few minutes."**: a temporary block on the first request; a retry usually lands on a clean proxy session.
- **"bol.com reported matching products but none could be extracted. The site markup may have changed."**: a markup change on bol.com's side; report it on the Issues tab, fixes ship quickly.
- **"... then the site blocked further requests. Partial coverage ..."**: the run kept everything collected before the block; re-run later or narrow the query.
- **Fewer items than requested on a free plan**: the 5-item free sample cap; run on a paid Apify plan for full results.

### Support

Found an issue or missing a field you need? The fastest route is the actor's **Issues tab** - it is monitored and reports get fixed. For anything private, email **contact@lowlanddata.com**. This actor is actively maintained.

Working well for you? A **rating on this page** takes ten seconds and helps other buyers find a GDPR-clean option among the lookalikes. It is also the clearest signal of what we should build next.

# Actor input Schema

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

What to search for on bol.com, exactly as you would type it in the site's search box, e.g. "iphone 16 hoesje" or "lego technic". Leave it out when you only re-check products through <b>listingIds</b>.

## `listingIds` (type: `array`):

Re-check products you already know instead of searching: one product number per line (the digits at the end of every bol.com product address, and the <code>productId</code> of every dataset item), or the product's full address. Each one is read from its own page on the storefront chosen below - title, price, rating, seller type, main image - with the detail fields (brand, EAN, colour, material, condition, availability) whether or not <b>Scrape details</b> is on. A product that is gone from the site is skipped, named in the log and not billed. <b>When given, the search fields of this form are ignored</b> and the run status says which. Up to 50.

## `storefront` (type: `string`):

Which bol.com storefront to search: bol.com/nl (Netherlands) or bol.com/be (Belgium, Dutch). Assortment and prices can differ slightly.

## `priceMinEur` (type: `integer`):

Only include products costing at least this many euros. Products without a readable price are excluded when a price filter is set.

## `priceMaxEur` (type: `integer`):

Only include products costing at most this many euros. Products without a readable price are excluded when a price filter is set.

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

Also open each product page for brand, EAN barcode, colour, material, condition, availability and variant count. Slower: one extra request per product. The same page carries every photo of the product, delivered as <code>imageUrls</code>.

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

Stop after this many products. Free-plan runs are capped at 5 items. The form starts at 25 for a cheap first run - that is the form's prefill, not a cap on your plan; clear it to use the default of 200.

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

Proxy settings. bol.com only answers requests from Benelux consumer networks, so keep the default: Apify residential proxy pinned to the Netherlands.

## `reportFailures` (type: `boolean`):

When a run fails, send the developer the actor name and build, an error category, the error message (truncated) and a one-way hash of your input - so a bug can be fixed without anyone asking you to reproduce it. <b>Your input itself, your results and your identity are never sent, and successful runs send nothing at all.</b> Switch this off and the actor behaves exactly the same.

## Actor input object example

```json
{
  "searchQuery": "lego technic",
  "listingIds": [],
  "storefront": "bol.com/nl",
  "scrapeDetails": false,
  "maxItems": 25,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "NL"
  },
  "reportFailures": true
}
```

# Actor output Schema

## `products` (type: `string`):

Scraped bol.com products, one JSON object per product.

# 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 = {
    "searchQuery": "lego technic",
    "listingIds": [],
    "storefront": "bol.com/nl",
    "scrapeDetails": false,
    "maxItems": 25,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "NL"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("lowlanddata/bol-com-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 = {
    "searchQuery": "lego technic",
    "listingIds": [],
    "storefront": "bol.com/nl",
    "scrapeDetails": False,
    "maxItems": 25,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "NL",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("lowlanddata/bol-com-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 '{
  "searchQuery": "lego technic",
  "listingIds": [],
  "storefront": "bol.com/nl",
  "scrapeDetails": false,
  "maxItems": 25,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "NL"
  }
}' |
apify call lowlanddata/bol-com-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,lowlanddata/bol-com-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/Q7BVu072sstp6ca2e/builds/ZkYVXSGaqspgf17L2/openapi.json
