bol.com Product Scraper avatar

bol.com Product Scraper

Pricing

from $1.59 / 1,000 results

Go to Apify Store
bol.com Product Scraper

bol.com Product Scraper

Extract bol.com products as clean JSON with zero personal data - prices in cents, ratings, EAN barcodes, brands, availability. NL + BE storefronts, price-band filter, pay per result. Built for price monitoring, market research and AI pipelines.

Pricing

from $1.59 / 1,000 results

Rating

0.0

(0)

Developer

Lowland Data

Lowland Data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

bol.com Product Scraper — GDPR-safe product & price data

Extract products from bol.com — the largest online retailer of the Netherlands and Belgium — as clean, structured JSON. Titles, prices, ratings, review counts, delivery promises, brands and EAN barcodes, ready for price monitoring, market research and data pipelines.

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.

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:

{
"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 agile-model 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?

$1.99 per 1,000 products delivered, pay-as-you-go — no subscription, no charge for empty or failed runs. In plain dollars:

  • 100 products ≈ $0.20 — a daily niche watch.
  • 500 products ≈ $1.00 — a solid assortment snapshot.
  • A 2,000-product crawl ≈ $3.98 — a full category, deduplicated.

Your own Apify platform usage comes on top and stays small for scoped runs. 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 25 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:

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

FieldDescription
searchQueryWhat you'd type in the bol.com search box. Required.
storefrontbol.com/nl (Netherlands, default) or bol.com/be (Belgium, Dutch). Assortment and prices can differ slightly.
priceMinEurOnly include products costing at least this many euros.
priceMaxEurOnly include products costing at most this many euros.
scrapeDetailsAlso open each product page for brand, EAN, colour, material, condition, availability and variant count. Slower.
maxItemsStop after this many products (default 200).
proxyConfigurationProxy settings; keep Apify proxy enabled.

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

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):

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:

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:

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:

$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):

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

Sign in with your Apify account when prompted — runs are billed to it. Setup details per client: Apify MCP docs, or start from this actor's own MCP page: 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.

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.

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

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 25-item free sample cap; run on a paid Apify plan for full results.

Support

Found an issue or missing a field you need? Open an issue on the actor's Issues tab — reports get fixed, 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.