bol.com Product Scraper
bol.com is the online price the Netherlands and Belgium buy against, the number your own listing gets compared to.
bol.com is the online price the Netherlands and Belgium buy against, the number your own listing gets compared to. Rows carry price in cents, rating, review count, delivery promise, and a bol.com-vs-partner flag; details add EAN, brand and condition. No seller identity or reviewer data collected.
$3.00 / 1,000 · 92.2% success over 51 public runs in the last 30 days.
Run it on Apify → Free to try - runs bill per result on your own account.
What you give it
Every field is optional unless marked; sensible defaults do the rest.
| Field | Type | What it does | Default |
|---|---|---|---|
searchQuery |
string | What to search for on bol.com, exactly as you would type it in the site's search box, e.g. "iphone 16 hoesje" or "lego technic". Leave it out when you only re-check products through listingIds. | lego technic |
listingIds |
array | Re-check products you already know instead of searching: one product number per line (the digits at the end of every bol.com product address, and the productId of every dataset item), or the product's full address. Each one is read from its own page on the storefront chosen below - title, price, rating, seller type, main image - with the detail fields (brand, EAN, colour, material, condition, availability) whether or not Scrape details is on. A product that is gone from the site is skipped, named in the log and not billed. When given, the search fields of this form are ignored and the run status says which. Up to 50. |
[] |
storefront |
string | Which bol.com storefront to search: bol.com/nl (Netherlands) or bol.com/be (Belgium, Dutch). Assortment and prices can differ slightly. | bol.com/nl |
priceMinEur |
integer | Only include products costing at least this many euros. Products without a readable price are excluded when a price filter is set. | - |
priceMaxEur |
integer | Only include products costing at most this many euros. Products without a readable price are excluded when a price filter is set. | - |
scrapeDetails |
boolean | Also open each product page for brand, EAN barcode, colour, material, condition, availability and variant count. Slower: one extra request per product. The same page carries every photo of the product, delivered as imageUrls. |
False |
maxItems |
integer | Stop after this many products. Free-plan runs are capped at 5 items. The form starts at 25 for a cheap first run - that is the form's prefill, not a cap on your plan; clear it to use the default of 200. | 200 |
reportFailures |
boolean | When a run fails, send the developer the actor name and build, an error category, the error message (truncated) and a one-way hash of your input - so a bug can be fixed without anyone asking you to reproduce it. Your input itself, your results and your identity are never sent, and successful runs send nothing at all. Switch this off and the actor behaves exactly the same. | True |
What you get back
One JSON object per result, with exactly these fields - no seller identities, no contact data, ever.
A real result row from a recent run:
{
"currency": "EUR",
"deliveryText": "",
"imageUrl": "https://media.s-bol.com/l3KZkNovgK95/N9O9Gwv/550x550.jpg",
"priceCents": 7998,
"productId": "9300000272078194",
"ratingValue": 3.4,
"reviewCount": 8,
"snippet": "Realistische AK-47 bouwervaring met mechanische functies De Reobrix AK-47 bouwset brengt een iconisch...",
"thirdPartySeller": true,
"title": "Reobrix 7 7005 AK-47 Assault Rifle bouwset | WW2 army ops pistool modelbouw | Creator classic battlefield guns bouwpakket | Technische Educa...",
"url": "https://www.bol.com/nl/nl/p/reobrix-7-7005-ak-47-assault-rifle-bouwset-ww2-army-ops-pistool-modelbouw-creator-classic-battlefield-guns-bouwp..."
}
| Field | Type | Meaning |
|---|---|---|
productId |
string | bol.com product ID from the product URL. |
url |
string | Direct link to the product page. |
title |
string | Product title as listed. |
priceCents |
['integer', 'null'] | Current price in euro cents as shown on the search page. Null when the tile shows no readable price. |
currency |
string | Always EUR. |
ratingValue |
['number', 'null'] | Average customer rating, 0-5. Null when the product has no reviews. |
reviewCount |
['integer', 'null'] | Number of customer reviews. Review text and reviewer identities are never collected. |
snippet |
string | Product description snippet from the search page. |
deliveryText |
string | Stock and delivery promise as displayed, e.g. 'Op voorraad. Voor 21:00 uur besteld, morgen in huis'. |
thirdPartySeller |
boolean | True when the offer comes from a marketplace partner instead of bol.com itself. The seller's name is never collected. |
imageUrl |
string | Main product image. |
brand |
['string', 'null'] | Brand name. Only present with scrapeDetails enabled. |
ean |
['string', 'null'] | EAN-13 / GTIN-13 barcode. Only present with scrapeDetails enabled. |
color |
['string', 'null'] | Variant colour. Only present with scrapeDetails enabled. |
material |
['string', 'null'] | Product material. Only present with scrapeDetails enabled. |
condition |
['string', 'null'] | Offer condition from structured data, e.g. NewCondition. Only present with scrapeDetails enabled. |
availability |
['string', 'null'] | Offer availability from structured data, e.g. InStock. Only present with scrapeDetails enabled. |
variantCount |
integer | Number of product variants (colours, sizes) on the product page. Only present with scrapeDetails enabled. |
imageUrls |
array | Every photo of the product, 550 px wide, in the site's order (up to 8). Present when the product's own page was read: with scrapeDetails on, or through listingIds. The search tile carries one thumbnail (imageUrl). |
Health
92.2% success over 51 public runs in the last 30 days. Live record, failures included: status page.
Full documentation, examples and the AI-assistant prompt live on the store page.
The history behind this tool
This tool answers what a source shows today. Its output also feeds a series recorded every day and kept: Retail price and stock availability over time. A run gives you the current market; the series is the part that cannot be reconstructed afterwards, because the source overwrites it.