Coolblue APIcoolblue.nl ↗
Access Coolblue.nl product listings, laptop specs, customer reviews, and second-chance items via 8 structured endpoints. Search, filter by brand, and paginate results.
What is the Coolblue API?
The Coolblue.nl API exposes 8 endpoints covering product search, laptop category browsing, detailed specifications, customer reviews, and refurbished listings from Coolblue.nl. The get_laptop_details endpoint returns structured key-value specification pairs for any laptop identified by its slug and product ID. Other endpoints cover brand-filtered browsing across Apple, Lenovo, HP, and five other manufacturers, plus a dedicated second-chance listings feed with condition information.
curl -X GET 'https://api.parse.bot/scraper/3313b917-e6fd-4f12-affa-3f1888f5cfa9/search_products?page=1&sort=relevance&query=laptop' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace coolblue-nl-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""
Coolblue Laptop Scraper API - Python Client
Get your API key from: https://parse.bot/settings
"""
import os
import requests
from typing import Any, Dict, List, Optional
class ParseClient:
"""Client for interacting with the Coolblue Laptop Scraper API."""
def __init__(self, api_key: Optional[str] = None):
"""
Initialize the Parse API client.
Args:
api_key: API key for authentication. If not provided, reads from PARSE_API_KEY env var.
"""
self.base_url = "https://api.parse.bot"
self.scraper_id = "3313b917-e6fd-4f12-affa-3f1888f5cfa9"
self.api_key = api_key or os.getenv("PARSE_API_KEY")
if not self.api_key:
raise ValueError(
"API key not provided. Pass it as argument or set PARSE_API_KEY environment variable."
)
def _call(
self, endpoint: str, method: str = "POST", **params
) -> Dict[str, Any]:
"""
Make a request to the Parse API.
Args:
endpoint: The endpoint name (e.g., 'search_products')
method: HTTP method ('GET' or 'POST')
**params: Query/body parameters
Returns:
JSON response as dictionary
"""
url = f"{self.base_url}/scraper/{self.scraper_id}/{endpoint}"
headers = {"X-API-Key": self.api_key, "Content-Type": "application/json"}
if method == "GET":
response = requests.get(url, headers=headers, params=params)
elif method == "POST":
response = requests.post(url, headers=headers, json=params)
else:
raise ValueError(f"Unsupported method: {method}")
response.raise_for_status()
return response.json()
def search_products(
self,
query: str,
page: int = 1,
sort: str = "relevance",
) -> Dict[str, Any]:
"""
Search for products across all categories.
Args:
query: Search keyword
page: Page number for pagination (default: 1)
sort: Sorting option - relevance, price_asc, price_desc, newest, rating (default: relevance)
Returns:
Dictionary with 'total' count and 'products' list
"""
return self._call(
"search_products", method="GET", query=query, page=page, sort=sort
)
def search_laptops(
self,
query: Optional[str] = None,
page: int = 1,
sort: str = "relevance",
) -> Dict[str, Any]:
"""
Search specifically for laptops with spec highlights.
Args:
query: Search keyword for laptops (optional)
page: Page number (default: 1)
sort: Sorting option (default: relevance)
Returns:
Dictionary with 'total' count and 'products' list with laptop specs
"""
params = {"page": page, "sort": sort}
if query:
params["query"] = query
return self._call("search_laptops", method="GET", **params)
def get_laptop_listings_by_category(
self, category: str = "laptops", page: int = 1
) -> Dict[str, Any]:
"""
Browse laptop listings by category.
Args:
category: Category slug (default: laptops)
page: Page number (default: 1)
Returns:
Dictionary with 'total' count and 'products' list
"""
return self._call(
"get_laptop_listings_by_category",
method="GET",
category=category,
page=page,
)
def get_laptop_listings_by_brand(
self, brand: str, page: int = 1
) -> Dict[str, Any]:
"""
Browse laptops by brand.
Args:
brand: Brand name (e.g., hp, lenovo, apple, asus)
page: Page number (default: 1)
Returns:
Dictionary with 'total' count and 'products' list
"""
return self._call(
"get_laptop_listings_by_brand", method="GET", brand=brand, page=page
)
def get_laptop_details(self, product_id: str, slug: str) -> Dict[str, Any]:
"""
Get detailed specifications for a laptop.
Args:
product_id: The numeric product ID
slug: The product URL slug
Returns:
Dictionary with 'name' and 'specifications' object
"""
return self._call(
"get_laptop_details", method="GET", product_id=product_id, slug=slug
)
def get_new_laptops(self, page: int = 1) -> Dict[str, Any]:
"""
Retrieve newly added laptop items.
Args:
page: Page number (default: 1)
Returns:
Dictionary with 'products' list
"""
return self._call("get_new_laptops", method="GET", page=page)
def get_laptop_reviews(
self, product_id: str, slug: str, page: int = 1
) -> Dict[str, Any]:
"""
Retrieve customer reviews for a specific laptop.
Args:
product_id: The numeric product ID
slug: The product URL slug
page: Page number (default: 1)
Returns:
Dictionary with 'reviews' list containing rating, text, and author
"""
return self._call(
"get_laptop_reviews",
method="GET",
product_id=product_id,
slug=slug,
page=page,
)
def get_affordable_second_chance(self, page: int = 1) -> Dict[str, Any]:
"""
Retrieve refurbished/second-chance laptops.
Args:
page: Page number (default: 1)
Returns:
Dictionary with 'products' list
"""
return self._call(
"get_affordable_second_chance", method="GET", page=page
)
def extract_slug_from_url(url: str) -> str:
"""Extract product slug from URL."""
if not url:
return "unknown"
return url.rstrip("/").split("/")[-1]
def main():
"""
Practical workflow: Find high-rated MacBooks, compare their specifications,
read customer reviews, and check for refurbished alternatives.
"""
client = ParseClient()
print("=" * 80)
print("COOLBLUE LAPTOP FINDER - MACBOOK ANALYSIS & COMPARISON")
print("=" * 80)
# Step 1: Search for MacBooks
print("\n[STEP 1] Searching for MacBooks sorted by rating...")
search_results = client.search_products(
query="MacBook", sort="rating", page=1
)
all_macbooks = search_results.get("products", [])
total_found = search_results.get("total", 0)
print(f"Found {total_found} total MacBook results")
print(f"Retrieved {len(all_macbooks)} products\n")
if not all_macbooks:
print("No MacBooks found. Exiting.")
return
# Step 2: Filter and display top-rated MacBooks
print("--- Top-Rated MacBooks Available ---")
top_macbooks = all_macbooks[:5]
for idx, macbook in enumerate(top_macbooks, 1):
name = macbook.get("name", "Unknown")
price = macbook.get("price", "N/A")
reviews_count = macbook.get("reviews_count", 0)
print(f"{idx}. {name}")
print(f" Price: €{price} | Customer Reviews: {reviews_count}\n")
# Step 3: Get detailed specs for the top MacBook
print("[STEP 2] Retrieving detailed specifications for top MacBook...")
top_macbook = top_macbooks[0]
product_id = top_macbook.get("product_id")
url = top_macbook.get("url", "")
slug = extract_slug_from_url(url)
try:
details = client.get_laptop_details(product_id=product_id, slug=slug)
spec_name = details.get("name", "Unknown")
specifications = details.get("specifications", {})
print(f"Detailed specs for: {spec_name}")
if specifications:
for spec_key, spec_value in list(specifications.items())[:8]:
print(f" • {spec_key}: {spec_value}")
else:
print(" (No detailed specifications available)")
except Exception as e:
print(f" Could not retrieve details: {str(e)}")
# Step 4: Search with laptop-specific endpoint
print("\n[STEP 3] Searching with laptop-specific endpoint for MacBooks...")
laptop_search = client.search_laptops(query="MacBook", page=1)
laptop_products = laptop_search.get("products", [])
print(f"Found {len(laptop_products)} MacBooks with detailed specs\n")
print("--- MacBook Specs Comparison ---")
for idx, laptop in enumerate(laptop_products[:4], 1):
name = laptop.get("name", "Unknown")
processor = laptop.get("processor", "N/A")
screen = laptop.get("screen_size", "N/A")
price = laptop.get("price", "N/A")
rating = laptop.get("rating", "N/A")
print(f"{idx}. {name}")
print(f" Processor: {processor} | Screen: {screen}")
print(f" Price: €{price} | Rating: {rating}\n")
# Step 5: Browse Apple MacBooks via brand filter
print("[STEP 4] Browsing all Apple laptops by brand...")
apple_laptops = client.get_laptop_listings_by_brand(brand="apple", page=1)
apple_products = apple_laptops.get("products", [])
apple_total = apple_laptops.get("total", 0)
print(f"Total Apple laptops available: {apple_total}")
print(f"Showing {len(apple_products)} results:\n")
for idx, apple in enumerate(apple_products[:4], 1):
name = apple.get("name", "Unknown")
price = apple.get("price", "N/A")
rating = apple.get("rating", "N/A")
print(f"{idx}. {name}")
print(f" Price: €{price} | Rating: {rating}\n")
# Step 6: Get customer reviews for the top MacBook
print("[STEP 5] Fetching customer reviews for top MacBook...")
try:
reviews_data = client.get_laptop_reviews(
product_id=product_id, slug=slug, page=1
)
reviews = reviews_data.get("reviews", [])
avg_rating = reviews_data.get("average_rating", "N/A")
total_reviews = reviews_data.get("total_reviews", 0)
rating_categories = reviews_data.get("rating_categories", [])
print(f"Average Rating: {avg_rating}/10 ({total_reviews} total reviews)")
if rating_categories:
print("\nRating Breakdown by Category:")
for category in rating_categories[:4]:
cat_name = category.get("name", "Unknown")
cat_avg = category.get("averageRating", "N/A")
print(f" • {cat_name}: {cat_avg}/10")
if reviews:
print("\n--- Recent Customer Reviews ---\n")
for idx, review in enumerate(reviews[:3], 1):
title = review.get("title", "No title")
author = review.get("author", "Anonymous")
rating = review.get("rating", "N/A")
text = review.get("text", "")[:120]
votes_up = review.get("votes_up", 0)
pros = review.get("pros", [])
print(f"{idx}. {title}")
print(f" By {author} | Rating: {rating}/10 | Helpful: {votes_up}👍")
print(f' "{text}..."')
if pros:
print(f" Pros: {', '.join(pros[:2])}")
print()
except Exception as e:
print(f"Could not retrieve reviews: {str(e)}")
# Step 7: Check for refurbished MacBook deals
print("[STEP 6] Checking for refurbished/second-chance MacBook deals...")
refurb_results = client.get_affordable_second_chance(page=1)
refurb_products = refurb_results.get("products", [])
# Filter for MacBooks in refurbished section
refurb_macbooks = [p for p in refurb_products if "macbook" in p.get("name", "").lower()]
if refurb_macbooks:
print(f"Found {len(refurb_macbooks)} refurbished MacBooks\n")
print("--- Refurbished MacBook Deals ---\n")
for idx, refurb in enumerate(refurb_macbooks[:4], 1):
name = refurb.get("name", "Unknown")
price = refurb.get("price", "N/A")
highlights = refurb.get("highlights", [])
print(f"{idx}. {name}")
print(f" Price: €{price}")
if highlights:
for highlight in highlights[:2]:
print(f" • {highlight}")
print()
else:
print(f"No refurbished MacBooks found (checked {len(refurb_products)} total refurbished items)")
# Step 8: Check new arrivals
print("[STEP 7] Checking for newly added laptops...")
new_arrivals = client.get_new_laptops(page=1)
new_products = new_arrivals.get("products", [])
# Filter for new MacBooks
new_macbooks = [p for p in new_products if "macbook" in p.get("name", "").lower()]
if new_macbooks:
print(f"Found {len(new_macbooks)} newly added MacBooks\n")
print("--- Latest MacBook Arrivals ---\n")
for idx, new_laptop in enumerate(new_macbooks[:3], 1):
name = new_laptop.get("name", "Unknown")
price = new_laptop.get("price", "N/A")
print(f"{idx}. {name} - €{price}\n")
else:
print("No newly arrived MacBooks at this time")
# Summary and recommendations
print("=" * 80)
print("ANALYSIS COMPLETE - SUMMARY & RECOMMENDATIONS")
print("=" * 80)
print(f"\n✓ Found {len(top_macbooks)} highly-rated MacBooks (€{top_macbook.get('price', 'N/A')} starting)")
print(f"✓ Apple brand catalog has {apple_total} total laptop models")
print(f"✓ Top MacBook has {total_reviews} customer reviews (average: {avg_rating}/10)")
print(f"✓ {len(refurb_macbooks)} refurbished MacBooks available for cost savings")Search for products across all categories on Coolblue. Returns paginated product results matching the query.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number for pagination |
| sort | string | Sort order. Accepted values: relevance, price_asc, price_desc, newest, rating |
| queryrequired | string | Search keyword |
{
"type": "object",
"fields": {
"url": "string URL that was fetched",
"total": "integer total number of matching products",
"products": "array of product objects with name, url, product_id, slug, price, highlights, and optional rating/reviews_count"
},
"sample": {
"data": {
"url": "https://www.coolblue.nl/en/search?q=laptop&page=1&sort=relevance",
"total": 186,
"products": [
{
"url": "https://www.coolblue.nl/en/product/963044/vortech-pro-gaming-chair-black.html",
"name": "Vortech Pro Gaming Chair Black",
"slug": "vortech-pro-gaming-chair-black",
"price": 269,
"price_str": "269,-",
"highlights": [
"Our choice for a gaming chair with many adjustment options"
],
"product_id": "963044",
"reviews_count": 4,
"reviews_count_str": "4 reviews"
}
]
},
"status": "success"
}
}About the Coolblue API
Search and Browse
The search_products endpoint accepts a query string and returns paginated results across all Coolblue categories, each product carrying name, url, product_id, slug, price, and highlights, with optional rating and reviews_count when available. The search_laptops endpoint targets the laptop category specifically and adds enriched fields — processor, screen_size, and os — on top of the base product shape. Both endpoints accept a sort parameter with values relevance, price_asc, price_desc, newest, and rating.
Category and Brand Filters
get_laptop_listings_by_category accepts a category path from options including laptops, windows-laptops, apple-macbook, gaming-laptops, and chromebook-models. get_laptop_listings_by_brand requires a brand parameter accepting eight values: apple, hp, lenovo, acer, asus, microsoft, msi, and samsung. Both return the same paginated product array shape with optional highlights, ratings, and review counts.
Details and Reviews
get_laptop_details takes a slug and product_id — both obtainable from any listing endpoint — and returns a specifications object of key-value pairs covering the full technical spec sheet for that product. get_laptop_reviews returns paginated individual reviews with title, text, rating, author, date, pros, cons, votes_up, and votes_down, alongside aggregate fields: total_reviews, average_rating (out of 10), and a rating_categories array with per-dimension averages.
New and Refurbished Listings
get_new_laptops returns the most recently added laptops sorted by addition date, useful for tracking catalog updates. get_affordable_second_chance returns refurbished laptop listings where the highlights array includes condition descriptors, allowing consumers to distinguish product quality tiers in Coolblue's second-chance inventory.
The Coolblue API is a managed, monitored endpoint for coolblue.nl — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when coolblue.nl changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official coolblue.nl API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Compare laptop prices across brands by combining
get_laptop_listings_by_brandresults for Apple, Lenovo, and HP. - Track newly added laptop models by polling
get_new_laptopsand diffing against a stored product list. - Build a refurbished laptop finder using
get_affordable_second_chancewith condition data from the highlights field. - Aggregate customer sentiment by fetching
get_laptop_reviewsand computing per-dimension averages fromrating_categories. - Populate a spec comparison table by calling
get_laptop_detailsfor multiple product slugs and merging theirspecificationsobjects. - Monitor price trends across categories by periodically querying
get_laptop_listings_by_categorywithsort=price_asc. - Filter gaming laptops by rating using
get_laptop_listings_by_categorywithcategory=gaming-laptopsandsort=rating.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Coolblue have an official public developer API?+
What does `get_laptop_details` return compared to a listing endpoint?+
get_laptop_details returns a specifications object with detailed key-value pairs covering the full technical spec sheet — fields like CPU model, RAM, storage, display resolution, and battery capacity that are not present in listing endpoints. Listing endpoints return summary fields such as price, highlights, and optional processor/screen_size/os from search_laptops.Are categories outside laptops covered by the browse endpoints?+
get_laptop_listings_by_category, get_laptop_listings_by_brand, get_new_laptops, get_affordable_second_chance) are scoped to laptops only. search_products covers all Coolblue categories via keyword search. You can fork this API on Parse and revise it to add browse endpoints for other product categories such as televisions or smartphones.Does the reviews endpoint return seller or third-party reviews?+
get_laptop_reviews endpoint returns Coolblue customer reviews only. Each review object includes author, date, rating, pros, cons, votes_up, and votes_down. It does not return reviews from external platforms. You can fork this API on Parse and revise it to add an endpoint pulling review data from another source if cross-platform aggregation is needed.Is there a way to filter search results by price range?+
search_products and search_laptops endpoints support sorting by price_asc or price_desc but do not accept minimum or maximum price parameters. Results can be sorted by price but not bounded to a range on the API side. You can fork this API on Parse and revise it to add price range filtering logic.