# bol.com Product Search API Documentation

Scrappa's `GET /api/bol/search` returns bol.com products for the Netherlands and Belgium as structured JSON, with sort, category, brand and price filters and paging.

## Credits

One successful request with results costs 9 credits. An empty result, a validation error and every failure cost nothing.

## What you get

One request returns one page (about 30 cards) with bol.com's own match count in `total`, `max_page`, the requested `page` and the `facets` for the next call. Each product has `id`, `title`, `url`, `price` (a number) and `currency` (EUR), `original_price` and `discount` (`amount` and `percent`) when bol.com shows a reference price, `select_price`, `seller`, `condition`, `delivery_text`, `delivery_date` (ISO 8601), `image_url`, `rating`, `review_count`, `brand`, `categories`, `is_sponsored` and `offers_url`. The `id` goes unchanged into the product, offers and reviews endpoints.

## Storefronts

`country=nl` (default) searches bol.com Netherlands. `country=be` searches Belgium in Dutch (`language=nl`, default) or French (`language=fr`). A search for an EAN returns the product with that EAN.

## Filters are honoured

`category` takes a category id from `facets` with `type` category. `facet_ids` takes filter value ids from `facets` (for example a brand), comma-separated. `min_price` and `max_price` filter by price in EUR; cards whose shown price is outside the range are removed from the page. `applied_filters` echoes what was sent. Unknown parameters and values return `422`.

## Sorting and paging

`sort` is `relevance` (default), `price_asc`, `price_desc`, `rating` or `popularity`. bol.com lists at most 10 pages. A later page returns an empty `products` list with the requested `page`, never page 1 data.

## Not available

Rating and delivery filters are not offered. A bare brand name such as a brand without a product word returns `422`.

- **Documentation:** [https://scrappa.co/docs/bol-api/bol_search](https://scrappa.co/docs/bol-api/bol_search)
- **API group:** bol.com API
- **Endpoint:** `GET https://scrappa.co/api/bol/search`

## Authentication

Send your Scrappa API key in the `X-API-KEY` request header. Paid endpoints also support accountless x402 payments when called without an API key.

## Parameters

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `q` | string | Yes | Search term or EAN, for example airfryer. |
| `country` | string | No | nl (default) or be. |
| `language` | string | No | nl (default) or fr. fr needs country=be. |
| `page` | integer | No | Result page, 1 to 10. Later pages are empty. |
| `sort` | string | No | relevance (default), price_asc, price_desc, rating or popularity. |
| `category` | string | No | Category id from the facets of an earlier search, for example 18336. |
| `facet_ids` | string | No | Filter value ids from the facets, such as a brand. Comma-separated. |
| `min_price` | number | No | Minimum price in EUR. |
| `max_price` | number | No | Maximum price in EUR. |

## Example request

```bash
#!/bin/bash

curl -X GET \
    -H "x-api-key: YOUR_API_KEY_HERE" \
    "https://scrappa.co/api/bol/search?q=airfryer&country=nl&sort=price_asc&min_price=100&max_price=150"
```

## Example response

```json
{
    "success": true,
    "query": "airfryer",
    "locale": "nl/nl",
    "page": 1,
    "max_page": 10,
    "total": 704,
    "returned": 28,
    "applied_filters": {
        "sort": "price_asc",
        "min_price": 100,
        "max_price": 150
    },
    "products": [
        {
            "id": "9300000171550609",
            "title": "Philips 3000 Series Dual Airfryer - NA351/00 - Dubbele Mand",
            "url": "https://www.bol.com/nl/nl/p/philips-3000-series-dual-airfryer-na351-00/9300000171550609/",
            "price": 109,
            "currency": "EUR",
            "original_price": 199.99,
            "discount": {
                "amount": 90.99,
                "percent": 45
            },
            "select_price": null,
            "is_select": false,
            "seller": {
                "id": "0",
                "name": "bol",
                "is_bol": true,
                "rating": null,
                "rating_percent": null,
                "top_seller": null
            },
            "condition": "new",
            "delivery_text": "Op voorraad. Voor 23:59 uur besteld, dinsdag in huis",
            "delivery_date": "2026-11-10",
            "image_url": "https://media.s-bol.com/Qr0jNQGR24Q0/zp9Z668/1200x989.jpg",
            "rating": 4.6,
            "review_count": 200,
            "brand": {
                "id": "4978545",
                "name": "Philips"
            },
            "categories": [
                [
                    {
                        "id": "3136",
                        "name": "Elektronica"
                    },
                    {
                        "id": "18336",
                        "name": "Airfryers"
                    }
                ]
            ],
            "is_sponsored": false,
            "offers_url": "https://www.bol.com/nl/nl/prijsoverzicht/philips-3000-series-dual-airfryer-na351-00/9300000171550609/",
            "locale": "nl/nl"
        }
    ],
    "facets": [
        {
            "type": "category",
            "id": "18336",
            "name": "Airfryers",
            "count": 2868,
            "applied": false
        },
        {
            "type": "range",
            "id": "12194",
            "name": "Prijs (\u20ac)",
            "min": 0.89,
            "max": 2203,
            "unit": "\u20ac"
        },
        {
            "type": "filter",
            "id": "4842",
            "name": "Merk",
            "items": [
                {
                    "id": "4294884369",
                    "name": "Philips",
                    "count": 72,
                    "applied": false
                }
            ]
        }
    ],
    "meta": {
        "endpoint_family": "search",
        "billable": true,
        "credits": 9,
        "attempts": 1
    }
}
```

## Errors

| Status | Error | Description |
| --- | --- | --- |
| 422 | Query Not Searchable | bol.com answers a bare brand name with a brand page instead of a product list (`unsearchable_query`). Add a product word. Non-billable. |
| 422 | Validation Error | A query parameter is missing, unknown or unusable. Unknown parameters and unknown values are rejected, never ignored. Non-billable. |
| 503 | Upstream Unavailable | bol.com could not be reached after retries, answered with an error or changed its format (`upstream_unavailable`, `upstream_blocked`, `parser_drift`). Retryable and never billed. Clients are never rate limited. |

## More Scrappa resources

- [API documentation](https://scrappa.co/docs)
- [Full LLM-readable API reference](https://scrappa.co/llms-full.txt)
- [OpenAPI specification](https://scrappa.co/docs/api.json)
- [Pricing](https://scrappa.co/pricing)
