Discover/Coolblue API
live

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.

This API takes change requests — .
Endpoints
8
Updated
2mo ago

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.

Try it
Page number for pagination
Sort order. Accepted values: relevance, price_asc, price_desc, newest, rating
Search keyword
api.parse.bot/scraper/3313b917-e6fd-4f12-affa-3f1888f5cfa9/<endpoint>
Ready to send
Fill in the parameters and hit sign in to send to see live response data here.
Call it over HTTPgrab a free API key at signup
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'
Python SDK · recommended

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")
All endpoints · 8 totalmissing one? ·

Search for products across all categories on Coolblue. Returns paginated product results matching the query.

Input
ParamTypeDescription
pageintegerPage number for pagination
sortstringSort order. Accepted values: relevance, price_asc, price_desc, newest, rating
queryrequiredstringSearch keyword
Response
{
  "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.

Reliability & maintenance

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?+
It's built not to. Every endpoint is health-checked on a schedule with automated test probes. When the source site changes and a check fails, the API is automatically queued for repair and re-verified — that's the self-healing layer. Each API page shows when its endpoints were last verified. And because marketplace APIs are shared, any fix reaches everyone using it.
Is this an official API from the source site?+
No — Parse APIs are independent, managed REST wrappers over publicly available data. That is the point: where a site has no official API (or only a limited one), Parse gives you a maintained, monitored endpoint for that data and keeps it working as the site changes — so you get a stable contract over a source that never promised one.
Can I fix or extend this API myself if I need a new endpoint or field?+
Yes — and you don't have to wait on us. This API was generated by the Parse agent, which stays attached. Describe the change in plain English ("add an endpoint that returns reviews", "fix the price field") in the revise box on the API page or via the revise_api MCP tool, and the agent rebuilds it against the live site in minutes. Contributing the change back to the public API is free.
What happens if I call an endpoint that has an issue?+
Errors are machine-readable: a bad call returns a clean status with the list of available endpoints and a repair hint, so an agent (or you) can recover or trigger a fix instead of failing silently. Confirmed failures feed the automatic repair queue.
Common use cases
  • Compare laptop prices across brands by combining get_laptop_listings_by_brand results for Apple, Lenovo, and HP.
  • Track newly added laptop models by polling get_new_laptops and diffing against a stored product list.
  • Build a refurbished laptop finder using get_affordable_second_chance with condition data from the highlights field.
  • Aggregate customer sentiment by fetching get_laptop_reviews and computing per-dimension averages from rating_categories.
  • Populate a spec comparison table by calling get_laptop_details for multiple product slugs and merging their specifications objects.
  • Monitor price trends across categories by periodically querying get_laptop_listings_by_category with sort=price_asc.
  • Filter gaming laptops by rating using get_laptop_listings_by_category with category=gaming-laptops and sort=rating.
Pricing & limitsSee full pricing →
TierPriceCredits/monthRate limit
Free$0/mo1005 req/min
Hobby$30/mo1,00020 req/min
Developer$100/mo5,000100 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.

Frequently asked questions
Does Coolblue have an official public developer API?+
Coolblue does not publish a public developer API. There is no documented REST or GraphQL interface available to external developers on their site.
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?+
The category and brand 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?+
The 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?+
The 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.
Page content last updated . Spec covers 8 endpoints from coolblue.nl.
Related APIs in EcommerceSee all →
coolblue.be API
Search and browse electronics products from Coolblue Belgium, including CPUs, GPUs, and smartphones, with instant access to detailed specifications, pricing, and availability. Find exactly what you need by category or search query, and check real-time stock and price information across their entire catalog.
tweakers.net API
Access product listings, prices, shop comparisons, news articles, and search results from Tweakers.net — the leading Dutch tech platform and price comparison site.
alternate.be API
Search for products on Alternate Belgium and instantly access live prices, stock availability, technical specifications, customer reviews, and current deals across their entire catalog. Browse their complete category structure to find exactly what you need and compare products before making a purchase decision.
apple.com, dell.com API
Search and compare laptop prices, specs, and discounts across Apple and Dell in real-time to find the best deals. Get detailed product information, current pricing, and available promotions all in one place.
megekko.be API
Search and browse the full Megekko product catalog, view detailed specs, pricing, and stock availability. Browse by category, use keyword search to find specific products, or explore shortcut endpoints for popular categories like GPUs and CPUs.
amazon.nl API
Search Amazon.nl for products by keyword, retrieve full product details and specifications, read customer reviews, and browse category bestseller lists.
pccomponentes.com API
Search and browse PC components across categories and retrieve detailed product information including technical specifications, pricing, availability, and customer reviews. Ideal for comparing hardware options across processors, graphics cards, laptops, and more.
megekko.nl API
Search and browse products from Megekko's electronics catalog, getting detailed specifications, pricing, and category information to compare items and find exactly what you're looking for. Explore the full product hierarchy to discover items across all categories and subcategories available on the store.