bol.com Scraper: Prices, Sellers & Ratings avatar

bol.com Scraper: Prices, Sellers & Ratings

Pricing

from $1.00 / 1,000 results

Go to Apify Store
bol.com Scraper: Prices, Sellers & Ratings

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

reventadata

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

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. price is the selling price of the offer bol shows for the product, in euros.
  • Reference price, labelled. referencePrice comes with referencePriceLabel (Meestal, the most shown non-promotion price of the last 90 days as bol defines it, or Adviesprijs, the manufacturer's recommended price) and referencePriceCrossedOut, so a real discount is told apart from a comparison price.
  • Quantity discounts and Select prices. bundlePrices lists the price per item at 2, 3, 4 or more pieces; selectPrice is the bol Select member price when bol shows one.
  • Who sells it. seller, sellerId and soldByBol tell 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 maxItems returns the top of the list; the rating sort is bol's own best-rated order.

How to use it

  1. Put one or more bol.com category or brand URLs in startUrls.
  2. Set maxItems (rows to save) and, if you want, a sort order and filters.
  3. Run the Actor and download the dataset as JSON, CSV or Excel.

Input

FieldTypeDescription
startUrlsarrayCategory (/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.
maxItemsintegerTotal 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.
maxPagesintegerResult pages per start URL, 1 to 500. Default 5.
sortstringPOPULARITY (the site's default), PRICE_ASC, PRICE_DESC or RATING.
minPrice, maxPricenumberPrice band in euros.
minRatingnumberMinimum average rating, 0 to 5. Unrated products are dropped when set.
onlyDiscountedbooleanKeep only products whose reference price is shown crossed out above the price.
sellerstringANY, BOL (sold by bol itself) or PARTNER (marketplace sellers).
includeSponsoredbooleanSponsored tiles are advertisements the site pins to the first result pages. Dropped by default.
includeKeywords, excludeKeywordsarrayWords the title, brand or category must / must not contain, ignoring case and accents.
proxyConfigurationobjectApify 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:

FieldTypeDescription
idstringbol.com product id.
titlestringProduct title.
urlstringProduct page URL.
brand, brandUrlstring / nullBrand name and its bol.com page.
pricenumberSelling price in EUR of the offer bol shows.
currencystringAlways EUR.
referencePricenumber / nullReference price in EUR, when bol shows one.
referencePriceLabelstring / nullMeestal or Adviesprijs, in the page language.
referencePriceCrossedOutbooleanTrue when bol shows the reference price crossed out.
discountPercentinteger / nullDiscount against the crossed-out reference price, as bol states it.
unitPrice, unitMeasurenumber / stringPrice per unit and bol's code for the unit, or null.
bundlePricesarrayminimumQuantity, price per item and discountPercent for each quantity discount.
selectPricenumber / nullbol Select member price, when bol shows one.
seller, sellerId, soldByBolstring / string / booleanSeller of the offer; seller id 0 is bol itself.
conditionstringnew.
delivery, deliveryDatestringThe delivery promise as shown, and the latest delivery date (YYYY-MM-DD).
isScarce, isSelectbooleanbol's low-stock flag and the Select label.
labelsarrayPromotion and award labels on the tile, for example deal or Budgettopper.
rating, reviewCountnumber / integerAverage rating out of 5 and number of ratings; both null when the product has none.
categoriesarrayCategory path from the root to the deepest category.
packQuantityinteger / nullPieces in the pack when bol states it.
imagestringMain image URL.
isSponsoredbooleanTrue when the tile was a sponsored placement.
country, languagestringNL or BE, and nl or fr, from the start URL.
sourceUrl, pagestring / integerThe start URL the row came from and the result page.
scrapedAtstringISO 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 muurstickers category (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 muurstickers and woonartikelen category 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. price is 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

ActorWhat it scrapes
Amazon Product & Price ScraperAmazon product listings and prices
Idealo Price Comparison ScraperIdealo price comparison listings
MediaMarkt Product & Price ScraperMediaMarkt products and prices
AliExpress Product & Price ScraperAliExpress products and prices
Shopify Store MonitorPrice and stock changes on Shopify stores