bol.com Scraper at a glance
bol.com Scraper is a ready-to-run Apify actor from abotapi for collecting ecommerce data. Its documented output includes product id, title, brand, price and list price, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $2.00 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify.
- Runs on
- Apify cloud: console, API, schedules and integrations
- Data type
- Ecommerce, Automation, Developer Tools
- Pricing
- $2.00 per 1,000 results (Free plan), from $1.00 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 31 options
Scrape bol.com products: title, price, list price and discount, EAN, brand, images, condition, delivery, full specifications, ratings with distribution, individual reviews, every offer with seller name and rating, and refurbished prices. Search by keyword with filters, or paste product URLs.
What bol.com Scraper can do
- One record, most of what you need. Every product carries price, list price, discount, currency, brand, category path, condition, delivery estimate, rating summary, image and seller without turning anything on.
- Full detail on demand. Turn on Fetch full product details to add the complete specification list (including EAN), the full description, every product image, the full review list with star distribution, seller rating, product weight, and refurbished or second-hand offers.
- Six filters before anything is collected. Price band, minimum rating, condition, sponsored-only and in-stock-only narrow results before they are scraped or charged, on top of six sort orders.
- Two ways in. Search mode builds queries from keywords, or paste product and search-result URLs directly in URL mode.
- Bol.com's own deal pages. An optional specials source adds the storewide deals page or the clearance page alongside your keywords, and each product carries real was-price, savings and promo-label fields straight from that listing.
- One finite cap. Max items bounds a run's size and cost; page depth is unlimited unless you set it.
Choose what to collect
These inputs let you configure bol.com Scraper - Products, Prices, Offers, Reviews. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | Choose Search to build queries from keywords and filters, or URL to scrape pasted product or result-page URLs directly. |
searchTermsarray | One or more keywords to search for, e.g. "laptop", "koffiezetapparaat". |
productIdsarray | Look up specific products directly: bol.com product ids (16 digits, e.g. 9300000230842700), EAN/GTIN barcodes (8, 12, 13 or 14 digits), or product page URLs. Works in either mode and alongside search keywords; each entry returns one product. A bol.com id opens that exact product page (nothing is returned if it no longer exists); EAN/GTIN lookups return the top bol.com search hit for that barcode. A bol.com id or product URL always returns full detail fields; the detail enrichment charge applies to it only when Fetch full product details is on. |
specialsCategorystring | Optional. Add one of bol.com's own promo/discount browse pages as an extra source for this run, alongside your search keywords. Each returned product carries real was-price/discount fields (isOnSpecial, savingsAmount, savingsPercent, promoLabel) straight from bol.com's own listing data. Off by default. |
sortBystring | Result ordering. Applies in both Search and URL mode: for a pasted search-result URL, this input's sort is applied when the search is rebuilt, and the pasted URL's own sort order (if any) is not read or preserved. |
minPriceinteger | Only keep products at or above this price. |
maxPriceinteger | Only keep products at or below this price. |
Show 24 more inputs
| Input | What it controls |
|---|---|
minRatinginteger | Only keep products with an average review rating at or above this value (1-5). |
conditionstring | Keep only products whose best offer matches this condition. |
sponsoredOnlyboolean | Keep only sponsored (advertised) products. |
includeSponsoredboolean | Keep sponsored (advertised) listings in the results. Turn off to drop them. Ignored when Sponsored only is on. |
inStockOnlyboolean | Keep only products that have a buyable offer. |
urlsarray | Paste bol.com product, search-result, category (/l/), brand (/b/), deals or outlet (/ra/) URLs. Belgian search links (/be/nl/s/ and /be/fr/s/) are scraped on the Belgian storefront and records carry country BE; Belgian category, brand and outlet links are skipped. The price, rating, condition, sponsored and in-stock filters still apply. A product link always returns full detail fields; the detail enrichment charge applies to it only when Fetch full product details is on. Left untouched, one example of each shape runs. |
fetchDetailsboolean | Adds the full specifications (incl. EAN), full description, every image, the full review list with rating distribution, seller rating, weight, and refurbished/second-hand offers. Without it, runs already return price, image, rating summary, condition and seller. |
maxReviewsinteger | Maximum number of individual reviews captured per product when Fetch full product details is on. Bol.com's product page serves only its first slice of reviews (about 6 per product in testing) and exposes no way to page further, so fewer reviews than the cap may come back. |
maxPagesinteger | Safety bound on result pages walked per keyword. Leave empty or 0 for unlimited. This does NOT cap the number of products; the run still stops at Max items. |
totalPagesinteger | Same as Max pages per search, kept for compatibility with other bol.com scrapers. Max pages wins when both are set. |
maxListingsinteger | Maximum number of products to return across the whole run. The single finite cap. Set 0 for unlimited. |
residentialCountriesarray | Preferred exit countries. Defaults to NL then BE, DE, FR, GB. |
maxResidentialRequestsinteger | Cost guard limiting how many requests the run may make before switching to the backup gateway. 0 = unlimited. Default 5000. |
trafficBudgetMbinteger | Soft transfer budget. When exceeded, the actor switches to the backup gateway. 0 = unlimited. Default 1500. |
preferDatacenterboolean | No effect: Bol.com refuses datacenter connections, so the actor always uses a residential connection. Kept so saved tasks keep working. |
resumeFromRunIdstring | Paste a previous run ID or dataset ID to continue a large crawl of products without returning or charging for products already collected there. Use this after an interrupted run, or when continuing a product catalogue pull in another run. For recurring daily monitoring of the same search, use Incremental mode below instead. |
incrementalModeboolean | Turn this on for daily or recurring monitoring. The first run returns all matching products as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED products. A product is UPDATED when a tracked field changes: price, list price, discount, availability and delivery, condition, title, offers, seller, specifications, description or categories. These never make a product UPDATED (they stay in the output): reviews and every rating or review counter, the rotating image host, URL tracking parameters, and the order of offers. Use "Ignore fields when detecting changes" below to exclude more fields. Turn on "Emit unchanged" or "Emit expired" only when you also want those products returned (and billed). State is kept separately for each search/URL/specials/detail-mode setup; use State key when you want to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above. |
stateKeystring | Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the search/URL/specials and filter settings, different searches then never mix state with each other. |
emitUnchangedboolean | Off by default. Turn on to also return products that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have, so leave it off unless you specifically want the full snapshot every run. |
emitExpiredboolean | Off by default. Turn on to also return products that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search, not when Max items capped it or when Resume was used. This returns, and bills, extra synthetic rows, so leave it off unless you need expiry tracking. |
ignoreFieldsForChangesarray | Optional. Top-level output field names (for example description or delivery) that must never make a product UPDATED or appear in changedFields. They are still returned in the output. Added on top of the built-in exclusions (reviews, rating counters). Applies to the saved state too, so changing this list does not cause a one-time wave of UPDATED rows. |
mcpConnectorsarray | Optional. Pick connected apps (Notion, Airtable, Linear, Apify) to also push each scraped product to, in addition to the dataset. |
notionParentPageUrlstring | Optional. When a Notion connector is selected, create one page per product under this parent page. |
maxNotifyListingsinteger | Optional cap on how many products are pushed to the selected MCP connectors. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
productIdProduct IDtitleTitlebrandBrandpricePricelist_priceList pricediscount_percentageDiscount %isOnSpecialOn specialsavingsAmountSavings amountsavingsPercentSavings %promoLabelPromo labelspecialsCategorySpecials categorycurrencyCurrencyShow 49 more fields
conditionConditionratingRatingreviewCountReviewscategoryCategoryeanEANimageImage (image)sellerSelleravailabilityAvailabilitysponsoredSponsoredurlURL (link)changeTypeChange type (incremental mode) (text)changedFieldsChanged fields (incremental mode) (array)firstSeenAtFirst seen (incremental mode) (date)lastSeenAtLast seen (incremental mode) (date)scrapedAtScraped at (datetime)linkLink (link)offer_uidOffer UIDsecondary_imagesSecondary images (array)sponsor_ad_idSponsor ad IDretailer_idRetailer IDdiscount_priceDiscount priceselect_priceSelect priceselect_labelSelect labelselect_discountSelect discountrefurbished_priceRefurbished priceorderableOrderable (boolean)summarySummary (text)reviews_averageReviews averagereviews_totalReviews totaldelivery_descriptionDelivery description (text)release_dateRelease date (date)delivered_within_48hDelivered within 48h (boolean)bundle_pricesBundle prices (array)promotional_labelsPromotional labels (array)is_scarceIs scarce (boolean)purchase_typePurchase type (text)energy_labelEnergy label (text)explicitExplicit (boolean)idIDdescriptionDescriptionspecificationsSpecifications (array)ratingDistributionRating distribution (object)offersOffers (array)buyBoxBuy box (object)variantsVariants (array)imagesImages (array)weightWeightenergyLabelEnergy labelreviewsreviewsExample output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"productId": "9300000012345",
"title": "Voorbeeld Draadloze Hoofdtelefoon met Noise Cancelling, Zwart",
"brand": "Voorbeeldmerk",
"price": 279,
"list_price": 349.99,
"discount_percentage": 20,
"currency": "EUR",
"condition": "new",
"ean": "0000000000000",
"category": "Koptelefoons",
"categoryHierarchy": [
"Elektronica",
"Audio",
"Koptelefoons"
],
"rating": 4.6,
"reviewCount": 812,
"ratingDistribution": {
"fiveStar": 600,
"fourStar": 150,
"threeStar": 40,
"twoStar": 12,
"oneStar": 10
},
"reviews": [
{
"rating": 5,
"title": "Prima aankoop",
"text": "Snel geleverd en werkt goed.",
"nickname": "Klant2024",
"location": "Nederland",
"verified": true
}
],
"image": "https://media.s-bol.com/0000/image-550x461.jpg",
"images": [
"https://media.s-bol.com/0000/image-550x461.jpg"
],
"availability": "Voor 23:59 uur besteld, morgen in huis",
"delivery": "Voor 23:59 uur besteld, morgen in huis",
"offers": [
{
"price": 279,
"currency": "EUR",
"condition": "new",
"seller": {
"id": "0000000",
"name": "Voorbeeldverkoper",
"rating": 9.2,
"topSeller": true
}
}
],
"seller": {
"id": "0000000",
"name": "Voorbeeldverkoper",
"rating": 9.2,
"topSeller": true
},
"specifications": [
{
"group": "Algemeen",
"name": "EAN",
"value": "0000000000000"
},
{
"group": "Algemeen",
"name": "Kleur",
"value": "Zwart"
}
],
"description": "Voorbeeldbeschrijving van dit product voor studie, werk of thuisgebruik.",
"weight": "254 g",
"weightGrams": 254,
"sponsored": false,
"has_refurbished": false,
"in_stock": true,
"isOnSpecial": true,
"originalPrice": 349.99,
"savingsAmount": 70.99,
"savingsPercent": 20,
"promoLabel": "deal",
"specialsCategory": null,
"products_found": 4210,
"search_query": "koptelefoon",
"country": "NL",
"url": "https://www.bol.com/nl/nl/p/voorbeeld-hoofdtelefoon/9300000012345/",
"scrapedAt": "2026-01-01T00:00:00+00:00"
}Ways to use this data
- Price trackers and deal hunters: watch prices, discounts and Bol.com's own specials pages on a recurring schedule.
- E-commerce and marketplace analysts: compare pricing, ratings and seller performance across categories.
- Retail catalog teams: pull full specifications, EAN codes and every product image to enrich a catalog.
- Review and reputation research: collect the full review list and star distribution per product.
- Resellers and price-comparison tools: track refurbished and second-hand offers alongside new-condition pricing.
Before you run
Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.
Questions about this actor
What data does bol.com Scraper return?
The documented output for bol.com Scraper includes product id, title, brand, price, list price, discount %, on special and savings amount. Availability of each field depends on the source page and the selected mode.
How much does bol.com Scraper cost?
It costs $2.00 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
Can I get only new or changed products on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new, updated and reappeared products, and unchanged ones are not billed unless Emit unchanged is on.
What's the difference between Resume and Incremental mode?
This is the most common mix-up. Resume (resumeFromRunId) continues one specific interrupted run by skipping products it already collected. Incremental mode remembers the previous run of the same search by itself, for recurring scheduled runs, so you never paste an ID. The two can be combined only to bootstrap a search's very first incremental baseline from a resumed dataset; combining them again once that search already has saved incremental state stops the run with a message telling you to drop Resume or set a different stateKey.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to also push each product to Notion, Linear or Airtable.
