# Boots Scraper (`crawlerbros/boots-scraper`) Actor

Scrape Boots UK - the UK's largest pharmacy-led health and beauty retailer. Search by keyword, browse skincare, haircare, makeup, health categories and clearance, or fetch product pages by URL. Get names, brands, prices, was-prices, ratings, ingredients, images and availability.

- **URL**: https://apify.com/crawlerbros/boots-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

## Boots Scraper

Scrape **Boots UK** — the UK's largest pharmacy-led health and beauty retailer. Search by keyword, browse curated categories (skincare, haircare, makeup, health, baby, electrical, clearance…), or fetch product pages by URL. Get product names, brands, prices, was-prices, price-per-unit, ratings, review counts, ingredients, images, availability and category paths for every product. No login required.

### What this actor does

- **Three modes:** `search`, `browseByCategory`, `byUrl`
- **Full product detail:** name, brand, price, was-price, price per unit, rating, review count, ingredients, size, images, availability
- **Rich filters:** brands, price range, minimum rating, keyword, sort order
- **Curated dropdowns:** 40 curated Boots categories and 60 top brands
- **Offers & clearance:** dedicated `clearance` category plus live offer text on each product
- **Empty fields are omitted**

### Output per product

- `productId` — Boots catalog entry ID
- `model`, `manufacturerModel` — Boots model / part numbers
- `title`, `brand`, `size` (e.g. `30ML`), `pricePerUnit`
- `price`, `wasPrice`, `currency` — was-price appears only when a real discount exists
- `rating`, `roundedRating`, `reviewCount`
- `ingredients[]`, `suitableFor[]`, `productType`, `pharmacyMedicine`
- `description` — full description (mode=byUrl)
- `imageUrls[]` — scene7 CDN images
- `inStock`, `availability` (e.g. `In Stock`, `Out of stock`, `Stock Coming Soon`), `canAddToBasket`
- `adCardPoints`, `expressDelivery`, `hasOtherPromotion`, `offers[]`
- `categoryPath`, `categories[]`
- `sourceUrl`, `recordType: "product"`, `scrapedAt`

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `search` | `search` / `browseByCategory` / `byUrl` |
| `searchQuery` | string | `serum` | Free-text query (mode=search) |
| `categoryPath` | string | `beauty & skincare > skincare` | Curated Boots category (mode=browseByCategory) |
| `urls` | array | – | Product page URLs (mode=byUrl) |
| `brand` | array | – | Keep only these brands |
| `minPrice` | number | – | Minimum price in £ |
| `maxPrice` | number | – | Maximum price in £ |
| `minRating` | number | – | Minimum review rating (1–5) |
| `containsKeyword` | string | – | Keep products whose name/description contains this text |
| `sortBy` | string | `mostRelevant` | `mostRelevant` / `priceLowToHigh` / `priceHighToLow` / `topRated` / `newest` |
| `renderProductPages` | bool | `true` | Render PDPs in a browser (mode=byUrl) |
| `maxItems` | int | `50` | Hard cap (1–1000) |
| `proxyConfiguration` | object | – | Optional; engaged automatically if Boots blocks the datacenter IP |

#### Example: search serums with filters

```json
{
  "mode": "search",
  "searchQuery": "serum",
  "brand": ["Nivea", "Lumene"],
  "minPrice": 10,
  "maxPrice": 30,
  "minRating": 4,
  "maxItems": 20
}
```

#### Example: browse a category

```json
{
  "mode": "browseByCategory",
  "categoryPath": "beauty & skincare > skincare > facial skincare > face serums & treatments",
  "sortBy": "topRated",
  "maxItems": 100
}
```

#### Example: clearance products

```json
{
  "mode": "browseByCategory",
  "categoryPath": "clearance",
  "maxItems": 50
}
```

#### Example: full detail for specific product pages

```json
{
  "mode": "byUrl",
  "urls": [
    "https://www.boots.com/lumene-nordic-c-valo-glow-boost-essence-30ml-10346480",
    "https://www.boots.com/nivea-luminous-630-anti-age-dark-spot-2-in-1-serum-with-collagen-booster-30ml-10330108"
  ]
}
```

### Data source and limitations

- **Data source:** Boots UK's public product search service (`www.boots.com/online/api/search/v2/multiple-query/uk`) — the same JSON API the boots.com search page calls — plus the public product pages (PDPs) for full descriptions. No auth or login is required.
- **Currency & market:** all prices are in GBP (£) from the UK site (`www.boots.com`). Boots operates separate sites in Ireland and other markets, which are out of scope.
- **PDP access:** product pages are protected by Imperva's bot challenge from plain HTTP clients, so `byUrl` renders each page in a real browser. The search/browse API path does not need a browser.
- **Anti-bot:** Boots may rate-limit or challenge bursts from the search API. The actor retries politely with exponential backoff and can use an optional proxy if blocks persist.
- **`description` only in `byUrl` mode:** listing responses (search/browse) carry names, prices, ratings, ingredients and images but not the long marketing description. The `renderProductPages` toggle controls PDP rendering for mode=byUrl.
- **Not affiliated:** this actor is a third-party tool and is not affiliated with or endorsed by Boots.

### Use cases

- **Price monitoring** — track price and was-price movements across Boots's catalogue
- **Beauty & health market research** — extract ratings, review counts and ingredients at scale
- **Competitor assortment analysis** — compare Boots category assortments and offers
- **Promotion tracking** — monitor clearance and multi-buy offers (BOGOF, 3 for 2)
- **Product feed building** — assemble rich product feeds for retail analytics

### FAQ

**What is the data source?** Boots UK's own product search service (`www.boots.com/online/api/search`) plus the public product pages. No auth or login is required. This is a third-party tool and is not affiliated with Boots.

**What currency and market are supported?** GBP and the UK site (`www.boots.com`). Boots operates different sites in Ireland and other markets, which are out of scope.

**Why is `description` only populated in `byUrl` mode?** Listing responses (search/browse) contain names, prices, ratings, ingredients and images but not the long marketing description. Rendering each product page gives the full description — the `renderProductPages` toggle controls this for mode=byUrl.

**What does `wasPrice` mean?** The regular (pre-discount) price shown by Boots. It only appears when it differs from the current price, i.e. a genuine discount.

**Are there rate limits?** Boots protects its search service with bot detection. The actor retries politely with exponential backoff and can use an optional proxy if blocks persist.

**How fresh is the data?** Product data is indexed continuously from Boots's catalogue; prices, availability and offers update throughout the day.

**What is `adCardPoints`?** Advantage Card points earnable on the product.

**Why are some fields missing on some products?** Products without ratings, offers or stock messages simply omit those fields — no placeholder values are emitted.

# Actor input Schema

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

What to fetch.

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

Free-text query, e.g. `serum`, `vitamin c`, `lipstick` (mode=search).

## `categoryPath` (type: `string`):

Curated Boots category, e.g. `beauty & skincare > skincare > facial skincare > face serums & treatments`, or `clearance` (mode=browseByCategory).

## `urls` (type: `array`):

Boots product page URLs, e.g. `https://www.boots.com/lumene-nordic-c-valo-glow-boost-essence-30ml-10346480`.

## `brand` (type: `array`):

Keep only products from these brands.

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

Drop products below this price.

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

Drop products above this price.

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

Keep only products rated at least this (1-5).

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

Keep only products whose name or description contains this text (case-insensitive).

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

Result ordering.

## `renderProductPages` (type: `boolean`):

Render each product page in a browser to extract the full description and ingredients list. Required for mode=byUrl.

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

Hard cap on emitted records.

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

Optional proxy. Used automatically only if Boots blocks the datacenter IP.

## Actor input object example

```json
{
  "mode": "search",
  "searchQuery": "serum",
  "categoryPath": "beauty & skincare > skincare",
  "urls": [],
  "brand": [],
  "sortBy": "mostRelevant",
  "renderProductPages": true,
  "maxItems": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

Dataset containing all scraped Boots 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": "serum",
    "categoryPath": "beauty & skincare > skincare",
    "urls": [],
    "brand": [],
    "sortBy": "mostRelevant",
    "renderProductPages": true,
    "maxItems": 5,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/boots-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": "serum",
    "categoryPath": "beauty & skincare > skincare",
    "urls": [],
    "brand": [],
    "sortBy": "mostRelevant",
    "renderProductPages": True,
    "maxItems": 5,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/boots-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": "serum",
  "categoryPath": "beauty & skincare > skincare",
  "urls": [],
  "brand": [],
  "sortBy": "mostRelevant",
  "renderProductPages": true,
  "maxItems": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call crawlerbros/boots-scraper --silent --output-dataset

```

## MCP server setup

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