Bol Listings Scraper
Pricing
from $3.00 / 1,000 product listings
Bol Listings Scraper
The Bol.com Listings Scraper extracts product listings and detail pages from bol.com (NL/BE), capturing titles, prices, ratings, brands, sellers, and per-variant data including EAN-13, color, weight, and buy-box offers β ideal for price tracking, repricing, and competitive analysis.
Pricing
from $3.00 / 1,000 product listings
Rating
0.0
(0)
Developer
FalconScrape
Maintained by CommunityActor stats
1
Bookmarked
36
Total users
7
Monthly active users
17 days ago
Last modified
Categories
Share
ποΈ Bol.com Listings Scraper
Easily extract product data from bol.com β the leading Dutch and Belgian e-commerce marketplace. The Bol.com Listings Scraper turns any search query, category, brand, series, or product detail URL into structured JSON, with optional per-variant enrichment (EAN-13, color, weight, seller, condition) pulled straight from bol.com's embedded JSON-LD.
β¨ Features
- π·οΈ Comprehensive product data: titles, prices, ratings, review counts, brand, seller, delivery promises, sponsored flags, and image URLs straight from listing pages.
- π¬ Per-variant enrichment: opt into product detail pages for full JSON-LD
ProductGrouprecords β EAN-13, color, weight in grams, condition, availability, and per-variant buy-box seller. - π§Ύ All seller offers by EAN: pass EAN barcodes and/or turn on
includeSellerOffersto get every seller's offer for the exact product and country β new, used and refurbished (with grade), price, shipping, total, delivery date, seller rating and buy-box flag β plus bol's own per-condition counts and anoffersCompleteflag. - π³π± π§πͺ NL + BE shops: scrape
bol.com/nl/nl/orbol.com/be/nl/. The Actor automatically pins Apify Residential proxy to the matching country. - π‘οΈ Anti-bot ready: Akamai Bot Manager bypass via Apify Residential proxy + browser-realistic headers + automatic session rotation on 403/429.
- π Books too: handles bol's
BookJSON-LD shape with variants underworkExampleβ ISBN-13 ends up in the samegtin13field. - πΈ Pay-per-event pricing: pay only for items pushed to the dataset β see the pricing table below.
π οΈ How It Works
- Choose a mode by what you put in the input:
- Search β keywords under
searchQueries(e.g.harry potter boek) or paste search URLs intostartUrls. - Category / Brand / Series β paste
/l/,/pb/, or/serie/URLs intostartUrls. - Product detail β paste
/p/.../{id}/URLs intostartUrls. - EAN lookup β list barcodes under
eans. Each EAN is searched on the selected shop and confirmed against the exact product's JSON-LD (never a sibling variant). EANs with no exact match produce a free{"type": "unresolved"}record.
- Search β keywords under
- Pick the country shop β
nlorbe. The Actor pins the residential proxy to the matching country. - (Optional) Turn on
includeProductDetailsto switch into PDP-enrichment mode β listing pages become URL sources only, and the dataset gets one rich record per product detail page. - (Optional) Turn on
includeSellerOffers(requiresincludeProductDetails) to attach every seller offer to each product record β no extra charge per offer. - Set
maxItemsto cap your spend, or leave it0for unlimited. - Run the scraper β results stream to the default dataset, ready to download as JSON / CSV / Excel.
βοΈ Input
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
startUrls | array of URLs | optional | β | Bol.com URLs to crawl. Supports /s/, /l/, /pb/, /serie/, and /p/ paths on bol.com/nl/nl/ or bol.com/be/nl/. |
searchQueries | string[] | optional | [] | Keywords to convert into search start URLs (one search URL per query, on the selected country shop). |
country | nl | be | optional | nl | Country shop. Drives both the search URL path and the residential proxy country (forced to match β never mix /nl/ with BE IPs). |
maxItems | integer β₯ 0 | optional | 0 | Maximum dataset items to push across the whole run. 0 = unlimited. Use this to cap spend. |
includeProductDetails | boolean | optional | false | When true, listings are used only to discover product URLs; the dataset gets one PDP record per product (full JSON-LD). |
eans | string[] | optional | β | EAN/GTIN barcodes (8β14 digits, as text so leading zeros survive). Requires includeProductDetails=true. |
includeSellerOffers | boolean | optional | false | Attach all seller offers (new/used/refurbished) of the selected product in the selected country. Requires includeProductDetails=true. |
maxOfferPages | integer 1β50 | optional | 5 | Cap on seller-offer pages (10 offers each) per product. Hitting it sets offersComplete=false, offersIncompleteReason="max-offer-pages". |
proxyConfiguration | object | optional | RESIDENTIAL | Apify proxy options. Residential is required β bol blocks datacenter IPs. Country code is overwritten to match country. |
At least one of
startUrls,searchQueriesoreansmust be provided.
Example β all seller offers for one EAN on bol.com NL:
{ "eans": ["5702017583488"], "country": "nl", "includeProductDetails": true, "includeSellerOffers": true }
π Sample Output Data
Listing card (when includeProductDetails=false)
{"type": "listing","productId": "9200000023479731","url": "https://www.bol.com/nl/nl/p/harry-potter-boxset/9200000023479731/","title": "Harry Potter - Full Boxset","imageUrl": "https://media.s-bol.com/qwD5RRPRo10/550x450.jpg","brandName": "J.K. Rowling","brandId": "545975","price": 56.93,"priceCurrency": "EUR","rating": 4.8,"reviewCount": 612,"specs": ["Engels", "Boxset paperback", "9781408856772", "09 oktober 2014", "3872 pagina's"],"offerUid": "94f335fe-0d0b-40ed-ab3c-51598d511285","sponsored": false,"sustainable": false,"sellerHint": "bol","deliveryText": "Voor 23:59 uur besteld, maandag in huis","domain": "nl","sourceUrl": "https://www.bol.com/nl/nl/s/?searchtext=harry+potter+boek","sourcePage": 1,"scrapedAt": "2026-05-16T10:00:00.000Z"}
Product detail with variants (when includeProductDetails=true)
{"type": "product","productGroupId": "9300000219087542","name": "iPhone 17 - verwacht model","rating": 4.8,"reviewCount": 32,"lowPrice": 815,"highPrice": 1218,"offerCount": 10,"category": [{ "name": "Elektronica", "position": 1, "url": "https://www.bol.com/nl/nl/l/elektronica/3136/" },{ "name": "Smartphones", "position": 3, "url": "https://www.bol.com/nl/nl/l/smartphones/4010/" }],"variants": [{"productId": "9300000240171669","url": "https://www.bol.com/nl/nl/p/apple-iphone-17-256gb-sage/9300000240171669/","name": "Apple iPhone 17 - 256GB - Sage","color": "Groen","gtin13": "0195950644388","weightGrams": 337,"brandName": "Apple","price": 889,"priceCurrency": "EUR","condition": "NewCondition","availability": "InStock","sellerName": "Smartech NL"}],"domain": "nl","url": "https://www.bol.com/nl/nl/p/apple-iphone-17-256gb-sage/9300000240171669/","scrapedAt": "2026-05-16T10:00:00.000Z"}
Seller offers (when includeSellerOffers=true)
Added to the product detail record above. Offers belong to selectedProductId (the exact product in the URL / EAN), in the selected country β the same product often has different sellers in NL and BE.
{"ean": "5702017583488","selectedProductId": "9300000157956429","sellerOfferCount": 7,"sellerOfferCounts": { "new": 7, "used": 0, "refurbished": 0 },"offersComplete": true,"offersIncompleteReason": null,"offersSourceUrl": "https://www.bol.com/nl/nl/prijsoverzicht/lego-botanicals-rozenboeket/9300000157956429/?sort=price&sortOrder=asc","sellerOffers": [{"offerId": "6cc9ba23-4459-4455-b1f0-dbb512814ec3","sellerId": "0","sellerName": "bol","sellerRating": null,"topSeller": null,"condition": "new","conditionGrade": null,"conditionComment": null,"price": 39.99,"currency": "EUR","shipping": 0,"totalPrice": 39.99,"deliveryDescription": "Op voorraad. Voor 23:59 uur besteld, morgen in huis","latestDeliveryDate": "2026-09-23","deliveredWithin48Hours": true,"isBuyBox": true,"selectPrice": null}]}
offersComplete is true only when pagination reached its end and the number of unique offers equals bol's own per-condition counts. Otherwise offersIncompleteReason says why: max-offer-pages, count-mismatch, graphql-error, repeated-cursor, no-offer-compare-url or request-failed. A product with zero offers is a valid, complete record. shipping is null when unknown (never guessed as 0); prices are anonymous public observations, not personalised checkout prices.
π° Pricing
This Actor uses pay-per-event β you pay only for items written to the dataset. Which event you're charged for depends on the includeProductDetails flag (the two modes are mutually exclusive within a single run).
| Event | When charged | Price (USD) |
|---|---|---|
product-listing | Each listing card pushed when includeProductDetails=false | $0.003 |
item-detail | Each PDP record (with full JSON-LD variants) when includeProductDetails=true | $0.010 |
Worked examples:
| Scenario | Items | Event | Total cost |
|---|---|---|---|
| Keyword search, first 10 pages (~250 cards) | 250 | product-listing | $0.75 |
| Full keyword search to bol's 256-page cap (~6,400 cards) | 6,400 | product-listing | $19.20 |
1,000 PDPs with includeProductDetails=true | 1,000 | item-detail | $10.00 |
10,000 PDPs with includeProductDetails=true | 10,000 | item-detail | $100.00 |
Seller offers and EAN lookups are included in the item-detail price β one charge per product record, never per offer. Unresolved EANs are free.
Set maxItems to put a hard cap on the run and your bill. π―
Get the freshest Dutch and Belgian e-commerce data with Bol.com Listings Scraper today! π