Morrisons Scraper: Prices, More Card Offers & Products (UK) avatar

Morrisons Scraper: Prices, More Card Offers & Products (UK)

Pricing

from $2.40 / 1,000 products

Go to Apify Store
Morrisons Scraper: Prices, More Card Offers & Products (UK)

Morrisons Scraper: Prices, More Card Offers & Products (UK)

Scrape Morrisons UK grocery products by search, category or product URL: price, was price, unit price, More Card Price, multi-buys and offers, availability, ratings, dietary icons, and optional ingredients, allergens and nutrition. Fast JSON from Morrisons' own API. Pay per product.

Pricing

from $2.40 / 1,000 products

Rating

0.0

(0)

Developer

Zaiq

Zaiq

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

6 days ago

Last modified

Share

Get Morrisons UK grocery products as clean data: price, was price, unit price, More Card Price, multi-buys and other offers, availability, category, rating, dietary icons and, if you ask for it, ingredients, allergens and nutrition. Search like a shopper, list whole categories and aisles, or check a fixed list of products every day.

The Actor reads the same product API the groceries.morrisons.com website uses, so results arrive as structured data in seconds (up to 300 products per request), without a browser and without logging in.

What it does

  • Search terms, as many pages as you need.
  • Category and aisle pages: paste the page address (it ends in a number), for example https://groceries.morrisons.com/categories/fresh-foods/milk-eggs-butter/fresh-milk/semi-skimmed-milk/177269.
  • Product URLs or product numbers (the number at the end of a product URL). A product that does not exist comes back as a free row with an error.
  • Prices: the price you pay, the was price for "Now £x, Was £y" offers, the unit price (per kg, litre, each...), and the More Card Price with its unit price.
  • Promotions, classified: More Card Price, multi-buy ("Buy 2 for £4"), meal deal, price cut, and Morrisons' own labels such as "Unbeatable Price" and "Intro Price".
  • Only products on offer: one switch, applied by Morrisons' own "On offer" filter.
  • Availability (inStock), pack size as written and as a number in grams, millilitres or items, category path, rating and number of reviews, dietary icons (Vegetarian, Vegan...), labels (New, Alcohol).
  • Details on request: ingredients, the allergens marked in bold in the ingredients (as a list), dietary information, nutrition table, storage, preparation, origin and manufacturer.
  • Sort: relevance, price low to high, price high to low, unit price, customer rating (Morrisons' own sorting).

The output has the same columns as our Tesco, Sainsbury's and Asda scrapers, so the four can be compared row by row.

Who uses it

  • Brands and suppliers checking their shelf price, offers and More Card Prices at Morrisons.
  • Retail and pricing analysts tracking price changes, unit prices and promotions over time.
  • Deal and comparison sites listing current Morrisons offers.
  • Researchers measuring grocery inflation with real basket prices.
  • Nutrition and allergen apps that need ingredients and nutrition per product.

Example

Test runs on 4 October 2026 through UK home connections:

RunResult
Six searches (milk, bread, coffee, pasta, eggs, bananas), 50 products each300 products in 5 seconds; 136 on offer, 45 with a was price, 4 with a More Card Price
One search ("chocolate") to 650 products650 products from 3 requests in 6 seconds
The semi-skimmed milk aisle38 products from one request
Offers only: two searches and the semi-skimmed milk aisle139 products, all on offer; 84 with a was price, 13 with a More Card Price
Eleven pasta products with details11 of 11 with a nutrition table; 10 with ingredients
Product numbers, one of them not on Morrisonsthe real products returned; the missing one as a free row

No request was blocked in these runs.

Input

{
"searchTerms": ["milk", "coffee"],
"categoryUrls": [{ "url": "https://groceries.morrisons.com/categories/fresh-foods/milk-eggs-butter/fresh-milk/semi-skimmed-milk/177269" }],
"productIds": ["113240422"],
"maxItems": 500,
"maxItemsPerSource": 200,
"offersOnly": false,
"sort": "relevance",
"includeDetails": false
}
FieldWhat it does
searchTermsWords to search for, as you would type them on groceries.morrisons.com.
categoryUrlsMorrisons category or aisle pages (addresses ending in a number).
productUrlsMorrisons product pages.
productIdsMorrisons product numbers (the number at the end of a product URL).
maxItemsStop after this many products in total (default 1000).
maxItemsPerSourceStop each search or category after this many products (default 200).
offersOnlyOnly products on offer, as Morrisons' "On offer" filter defines it.
sortrelevance, price-low-high, price-high-low, unit-price-low-high or rating.
includeDetailsAdd ingredients, allergens, nutrition, storage and origin (charged separately).
deduplicateWrite a product found by two searches once (default on). Switch off to keep every search's full list.
proxyConfiguration, maxConcurrencyAdvanced. UK residential connections are the default and are included in the price.

Output

One row per product. A row from a search for "morrisons the best coffee" (offers only), with details shortened:

{
"retailer": "Morrisons",
"productId": "111000599",
"sku": "ea6e341e-7923-4fe4-8d14-9aca799665db",
"gtin": null,
"name": "Morrisons The Best Fair Trade Colombian Pods x 10",
"brand": "Morrisons The Best",
"url": "https://groceries.morrisons.com/products/morrisons-the-best-fair-trade-colombian-pods-x-10/111000599",
"imageUrl": "https://groceries.morrisons.com/images-v3/4b85987b-1398-4173-a0c1-3546047c9d74/828639a4-c58e-4b34-aea7-352a798cfc54/640x640.jpg",
"price": 3.25,
"currency": "GBP",
"wasPrice": null,
"unitPrice": 60.19,
"unitPriceUnit": "kg",
"loyaltyPrice": 2.92,
"loyaltyUnitPrice": 54.07,
"loyaltyScheme": "More Card",
"loyaltyValidFrom": null,
"loyaltyValidTo": null,
"onOffer": true,
"promotions": [
{
"id": "BUL-a093652e319b8c02dc23690",
"text": "The Best Save 10% - More Card Price",
"type": "loyalty-price",
"loyalty": true,
"offerPrice": 2.92,
"offerUnitPrice": 54.07,
"quantity": null,
"multibuyPrice": null,
"validFrom": null,
"validTo": null
}
],
"promotionText": "The Best Save 10% - More Card Price",
"size": "54g",
"sizeValue": 54,
"sizeUnit": "g",
"packCount": null,
"inStock": true,
"availability": "available",
"category": "Nespresso Coffee Pods",
"categoryPath": ["Food Cupboard", "Coffee", "Coffee Pods & Capsules", "Nespresso Coffee Pods"],
"rating": 3.0,
"reviewCount": 1,
"dietary": [],
"labels": [],
"region": null,
"storeId": null,
"details": {
"storage": "Store in a cool, dry place.\nFor best before end see side of pack",
"manufacturer": "Wm Morrison Supermarkets Limited,\nGain Lane,\nBradford,\nBD3 7DL. ..."
},
"sourceType": "search",
"sourceInput": "morrisons the best coffee",
"position": 1,
"scrapedAt": "2026-10-04T15:52:25Z",
"error": null,
"charged": true
}

A "Now £6, Was £8.35" offer looks like this: "price": 6.0, "wasPrice": 8.35 with a promotion {"text": "Now £6, Was £8.35", "type": "price-cut", "offerPrice": 6.0}.

Notes on the fields:

  • price is what you pay now; wasPrice is the earlier price of a "Now/Was" offer; loyaltyPrice is the More Card Price. Morrisons gives no dates for its offers on the website, so the validity fields are empty.
  • Morrisons does not publish barcodes on its website, so gtin is empty.
  • "Unbeatable Price" and similar labels count as offers, because Morrisons' own "On offer" filter includes them.
  • The run's key-value store also holds RUN-SUMMARY: products written, what each input returned and why the run stopped.

Use it from code, automations and AI agents

  • API: run it and get the results in one call: POST https://api.apify.com/v2/acts/zaiq~morrisons-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN with the input as JSON. The API tab on this page has ready-made Python, JavaScript and cURL examples.
  • Python (pip install apify-client):
from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("zaiq/morrisons-scraper").call(run_input={'searchTerms': ['milk'], 'maxItems': 20})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)
  • No code: connect it to Google Sheets, Zapier, Make or n8n from the Integrations tab, schedule runs in Apify Console, and get a webhook when a run finishes.
  • AI agents (MCP): add it as a tool to Claude, Cursor or any MCP client through Apify's MCP server: https://mcp.apify.com?tools=zaiq/morrisons-scraper.

Pricing

Pay per event:

EventPrice
Product scraped (one row written)$0.003 ($3 per 1,000 products)
Product details added (ingredients, allergens, nutrition; only when switched on)$0.004
Run start$0.005

Free: products that cannot be found, requests that fail or are blocked, retries and duplicates. Your spending limit for the run is respected: the run stops cleanly before going over it.

Limits

  • Prices are the ones Morrisons shows on its website to shoppers who are not signed in. Personalised More Card offers are not included.
  • Morrisons groups search results by category; when you sort a search, products are sorted within those groups.
  • In our tests every row was in stock: Morrisons appears to leave unavailable products out of searches and aisles.
  • Product details need one extra request per product.
  • Up to 10 requests at once (4 by default), to keep the load on Morrisons light.
  • Check that your use of the data complies with Morrisons' terms and with the law that applies to you.

FAQ

Do I need a Morrisons account or More Card? No. The Actor sees what any visitor to groceries.morrisons.com sees, including the advertised More Card Prices.

Which prices are these? The prices groceries.morrisons.com shows to a visitor who has not signed in or chosen a delivery address. In-store prices can differ.

How do I track prices every day? Put your product numbers in productIds and schedule the Actor.

How do I get every product on offer in an aisle? Add the aisle page under categoryUrls, switch on offersOnly and raise maxItemsPerSource.

What if a request fails? It is retried through another UK home connection. Failed requests are free.

Can I get the data for Tesco, Sainsbury's or Asda too? Yes, our Tesco, Sainsbury's and Asda scrapers return the same columns.