bol.com Scraper: Prices, Sellers & Ratings
Pricing
from $1.00 / 1,000 results
bol.com Scraper: Prices, Sellers & Ratings
Scrape bol.com category and brand pages in the Netherlands and Belgium. One row per product: price, reference price and discount, quantity prices, seller, delivery, rating, review count and category. Sort by price or rating, filter by seller, price and keywords.
Pricing
from $1.00 / 1,000 results
Rating
0.0
(0)
Developer
reventadata
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
bol.com Scraper: Prices, Sellers and Ratings by Category or Brand
Unofficial. This Actor is not affiliated with, authorised by, endorsed by, or in any way officially connected to bol.com. "bol" and "bol.com" are trademarks of their respective owner and are used here only to describe what this tool reads. It reads the same public category and brand pages a browser does.
Give it bol.com category or brand pages (Netherlands or Belgium) and get one clean row per product: price in euros, the reference price and discount, quantity-discount prices, seller, delivery promise, rating, review count and category path.
What does it do?
For each start URL it walks the result pages of that bol.com category or brand page, reads the product data the page embeds, and saves one row per product. A page holds 24 to 30 products and the site ends every list after page 500.
It reads category pages (https://www.bol.com/nl/nl/l/<name>/<id>/, including filtered category pages copied
from the site) and brand pages (https://www.bol.com/nl/nl/b/<name>/<id>/). It does not read search result
pages or product pages: bol.com's robots.txt disallows search (/s/), and this Actor stays on the two page types
it leaves open.
Why use it?
- Prices as shoppers see them.
priceis the selling price of the offer bol shows for the product, in euros. - Reference price, labelled.
referencePricecomes withreferencePriceLabel(Meestal, the most shown non-promotion price of the last 90 days as bol defines it, orAdviesprijs, the manufacturer's recommended price) andreferencePriceCrossedOut, so a real discount is told apart from a comparison price. - Quantity discounts and Select prices.
bundlePriceslists the price per item at 2, 3, 4 or more pieces;selectPriceis the bol Select member price when bol shows one. - Who sells it.
seller,sellerIdandsoldByBoltell bol's own offers from marketplace partners. - Filters that run before you pay. Price band, minimum rating, discounted only, seller type, words the title, brand or category must or must not contain.
- Cheapest or dearest first. Sort by price (either way) and a small
maxItemsreturns the top of the list; the rating sort is bol's own best-rated order.
How to use it
- Put one or more bol.com category or brand URLs in
startUrls. - Set
maxItems(rows to save) and, if you want, a sort order and filters. - Run the Actor and download the dataset as JSON, CSV or Excel.
Input
| Field | Type | Description |
|---|---|---|
startUrls | array | Category (/l/) or brand (/b/) pages on bol.com, Netherlands (/nl/nl/) or Belgium (/be/nl/, /be/fr/). Query strings are ignored: the Actor sets page and sort itself. |
maxItems | integer | Total products to save across all start URLs, counted after the filters. Default 100. URLs run in the order given and the run stops once the cap is reached. |
maxPages | integer | Result pages per start URL, 1 to 500. Default 5. |
sort | string | POPULARITY (the site's default), PRICE_ASC, PRICE_DESC or RATING. |
minPrice, maxPrice | number | Price band in euros. |
minRating | number | Minimum average rating, 0 to 5. Unrated products are dropped when set. |
onlyDiscounted | boolean | Keep only products whose reference price is shown crossed out above the price. |
seller | string | ANY, BOL (sold by bol itself) or PARTNER (marketplace sellers). |
includeSponsored | boolean | Sponsored tiles are advertisements the site pins to the first result pages. Dropped by default. |
includeKeywords, excludeKeywords | array | Words the title, brand or category must / must not contain, ignoring case and accents. |
proxyConfiguration | object | Apify residential proxy in the Netherlands (default, and the transport measured to work). No proxy and datacenter proxies get an "IP address is blocked" page. |
Sample input
{"startUrls": [{"url": "https://www.bol.com/nl/nl/l/muurstickers/14158/"}],"maxItems": 20,"maxPages": 1,"sort": "PRICE_ASC"}
Output
One row per product:
| Field | Type | Description |
|---|---|---|
id | string | bol.com product id. |
title | string | Product title. |
url | string | Product page URL. |
brand, brandUrl | string / null | Brand name and its bol.com page. |
price | number | Selling price in EUR of the offer bol shows. |
currency | string | Always EUR. |
referencePrice | number / null | Reference price in EUR, when bol shows one. |
referencePriceLabel | string / null | Meestal or Adviesprijs, in the page language. |
referencePriceCrossedOut | boolean | True when bol shows the reference price crossed out. |
discountPercent | integer / null | Discount against the crossed-out reference price, as bol states it. |
unitPrice, unitMeasure | number / string | Price per unit and bol's code for the unit, or null. |
bundlePrices | array | minimumQuantity, price per item and discountPercent for each quantity discount. |
selectPrice | number / null | bol Select member price, when bol shows one. |
seller, sellerId, soldByBol | string / string / boolean | Seller of the offer; seller id 0 is bol itself. |
condition | string | new. |
delivery, deliveryDate | string | The delivery promise as shown, and the latest delivery date (YYYY-MM-DD). |
isScarce, isSelect | boolean | bol's low-stock flag and the Select label. |
labels | array | Promotion and award labels on the tile, for example deal or Budgettopper. |
rating, reviewCount | number / integer | Average rating out of 5 and number of ratings; both null when the product has none. |
categories | array | Category path from the root to the deepest category. |
packQuantity | integer / null | Pieces in the pack when bol states it. |
image | string | Main image URL. |
isSponsored | boolean | True when the tile was a sponsored placement. |
country, language | string | NL or BE, and nl or fr, from the start URL. |
sourceUrl, page | string / integer | The start URL the row came from and the result page. |
scrapedAt | string | ISO 8601 timestamp. |
Sample output
Taken from a real row (2026-10-21), with scrapedAt set to a fixed time:
{"id": "9200000090597626","title": "12x Glow in the Dark kleurige 3D Vlinders met magneet en sticker, voor muur, koelkast, deuren etc.","url": "https://www.bol.com/nl/nl/p/12x-glow-in-the-dark-kleurige-3d-vlinders-met-magneet-en-sticker-voor-muur-koelkast-deuren-etc/9200000090597626/","brand": "Favorite Things","brandUrl": "https://www.bol.com/nl/nl/b/favorite-things/15956481/","price": 4.39,"currency": "EUR","referencePrice": 7.45,"referencePriceLabel": "Meestal","referencePriceCrossedOut": true,"discountPercent": 41,"unitPrice": null,"unitMeasure": null,"bundlePrices": [{"minimumQuantity": 2, "price": 4.26, "discountPercent": 3},{"minimumQuantity": 4, "price": 4.13, "discountPercent": 6},{"minimumQuantity": 6, "price": 3.95, "discountPercent": 10}],"selectPrice": null,"seller": "Knaak","sellerId": "1476045","soldByBol": false,"condition": "new","delivery": "Uiterlijk 28 oktober in huis","deliveryDate": "2026-10-28","isScarce": false,"isSelect": false,"labels": ["Budgettopper"],"rating": 4.2,"reviewCount": 30,"categories": ["Wonen", "Woonaccessoires", "Wanddecoratie", "Muurstickers"],"packQuantity": null,"image": "https://media.s-bol.com/nMgn4BNWK4E/550x550.jpg","isSponsored": false,"country": "NL","language": "nl","sourceUrl": "https://www.bol.com/nl/nl/l/muurstickers/14158/","page": 1,"scrapedAt": "2026-10-21T12:00:00+00:00"}
Limits
- Category and brand pages only. There is no keyword search and no product-page detail (no EAN, no full specifications, no list of competing offers). A row is what the result tile shows.
- 500 pages per start URL. The site answers page 501 with a 404. On the
muurstickerscategory (2026-10-21) pages 1 to 5 held 29 to 30 products each, 6 of them sponsored, and pages 7 to 25 held 23 to 24 with none. - The site's result total is not a real count. The
muurstickersandwoonartikelencategory pages report a total of 300,000 and flag it as an early stop. Split a broad category with its sub-categories or brand pages. - One price per product.
priceis the best offer bol shows on the tile; other sellers' offers for the same product are not listed. - Prices and delivery promises are what the site serves to an anonymous visitor from the Netherlands.
- Text fields (title, delivery, labels) are in the language of the page: Dutch for
/nl/and/be/nl/, French for/be/fr/. - A run that saves zero rows fails instead of finishing empty, so a mistyped URL or an over-strict filter is visible.
How fast is it?
About 5 seconds per result page. Measured 2026-10-21: 1,000 rows of the woonartikelen category (43 pages) in 220 seconds.
How much does it cost to scrape bol.com?
Pay-per-event: $0.001 per result saved to the dataset ($1.00 per 1,000 results), plus $0.00005 charged once when the run starts. No subscription. Filters run before a row is saved, so rows they drop are not charged.
FAQ
Is a proxy required? Yes. bol.com returns a 403 "IP address is blocked" page to plain and datacenter requests. The Actor defaults to Apify residential proxy in the Netherlands. A residential exit is occasionally one bol.com has already blocked; the Actor retries with a new exit.
Why can I not search for a keyword? bol.com's robots.txt disallows its search pages, so the Actor does not read them. Use the category or brand page that holds the products you want.
Why is discountPercent null when referencePrice is set? bol shows two kinds of reference price. Meestal is
usually crossed out and comes with a percentage, but some Meestal prices are shown without it. Adviesprijs is the
manufacturer's recommended price, shown for comparison, not crossed out, with no percentage. Check referencePriceCrossedOut.
Why are rating and reviewCount null? The product has no ratings yet. In a 1,000-row run on 2026-10-21, 66 had none.
Why does a row from a Belgian page have French text? Pages under /be/fr/ are in French. Prices are in euros either way.
Does it use a bol account? No. It sends no login and sees what an anonymous visitor sees.
More scrapers
| Actor | What it scrapes |
|---|---|
| Amazon Product & Price Scraper | Amazon product listings and prices |
| Idealo Price Comparison Scraper | Idealo price comparison listings |
| MediaMarkt Product & Price Scraper | MediaMarkt products and prices |
| AliExpress Product & Price Scraper | AliExpress products and prices |
| Shopify Store Monitor | Price and stock changes on Shopify stores |