Bol.com Scraper
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
Unfenced Group
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
16 hours 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 | Maximum items to return. 0 = unlimited. Default 50. |
fetchDetails | boolean | Visit each product detail page for per-variant EAN-13, brand, weight, buy-box, specifications and a review sample. 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.
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