# Bol Com Listings Extractor (`kawsar/bol-com-listings-extractor`) Actor

Bol.com search scraper that pulls listings by keyword, with price, rating, reviews, brand, seller, and image, so you can run SEO research and track prices at scale.

- **URL**: https://apify.com/kawsar/bol-com-listings-extractor.md
- **Developed by:** [Kawsar](https://apify.com/kawsar) (community)
- **Categories:** E-commerce, SEO tools, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.99 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Bol.com Listings Extractor

Bol.com Listings Extractor reads product data from Bol.com search results so you don't have to copy anything by hand. Give it the keywords you want, choose the Netherlands or Belgium store, and it walks the result pages and collects what it finds: title, price, rating, reviews, brand, seller, the product link, and the image.

It's built for SEO and e-commerce research on Bol.com: keyword research, watching competitor prices, tracking how products rank for a term, and building out a product catalog.

### What it does

- Searches Bol.com by any keyword, the same text you'd type into the site's search box
- Takes a list of keywords and scrapes each one separately
- Works on the Netherlands (bol.com/nl) and Belgium (bol.com/be) marketplaces
- Pages through results on its own until it hits your per-keyword item limit
- Returns clean, structured rows ready for export or the API

### Input

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `searchQueries` | array of strings | yes | One or more keywords, exactly as you'd type them into the Bol.com search box. Each keyword is scraped separately. |
| `countryCode` | string | no | `nl` for bol.com/nl or `be` for bol.com/be. Default `nl`. |
| `maxItems` | integer | no | Maximum products to return **per keyword**. Default `100`, max `1000`. The actor keeps paging until it reaches this number or runs out of results. |
| `requestTimeoutSecs` | integer | no | Per-request timeout in seconds. Default `45`. |

#### Example input

```json
{
    "searchQueries": ["airco", "ventilator", "koelkast"],
    "countryCode": "nl",
    "maxItems": 100
}
````

With three keywords and `maxItems: 100`, the run returns up to 300 products, 100 for each keyword.

### Output

Each product is one row in the dataset.

| Field | Description |
|-------|-------------|
| `searchQuery` | The keyword this product was found for. |
| `page` | Result page the product appeared on. |
| `position` | Rank of the product within the page. |
| `productId` | Bol.com product identifier. |
| `productTitle` | Product name. |
| `productUrl` | Link to the product page. |
| `image` | Product image URL. |
| `price` | Price as a number. |
| `currency` | Currency code (EUR). |
| `rating` | Average star rating, when shown. |
| `reviewCount` | Number of reviews, when shown. |
| `brand` | Brand name, when shown. |
| `seller` | Seller name, when shown. |
| `sponsored` | Whether the listing is a sponsored result. |
| `scrapedAt` | UTC timestamp of the scrape. |

#### Example output

```json
{
    "searchQuery": "airco",
    "page": 1,
    "position": 1,
    "productId": "9300000304596514",
    "productTitle": "Silvergear Bureau Ventilator - Mini Bureauventilator - Wit",
    "productUrl": "https://www.bol.com/nl/nl/p/.../9300000304596514/",
    "image": "https://media.s-bol.com/gglV76KxX0or/vo0w4v5/550x550.jpg",
    "price": 34.95,
    "currency": "EUR",
    "rating": 4.3,
    "reviewCount": 91,
    "brand": "Silvergear",
    "seller": "Karsten Int",
    "sponsored": true,
    "scrapedAt": "2026-06-29T12:10:02.203581+00:00"
}
```

### How to use

1. Open the actor and add your keywords to **Search keywords**. Add as many as you like; each one is scraped on its own.
2. Pick the marketplace, Netherlands or Belgium.
3. Set **Max items per keyword**.
4. Run it. Results stream into the dataset as the actor works through each page, so you can watch them arrive.

### How pagination works

You don't set a page count. The actor starts on page 1 of the search results, reads every product on the page, then moves to the next page and repeats. It stops for a keyword when it has collected `maxItems` products or there are no more results to read. Then it moves on to the next keyword. Because the limit is per keyword, every keyword in a batch gets the same depth of coverage.

### Exporting results

Download the dataset as JSON, CSV, Excel, XML, or HTML from the run's **Storage** tab, or pull it through the Apify API into your own dashboards and tools. The dataset has a built-in table view so you can scan results without exporting.

### Use cases

- **Keyword research:** see which products and brands rank for a search term, and how many sponsored listings sit at the top.
- **Price monitoring:** schedule daily or weekly runs for the same keywords and watch how competitor prices move over time.
- **Catalog building:** collect product titles, IDs, images, and links for a whole category in one pass.
- **Brand and seller tracking:** find every listing tied to a brand or third-party seller for a search term.
- **Market and assortment analysis:** measure rating distribution, review counts, and price ranges for a product type.

### Running on a schedule

Set up an Apify Schedule to run the actor at a fixed interval (for example every morning). Combine it with a webhook or integration to push new results into Google Sheets, a database, Slack, or your BI tool. This turns a one-off scrape into an ongoing price and ranking monitor.

### Tips

- Use the exact words a shopper would type. Bol.com search is sensitive to spelling and language (Dutch keywords return the most relevant results).
- Start with a small `maxItems` to preview the data shape, then raise it for a full pull.
- Sponsored rows are flagged with `sponsored: true` so you can filter them out of organic ranking analysis.
- Some fields (`rating`, `reviewCount`, `brand`, `seller`) are only present when Bol.com shows them on the card, so expect them to be empty for newer or sponsored listings.

### Notes and limitations

- Prices are read as they appear on the search results page and are for reference. Always confirm the live price on the product page before acting on it.
- Bol.com may change its page layout at any time, which can affect extraction. If you spot missing fields, report it so the parser can be updated.
- The actor reads public search result pages only. It does not log in, place orders, or access any account data.

### FAQ

**Can I scrape more than one keyword at a time?**
Yes. Add as many keywords as you want to **Search keywords**. Each is scraped separately and tagged with `searchQuery` in the output.

**Does `maxItems` limit the whole run or each keyword?**
Each keyword. Ten keywords with `maxItems: 50` returns up to 500 products, 50 per keyword.

**Which marketplaces are supported?**
The Netherlands store (bol.com/nl) and the Belgium store (bol.com/be), selectable with `countryCode`.

**What currency are prices in?**
Euro (EUR) for both marketplaces.

# Actor input Schema

## `searchQueries` (type: `array`):

One or more search keywords, exactly as you would type them into the Bol.com search box. Each keyword is scraped separately.

## `countryCode` (type: `string`):

Which Bol.com marketplace to search.

## `maxItems` (type: `integer`):

Maximum number of products to return for each keyword. The actor keeps paging through results until it reaches this number or runs out of products.

## `requestTimeoutSecs` (type: `integer`):

Per-request timeout in seconds.

## Actor input object example

```json
{
  "searchQueries": [
    "airco",
    "ventilator"
  ],
  "countryCode": "nl",
  "maxItems": 20,
  "requestTimeoutSecs": 45
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchQueries": [
        "airco"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("kawsar/bol-com-listings-extractor").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "searchQueries": ["airco"] }

# Run the Actor and wait for it to finish
run = client.actor("kawsar/bol-com-listings-extractor").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQueries": [
    "airco"
  ]
}' |
apify call kawsar/bol-com-listings-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=kawsar/bol-com-listings-extractor",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Bol Com Listings Extractor",
        "description": "Bol.com search scraper that pulls listings by keyword, with price, rating, reviews, brand, seller, and image, so you can run SEO research and track prices at scale.",
        "version": "0.0",
        "x-build-id": "Vf51afD9GODZ9Qkk5"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/kawsar~bol-com-listings-extractor/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-kawsar-bol-com-listings-extractor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/kawsar~bol-com-listings-extractor/runs": {
            "post": {
                "operationId": "runs-sync-kawsar-bol-com-listings-extractor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/kawsar~bol-com-listings-extractor/run-sync": {
            "post": {
                "operationId": "run-sync-kawsar-bol-com-listings-extractor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "searchQueries"
                ],
                "properties": {
                    "searchQueries": {
                        "title": "Search keywords",
                        "type": "array",
                        "description": "One or more search keywords, exactly as you would type them into the Bol.com search box. Each keyword is scraped separately.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "countryCode": {
                        "title": "Marketplace",
                        "enum": [
                            "nl",
                            "be"
                        ],
                        "type": "string",
                        "description": "Which Bol.com marketplace to search.",
                        "default": "nl"
                    },
                    "maxItems": {
                        "title": "Max items per keyword",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Maximum number of products to return for each keyword. The actor keeps paging through results until it reaches this number or runs out of products.",
                        "default": 20
                    },
                    "requestTimeoutSecs": {
                        "title": "Request timeout (seconds)",
                        "minimum": 5,
                        "maximum": 120,
                        "type": "integer",
                        "description": "Per-request timeout in seconds.",
                        "default": 45
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
