# Morrisons Scraper — UK Grocery Prices, Offers & Ratings (`hipersoft/morrisons-scraper`) Actor

Scrape Morrisons online groceries: product name, brand, pack size, price, was-price, unit price, offers, rating, reviews, category, dietary labels and images from any search, aisle or whole department. Track UK supermarket prices and promotions. Export CSV/JSON.

- **URL**: https://apify.com/hipersoft/morrisons-scraper.md
- **Developed by:** [hiper soft](https://apify.com/hipersoft) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.0015 / product

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Morrisons Scraper: UK Grocery Prices, Offers and Ratings

**Morrisons Scraper** extracts product data from **Morrisons online groceries** (groceries.morrisons.com), one of the UK's biggest supermarkets, with tens of thousands of products across **fresh food, food cupboard, frozen, drinks, beer & wine, health & beauty, baby, household and pet**. For every product you get the **name, brand, pack size, current price, was-price, unit price (per kg, per litre, each), active offers and multibuys, star rating and review count, full category path, dietary labels (vegetarian, vegan…), shelf life, availability, images** and the product link. Search any keyword, scrape a whole **department** or paste any **aisle link**, and export to **CSV, Excel or JSON**. Built for **UK grocery price tracking, promotion monitoring and supermarket comparison**.

### What does Morrisons Scraper do?

- 🔎 **Search by keyword**: milk, bread, chicken breast, nappies, prosecco… one search per term.
- 🏬 **Whole departments**: pick Fruit & Veg, Fresh Foods, Food Cupboard, Frozen, Drinks, Pet Shop and more to collect every product.
- 🗂️ **Aisle and category links**: paste any Morrisons category link.
- 💷 **Prices**: current price, was-price on reductions, and unit price with its unit (per kg, per litre, each).
- 🏷️ **Offers**: multibuys, "Now £2, Was £2.50", More Card prices and online exclusives.
- ⭐ **Ratings and reviews**: average rating and number of reviews.
- 🥦 **Dietary labels**: vegetarian, vegan and other icons.
- 📦 **Pack size, shelf life, availability, new and alcohol flags.**
- 🗺️ **Full category path** for every product.
- 🖼️ **High-resolution product images.**
- 🧹 **Filters**: only products on offer, only available products.

### What data can you scrape from Morrisons?

| Field | Description |
|---|---|
| Product | Name, brand, pack size, product ID, link |
| Price | Current price, was-price, unit price and unit |
| Offers | Active promotions and multibuys |
| Reviews | Average rating, review count |
| Category | Full category path and lowest category |
| Labels | Dietary labels, new, alcohol |
| Freshness | Guaranteed shelf life |
| Stock | Availability |
| Images | Main image and gallery |

### Use cases for Morrisons grocery data

- **Grocery price tracking**: monitor Morrisons prices and unit prices daily or weekly.
- **Supermarket comparison**: compare Morrisons with Tesco, Sainsbury's, Asda and Aldi.
- **Promotion monitoring**: catch every multibuy, price cut and More Card offer.
- **Brands and FMCG suppliers**: check shelf prices, promotions and ratings of your products.
- **Inflation and cost-of-living research**: build food price indices from real shelf prices.
- **Retail analytics**: analyse assortments, own-brand share and pricing by category.
- **Meal-planning and deal apps**: feed live UK grocery prices into your app.

### How to scrape Morrisons

1. Click **Try for free** to open Morrisons Scraper in Apify Console.
2. Enter **search terms**, choose **whole departments**, or paste **Morrisons links**.
3. Optionally turn on **Only products on offer** or **Only available products**.
4. Set **Max products** and click **Start**.
5. Download the products as **CSV, Excel or JSON**.

### Input

#### Example input

```json
{
  "searchTerms": ["milk", "prosecco"],
  "departments": ["fresh-foods", "pet"],
  "onlyOnPromotion": false,
  "maxItems": 0
}
```

| Field | Description |
|---|---|
| **Search terms** | Keywords to search, one search each. |
| **Whole departments** | Collect every product in the chosen departments. |
| **Morrisons category or search links** | Aisle/category links or search links. |
| **Only products on offer** | Only products with an active offer. |
| **Only available products** | Skip unavailable products. |
| **Max products** | Stop after this many (0 = no limit). |

### Output

#### Product example

```json
{
  "productId": "113348193",
  "url": "https://groceries.morrisons.com/products/morrisons-apples-1-2kg-pack/113348193",
  "name": "Morrisons Apples 1.2kg Pack",
  "brand": "Morrisons",
  "packSize": "1.2kg",
  "price": 2,
  "regularPrice": 2.5,
  "currency": "GBP",
  "unitPrice": 1.67,
  "unitPriceUnit": "per 1kg",
  "onPromotion": true,
  "promotions": ["Now £2, Was £2.50"],
  "rating": 3.5,
  "reviewCount": 21,
  "available": true,
  "categoryPath": ["Events, Inspiration & Ways To Save", "Market Street", "Fresh Fruit & Veg", "Fruit", "Apples", "Braeburn Apples"],
  "category": "Braeburn Apples",
  "dietary": ["Vegetarian", "Vegan"],
  "shelfLife": "2 days",
  "isNew": false,
  "alcohol": false,
  "imageUrl": "https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/53702a7a-3cfd-4c67-a43a-cbe6ee0a6fe8/640x640.jpg"
}
```

#### Multibuy example

```json
{
  "name": "Mionetto Prosecco Doc Treviso Brut 75cl",
  "packSize": "75cl",
  "price": 11.75,
  "unitPrice": 15.67,
  "unitPriceUnit": "per litre",
  "promotions": ["Buy 6 Save 25% - More Card Price", "Buy 2 for £15 - Online Exclusive"],
  "rating": 4,
  "reviewCount": 2,
  "category": "Prosecco"
}
```

#### Output schema

| Field | Type | Description |
|---|---|---|
| `productId`, `sku`, `url` | string | Identifiers and link. |
| `name`, `brand`, `packSize` | string | Product. |
| `price`, `regularPrice`, `currency` | mixed | Current and was-price (£). |
| `unitPrice`, `unitPriceUnit` | mixed | Price per unit. |
| `onPromotion`, `promotions` | mixed | Offers. |
| `rating`, `reviewCount` | number | Reviews. |
| `available` | boolean | Availability. |
| `categoryPath`, `category` | mixed | Category. |
| `dietary` | array | Dietary labels. |
| `shelfLife`, `isNew`, `alcohol` | mixed | Extra info. |
| `imageUrl`, `images` | mixed | Images. |
| `search`, `scrapedAt` | string | Source info. |

### How much does it cost to scrape Morrisons?

Morrisons Scraper uses **pay-per-product** pricing: a small fixed price per product, with automatic discounts on higher Apify plans. See the **Pricing** tab for the exact price. A whole department of about a thousand products takes roughly a minute.

### More grocery and retail data

- [ALDI Australia Scraper](https://apify.com/hipersoft/aldi-au-scraper): supermarket prices in Australia.
- [OTTO.de Scraper](https://apify.com/hipersoft/otto-scraper): German products and prices.
- [UK Food Hygiene Scraper](https://apify.com/hipersoft/uk-food-hygiene-scraper): UK food business hygiene ratings.

### FAQ

**Can I scrape every Morrisons product?**
Yes. Select all **Whole departments** and set **Max products** to 0.

**Are prices the same as in store?**
These are the online prices for home delivery; in-store prices can differ.

**What is the unit price?**
The price per kg, per litre or per item that Morrisons shows, so you can compare pack sizes.

**Can I track offers?**
Yes. Turn on **Only products on offer** and schedule a daily run to follow promotions over time.

**What formats can I export?**
CSV, Excel, JSON, XML, HTML and RSS, or read the results through the Apify API.

**Can I integrate Morrisons Scraper with other apps?**
Morrisons Scraper can be connected with almost any cloud service or web app thanks to [integrations on the Apify platform](https://apify.com/integrations). It works with [Make](https://apify.com/integrations/make), [Zapier](https://apify.com/integrations/zapier), [Slack](https://docs.apify.com/platform/integrations/slack), [Airbyte](https://docs.apify.com/platform/integrations/airbyte), [GitHub](https://docs.apify.com/platform/integrations/github), [Google Drive](https://docs.apify.com/platform/integrations/drive) and [many more](https://apify.com/integrations), plus the [Apify API](https://docs.apify.com/api/v2), JS/Python clients and MCP. Or use [webhooks](https://docs.apify.com/platform/integrations/webhooks) to trigger an action whenever a run finishes.

**Is it legal to scrape Morrisons?**
The scraper only collects publicly listed product information. You are responsible for using the data in line with Morrisons' terms and applicable law.

### Related Actors

- [ALDI Australia Scraper](https://apify.com/hipersoft/aldi-au-scraper)
- [OTTO.de Scraper](https://apify.com/hipersoft/otto-scraper)

### Notes

Original clean-room implementation. Returns only public data. Not affiliated with Morrisons.

# Actor input Schema

## `searchTerms` (type: `array`):

What to search on Morrisons, e.g. milk, bread, chicken breast, nappies, prosecco. Each term is a separate search.

## `departments` (type: `array`):

Scrape every product in one or more Morrisons departments.

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

Optional. Paste Morrisons aisle/category links (e.g. https://groceries.morrisons.com/categories/fruit-veg/176738) or search links.

## `onlyOnPromotion` (type: `boolean`):

Only return products with an active offer or reduced price.

## `onlyAvailable` (type: `boolean`):

Skip products that are currently unavailable.

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

Stop after this many products. 0 means no limit.

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

Not required for normal use.

## Actor input object example

```json
{
  "searchTerms": [
    "milk"
  ],
  "onlyOnPromotion": false,
  "onlyAvailable": false,
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

The results as dataset items.

# 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 = {
    "searchTerms": [
        "milk"
    ],
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("hipersoft/morrisons-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 = {
    "searchTerms": ["milk"],
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("hipersoft/morrisons-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 '{
  "searchTerms": [
    "milk"
  ],
  "maxItems": 50
}' |
apify call hipersoft/morrisons-scraper --silent --output-dataset

```

## MCP server setup

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