Coolblue
The Dutch and Belgian electronics retailer: live price, stock, delivery promise, the full spec table and review scores, per storefront.
/coolblue/v1/search3 creditsSearch Coolblue by keyword: product id, name, price in euro, the delivery promise the site prints beside the product, the review score and the key specs. When the keyword is a whole category Coolblue answers with that category instead of a result list — this endpoint follows that and tells you so in `resolved_as`, so a search for 'headphones' returns headphones rather than an error. `total` is Coolblue's own match count and is present on keyword result sets.
| Parameter | Allowed / range | Description | |
|---|---|---|---|
| query | required | — | What to search for, in English or Dutch. A product number (979101) or a manufacturer code (EP2-61329) also resolves to the single matching product. |
| market = nl | optional | nl · be · de | Which storefront to ask. Prices and stock genuinely differ between them (measured: 5 of 7 shared products had a different price on nl vs be) and each market lists products the others do not. |
| filters | optional | — | Facet segments in 'key:value' form, for example 'merk:apple'. One value per key (the source answers a multi-value '+' form with 404). Call the 'filters' action to list what a category accepts, with the result count behind each value. |
| sort = relevance | optional | relevance · lowest-price · highest-price · most-sold · highest-rated | Result order. All five were measured to genuinely reorder the grid. An unknown value is rejected rather than passed on, because the source accepts any string and silently ignores what it does not know. |
| page = 1 | optional | 1–20 | Page of results. Coolblue stops a keyword result set at page 20: page 21 returns HTTP 404, so at most 480 products of a larger set are reachable and `results_reachable` reports it. Narrow with `filters` to reach the rest. |
/coolblue/v1/browse3 creditsWalk one of Coolblue's 403 categories — the catalogue view, and the richer of the two surfaces. Rows carry the typed delivery promise, the price with and without VAT, the review average, how many stores hold the item, the refurbished (Second Chance) price when there is one, and the colour variants. Use `categories` for the slugs and `filters` for the narrowing options.
| Parameter | Allowed / range | Description | |
|---|---|---|---|
| category | required | — | A Coolblue category slug such as 'headphones', 'washing-machines' or 'laptops', or a category URL. The `categories` action lists all 403 of them. |
| market = nl | optional | nl · be · de | Which storefront to ask. Prices and stock genuinely differ between them (measured: 5 of 7 shared products had a different price on nl vs be) and each market lists products the others do not. |
| filters | optional | — | Facet segments in 'key:value' form, for example 'merk:apple'. One value per key (the source answers a multi-value '+' form with 404). Call the 'filters' action to list what a category accepts, with the result count behind each value. |
| sort = relevance | optional | relevance · lowest-price · highest-price · most-sold · highest-rated | Result order. All five were measured to genuinely reorder the grid. An unknown value is rejected rather than passed on, because the source accepts any string and silently ignores what it does not know. |
| page = 1 | optional | 1– | Page of 22 results. A category publishes its own `total_pages`; asking past it returns NOT_FOUND. |
/coolblue/v1/product/detail3 creditsOne full product record by id or Coolblue URL: price including and excluding VAT, stock state, how many of Coolblue's stores hold it and how many can hand it over, the complete manufacturer specification table, the review average with its 1-5 star distribution, Coolblue's own pros and cons, and every gallery image. The answer also carries `source_check`, which compares the price against the schema.org copy the same page publishes so you can see the two agree.
| Parameter | Allowed / range | Description | |
|---|---|---|---|
| product_id | required | — | The Coolblue product number (979101) or any Coolblue product URL. The id alone is enough — no slug needed. |
| market = nl | optional | nl · be · de | Which storefront to ask. Prices and stock genuinely differ between them (measured: 5 of 7 shared products had a different price on nl vs be) and each market lists products the others do not. |
| include_specs = true | optional | — | Include the specification table. Turn it off for a smaller answer when you only want price and stock; it costs the same, because it is the same page. |
/coolblue/v1/products/batch20 creditsUp to 10 products in ONE call — the shape a price tracker runs on. Each row carries price, stock, rating and the id, and any id this market does not sell is named in `missing` instead of being silently dropped. Specifications are off by default here to keep the answer readable.
| Parameter | Allowed / range | Description | |
|---|---|---|---|
| product_ids | required | — | Between 1 and 10 Coolblue product numbers or product URLs. |
| market = nl | optional | nl · be · de | Which storefront to ask. Prices and stock genuinely differ between them (measured: 5 of 7 shared products had a different price on nl vs be) and each market lists products the others do not. |
| include_specs = false | optional | — | Include each product's specification table. Off by default because ten full spec tables is a large answer. |
/coolblue/v1/filters2 creditsThe filter vocabulary a category actually accepts: every facet key, its English title, and the values behind it — each with the exact `key:value` segment to pass back into `browse` or `search` AND the number of products behind it, so you can see a filter bite before spending a call on it. This exists because the facet keys are Dutch even on the English storefront (the brand filter is `merk`), so they cannot be guessed.
| Parameter | Allowed / range | Description | |
|---|---|---|---|
| category | required | — | The category whose filters to list, for example 'headphones'. |
| filters | optional | — | Show the filters still available after these segments are applied, with their updated counts — this is how you discover the narrowing options inside a selection. |
| market = nl | optional | nl · be · de | Which storefront to ask. Prices and stock genuinely differ between them (measured: 5 of 7 shared products had a different price on nl vs be) and each market lists products the others do not. |
/coolblue/v1/categories1 creditEvery Coolblue category, read from the sitemap it publishes for crawlers: the slug you pass to `browse` and `filters`, and its path on the site. One small request, and the slugs were verified against the live grid rather than assumed.
| Parameter | Allowed / range | Description | |
|---|---|---|---|
| market = nl | optional | nl · be · de | Which storefront to ask. Prices and stock genuinely differ between them (measured: 5 of 7 shared products had a different price on nl vs be) and each market lists products the others do not. |
| contains | optional | — | Only return categories whose slug contains this text. |
curl -X POST https://api.reefapi.com/coolblue/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{}'{
"ok": true,
"data": { /* the result */ },
"meta": {
"latency_ms": 240,
"record_count": 12,
"completeness_pct": 100
},
"error": null
}