# Dunelm Scraper (`crawlerbros/dunelm-scraper`) Actor

Scrape Dunelm - the UK's leading home furnishings retailer. Keyword search, browse categories, or fetch product detail pages with names, brands, prices, was-prices, ratings, descriptions, dimensions, materials, colours, images and availability.

- **URL**: https://apify.com/crawlerbros/dunelm-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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

## Dunelm Scraper

Scrape **Dunelm** — the UK's leading home furnishings retailer. Keyword search the whole catalogue, browse any of 19 categories (furniture, sofas, curtains, blinds, bedding, lighting, home decor, kitchen, bathroom, garden…), or fetch full product pages. Get names, brands, prices and was-prices, ratings, review counts, descriptions, dimensions, materials and care instructions, colours, image galleries, and availability. No login, no cookies, no API key required.

### What this actor does

- **Three modes:** `search` (keyword, paginated), `browseByCategory` (26 categories), `byUrl` (full product detail pages)
- **Live UK prices** in GBP, including was-prices and price ranges for multi-variant products
- **Full product detail** — brand, department, descriptions, dimensions, composition/materials, care instructions, guarantees
- **Ratings and reviews** — average rating and review count where Dunelm publishes them
- **Images** — full galleries on CDN URLs that work without referer or cookies
- **Colours and variants** — colour options, per-variant SKUs and prices
- **Filters:** min/max price, min rating, keyword match; 6 sort orders
- **Empty fields are omitted** — you only ever see fields that actually exist for the product

### Output per product (mode = `search`)

- `productId`, `skuId`, `name`, `primaryCategory`
- `price`, `priceMin`, `priceMax`, `wasPrice`, `wasPriceMin`, `wasPriceMax` (GBP)
- `rating`, `reviewCount`, `badge` (e.g. "30% Off Selected", "New")
- `colours[]`, `options[]` (e.g. `option: Right Hand Corner`)
- `images[]` — CDN image URLs
- `sourceUrl` — the Dunelm product page
- `recordType: "product"`, `scrapedAt`

### Output per product (mode = `browseByCategory`)

Everything from `search` plus, when Dunelm serves them:

- `brand`, `categories[]` (full category path), `inStock`, `colour`
- Price range + was-price range for multi-variant lines
- `description` (short/long), `rating`, `reviewCount`

### Output per product (mode = `byUrl` — full detail)

- `productId`, `skuId`, `name`, `brand`, `department`, `productType`, `badge`
- `price`, `priceMin`, `priceMax`, `wasPrice` + range fields
- `rating`, `reviewCount`, `inStock`
- `description`, `features[]` (`{property, value}` — assembly, guarantee, composition…)
- `dimensions`, `materials` (composition), `careInstructions`
- `colours[]`, `options[]`, `images[]`
- `categories[]`, `category` (breadcrumb path, e.g. `Home > Home And Furniture > Furniture > Sofas And Chairs`), `breadcrumbs[]`
- `documents[]` (assembly instructions etc.), `collectionAvailability[]` (click & collect status per variant)
- `sourceUrl`, `recordType: "product"`, `scrapedAt`

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string (select) | `search` | `search`, `browseByCategory` or `byUrl` |
| `searchQuery` | string | `sofa` | Free-text keyword (mode=search) |
| `category` | string (select) | `furniture` | One of 26 categories, incl. office furniture, fans, luggage, new-in, special buys, trending products, cool sleep (mode=browseByCategory) |
| `productUrls` | array | – | Product page URLs or product IDs (mode=byUrl) |
| `minPrice` | number | – | Drop products below this price in GBP |
| `maxPrice` | number | – | Drop products above this price in GBP |
| `minRating` | number | – | Drop products rated below this (0–5) |
| `containsKeyword` | string | – | Keep only products matching this text (name, brand or description) |
| `sortBy` | string (select) | `ranking_desc` | Relevance / newest / price asc / price desc / rating / discount |
| `maxItems` | int | `60` | Hard cap (1–1000) |
| `proxyConfiguration` | object | – | Optional; only used lazily if Dunelm blocks or rate-limits |

#### Example: search sofas under £500, rated 4+

```json
{
  "mode": "search",
  "searchQuery": "sofa",
  "maxPrice": 500,
  "minRating": 4,
  "sortBy": "price_asc",
  "maxItems": 50
}
```

#### Example: browse clearance offers

```json
{
  "mode": "browseByCategory",
  "category": "all-offers",
  "sortBy": "biggest_discount",
  "maxItems": 60
}
```

#### Example: full detail for specific products

```json
{
  "mode": "byUrl",
  "productUrls": [
    "https://www.dunelm.com/product/armitage-chenille-3-seater-sofa-with-ball-feet-1000266490",
    "https://www.dunelm.com/product/dottie-quilt-cover-pillowcase-set-1000294585"
  ]
}
```

#### Example: keyword filter on bedding

```json
{
  "mode": "search",
  "searchQuery": "duvet",
  "containsKeyword": "double",
  "minPrice": 10,
  "maxPrice": 80,
  "maxItems": 30
}
```

### Use cases

- **Price monitoring** — track was-prices and discounts across Dunelm categories
- **Retail competitive intelligence** — product ranges, ratings and variant counts
- **Home furnishing catalogues** — build product feeds with descriptions, dimensions and images
- **Deal hunting** — scrape the offers category with biggest-discount sorting
- **E-commerce research** — analyse colour options, review counts and click-and-collect availability

### Data source and limitations

- **Data source:** Dunelm's public website (dunelm.com). The actor reads the structured product JSON that Dunelm embeds in every page (the same data their own app renders), so prices, ratings and descriptions match the site exactly.
- **Currency:** all prices are in GBP (£) — Dunelm is a UK retailer.
- **Category depth:** `browseByCategory` returns the first page of a category (60 products, the full relevance ranking). Dunelm's deeper category pagination is loaded client-side only; use `search` mode with a keyword for full multi-page walks. `search` mode paginates fully (`page` up to the last page).
- **Anti-bot:** Dunelm may occasionally throttle bursts of requests by serving a page without the embedded product data. The actor detects this and retries automatically. If you scrape very heavily, enable `proxyConfiguration`.
- **Variant pages:** `byUrl` sometimes receives Dunelm's lighter page variant — the actor re-fetches once to try to get the full detail (dimensions, materials, care). On the lighter variant, the record still contains price, rating, description, categories and images.
- **Not affiliated:** this actor is a third-party tool and is not affiliated with or endorsed by Dunelm.

### FAQ

**Do I need a Dunelm account or cookies?** No. Dunelm's public website serves the product data embedded in the HTML; no login is needed.

**Why are some prices shown as a range?** Multi-variant products (e.g. a sofa in several colours) have a `priceMin`/`priceMax` range. `price` is the first variant's current price.

**What is `wasPrice`?** Dunelm's reference price for the "was/now" display. `wasPriceMin`/`wasPriceMax` are the reference range for multi-variant products. Only present when Dunelm shows a was-price.

**Why are some fields missing on my records?** All fields are omitted when the product doesn't have them (no sentinel values). For example `wasPrice` only appears for discounted items, `dimensions` only in `byUrl` mode, and `careInstructions` only when Dunelm publishes them.

**Do image URLs work outside the browser?** Yes — images are served from `images.dunelm.com` and open directly without cookies or referer headers.

**Can I scrape every product on Dunelm?** You can walk full search results (paginated) and browse category first pages. For a complete site-wide crawl, run `search` mode with broad keywords plus `browseByCategory` for each of the 19 categories and merge the datasets.

**Is this affiliated with Dunelm?** No — this is a third-party actor using Dunelm's public website.

# Actor input Schema

## `mode` (type: `string`):

What to fetch.

## `searchQuery` (type: `string`):

Free-text keyword (mode=search).

## `category` (type: `string`):

Dunelm category to browse (mode=browseByCategory).

## `productUrls` (type: `array`):

Dunelm product URLs, e.g. `https://www.dunelm.com/product/armitage-chenille-3-seater-sofa-with-ball-feet-1000266490`.

## `minPrice` (type: `number`):

Drop products whose current price is below this amount.

## `maxPrice` (type: `number`):

Drop products whose current price is above this amount.

## `minRating` (type: `number`):

Drop products rated below this value (0-5).

## `containsKeyword` (type: `string`):

Only keep products whose name, brand or description contains this text (case-insensitive).

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

How Dunelm orders the results.

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

Hard cap on emitted records.

## `proxyConfiguration` (type: `object`):

Optional Apify proxy. The actor runs without a proxy and only uses it lazily if Dunelm starts blocking (403) or rate-limiting (429).

## Actor input object example

```json
{
  "mode": "search",
  "searchQuery": "sofa",
  "category": "furniture",
  "productUrls": [],
  "sortBy": "ranking_desc",
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `products` (type: `string`):

Dataset containing all scraped Dunelm products.

# 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 = {
    "mode": "search",
    "searchQuery": "sofa",
    "category": "furniture",
    "productUrls": [],
    "sortBy": "ranking_desc",
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/dunelm-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 = {
    "mode": "search",
    "searchQuery": "sofa",
    "category": "furniture",
    "productUrls": [],
    "sortBy": "ranking_desc",
    "maxItems": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/dunelm-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 '{
  "mode": "search",
  "searchQuery": "sofa",
  "category": "furniture",
  "productUrls": [],
  "sortBy": "ranking_desc",
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call crawlerbros/dunelm-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crawlerbros/dunelm-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/yJFRFWoMf4xWcBQGu/builds/KRMJcQzW4GFtTgyQr/openapi.json
