# Morrisons Product Search Scraper (`stealth_mode/morrisons-product-search-scraper`) Actor

Scrape product listings from Morrisons.com with complete details including pricing, availability, ratings, brand info, and images. Ideal for price monitoring, market research, and competitive analysis in the UK grocery sector.

- **URL**: https://apify.com/stealth\_mode/morrisons-product-search-scraper.md
- **Developed by:** [Stealth mode](https://apify.com/stealth_mode) (community)
- **Categories:** Automation, Developer tools, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 results

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

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use 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

## Morrisons Product Search Scraper: Extract Grocery Data from UK's Leading Supermarket

---

### What Is Morrisons.com?

Morrisons is the UK's fourth-largest supermarket chain, operating both physical stores and a comprehensive online grocery platform at `groceries.morrisons.com`. The site hosts tens of thousands of products across fresh produce, meat, fish, bakery, and more. Manual product data collection from Morrisons is tedious and error-prone — the **Morrisons Product Search Scraper** automates extraction at scale, delivering structured product intelligence in minutes.

---

### Overview

The **Morrisons Product Search Scraper** extracts detailed product information from Morrisons category and search pages, transforming unstructured listings into clean, analyzable data. It is designed for:

- **Price monitoring platforms** tracking grocery inflation and competitor pricing
- **Market researchers** analyzing UK retail trends and product availability
- **Data aggregators** building grocery product feeds
- **E-commerce analysts** benchmarking Morrisons against other retailers

Key features include configurable item limits per page, error tolerance for failed URLs, and comprehensive product metadata including pricing, availability, images, and customer ratings.

---

### Input Format

The scraper accepts a JSON configuration object specifying which product pages to extract and how to handle them:

```json
{
  "urls": [
    "https://groceries.morrisons.com/categories/meat-fish/179549?source=CAROUSEL_IMAGE"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 200
}
````

#### Configuration Parameters

| Parameter | Type | Description | Example |
|---|---|---|---|
| `urls` | Array | Product category or search result page URLs from Morrisons | `https://groceries.morrisons.com/categories/meat-fish/179549` |
| `max_items_per_url` | Integer | Maximum products to collect per page (1–200) | `200` |
| `ignore_url_failures` | Boolean | If `true`, continue processing if a URL fails; if `false`, halt on error | `true` |

**Input Guidelines:**

- Paste full URLs from Morrisons category pages (e.g., `/categories/meat-fish/`, `/categories/fresh-produce/`)
- Search result URLs are also supported
- Set `max_items_per_url` to limit data volume; use `200` for comprehensive category scrapes
- Enable `ignore_url_failures: true` for bulk runs to handle temporary network issues

***

### Output Format

**Sample output**

```json
{
  "product_id": "b4ba8f3b-e422-4ec5-a465-eaf5ae64b190",
  "retailer_product_id": "111595107",
  "brand": "Morrisons",
  "available": true,
  "is_verified_purchase": false,
  "quantity_in_basket": 0,
  "max_quantity_reached": false,
  "tax_codes_display_names": [],
  "image_ids": [
    "0c6e2230-05f9-4ea8-903d-8657d7237af1"
  ],
  "time_restricted": false,
  "guaranteed_product_life": {
    "quantity": 2,
    "unit": "DAY"
  },
  "is_in_current_catalog": true,
  "rating_summary": {
    "overall_rating": "2.9",
    "count": 49
  },
  "retailer_financing_plan_ids": [],
  "alcohol": false,
  "category_path": [
    "Meat & Fish",
    "Fish & Seafood",
    "Fresh Fish Fillets",
    "Salmon"
  ],
  "name": "Morrisons 2 Salmon Fillets 220g",
  "price": {
    "current": {
      "amount": "4.35",
      "currency": "GBP"
    },
    "unit": {
      "label": "fop.price.per.kg",
      "current": {
        "amount": "19.77",
        "currency": "GBP"
      }
    }
  },
  "is_in_product_list": false,
  "image": {
    "src": "https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/300x300.jpg",
    "description": "Morrisons 2 Salmon Fillets 220g",
    "fop_srcset": "https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/100x100.webp 100w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/150x150.webp 150w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/200x200.webp 200w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/300x300.webp 300w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/350x350.webp 350w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/410x410.webp 410w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/500x500.webp 500w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/100x100.jpg 100w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/150x150.jpg 150w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/200x200.jpg 200w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/300x300.jpg 300w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/350x350.jpg 350w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/410x410.jpg 410w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/500x500.jpg 500w",
    "bop_srcset": "https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/300x300.webp 300w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/500x500.webp 500w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/640x640.webp 640w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/800x800.webp 800w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/960x960.webp 960w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/1120x1120.webp 1120w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/1280x1280.webp 1280w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/300x300.jpg 300w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/500x500.jpg 500w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/640x640.jpg 640w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/800x800.jpg 800w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/960x960.jpg 960w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/1120x1120.jpg 1120w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/1280x1280.jpg 1280w"
  },
  "images": [
    {
      "src": "https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/500x500.jpg",
      "description": "Morrisons 2 Salmon Fillets 220g",
      "fop_srcset": "https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/100x100.webp 100w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/150x150.webp 150w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/200x200.webp 200w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/300x300.webp 300w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/350x350.webp 350w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/410x410.webp 410w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/500x500.webp 500w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/100x100.jpg 100w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/150x150.jpg 150w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/200x200.jpg 200w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/300x300.jpg 300w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/350x350.jpg 350w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/410x410.jpg 410w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/500x500.jpg 500w",
      "bop_srcset": "https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/300x300.webp 300w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/500x500.webp 500w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/640x640.webp 640w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/800x800.webp 800w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/960x960.webp 960w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/1120x1120.webp 1120w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/1280x1280.webp 1280w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/300x300.jpg 300w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/500x500.jpg 500w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/640x640.jpg 640w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/800x800.jpg 800w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/960x960.jpg 960w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/1120x1120.jpg 1120w, https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/0c6e2230-05f9-4ea8-903d-8657d7237af1/1280x1280.jpg 1280w"
    }
  ],
  "icons": {
    "certification": [],
    "legal": []
  },
  "featured": "false",
  "is_new": false,
  "offers": [
    {
      "id": "fd8a71ca-58f9-4314-bbbd-8a177ef6f7c2",
      "retailer_promotion_id": "1010518972",
      "description": "Buy 3 for £10",
      "type": "OFFER",
      "presentation_mode": "DEFAULT",
      "required_product_quantity": 3,
      "limit_reached": false
    }
  ],
  "offer": {
    "id": "fd8a71ca-58f9-4314-bbbd-8a177ef6f7c2",
    "description": "Buy 3 for £10",
    "type": "OFFER",
    "retailer_promotion_id": "1010518972",
    "limit_reached": false,
    "required_product_quantity": 3,
    "presentation_mode": "DEFAULT"
  },
  "size": {
    "value": "220g"
  },
  "from_url": "https://groceries.morrisons.com/categories/meat-fish/179549?source=CAROUSEL_IMAGE"
}
```

Each product record contains up to 23 fields with rich product and transactional metadata:

#### Product Identification

| Field | Meaning | Use Case |
|---|---|---|
| `Product ID` | Unique internal Morrisons identifier | Database key, deduplication |
| `Retailer Product ID` | Morrisons' official product code | Linking to inventory systems |
| `Name` | Full product name as displayed | Product labeling, search indexing |
| `Brand` | Manufacturer brand | Category analysis, private label detection |
| `Category Path` | Full hierarchical category string (e.g., "Meat & Fish > Fresh Meat > Beef") | Navigation tree, content organization |

#### Pricing & Availability

| Field | Meaning | Use Case |
|---|---|---|
| `Price` | Current retail price in GBP | Price tracking, competitor benchmarking |
| `Available` | Boolean indicating stock status (`true`/`false`) | Inventory monitoring, out-of-stock alerts |
| `Quantity In Basket` | Current quantity in shopper's cart (if applicable) | User preference analysis |
| `Max Quantity Reached` | Boolean for purchase limits | Compliance checking, supply constraints |
| `Size` | Product size/volume (e.g., "500g", "2 liters") | Unit price calculation, product matching |
| `Guaranteed Product Life` | Shelf life or best-before guidance | Freshness assurance, compliance |

#### Media & Visual Content

| Field | Meaning | Use Case |
|---|---|---|
| `Image` | Primary product image URL | Product displays, e-commerce integration |
| `Images` | Array of all product image URLs | Catalog enrichment, gallery builds |
| `Image IDs` | Internal IDs for image tracking | Asset management, image CDN routing |
| `Icons` | Badge/icon URLs (e.g., "organic", "vegan") | Attribute visualization |

#### Customer Engagement & Trust

| Field | Meaning | Use Case |
|---|---|---|
| `Rating Summary` | Aggregate customer rating (e.g., 4.5/5 stars) | Trust signals, quality scoring |
| `Is Verified Purchase` | Boolean confirming customer bought the item | Review authenticity |
| `Offers` | Array of active promotions or discounts | Promotional tracking, deal analysis |
| `Offer` | Primary active offer details | Campaign monitoring |

#### Product Classification

| Field | Meaning | Use Case |
|---|---|---|
| `Alcohol` | Boolean flag for alcohol products | Regulatory compliance, filtering |
| `Tax Codes Display Names` | Tax classification metadata | Financial reporting, audit trails |
| `Featured` | Boolean for hero/promoted placement | Merchandising insights |
| `Is New` | Boolean for newly listed products | New product tracking, trend analysis |
| `Is In Current Catalog` | Boolean confirming product is active | Discontinuation detection |
| `Is In Product List` | Boolean for list/wishlist membership | User preference data |
| `Time Restricted` | Boolean for time-limited availability | Seasonal or flash sale detection |

#### Finance & Partnerships

| Field | Meaning | Use Case |
|---|---|---|
| `Retailer Financing Plan IDs` | Payment plan options (e.g., Klarna) | Payment method analysis |

***

### How to Use

1. **Identify target categories** — Visit `groceries.morrisons.com`, navigate to product categories (e.g., Meat & Fish, Fresh Produce), and copy the full page URL.

2. **Configure input** — Paste category URLs into the `urls` array. Typical values for `max_items_per_url`:
   - `50` – Quick sample per category
   - `100` – Balanced coverage
   - `200` – Full category extraction (recommended for market analysis)

3. **Set error handling** — Keep `ignore_url_failures: true` to skip temporarily unavailable pages without halting the run.

4. **Run the scraper** — Start the actor and monitor the execution log.

5. **Download results** — Export as JSON, CSV, or Excel. Data is ready for analysis in spreadsheets or BI tools.

**Pro tips:**

- Scrape during off-peak hours (night/early morning) for faster page loads
- Use specific category URLs rather than site-wide searches for cleaner, more relevant data
- Combine with historical runs to track price changes over time

***

### Use Cases & Business Value

- **Price intelligence:** Monitor Morrisons grocery prices against competitors (Sainsbury's, Tesco, Asda)
- **Product trend analysis:** Track new launches, promotions, and seasonal product availability
- **Supply chain insight:** Identify stock-outs, allocation changes, and supplier impacts
- **Retail research:** Benchmark product mix, category depth, and private label strategy
- **Data enrichment:** Build comprehensive grocery product databases for API resale or SaaS platforms

By automating data extraction, this scraper replaces hours of manual browsing with actionable, machine-readable product intelligence.

***

### Conclusion

The **Morrisons Product Search Scraper** delivers fast, reliable access to UK grocery data at scale. With 23+ fields spanning pricing, availability, media, and customer signals, it empowers retailers, researchers, and data professionals to make smarter decisions. Start scraping category pages today and transform raw product listings into strategic intelligence.

# Actor input Schema

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

Add the URLs of the product search list urls you want to scrape. You can paste URLs one by one, or use the Bulk edit section to add a prepared list.

## `ignore_url_failures` (type: `boolean`):

If true, the scraper will continue running even if some URLs fail to be scraped.

## `max_items_per_url` (type: `integer`):

The maximum number of items to scrape per URL.

## Actor input object example

```json
{
  "urls": [
    "https://groceries.morrisons.com/categories/meat-fish/179549?source=CAROUSEL_IMAGE"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20
}
```

# 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 = {
    "urls": [
        "https://groceries.morrisons.com/categories/meat-fish/179549?source=CAROUSEL_IMAGE"
    ],
    "ignore_url_failures": true,
    "max_items_per_url": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("stealth_mode/morrisons-product-search-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 = {
    "urls": ["https://groceries.morrisons.com/categories/meat-fish/179549?source=CAROUSEL_IMAGE"],
    "ignore_url_failures": True,
    "max_items_per_url": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("stealth_mode/morrisons-product-search-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "urls": [
    "https://groceries.morrisons.com/categories/meat-fish/179549?source=CAROUSEL_IMAGE"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20
}' |
apify call stealth_mode/morrisons-product-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=stealth_mode/morrisons-product-search-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Morrisons Product Search Scraper",
        "description": "Scrape product listings from Morrisons.com with complete details including pricing, availability, ratings, brand info, and images. Ideal for price monitoring, market research, and competitive analysis in the UK grocery sector.",
        "version": "0.0",
        "x-build-id": "fN6g09ygir6CDBTJo"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/stealth_mode~morrisons-product-search-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-stealth_mode-morrisons-product-search-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/stealth_mode~morrisons-product-search-scraper/runs": {
            "post": {
                "operationId": "runs-sync-stealth_mode-morrisons-product-search-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/stealth_mode~morrisons-product-search-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-stealth_mode-morrisons-product-search-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "urls": {
                        "title": "URLs of the product search list urls to scrape",
                        "type": "array",
                        "description": "Add the URLs of the product search list urls you want to scrape. You can paste URLs one by one, or use the Bulk edit section to add a prepared list.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "ignore_url_failures": {
                        "title": "Continue running even if some URLs fail to be scraped",
                        "type": "boolean",
                        "description": "If true, the scraper will continue running even if some URLs fail to be scraped."
                    },
                    "max_items_per_url": {
                        "title": "Max items per URL",
                        "type": "integer",
                        "description": "The maximum number of items to scrape per URL."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
