Bol.com Product Search, Price & Stock Extractor
Searches Bol.com by keyword, category, EAN, or promotions page and returns price, rating, stock status, and seller for each product, with no login required.
Input schema
Input fields, types, required flags, descriptions, defaults, and prefills come from the published definition. Prefill examples are distinct from defaults.
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | required | What to collect from Bol.com. |
searchQueries | array | optional | One or more keywords to search for (mode=search). |
productUrls | array | optional | Bol.com product links, EAN-8/EAN-13 barcodes, or numeric product IDs (mode=productDetails). |
Show all input fields
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | required | What to collect from Bol.com. |
searchQueries | array | optional | One or more keywords to search for (mode=search). |
productUrls | array | optional | Bol.com product links, EAN-8/EAN-13 barcodes, or numeric product IDs (mode=productDetails). |
categoryUrls | array | optional | Bol.com listing links or numeric category IDs (mode=categoryBrowse). |
marketplace | string | optional | Which Bol.com shop to use for keyword searches and numeric category IDs. |
language | string | optional | Shop language for keyword searches and numeric category IDs. |
sortBy | string | optional | Result ordering for search and browsing. Price sorts use the emitted numeric price; RATING_ASC follows Bol's rating score, not the visible average. |
minPrice | integer | optional | Only keep products at or above this price. |
maxPrice | integer | optional | Only keep products at or below this price. |
minRating | number | optional | Only keep products rated at or above this value (0-5). |
condition | string | optional | Only keep products with this offer condition. |
inStockOnly | boolean | optional | Only keep products that are currently in stock. |
includeSponsored | boolean | optional | Keep sponsored (advertised) products in search and browse results. |
includeDetails | boolean | optional | Visit each product page to add EAN, full description, specifications, all images, rating distribution, and recent reviews. Slower, but more complete. |
includeOffers | boolean | optional | Add the first page of seller offers (price, shipping, condition, seller rating) for each product. Bol.com paginates offers; only the first page is returned. |
maxItems | integer | optional | Maximum number of products to return across the whole run. |
maxPages | integer | optional | Page limit per query or listing. 0 uses the source's own page limit. |
Download the published input schema
View complete JSON
{
"description": "Search, browse, look up products, or read deals from Bol.com in the Netherlands or Belgium.",
"properties": {
"categoryUrls": {
"default": [],
"description": "Bol.com listing links or numeric category IDs (mode=categoryBrowse).",
"editor": "stringList",
"prefill": [],
"title": "Category, brand, series, or deals URLs",
"type": "array"
},
"condition": {
"default": "any",
"description": "Only keep products with this offer condition.",
"editor": "select",
"enum": [
"any",
"new",
"refurbished",
"secondhand"
],
"enumTitles": [
"Any condition",
"New",
"Refurbished",
"Second-hand"
],
"prefill": "any",
"title": "Condition",
"type": "string"
},
"inStockOnly": {
"default": false,
"description": "Only keep products that are currently in stock.",
"prefill": false,
"title": "In stock only",
"type": "boolean"
},
"includeDetails": {
"default": false,
"description": "Visit each product page to add EAN, full description, specifications, all images, rating distribution, and recent reviews. Slower, but more complete.",
"prefill": false,
"title": "Fetch product details",
"type": "boolean"
},
"includeOffers": {
"default": false,
"description": "Add the first page of seller offers (price, shipping, condition, seller rating) for each product. Bol.com paginates offers; only the first page is returned.",
"prefill": false,
"title": "Fetch seller offers",
"type": "boolean"
},
"includeSponsored": {
"default": true,
"description": "Keep sponsored (advertised) products in search and browse results.",
"prefill": true,
"title": "Include sponsored products",
"type": "boolean"
},
"language": {
"default": "nl",
"description": "Shop language for keyword searches and numeric category IDs.",
"editor": "select",
"enum": [
"nl",
"fr"
],
"enumTitles": [
"Dutch",
"French"
],
"prefill": "nl",
"title": "Language",
"type": "string"
},
"marketplace": {
"default": "nl",
"description": "Which Bol.com shop to use for keyword searches and numeric category IDs.",
"editor": "select",
"enum": [
"nl",
"be"
],
"enumTitles": [
"Netherlands (bol.com/nl)",
"Belgium (bol.com/be)"
],
"prefill": "nl",
"title": "Marketplace",
"type": "string"
},
"maxItems": {
"default": 20,
"description": "Maximum number of products to return across the whole run.",
"maximum": 10000,
"minimum": 1,
"prefill": 1,
"title": "Max products",
"type": "integer"
},
"maxPages": {
"default": 0,
"description": "Page limit per query or listing. 0 uses the source's own page limit.",
"maximum": 500,
"minimum": 0,
"prefill": 0,
"title": "Max pages per source",
"type": "integer"
},
"maxPrice": {
"description": "Only keep products at or below this price.",
"minimum": 0,
"title": "Maximum price (EUR)",
"type": "integer"
},
"minPrice": {
"description": "Only keep products at or above this price.",
"minimum": 0,
"title": "Minimum price (EUR)",
"type": "integer"
},
"minRating": {
"description": "Only keep products rated at or above this value (0-5).",
"maximum": 5,
"minimum": 0,
"title": "Minimum rating",
"type": "number"
},
"mode": {
"default": "search",
"description": "What to collect from Bol.com.",
"editor": "select",
"enum": [
"search",
"productDetails",
"categoryBrowse",
"promotions"
],
"enumTitles": [
"Search products by keyword",
"Look up products by URL, EAN, or product ID",
"Browse a category, brand, series, or deals page",
"Browse current promotions"
],
"prefill": "search",
"title": "Mode",
"type": "string"
},
"productUrls": {
"default": [],
"description": "Bol.com product links, EAN-8/EAN-13 barcodes, or numeric product IDs (mode=productDetails).",
"editor": "stringList",
"prefill": [],
"title": "Product URLs, EANs, or product IDs",
"type": "array"
},
"searchQueries": {
"default": [
"laptop"
],
"description": "One or more keywords to search for (mode=search).",
"editor": "stringList",
"prefill": [
"laptop"
],
"title": "Search queries",
"type": "array"
},
"sortBy": {
"default": "RELEVANCE",
"description": "Result ordering for search and browsing. Price sorts use the emitted numeric price; RATING_ASC follows Bol's rating score, not the visible average.",
"editor": "select",
"enum": [
"RELEVANCE",
"POPULARITY",
"PRICE_ASC",
"PRICE_DESC",
"RATING_ASC",
"NEW",
"WISHLIST"
],
"enumTitles": [
"Relevance",
"Popularity",
"Price: low to high",
"Price: high to low",
"Best rated (Bol score)",
"Newest",
"Most wanted"
],
"prefill": "RELEVANCE",
"title": "Sort by",
"type": "string"
}
},
"required": [
"mode"
],
"schemaVersion": 1,
"title": "Bol.com Product Search, Price & Stock Extractor Input",
"type": "object"
}
Output schema
Published result links and storage locations. This schema is not an exhaustive contract for every field in a dataset record.
| Field | Type | Required | Description |
|---|---|---|---|
products | string | optional | Dataset containing all scraped Bol.com products. |
Download the published output schema
View complete JSON
{
"actorOutputSchemaVersion": 1,
"description": "Bol.com products with current price, list price, availability, seller, EAN, rating, images, specifications, reviews, and optional seller offers.",
"properties": {
"products": {
"description": "Dataset containing all scraped Bol.com products.",
"template": "{{links.apiDefaultDatasetUrl}}/items",
"title": "Bol.com products",
"type": "string"
}
},
"title": "Bol.com Product Search, Price & Stock Extractor Output"
}
Dataset schema
Published dataset views and any declared field definitions. A view can select only a subset of the returned record fields.
Download the published dataset schema
View complete JSON
{
"actorSpecification": 1,
"views": {
"overview": {
"display": {
"component": "table",
"properties": {}
},
"title": "Bol.com Products",
"transformation": {
"fields": [
"title",
"brand",
"price",
"rating",
"reviewCount",
"inStock",
"productUrl"
]
}
}
}
}
Key-value schema
Published key-value store definitions, when provided by this build.
This definition is not present in the default published build. See the published README for available documentation.
Published README
Read the full published documentation
Bol.com Product Search, Price & Stock Extractor
Collect live product data from Bol.com, the largest online retailer in the Netherlands and Belgium. Search by keyword, browse a category or brand, open a product by URL, EAN barcode, or product ID, or read the current promotions feed. Every record is real data from the public shop — prices, list prices, stock, sellers, ratings, images, and optional specifications and seller offers. No login, API key, or proxy setup is needed.
What this actor does
- Search one or more keywords with price, rating, condition, stock, and sponsored-product filters.
- Browse category, brand, series, or deals pages, with deep pagination.
- Look up products by direct URL, EAN-8/EAN-13, or Bol.com product ID.
- Read promotions from the deals hub and its category deals pages.
- Enrich on demand: add EAN, full description, specifications, all images, rating distribution, recent reviews, and the first page of seller offers.
- Supports the Netherlands and Belgium marketplaces in Dutch and French.
- Empty fields are omitted from each record rather than written as
null.
Output per product
productId— Bol.com product identifierean— EAN/GTIN barcode when the product page publishes one (details mode)title,shortDescription,descriptionbrandprice,currencylistPrice— reference price when Bol.com shows one above the current pricediscountAmount,discountPercentrating,reviewCountratingDistribution— star counts when details are fetchedrecentReviews— up to six recent reviews when details are fetchedimageUrl,images[]productUrlseller,sellerId,sellerRating,soldByBolinStock,availability,conditiondelivery,deliveryDate,isScarceisSponsored,sponsorpromotionLabels[]categories[]specifications— grouped key/value specifications when details are fetchedoffers[],offerCount— first page of seller offers, and that page's count, when offers are enabledmarketplace,language,sourceQueryscrapedAt— collection timestamp
Input
| Field | Type | Default | Description |
|---|---|---|---|
mode |
string (select) | search |
search, productDetails, categoryBrowse, or promotions. |
searchQueries |
array | ["laptop"] |
Keywords for search. |
productUrls |
array | [] |
Product URLs, EANs, or product IDs for productDetails. |
categoryUrls |
array | [] |
Category, brand, series, or deals URLs, or category IDs, for categoryBrowse. |
marketplace |
string (select) | nl |
nl or be. |
language |
string (select) | nl |
nl or fr. |
sortBy |
string (select) | RELEVANCE |
RELEVANCE, POPULARITY, PRICE_ASC, PRICE_DESC, RATING_ASC, NEW, or WISHLIST. Price sorts use the emitted numeric price; RATING_ASC follows Bol's rating score. |
minPrice |
integer | – | Minimum price in EUR. |
maxPrice |
integer | – | Maximum price in EUR. |
minRating |
number | – | Minimum average rating, 0-5. |
condition |
string (select) | any |
any, new, refurbished, or secondhand. |
inStockOnly |
boolean | false |
Keep only products currently in stock. |
includeSponsored |
boolean | true |
Keep sponsored search results. |
includeDetails |
boolean | false |
Fetch product pages for EAN, description, specifications, images, and reviews. |
includeOffers |
boolean | false |
Fetch the first page of seller offers for each product. |
maxItems |
integer | 20 |
Overall product cap (1-10,000). |
maxPages |
integer | 0 |
Page limit per query/listing; 0 uses the source's own limit. |
Example: search with filters
{
"mode": "search",
"searchQueries": ["koptelefoon", "laptop"],
"marketplace": "nl",
"language": "nl",
"minPrice": 50,
"maxPrice": 300,
"minRating": 4,
"condition": "new",
"inStockOnly": true,
"sortBy": "PRICE_ASC",
"includeDetails": true,
"maxItems": 40
}
Example: browse a category or brand
{
"mode": "categoryBrowse",
"categoryUrls": [
"https://www.bol.com/nl/nl/l/laptops/4770/",
"https://www.bol.com/be/nl/pb/hp/4997239/"
],
"marketplace": "be",
"language": "nl",
"sortBy": "POPULARITY",
"maxItems": 100
}
Example: product lookup by EAN or URL
{
"mode": "productDetails",
"productUrls": ["0199251730818", "https://www.bol.com/nl/nl/p/hp-omnibook-5-16-ba1751nd-intel-core-i5-i5-1334u-laptop-406-cm-2k-16-gb-lpddr5x-sdram-1-tb-ssd-wi-fi-6-windows-11-home-zilver/9300000230842700/"],
"includeOffers": true,
"maxItems": 10
}
Example: current promotions
{
"mode": "promotions",
"marketplace": "nl",
"language": "nl",
"maxItems": 30
}
Use cases
- Price monitoring — track current and reference prices for a product set.
- Assortment research — pull a category, brand, or search niche into a clean dataset.
- EAN catalog enrichment — resolve barcodes to titles, brands, images, and specifications.
- Stock and seller tracking — see availability, delivery promises, and who is selling each item.
- Promotion analysis — collect the current deals feed and its category offers.
FAQ
Where does the data come from?
It is read from Bol.com's publicly accessible product, search, category, and deals pages at run time. The actor is not affiliated with Bol.com.
Can I use it for both the Netherlands and Belgium?
Yes. Set marketplace to nl or be. Both Dutch and French shop languages are supported.
Why is ean missing from my search results?
Search result cards do not publish barcodes. Enable includeDetails to visit each product page, where the EAN is read when Bol.com publishes it.
How many products can one search return?
Bol.com caps a single keyword result list at 10 pages (typically 24-30 products per page, about 250-270 products). For larger runs, the actor automatically splits broad searches into narrower category slices; a category or brand page also goes much deeper.
Why are some fields absent from a record?
Bol.com does not publish every field for every product — for example, marketplace items may have no EAN or specifications, and new products may have no reviews yet. Absent values are omitted instead of written as null.
How are results sorted?
RELEVANCE, POPULARITY, NEW, and WISHLIST follow Bol.com's own ordering. RATING_ASC follows Bol.com's rating score, which can differ from the visible average rating. PRICE_ASC and PRICE_DESC are sorted on the emitted numeric price after duplicate products are removed.
Are sponsored products included?
Yes by default, with isSponsored and sponsor set. Turn includeSponsored off to remove them.
Are all seller offers returned?
Bol.com paginates its offers page. The actor returns the first page of offers for each product (currently up to 10) and offerCount is the count on that page, not the total across all pages.
How current are prices and stock?
Each run reads the live pages, so prices, delivery promises, and availability reflect the moment of collection.
Do I need a proxy or an account?
No. The actor connects automatically; you do not configure a proxy, cookie, login, or API key.
Why is the full review list not included?
Bol.com's product pages expose a rating summary and a short sample of recent reviews. The actor returns the rating distribution and up to six recent reviews when details are enabled.
Python quickstart
Use a schema-derived input and the Python standard library to start a run. An Apify account and token are required for execution.
Source build bnIPi7NeXWQiwtRsR. Documentation is regenerated from the default published build; private drafts are not included.