Pricing
from $1.80 / 1,000 product listings
Bol.com Scraper
Scrape bol.com (NL/BE) products: prices, EAN-13, ratings, sellers, variants, full specifications, complete reviews and every seller offer.
Pricing
from $1.80 / 1,000 product listings
Rating
0.0
(0)
Developer
Actor stats
1
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Extract structured product data from bol.com β the largest online retailer in the Netherlands and Belgium. Search by keyword, crawl category/brand/series pages, or pass product URLs directly. Get prices, EAN-13 barcodes, ratings, sellers, stock, and full per-variant data in clean JSON.
Works on both the Dutch shop (bol.com/nl) and the Belgian shop (bol.com/be).
What it does
- Search any keyword and collect every product on the results pages
- Crawl category (
/l/), brand (/pb/), and series (/serie/) listing pages - Enrich each product with detail-page data: EAN-13, brand, weight, condition, buy-box price range, and full specifications
- Collect full reviews per product β every review with rating, title, body, date and helpful count, plus the rating distribution
- Collect all seller offers β every seller competing on a product, not just the buy-box winner
- Track prices across variants and sellers for repricing and competitive analysis
- Monitor ratings, review counts, stock, and sponsored placement
Input
| Field | Type | Description |
|---|---|---|
searchQuery | string | A single keyword to search (e.g. koffie, lego, airpods). |
searchQueries | array | Several keywords in one run. Each becomes its own search. |
startUrls | array | Bol.com URLs to crawl: search (/s/), category (/l/), brand (/pb/), series (/serie/) or product (/p/) pages. |
country | string | nl (default) or be. Sets the shop for keyword searches. |
maxResults | integer | Overall ceiling on items returned across all sources. 0 = unlimited. Default 50. |
maxResultsPerUrl | integer | Optional per-source cap. Each search query and each start URL stops after this many items, while maxResults stays the overall ceiling. 0 = no per-source limit. Default 0. |
fetchDetails | boolean | Visit each product detail page for per-variant EAN-13, brand, weight, buy-box, specifications and a review sample. Default false. |
includeVariantPrices | boolean | Add the per-variant list (each variant's EAN-13, price, condition, availability) without the full detail enrichment. Visits the detail page. Ignored when fetchDetails is on. Default false. |
fetchReviews | boolean | Collect the full review list and rating distribution per product. Visits the detail page. Default false. |
fetchOffers | boolean | Collect every seller's offer per product, not just the buy-box. Visits the detail page. Default false. |
maxReviewsPerProduct | integer | Cap on reviews collected per product when fetchReviews is on. Default 50. |
proxyConfiguration | object | Optional. Leave empty to run without a proxy β the scraper escalates to residential automatically only if bol.com blocks a request. |
Example β search the Dutch shop
{"searchQuery":"koffiebonen","country":"nl","maxResults":100,"fetchDetails":false}
Example β multiple keywords with full detail enrichment
{"searchQueries":["nespresso cups","dolce gusto","senseo pads"],"country":"nl","maxResults":200,"fetchDetails":true}
Example β crawl a category page on the Belgian shop
{"startUrls":[{"url":"https://www.bol.com/be/nl/l/koffie/13302/"}],"maxResults":300}
Example β scrape specific products by URL
{"startUrls":[{"url":"https://www.bol.com/nl/nl/p/nescafe-dolce-gusto-lungo-48-koffiecups/9200000131373794/"}],"fetchDetails":true}
Example β full competitive intelligence (specs, reviews, all sellers)
{"searchQuery":"nespresso machine","country":"nl","maxResults":50,"fetchDetails":true,"fetchReviews":true,"fetchOffers":true}
Output
Every run writes one record per product to the dataset.
Listing fields (always present)
| Field | Type | Description |
|---|---|---|
type | string | "listing" or "detail". |
productId | string | Bol.com product ID. |
title | string | Product title. |
url | string | Full product URL. |
price | number | Current selling price in EUR. |
priceCurrency | string | Always "EUR". |
selectPrice | number|null | Select-deal price, if any. |
unitPrice | number|null | Price per unit (per kg/litre/piece). null for items not sold by measure. |
referencePrice | number|null | The "was" price (bol's most-shown price over 90 days), when discounted. |
discountPercentage | number|null | Discount vs the reference or Select price, when discounted. |
rating | number|null | Average review rating (0β5). |
reviewCount | number|null | Number of reviews. |
seller | string|null | Seller / retailer name (e.g. bol). |
condition | string|null | New, Refurbished, Secondhand. |
availability | string|null | Stock and delivery note. |
deliveredWithin48h | boolean|null | Whether 48h delivery applies. |
sponsored | boolean | Whether the placement is sponsored. |
sustainable | boolean | Whether the product carries a sustainability label. |
imageUrl | string|null | Largest available product image. |
description | string|null | Product description text. |
category | array | Category path, broadest first. |
sourcePage | number | Result page the item came from. |
sourceUrl | string | The listing URL it was found on. |
domain | string | www.bol.com. |
scrapedAt | string | ISO timestamp. |
Detail fields (added when fetchDetails: true)
| Field | Type | Description |
|---|---|---|
gtin13 | string|null | EAN-13 / GTIN-13 barcode. |
brand | string|null | Brand name. |
bestRating | number|null | Aggregate rating from the detail page. |
lowPrice | number|null | Lowest buy-box price across offers. |
highPrice | number|null | Highest buy-box price across offers. |
offerCount | number|null | Number of offers. |
images | array | All product images. |
variants | array | Per-variant objects (see below). |
specifications | array | Structured product specs as { name, value } pairs. |
reviewSample | array | Up to 10 reviews: rating, title, body, date. |
reviews | array | Full review list (when fetchReviews is on): rating, title, body, date, helpfulCount. |
ratingDistribution | object | Per-star review counts (when fetchReviews is on). |
offers | array | Every seller's offer (when fetchOffers is on): seller, price, condition, availability, offerType. |
Each entry in variants contains: productId, name, url, gtin13, brand, weightGrams, price, priceCurrency, availability, condition, seller, imageUrl.
Example output (listing)
{"type":"listing","productId":"9200000074456102","title":"Douwe Egberts Aroma Rood Filterkoffie - 6 x 500 gram","url":"https://www.bol.com/nl/nl/p/douwe-egberts-aroma-rood-filterkoffie-6-x-500-gram/9200000074456102/","price":59.94,"priceCurrency":"EUR","unitPrice":9.99,"rating":4.7,"reviewCount":437,"seller":"bol","condition":"New","availability":"Op voorraad. Voor 23:59 uur besteld, morgen in huis","sponsored":false,"imageUrl":"https://media.s-bol.com/gLoBQyJ92Zqk/550x504.jpg","category":["Eten & Drinken","Frisdrank, sap, koffie en thee","Koffie","Filterkoffie"],"sourcePage":1,"domain":"www.bol.com","scrapedAt":"2026-06-19T09:32:17.548Z"}
Example output (detail variant)
{"gtin13":"8445290872197","brand":"NESCAFΓ Dolce Gusto","weightGrams":1070,"price":29.97,"priceCurrency":"EUR","availability":"InStock","condition":"NewCondition","seller":"bol"}
Example output (specifications, reviews, offers)
{"specifications":[{"name":"Soort koffie","value":"Cups"},{"name":"Branding","value":"Medium gebrand"}],"ratingDistribution":{"5":180,"4":32,"3":9,"2":4,"1":3},"reviews":[{"rating":5,"title":"Goede koffie","body":"Zoals altijd een goede keuze.","date":"2025-08-26","helpfulCount":3}],"offers":[{"seller":"bol","price":19.47,"condition":"New","availability":"Op voorraad","offerType":"STANDARD"},{"seller":"CoffeeStore","price":16.47,"condition":"New","availability":"Op voorraad","offerType":"STANDARD"}]}
Pricing
This actor uses pay-per-result pricing. You only pay for the results you receive.
- $0.002 per product listing (
fetchDetails: false) - $0.008 per product detail (
fetchDetails: trueβ adds EAN-13, variants, specifications, buy-box range) - $0.003 per product with full reviews (
fetchReviews: true) - $0.003 per product with all seller offers (
fetchOffers: true)
Higher subscription tiers receive an automatic volume discount on every event.
Notes
- Bol.com applies bot protection that is tied to IP reputation. Small runs work without a proxy. For larger runs the actor automatically switches to a country-matched residential proxy when it detects a block β no configuration needed.
- Personal data is not collected. Review author names are excluded; only the rating, title, body, and date of a review are returned. Seller names are company names, not individuals.
Related scrapers
Other scrapers in our General Marketplaces & Retail collection:
Run it on a schedule
This actor is built for repeat use. Set it to run daily, weekly, or hourly, and the data keeps flowing without you touching it.
- Schedule runs β open the actor, go to Schedules, and pick a cadence. Each run only charges you for the results it returns.
- Connect it to your stack β push results straight to Google Sheets, Slack, a webhook, or your database using Apify Integrations. No glue code needed.
- Pull results via API β every run writes a clean dataset you can fetch with one API call, ready for whatever you build on top of it.
Set it once and it runs on its own.
Need a custom scraper?
Unfenced Group builds Apify actors for any website β for free.
If the site you need isn't in our portfolio yet, just ask. We scope, build, and publish it at no cost to you. You only pay for results β we absorb the compute and proxy costs ourselves. Same pay-per-result pricing, same quality, same standards as every actor in this portfolio.
Get in touch: www.unfencedgroup.nl
