Sainsbury's Groceries Products Search API
Search for an ingredient or product name and compare the returned packs, prices and public offers.
- 1–15 credits per call
- Failed calls are free
- Updated
- sainsburys.products.search
{ "count": 29, "has_more": false, "next_page": null, "page": 1, "page_size": 30, "total": 29, "products": [ { "name": "Sainsbury's British Semi Skimmed Milk, SO Organic 2.27L (4 pint)", "available": true, "brand": null, "gtin": null, "image": "https://assets.sainsburys-groceries.co.uk/gol/1208450/image.jpg", "pack_size": "4 pint", "retailer_product_id": "1208450", "url": "https://www.sainsburys.co.uk/gol-ui/product/sainsburys-british-semi-skimmed-milk-so-organic-2-27l-4-pint", "price": { "amount": 2.65, "currency": "GBP" }, "unit_price": { "amount": 1.17, "currency": "GBP", "measure_amount": 1, "unit": "per_litre" }, "member_prices": [], "promotions": [] }, { "name": "Sainsbury's 2L Fresher for Longer Filtered Semi-Skimmed Milk", "available": true, "brand": null, "gtin": "0000000133845", "image": "https://assets.sainsburys-groceries.co.uk/gol/7657802/image.jpg", "pack_size": "2L", "retailer_product_id": "7657802", "url": "https://www.sainsburys.co.uk/gol-ui/product/sainsburys-2l-fresher-for-longer-filtered-semi-skimmed-milk", "price": { "amount": 2.2, "currency": "GBP" }, "unit_price": { "amount": 1.1, "currency": "GBP", "measure_amount": 1, "unit": "per_litre" }, "member_prices": [], "promotions": [] } ]}
| # | Product | Product ID | Pack | Catalog available | GTIN | Product link | Image |
|---|---|---|---|---|---|---|---|
| 1 | Sainsbury's British Semi Skimmed Milk, SO Organic 2.27L (4 pint) | 1208450 | 4 pint | true | https://www.sainsburys.co.uk/gol-ui/product/sainsburys-british-… | https://assets.sainsburys-groceries.co.uk/gol/1208450/image.jpg | |
| 2 | Sainsbury's 2L Fresher for Longer Filtered Semi-Skimmed Milk | 7657802 | 2L | true | 0000000133845 | https://www.sainsburys.co.uk/gol-ui/product/sainsburys-2l-fresh… | https://assets.sainsburys-groceries.co.uk/gol/7657802/image.jpg |
| 3 | Sainsbury's British Semi Skimmed Milk 2.27L (4 pint) | 357937 | 4 pint | true | 0000050181117 | https://www.sainsburys.co.uk/gol-ui/product/sainsburys-british-… | https://assets.sainsburys-groceries.co.uk/gol/357937/image.jpg |
| 4 | Sainsbury's British Semi Skimmed Milk 1.13L (2 pint) | 1137637 | 2 pint | true | 5000181013566 | https://www.sainsburys.co.uk/gol-ui/product/sainsburys-british-… | https://assets.sainsburys-groceries.co.uk/gol/1137637/image.jpg |
| 5 | Sainsbury's British Semi Skimmed Milk 3.4L (6 pint) | 464390 | 6 pint | true | 5000181016574 | https://www.sainsburys.co.uk/gol-ui/product/sainsburys-british-… | https://assets.sainsburys-groceries.co.uk/gol/464390/image.jpg |
| 6 | Cravendale Filtered Fresh Semi Skimmed Milk 2L Fresher for Long… | 3216620 | 2L | true | 5000181024043 | https://www.sainsburys.co.uk/gol-ui/product/cravendale-filtered… | https://assets.sainsburys-groceries.co.uk/gol/3216620/image.jpg |
| 7 | Sainsbury's British Semi Skimmed Milk 1 Pint | 173759 | 1 Pint | true | 5000181015614 | https://www.sainsburys.co.uk/gol-ui/product/sainsburys-british-… | https://assets.sainsburys-groceries.co.uk/gol/173759/image.jpg |
| 8 | Sainsbury’s 1L Fresher For longer Filtered Semi Skimmed Milk | 8172497 | 1L | true | 0000000514828 | https://www.sainsburys.co.uk/gol-ui/product/sainsbury-s-1l-fres… | https://assets.sainsburys-groceries.co.uk/gol/8172497/image.jpg |
| 9 | Cravendale Filtered Fresh Semi Skimmed Milk Fresher for Longer … | 3216590 | 1L | true | 5000181024029 | https://www.sainsburys.co.uk/gol-ui/product/cravendale-filtered… | https://assets.sainsburys-groceries.co.uk/gol/3216590/image.jpg |
| 10 | Sainsbury's Everyday Lactose Free Semi Skimmed Dairy Drink 1L | 7943123 | 1L | true | 0000000346085 | https://www.sainsburys.co.uk/gol-ui/product/sainsburys-everyday… | https://assets.sainsburys-groceries.co.uk/gol/7943123/image.jpg |
What you send
The input
object of the request, with every field the endpoint accepts.
- Keep the default page size of 30; larger pages do not work reliably yet.
| Field | Type | Required | What it does | Example |
|---|---|---|---|---|
| query | string | yes | Grocery keyword or ingredient. | semi skimmed milk |
| page | integer | no | One-based result page to fetch. From 1 to 1000. Default: 1. |
|
| page_size | integer | no | Number of results per page. From 1 to 90. Default: 30. |
Fields it returns
What each record in the response holds, with the values from the sample above.
| Field | Type | What it is | Example |
|---|---|---|---|
| products[].name | string | Product or category name as returned; use its identifier to join records. | Sainsbury's British Semi Skimmed Milk, SO Organic 2.27L (4 pint) |
| products[].retailer_product_id | string | Sainsbury’s identifier for matching the same pack. | 1208450 |
| products[].pack_size | string | Size expression where supplied; null stays unknown. | 4 pint |
| products[].price | object | Regular pack amount, separate from member prices. | 2 fields |
| products[].unit_price | object | Retailer’s published unit amount; do not assume Nectar basis. | 4 fields |
| products[].available | boolean | Public catalog flag, not local stock. | true |
| products[].brand | null | Brand where supplied; lists may omit it. | null |
| products[].gtin | null | Barcode where supplied, retained as text. | null |
| products[].url | string | Official product page link. | https://www.sainsburys.co.uk/gol-ui/product/sainsburys-british-… |
| products[].image | string | Product image URL where supplied. | https://assets.sainsburys-groceries.co.uk/gol/1208450/image.jpg |
| products[].member_prices | array | Nectar member prices for the product, if any. | empty in this sample |
| products[].price.amount | number | Regular shelf price in pounds, before any Nectar price. | 2.65 |
| products[].price.currency | string | Currency code supplied with the regular price. | GBP |
| products[].promotions | array | Offers running on the product. | empty in this sample |
| products[].unit_price.amount | number | Price per unit in pounds, such as per litre. | 1.17 |
| products[].unit_price.currency | string | Currency of the unit price, such as GBP. | GBP |
| products[].unit_price.measure_amount | integer | Quantity the unit price is for, such as 1 litre. | 1 |
| products[].unit_price.unit | string | Keep the unit with the amount when comparing packs. | per_litre |
| count | integer | Number of products on this page. | 29 |
| has_more | boolean | Whether more pages of results follow. | false |
| next_page | null | Page number to ask for next, or null on the last page. | null |
| page | integer | Page number of these results. | 1 |
| page_size | integer | Most products returned per page. | 30 |
| products | array | Products matching the search on this page. | 29 records |
| total | integer | How many products match the search in all. | 29 |
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": "sainsburys.products.search", "input": { "query": "semi skimmed milk" }}'
import jsonimport osimport requestspayload = json.loads(r'''{ "capability": "sainsburys.products.search", "input": { "query": "semi skimmed 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": "sainsburys.products.search", "input": { "query": "semi skimmed 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
Use Upscrape to search Sainsbury’s for semi skimmed milk with the default page size. Compare the returned pack and unit prices, using matching units. Keep product IDs.
More from the Sainsbury's Groceries API
The same data from other platforms
Sainsbury's Groceries Products Search API FAQ
The short answers. The docs have the long ones.
How much does the Sainsbury's Groceries Products Search API cost?
1–15 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 Sainsbury's Groceries login?
No. It reads public Sainsbury's Groceries data; nothing runs on your account.
Can my AI agent call it?
Yes, over MCP: the agent finds sainsburys.products.search, checks its price and runs it with the same credits as the REST API.
Your first Sainsbury's Groceries call is free.
Up to 100 free credits to start, no card needed.