Bol Listings Scraper avatar

Bol Listings Scraper

Pricing

from $3.00 / 1,000 product listings

Go to Apify Store
Bol Listings Scraper

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

FalconScrape

Maintained by Community

Actor stats

1

Bookmarked

36

Total users

7

Monthly active users

17 days ago

Last modified

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 ProductGroup records β€” 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 includeSellerOffers to 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 an offersComplete flag.
  • πŸ‡³πŸ‡± πŸ‡§πŸ‡ͺ NL + BE shops: scrape bol.com/nl/nl/ or bol.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 Book JSON-LD shape with variants under workExample β€” ISBN-13 ends up in the same gtin13 field.
  • πŸ’Έ Pay-per-event pricing: pay only for items pushed to the dataset β€” see the pricing table below.

πŸ› οΈ How It Works

  1. Choose a mode by what you put in the input:
    • Search β€” keywords under searchQueries (e.g. harry potter boek) or paste search URLs into startUrls.
    • Category / Brand / Series β€” paste /l/, /pb/, or /serie/ URLs into startUrls.
    • Product detail β€” paste /p/.../{id}/ URLs into startUrls.
    • 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.
  2. Pick the country shop β€” nl or be. The Actor pins the residential proxy to the matching country.
  3. (Optional) Turn on includeProductDetails to switch into PDP-enrichment mode β€” listing pages become URL sources only, and the dataset gets one rich record per product detail page.
  4. (Optional) Turn on includeSellerOffers (requires includeProductDetails) to attach every seller offer to each product record β€” no extra charge per offer.
  5. Set maxItems to cap your spend, or leave it 0 for unlimited.
  6. Run the scraper β€” results stream to the default dataset, ready to download as JSON / CSV / Excel.

βš™οΈ Input

FieldTypeRequiredDefaultDescription
startUrlsarray of URLsoptionalβ€”Bol.com URLs to crawl. Supports /s/, /l/, /pb/, /serie/, and /p/ paths on bol.com/nl/nl/ or bol.com/be/nl/.
searchQueriesstring[]optional[]Keywords to convert into search start URLs (one search URL per query, on the selected country shop).
countrynl | beoptionalnlCountry shop. Drives both the search URL path and the residential proxy country (forced to match β€” never mix /nl/ with BE IPs).
maxItemsinteger β‰₯ 0optional0Maximum dataset items to push across the whole run. 0 = unlimited. Use this to cap spend.
includeProductDetailsbooleanoptionalfalseWhen true, listings are used only to discover product URLs; the dataset gets one PDP record per product (full JSON-LD).
eansstring[]optionalβ€”EAN/GTIN barcodes (8–14 digits, as text so leading zeros survive). Requires includeProductDetails=true.
includeSellerOffersbooleanoptionalfalseAttach all seller offers (new/used/refurbished) of the selected product in the selected country. Requires includeProductDetails=true.
maxOfferPagesinteger 1–50optional5Cap on seller-offer pages (10 offers each) per product. Hitting it sets offersComplete=false, offersIncompleteReason="max-offer-pages".
proxyConfigurationobjectoptionalRESIDENTIALApify proxy options. Residential is required β€” bol blocks datacenter IPs. Country code is overwritten to match country.

At least one of startUrls, searchQueries or eans must 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).

EventWhen chargedPrice (USD)
product-listingEach listing card pushed when includeProductDetails=false$0.003
item-detailEach PDP record (with full JSON-LD variants) when includeProductDetails=true$0.010

Worked examples:

ScenarioItemsEventTotal cost
Keyword search, first 10 pages (~250 cards)250product-listing$0.75
Full keyword search to bol's 256-page cap (~6,400 cards)6,400product-listing$19.20
1,000 PDPs with includeProductDetails=true1,000item-detail$10.00
10,000 PDPs with includeProductDetails=true10,000item-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! πŸš€