Morrisons Products Search API
Search Morrisons Groceries by keyword. Each product has its name, brand, price, unit price, rating and availability.
- 5 credits per call
- Failed calls are free
- Updated
- morrisons.products.search
{ "page": { "has_more": true, "page": 1, "returned": 50, "total_products": 52 }, "items": [ { "name": "Morrisons Whole British Milk 4 Pints", "available": true, "brand": "Morrisons", "product_id": "3ec356e2-e29b-47c6-a405-3729d743d77d", "retailer_product_id": "103103141", "url": "https://groceries.morrisons.com/products/morrisons-whole-british-milk-4-pints/103103141", "price": { "current": { "amount": "1.65", "amount_numeric": 1.65, "currency": "GBP" }, "unit": { "label": "fop.price.per.litre", "current": { "amount": "72.6", "amount_numeric": 72.6, "currency": "GBX" } } }, "rating": { "count": 41, "overall": 3.4 } }, { "name": "Morrisons British Whole Milk 4 Pint", "available": true, "brand": "Morrisons", "product_id": "1527fe28-f343-4328-a2bf-f6abd9e068a4", "retailer_product_id": "113239405", "url": "https://groceries.morrisons.com/products/morrisons-british-whole-milk-4-pint/113239405", "price": { "current": { "amount": "1.65", "amount_numeric": 1.65, "currency": "GBP" }, "unit": { "label": "fop.price.per.litre", "current": { "amount": "72.6", "amount_numeric": 72.6, "currency": "GBX" } } }, "rating": { "count": 11, "overall": 2.9 } } ]}
| # | Name | Brand | Price | Unit price | Rating | Ratings | Available | Product ID | Product id | Url |
|---|---|---|---|---|---|---|---|---|---|---|
| 1 | Morrisons Whole British Milk 4 Pints | Morrisons | 1.65 | 72.6 | 3.4 | 41 | true | 103103141 | 3ec356e2-e29b-47c6-a405-3729d743d77d | https://groceries.morrisons.com/products/morrisons-whole-britis… |
| 2 | Morrisons British Whole Milk 4 Pint | Morrisons | 1.65 | 72.6 | 2.9 | 11 | true | 113239405 | 1527fe28-f343-4328-a2bf-f6abd9e068a4 | https://groceries.morrisons.com/products/morrisons-british-whol… |
| 3 | Morrisons British Whole Milk 2 Pint | Morrisons | 1.20 | 1.06 | 3.4 | 5 | true | 103143451 | be536963-9603-4476-8f14-e2eaa0282e8e | https://groceries.morrisons.com/products/morrisons-british-whol… |
| 4 | Morrisons British Whole Milk 2 Pint | Morrisons | 1.20 | 1.06 | 4 | 4 | true | 113240377 | 8701fb36-18d7-461d-b167-415a3b51b94e | https://groceries.morrisons.com/products/morrisons-british-whol… |
| 5 | Morrisons Long Life British Whole Milk | Morrisons | 6.00 | 1.00 | 4.8 | 8 | true | 103113892 | cb84116a-abaa-4f3e-adf2-517487783dc1 | https://groceries.morrisons.com/products/morrisons-long-life-br… |
| 6 | Morrisons Whole British Milk 1 Pint | Morrisons | 0.85 | 1.50 | 0 | 0 | true | 114155772 | c02b0e02-b9c2-47ba-bb60-126f6c71a6a3 | https://groceries.morrisons.com/products/morrisons-whole-britis… |
| 7 | Cravendale Filtered Fresh Whole Milk Fresher for Longer 2L | Cravendale | 2.65 | 1.33 | 4.8 | 123 | true | 103050730 | 4de05f8c-cbb5-40cb-a807-9d41db58d0c5 | https://groceries.morrisons.com/products/cravendale-filtered-fr… |
| 8 | Morrisons British Whole Milk 6 Pint | Morrisons | 2.40 | 70.4 | 3.7 | 9 | true | 113239430 | 11ffe63b-6d78-42af-b9d8-05431cfb02ef | https://groceries.morrisons.com/products/morrisons-british-whol… |
| 9 | Morrisons British Whole Milk 6 Pints | Morrisons | 2.40 | 70.4 | 4.1 | 17 | true | 103042852 | a3caaded-4b21-4636-ba5e-9508d6cb0960 | https://groceries.morrisons.com/products/morrisons-british-whol… |
| 10 | Morrisons Scottish Whole Milk 2 Pint | Morrisons | 1.20 | 1.06 | 0 | 0 | true | 103143514 | c7dbd3e8-8a8e-4b43-9c68-bc84c2e4b838 | https://groceries.morrisons.com/products/morrisons-scottish-who… |
What you send
The input
object of the request, with every field the endpoint accepts.
| Field | Type | Required | What it does | Example |
|---|---|---|---|---|
| query | string | yes | What to search for, such as whole milk. | whole milk |
Fields it returns
What each record in the response holds, with the values from the sample above.
| Field | Type | What it is | Example |
|---|---|---|---|
| items[].name | string | The name as Morrisons shows it. | Morrisons Whole British Milk 4 Pints |
| items[].brand | string | The product's brand. | Morrisons |
| items[].rating.overall | number | The average star rating. | 3.4 |
| items[].rating.count | integer | How many ratings the product has. | 41 |
| items[].available | boolean | Whether the product can be ordered now. | true |
| items[].retailer_product_id | string | Morrisons' shop number for the product. | 103103141 |
| items[].price | object | The product's price. | 2 fields |
| items[].rating | object | The product's rating. | 2 fields |
| items[].price.current | object | The price now, with its currency. | 3 fields |
| items[].price.unit | object | The price per unit, such as per kilogram. | 2 fields |
| items[].product_id | string | Morrisons' ID for the product; the product endpoint takes it. | 3ec356e2-e29b-47c6-a405-3729d743d77d |
| items[].url | string | The page on Morrisons' site. | https://groceries.morrisons.com/products/morrisons-whole-britis… |
| items | array | The products. | 50 records |
| page | object | Paging for this response. | 4 fields |
| page.has_more | boolean | Whether another page follows. | true |
| page.page | integer | Paging for this response. | 1 |
| page.returned | integer | How many entries this page holds. | 50 |
| page.total_products | integer | How many products match. | 52 |
Call it from your code, or ask your agent
Set UPSCRAPE_API_KEY to your key and copy a working request.
curl --request POST \ --url https://data.upscrape.com/execute \ --header "Authorization: Bearer $UPSCRAPE_API_KEY" \ --header "Content-Type: application/json" \ --header "Prefer: wait=30" \ --data '{ "capability": "morrisons.products.search", "input": { "query": "whole milk" }}'
import jsonimport osimport requestspayload = json.loads(r'''{ "capability": "morrisons.products.search", "input": { "query": "whole milk" }}''')response = requests.post( "https://data.upscrape.com/execute", headers={ "Authorization": f"Bearer {os.environ['UPSCRAPE_API_KEY']}", "Content-Type": "application/json", "Prefer": "wait=30", }, json=payload,)response.raise_for_status()print(json.dumps(response.json(), indent=2))
const response = await fetch("https://data.upscrape.com/execute", { method: "POST", headers: { "Authorization": `Bearer ${process.env.UPSCRAPE_API_KEY}`, "Content-Type": "application/json", "Prefer": "wait=30", }, body: JSON.stringify({ "capability": "morrisons.products.search", "input": { "query": "whole milk" }}),});if (!response.ok) { throw new Error(`Upscrape request failed: ${response.status}`);}console.log(JSON.stringify(await response.json(), null, 2));
https://data.upscrape.com/mcp
Using Upscrape, search Morrisons for whole milk and make a table of name, brand, price and price per litre, cheapest per litre first.
More from the Morrisons API
The same data from other platforms
Morrisons Products Search API FAQ
The short answers. The docs have the long ones.
How much does the Morrisons Products Search API cost?
5 credits per successful call, shown before it runs. You buy credits once, and paid credits never expire.
What do I send?
Send query. The input fields below list every option with its type and limits.
Do I need a Morrisons login?
No. It reads public Morrisons data; nothing runs on your account.
Can my AI agent call it?
Yes, over MCP: the agent finds morrisons.products.search, checks its price and runs it with the same credits as the REST API.
Your first Morrisons call is free.
Up to 100 free credits to start, no card needed.