# Dreamland Scraper \[$0.49/1K 💰] — NL & BE Toys, EAN, Stock (`unfenced-group/dreamland-scraper`) Actor

Scrape toy products from dreamland.nl and dreamland.be (Dutch and French) at $0.49 per 1,000. Prices, recommended retail price and discount, EAN, article number, specifications, ratings, reviews and stock in every physical store. By category, brand, URL or the whole catalogue.

- **URL**: https://apify.com/unfenced-group/dreamland-scraper.md
- **Developed by:** [Unfenced Group](https://apify.com/unfenced-group) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.49 / 1,000 products

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## Dreamland Scraper

![Dreamland Scraper](https://api.apify.com/v2/key-value-stores/ZhTDFZkKFqwhoKxEv/records/banner.png)

Extract toy products from dreamland.nl and dreamland.be: prices, recommended retail prices and discounts, EAN, article numbers, specifications, ratings and reviews, and stock in every physical store. Search by keyword, scrape by category or brand, start from any Dreamland URL, or take the whole catalogue. No API key required.

***

### Why this scraper?

#### 🎯 Built for Dreamland in two countries

One actor covers dreamland.nl and dreamland.be in Dutch and French. Product codes are shared across all three storefronts, so prices and stock compare directly between the Netherlands and Belgium.

#### 🔎 Keyword search

Type a brand, a character or a product type. A brand returns its full listing, a category name returns that category, and any other term matches product names across the full catalogue. Every row records the keyword and how it matched.

#### 💶 Prices you can analyse

Current price, the manufacturer's recommended retail price, discount in euros and percent, and promotion badges. A discount-only filter uses Dreamland's own reduced-price listing, so a discount run reads a few pages, not the whole category.

#### 🏷️ Product identifiers

EAN barcode, Dreamland order code and the manufacturer's article number (for example the LEGO set number) on every detailed record. Match Dreamland against any other retailer or your own catalogue.

#### 🏬 Stock in every store

With details on, each product carries the stock status of every physical Dreamland store, with store code and coordinates. See where a product is in stock, running low or sold out.

#### ⭐ Ratings and reviews

Exact average rating, review count and the reviews shown on the product page, without reviewer names.

#### 📦 Up to 70 fields

Specifications by stable attribute code, age grading, piece count, description in text, HTML and Markdown, manufacturer details, safety warnings and links to the same product on the other storefronts.

***

### Input parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `site` | string | `"nl"` | `nl` = dreamland.nl, `be-nl` = dreamland.be in Dutch, `be-fr` = dreamland.be in French. |
| `searchQueries` | array | `[]` | Keywords, one per line, e.g. `lego star wars`, `stitch`, `knuffel`. See **How keyword search works** below. |
| `categories` | array | `[]` | Top-level categories by Dutch slug, e.g. `bouwen-en-constructie`. French pages are resolved automatically. |
| `brands` | array | `[]` | Brand slugs as used in Dreamland's `/m/` URLs, e.g. `lego`, `playmobil`, `pokemon`. |
| `startUrls` | array | `[]` | Any Dreamland category, sub-category, brand or product URL. Overrides categories and brands. |
| `sortBy` | string | `"relevance-desc"` | `relevance-desc`, `price-asc`, `price-desc`, `sortingRating-desc` or `new-desc`. |
| `minPrice` | integer | (empty) | Minimum price in euros. |
| `maxPrice` | integer | (empty) | Maximum price in euros. |
| `onlyDiscounted` | boolean | `false` | Only products priced below their recommended retail price. |
| `onlyNew` | boolean | `false` | Only products marked as new. |
| `searchProductNames` | boolean | `true` | For keywords that are not a brand or category, also match product names. These matches are billed at the detailed rate. |
| `fetchDetails` | boolean | `false` | Open each product page for EAN, specifications, description, reviews, store stock and more. Billed at the detailed rate. |
| `includeReviews` | boolean | `true` | With details on, include the reviews from the product page. |
| `includeStoreStock` | boolean | `true` | With details on, include stock per physical store. |
| `maxItems` | integer | `100` | Maximum number of products. `0` means no limit. |

Leave `searchQueries`, `categories`, `brands` and `startUrls` empty to scrape the whole catalogue (19,426 products on dreamland.nl in September 2026).

#### How keyword search works

Dreamland's robots.txt does not allow automated use of its site search, so this actor never calls it. Instead it resolves each keyword against the product and category sitemaps that Dreamland publishes for search engines, in three steps:

1. **Brand.** If the keyword is a brand (`lego`, `playmobil`, `paw patrol`), you get the brand's full listing first, then any other products with the keyword in their name.
2. **Category.** If the keyword names a category (`knuffel`, `puzzel`, `trampoline`), you get that category's listing. Plurals are matched, so `puzzel` finds *Puzzels*.
3. **Product name.** Otherwise, every product whose name contains all the words of the keyword (`lego star wars`, `eenhoorn`, `fiets 16 inch`). These are read from their product pages, so they come back fully detailed and are billed at the detailed rate.

Brand and category matches follow your `fetchDetails` setting and are billed at the listing rate unless you turn details on. The `matchedBy` field on each row tells you which step found it.

***

### Output schema

Every field below is present on every record. Fields the source does not publish for a product, and detail-only fields when `fetchDetails` is off, are returned as `null`.

| Field | Type | Description |
|---|---|---|
| `id` | string | Dreamland product code, same as `productCode`. Stable across runs and storefronts. |
| `productCode` | string | Dreamland's 8-digit order code, shared by dreamland.nl and dreamland.be. |
| `productId` | string | Dreamland's internal numeric product ID. |
| `name` | string | Product name as shown on the site. |
| `url` | string | Product page URL on the scraped storefront. |
| `site` | string | Storefront scraped: `dreamland.nl`, `dreamland.be/nl` or `dreamland.be/fr`. |
| `country` | string | `NL` or `BE`. |
| `language` | string | `nl` or `fr`. |
| `currency` | string | Always `EUR`. |
| `brand` | string|null | Brand, e.g. `LEGO`, `PLAYMOBIL`. Null for unbranded and house products. |
| `subBrand` | string|null | Product line, e.g. `Star Wars`, `Technic`, `Pokemon`. |
| `category` | string | Top-level category. |
| `subCategory` | string|null | Second-level category. |
| `subSubCategory` | string|null | Third-level category, where the site uses one. |
| `categoryPath` | string\[] | Full category path, top level first. |
| `categoryUrl` | string|null | Category page URL. Detail only. |
| `price` | number | Current selling price in euros. |
| `recommendedRetailPrice` | number|null | Manufacturer's recommended retail price, when the site shows one. |
| `priceLabel` | string|null | Label shown next to the RRP, e.g. `Adviesprijs`. |
| `isDiscounted` | boolean | True when the price is below the shown RRP. |
| `discountAmount` | number|null | RRP minus price, in euros. |
| `discountPercent` | number|null | Discount as a percentage of the RRP, one decimal. |
| `labels` | string\[] | Badges on the product, e.g. `Nieuw`, `Actie`, `DreamDeal`, `Alleen thuislevering`. |
| `isNew` | boolean | Marked as new. |
| `isPromotion` | boolean | Carries a promotion badge. |
| `homeDeliveryOnly` | boolean | Available for home delivery only, not in stores. |
| `deliveryText` | string|null | Delivery or stock message as shown, e.g. `Levertijd: 1-2 werkdagen`. |
| `inStockOnline` | boolean|null | Orderable online now. |
| `isPreOrder` | boolean | Not yet released or awaiting stock. |
| `availableFrom` | string|null | Expected availability date (ISO) for pre-order products. |
| `availability` | string|null | Schema.org availability: `InStock`, `OutOfStock`, `InStoreOnly`, `OnlineOnly`. Detail only. |
| `canHomeDeliver` | boolean|null | Home delivery offered. Detail only. |
| `canPickUpInStore` | boolean|null | Store pickup offered. Detail only. |
| `ratingStars` | number|null | Star rating from the listing card, to the nearest half star. |
| `rating` | number|null | Exact average rating out of 5. Detail only. |
| `reviewCount` | integer|null | Number of reviews. Detail only. |
| `imageUrl` | string | Main product image. |
| `imageUrlWebp` | string|null | Main image in WebP. |
| `secondaryImageUrl` | string|null | Second product image from the listing card. |
| `images` | string\[] | Listing: card images. Detail: every gallery image at full resolution. |
| `imageCount` | integer|null | Number of gallery images. Detail only. |
| `ean` | string|null | EAN / GTIN barcode. Detail only. |
| `articleNumber` | string|null | Manufacturer's article or set number, e.g. LEGO `75192`. Detail only. |
| `ageGrading` | string|null | Age grading as shown, e.g. `Vanaf 16 jaar`. Detail only. |
| `minAgeYears` | number|null | Minimum age in years, parsed from the age grading. Detail only. |
| `pieceCount` | integer|null | Number of pieces, where published (building sets). Detail only. |
| `license` | string|null | Licence or theme, where published. Detail only. |
| `material` | string|null | Main material. Detail only. |
| `batteries` | string|null | Battery requirement, e.g. `2 x Knoopcel LR41 (inbegrepen)`. Detail only. |
| `specifications` | object|null | Every specification row, keyed by its label on the site. Detail only. |
| `specificationCodes` | object|null | The same rows keyed by Dreamland's stable attribute codes (`BARCODE`, `AGE_GRADING` and so on), for consistent parsing across languages. Detail only. |
| `descriptionText` | string|null | Product description as plain text. Detail only. |
| `descriptionHtml` | string|null | Product description as HTML. Detail only. |
| `descriptionMarkdown` | string|null | Product description as Markdown. Detail only. |
| `manufacturerName` | string|null | Manufacturer or importer (EU product-safety information). Detail only. |
| `manufacturerAddress` | string|null | Manufacturer's business address. Detail only. |
| `safetyWarnings` | object\[] | Safety pictograms: `code` and `text`. Detail only. |
| `storesWithStock` | integer|null | Number of physical stores with stock. Detail only. |
| `storesTotal` | integer|null | Number of physical stores listed for the product. Detail only. |
| `storeStock` | object\[]|null | One entry per store. Detail only. |
| `storeStock.storeCode` | string | Dreamland store code, e.g. `ALMER`. |
| `storeStock.storeName` | string | Store name. |
| `storeStock.status` | string | `in-stock`, `low-stock` or `sold-out`. |
| `storeStock.hasStock` | boolean | Store holds stock. |
| `storeStock.hasPurchasableStock` | boolean | Stock can be reserved for pickup. |
| `storeStock.latitude` | number | Store latitude. |
| `storeStock.longitude` | number | Store longitude. |
| `reviews` | object\[]|null | Reviews shown on the product page: `rating`, `title`, `date` (ISO), `text`. Reviewer names are never collected. Detail only. |
| `alternateUrls` | object|null | The same product on the other storefronts: `nlNL`, `nlBE`, `frBE`. Detail only. |
| `searchQuery` | string|null | The keyword that found this product, if any. |
| `matchedBy` | string|null | How the keyword matched: `brand`, `category` or `product-name`. |
| `listPosition` | integer|null | Position in the listing it was found in. |
| `sourceUrl` | string|null | Listing page the product was collected from. |
| `sourcePage` | integer|null | Page number within that listing. |
| `detailFetched` | boolean | True when the product page was opened. Decides the billing rate. |
| `contentHash` | string | Hash of product code and name, for de-duplication across runs. |
| `source` | string | Always `dreamland`. |
| `scrapedAt` | string | ISO timestamp of collection. |

#### Example record

A detailed record (`fetchDetails: true`). Long arrays and the description are shortened here.

```json
{
  "id": "01297751",
  "productCode": "01297751",
  "productId": "26182",
  "name": "75192 LEGO Star Wars Millennium Falcon",
  "url": "https://www.dreamland.nl/producten/75192-lego-star-wars-millennium-falcon/01297751",
  "site": "dreamland.nl",
  "country": "NL",
  "language": "nl",
  "currency": "EUR",
  "brand": "LEGO",
  "subBrand": "Star Wars",
  "category": "Bouwen en constructie",
  "subCategory": "Bouwsets",
  "subSubCategory": null,
  "categoryPath": [
    "Bouwen en constructie",
    "Bouwsets"
  ],
  "categoryUrl": "https://www.dreamland.nl/c/categorie/bouwen-en-constructie/bouwsets/producten",
  "price": 849.99,
  "recommendedRetailPrice": null,
  "priceLabel": null,
  "isDiscounted": false,
  "discountAmount": null,
  "discountPercent": null,
  "labels": [],
  "isNew": false,
  "isPromotion": false,
  "homeDeliveryOnly": false,
  "deliveryText": null,
  "inStockOnline": false,
  "isPreOrder": false,
  "availableFrom": null,
  "availability": "InStoreOnly",
  "canHomeDeliver": true,
  "canPickUpInStore": true,
  "ratingStars": 5,
  "rating": 5,
  "reviewCount": 32,
  "imageUrl": "https://www.dreamland.nl/media/cache/default_pop_product_image/media/image/01297751/b5c039bb984bb26b_01297751_001.6488a988.jpg",
  "imageUrlWebp": "https://www.dreamland.nl/media/cache/default_pop_product_image_webp/media/image/01297751/b5c039bb984bb26b_01297751_001.6488a988.webp",
  "secondaryImageUrl": "https://www.dreamland.nl/media/cache/default_pop_product_image/media/image/01297751/06ff8bc0985357b6_01297751_003.9bc17833.jpg",
  "images": [
    "https://www.dreamland.nl/media/image/01297751/b5c039bb984bb26b_01297751_001.jpg",
    "https://www.dreamland.nl/media/image/01297751/260a578db4b6433e_01297751_002.jpg"
  ],
  "imageCount": 10,
  "ean": "5702015869935",
  "articleNumber": "75192",
  "ageGrading": "Vanaf 16 jaar",
  "minAgeYears": 16,
  "pieceCount": 7541,
  "license": null,
  "material": "Plastic",
  "batteries": null,
  "specifications": {
    "Merk": "LEGO",
    "Submerk": "Star Wars",
    "Materiaal": "Plastic",
    "Aantal stukjes": "7541 Stukjes",
    "Geschikt voor": "Beide",
    "Bestelcode": "01297751",
    "Barcode": "5702015869935",
    "Leeftijd": "Vanaf 16 jaar",
    "Artikel nummer": "75192"
  },
  "specificationCodes": {
    "BRAND": "LEGO",
    "SUBBRAND": "Star Wars",
    "MATERIAL": "Plastic",
    "LEGO_Aantal_stuks": "7541 Stukjes",
    "SUITABLE FOR": "Beide",
    "ORDER_CODE": "01297751",
    "BARCODE": "5702015869935",
    "AGE_GRADING": "Vanaf 16 jaar",
    "ARTICLE_NUMBER": "75192"
  },
  "descriptionText": "Kom aan boord van de beroemde Millennium Falcon van LEGO voor een reis door het melkwegstelsel! Zo herbeleef je alles van de mythische Star Wars-saga!\nBuitenkan…",
  "descriptionHtml": "<p>Kom aan boord van de beroemde Millennium Falcon van LEGO voor een reis door het melkwegstelsel! Zo herbeleef je alles…",
  "descriptionMarkdown": "Kom aan boord van de beroemde Millennium Falcon van LEGO voor een reis door het melkwegstelsel! Zo herbeleef je alles va…",
  "manufacturerName": "Lego Nederland bv",
  "manufacturerAddress": "Ruiterijschool 5, 2930 Brasschaat Nederland, NL",
  "safetyWarnings": [
    {
      "code": "chocking-hazard",
      "text": "Opgepast, verstikkingsgevaar! Niet geschikt voor kinderen onder de 3 jaar."
    }
  ],
  "storesWithStock": 26,
  "storesTotal": 27,
  "storeStock": [
    {
      "storeCode": "ALMER",
      "storeName": "DreamLand Almere",
      "status": "in-stock",
      "hasStock": true,
      "hasPurchasableStock": true,
      "latitude": 52.373244,
      "longitude": 5.220256
    },
    {
      "storeCode": "ARKEL",
      "storeName": "DreamLand Arkel",
      "status": "in-stock",
      "hasStock": true,
      "hasPurchasableStock": true,
      "latitude": 51.867381,
      "longitude": 4.989133
    }
  ],
  "reviews": [
    {
      "rating": 5,
      "title": "Zeer mooie Lego build voor een zeer mooie prijs.",
      "date": "2025-03-12",
      "text": "Een waar pronkstuk voor de Lego Star Wars collectie van onze zoon."
    }
  ],
  "alternateUrls": {
    "nlNL": "https://www.dreamland.nl/producten/75192-lego-star-wars-millennium-falcon/01297751",
    "nlBE": "https://www.dreamland.be/nl/producten/75192-lego-star-wars-millennium-falcon/01297751",
    "frBE": "https://www.dreamland.be/fr/produits/75192-lego-star-wars-millennium-falcon/01297751"
  },
  "searchQuery": null,
  "matchedBy": null,
  "listPosition": 1,
  "sourceUrl": "https://www.dreamland.nl/c/bouwen-en-constructie/producten?sort=price-desc",
  "sourcePage": 1,
  "detailFetched": true,
  "contentHash": "fa6e8524be3e6a66",
  "source": "dreamland",
  "scrapedAt": "2026-09-11T11:23:49.015Z"
}
```

***

### Examples

**1. Keyword search across a brand, a product line and a category**

```json
{ "site": "nl", "searchQueries": ["pokemon", "lego star wars", "knuffel"], "maxItems": 500 }
```

**2. Discounted board games and puzzles in Belgium, with EAN and store stock**

```json
{ "site": "be-nl", "categories": ["gezelschapspellen-en-puzzels"], "onlyDiscounted": true, "fetchDetails": true, "maxItems": 500 }
```

**3. A sub-category and single products by URL**

```json
{ "startUrls": [
    { "url": "https://www.dreamland.nl/c/games-en-multimedia/spelconsoles-accessoires/producten" },
    { "url": "https://www.dreamland.nl/producten/10713-lego-classic-creatieve-koffer/01295689" }
  ], "maxItems": 200 }
```

**4. Daily feed of new arrivals in French for Belgium**

```json
{ "site": "be-fr", "categories": ["speelfiguren-en-sets", "poppen-figuren-en-knuffels"], "onlyNew": true, "sortBy": "new-desc", "maxItems": 300 }
```

Schedule example 4 daily and compare `productCode` against yesterday's dataset to spot new listings.

***

### 💰 Pricing

You only pay for products delivered to your dataset. Failed requests are never charged.

| Event | Price per 1,000 | When it applies |
|---|---|---|
| Product | **$0.49** | Product collected from a category, brand or catalogue page |
| Product with details | **$2.49** | Product whose product page was also opened (`fetchDetails: true`), and keyword matches found by product name |

| Products | Listing only | With details |
|---|---|---|
| 100 | ~$0.05 | ~$0.25 |
| 1,000 | ~$0.49 | ~$2.49 |
| 10,000 | ~$4.90 | ~$24.90 |

Until 26 September 2026 the detailed rate is $2.19 per 1,000. Keyword matches found through product names (`matchedBy: product-name`) are read from their product page and billed as products with details. Turn off `searchProductNames` to keep keyword runs at the listing rate. A product whose page could not be loaded is billed at the listing rate, because that is what you received. A negligible $0.00005 start fee applies per run. Use **Max results** to cap spend.

***

### Performance

Dreamland sits behind bot protection, so every page goes through an unblocking proxy that takes 5 to 30 seconds per page. The actor fetches pages in parallel to compensate.

| Run size | Listing only | With details |
|---|---|---|
| 100 products | about 1–2 minutes | about 4–6 minutes |
| 1,000 products | about 6–10 minutes | about 20–30 minutes |
| 10,000 products | about 1–1.5 hours | not recommended in one run |

***

### Known limitations

- **Keyword search does not read product descriptions.** It matches brand, category and product names, which covers most searches (`stitch` finds 95% of what the site's own search finds), but words that only appear in descriptions are missed. `eenhoorn` matches 159 product names where the site's own search reports about 340 hits.
- **French keywords on dreamland.be.** Dreamland publishes its Belgian sitemaps in Dutch only. Brand keywords work in both languages; product and category words should be given in Dutch, and the results are still returned from the French pages.
- **The whole-catalogue listing cannot be sorted or filtered server-side.** robots.txt allows only plain paging there, so filters are applied locally and read more pages. Pick categories to filter efficiently.
- **Some products have no brand.** Party goods and house products often carry a sub-brand (for example `Pokemon`) but no brand.
- **Reviews are limited to those on the product page.** Products with many reviews show a selection, not every review.
- **Store stock is a snapshot** of what the site shows at the time of the run.

***

### Technical details

- **Source:** dreamland.nl and dreamland.be (Dutch and French), Colruyt Group's toy retailer
- **Coverage:** full catalogue, by category, brand or URL
- **Compliance:** respects robots.txt; site search and filtered root listings are never requested
- **Retry:** automatic retry with exponential backoff; repeated pages are detected and stop the listing
- **Health:** every run writes `OUTPUT` and `HEALTH` records to its key-value store

***

### Rate this actor

If this scraper does its job, a short review on the **Reviews** tab helps other users find it. Something not working? Open an issue on the **Issues** tab instead — issues get fixed.

***

### Need a custom scraper?

**[Unfenced Group](https://www.unfencedgroup.nl)** builds Apify actors for any website — for free.

If the site you need isn't in our portfolio yet, just ask. We scope, build, and publish it at no cost to you. You only pay for results — we absorb the compute and proxy costs ourselves. Same pay-per-result pricing, same quality, same standards as every actor in this portfolio.

**Get in touch:** [www.unfencedgroup.nl](https://www.unfencedgroup.nl)

# Actor input Schema

## `site` (type: `string`):

Which Dreamland storefront to scrape. nl = dreamland.nl (Netherlands), be-nl = dreamland.be in Dutch, be-fr = dreamland.be in French. Prices and stock differ per country. Example: nl

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

Search terms, one per line: a brand, a product line, a character or a product type. A brand returns its full listing, a category name returns that category, and any other term matches product names. Example: \["lego star wars", "stitch", "knuffel"]

## `categories` (type: `array`):

Top-level product categories to scrape. Use the Dutch slug for every storefront; French pages are resolved automatically. Example: \["bouwen-en-constructie"]

## `brands` (type: `array`):

Brand names or brand-page slugs as used in Dreamland's /m/ URLs. Example: \["lego", "playmobil", "pokemon"]

## `startUrls` (type: `array`):

Any dreamland.nl or dreamland.be category, sub-category, brand or product URL. Listing URLs are paged automatically; product URLs return one fully detailed record each. When set, Categories and Brands are ignored. Example: https://www.dreamland.nl/c/bouwen-en-constructie/bouwsets/producten

## `sortBy` (type: `string`):

Order in which products are collected. Applies to categories, brands and category URLs, not to the whole-catalogue listing. Example: price-asc

## `minPrice` (type: `integer`):

Only return products priced at or above this amount in euros. Example: 10

## `maxPrice` (type: `integer`):

Only return products priced at or below this amount in euros. Example: 50

## `onlyDiscounted` (type: `boolean`):

Return only products sold below the manufacturer's recommended retail price, with the RRP and discount on every row. Uses Dreamland's own reduced-price filter for categories and brands. Example: true

## `onlyNew` (type: `boolean`):

Return only products Dreamland marks as new. Uses the site's own new-arrivals filter for categories and brands. Example: true

## `searchProductNames` (type: `boolean`):

For keywords that are not a brand or category, also match product names. Each match is read from its product page, so these rows are billed at the detailed rate. Turn off to keep keyword runs at the listing rate. Example: true

## `fetchDetails` (type: `boolean`):

Open each product page for EAN, article number, age grading, full description, all specifications, exact rating, reviews, stock per store, manufacturer and safety warnings. Billed at the detailed rate. Example: true

## `includeReviews` (type: `boolean`):

With product details on, include the reviews shown on the product page (rating, title, date, text; no reviewer names). Example: true

## `includeStoreStock` (type: `boolean`):

With product details on, include the stock status for every physical Dreamland store, with store code and coordinates. Example: true

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

Maximum number of products to return. 0 means no limit. Example: 100

## Actor input object example

```json
{
  "site": "nl",
  "searchQueries": [
    "lego"
  ],
  "categories": [],
  "brands": [],
  "startUrls": [],
  "sortBy": "relevance-desc",
  "onlyDiscounted": false,
  "onlyNew": false,
  "searchProductNames": true,
  "fetchDetails": false,
  "includeReviews": true,
  "includeStoreStock": true,
  "maxItems": 30
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# 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 = {
    "site": "nl",
    "searchQueries": [
        "lego"
    ],
    "maxItems": 30
};

// Run the Actor and wait for it to finish
const run = await client.actor("unfenced-group/dreamland-scraper").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 = {
    "site": "nl",
    "searchQueries": ["lego"],
    "maxItems": 30,
}

# Run the Actor and wait for it to finish
run = client.actor("unfenced-group/dreamland-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "site": "nl",
  "searchQueries": [
    "lego"
  ],
  "maxItems": 30
}' |
apify call unfenced-group/dreamland-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,unfenced-group/dreamland-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/lWIIRe0VPJq9A91Ek/builds/shdjhfnaxll1x16Ra/openapi.json
