Sainsbury's Groceries Offers API
Browse public offer listings and keep membership or quantity conditions beside each product.
- 1–15 credits per call
- Failed calls are free
- Updated
- sainsburys.promotions.list
{ "count": 30, "has_more": true, "next_page": 2, "page": 1, "page_size": 30, "total": 9844, "products": [ { "name": "Sainsbury's 600g Easy Peelers, Taste the Difference", "available": true, "brand": null, "gtin": null, "image": "https://assets.sainsburys-groceries.co.uk/gol/1174281/image.jpg", "pack_size": "600g", "retailer_product_id": "1174281", "url": "https://www.sainsburys.co.uk/gol-ui/product/sainsburys-600g-easy-peelers-taste-the-difference", "price": { "amount": 2.25, "currency": "GBP" }, "unit_price": { "amount": 3.75, "currency": "GBP", "measure_amount": 1, "unit": "per_kg" }, "member_prices": [ { "promotion_id": "10763381", "scheme": "nectar", "price": { "amount": 1.69, "currency": "GBP" } } ], "promotions": [ { "buy_quantity": null, "description": "Buy 1 save 25%", "end": "2026-10-05T23:00:00Z", "for_amount": null, "id": "10763381", "member_scheme": "nectar", "start": "2026-09-22T23:00:00Z", "type": "member" } ] }, { "name": "Sainsbury's Tenderstem Broccoli 200g", "available": true, "brand": null, "gtin": null, "image": "https://assets.sainsburys-groceries.co.uk/gol/1257090/image.jpg", "pack_size": "200g", "retailer_product_id": "1257090", "url": "https://www.sainsburys.co.uk/gol-ui/product/sainsburys-tenderstem-broccoli-200g", "price": { "amount": 1.6, "currency": "GBP" }, "unit_price": { "amount": 8, "currency": "GBP", "measure_amount": 1, "unit": "per_kg" }, "member_prices": [ { "promotion_id": "10766860", "scheme": "nectar", "price": { "amount": 1.25, "currency": "GBP" } } ], "promotions": [ { "buy_quantity": 1, "description": "Buy 1 for 1.25", "end": "2026-10-05T23:00:00Z", "for_amount": 1.25, "id": "10766860", "member_scheme": "nectar", "start": "2026-09-15T23:00:00Z", "type": "member" } ] } ]}
| # | Product | Product ID | Pack | Catalog available | GTIN | Product link | Image |
|---|---|---|---|---|---|---|---|
| 1 | Sainsbury's 600g Easy Peelers, Taste the Difference | 1174281 | 600g | true | https://www.sainsburys.co.uk/gol-ui/product/sainsburys-600g-eas… | https://assets.sainsburys-groceries.co.uk/gol/1174281/image.jpg | |
| 2 | Sainsbury's Tenderstem Broccoli 200g | 1257090 | 200g | true | https://www.sainsburys.co.uk/gol-ui/product/sainsburys-tenderst… | https://assets.sainsburys-groceries.co.uk/gol/1257090/image.jpg | |
| 3 | Sainsbury's Loose Broccoli | 1192001 | true | 2670230000002 | https://www.sainsburys.co.uk/gol-ui/product/sainsburys-loose-br… | https://assets.sainsburys-groceries.co.uk/gol/1192001/image.jpg | |
| 4 | Sainsbury's Royal Gala Apples x6 | 323628 | x6 | true | https://www.sainsburys.co.uk/gol-ui/product/sainsburys-royal-ga… | https://assets.sainsburys-groceries.co.uk/gol/323628/image.jpg | |
| 5 | Sainsbury's 250g Vittoria Cherry Vine Tomatoes, Taste the Diffe… | 662789 | 250g | true | https://www.sainsburys.co.uk/gol-ui/product/sainsburys-250g-vit… | https://assets.sainsburys-groceries.co.uk/gol/662789/image.jpg | |
| 6 | Sainsbury's Closed Cup Mushrooms Vitamin D 400g | 8227703 | 400g | true | 5063334025595 | https://www.sainsburys.co.uk/gol-ui/product/sainsburys-closed-c… | https://assets.sainsburys-groceries.co.uk/gol/8227703/image.jpg |
| 7 | Sainsbury's 500g Carrots | 7910943 | 500g | true | 0000000322508 | https://www.sainsburys.co.uk/gol-ui/product/sainsburys-500g-car… | https://assets.sainsburys-groceries.co.uk/gol/7910943/image.jpg |
| 8 | Sainsbury's 200g Extra Fine Green Beans,Taste the Difference | 312134 | 200g | true | 0000000425476 | https://www.sainsburys.co.uk/gol-ui/product/sainsburys-200g-ext… | https://assets.sainsburys-groceries.co.uk/gol/312134/image.jpg |
| 9 | Sainsbury's 640g British Fresh Skinless & Boneless Chicken Brea… | 7874927 | 640g | true | 0000000296755 | https://www.sainsburys.co.uk/gol-ui/product/sainsburys-640g-bri… | https://assets.sainsburys-groceries.co.uk/gol/7874927/image.jpg |
| 10 | Sainsbury's Conference Pears, Ripe & Ready x4 | 6621757 | x4 | true | 0000001514308 | https://www.sainsburys.co.uk/gol-ui/product/sainsburys-conferen… | https://assets.sainsburys-groceries.co.uk/gol/6621757/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 |
|---|---|---|---|---|
| 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 600g Easy Peelers, Taste the Difference |
| products[].retailer_product_id | string | Sainsbury’s identifier for matching the same pack. | 1174281 |
| products[].pack_size | string | Size expression where supplied; null stays unknown. | 600g |
| 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-600g-eas… |
| products[].image | string | Product image URL where supplied. | https://assets.sainsburys-groceries.co.uk/gol/1174281/image.jpg |
| products[].member_prices[].price | object | The price Nectar members pay, with its currency. | 2 fields |
| products[].member_prices | array | Nectar member prices for the product, if any. | 1 records |
| products[].member_prices[].promotion_id | string | Sainsbury’s ID for the offer behind this price. | 10763381 |
| products[].member_prices[].scheme | string | Loyalty scheme the price is for, such as Nectar. | nectar |
| products[].price.amount | number | Regular shelf price in pounds, before any Nectar price. | 2.25 |
| products[].price.currency | string | Currency code supplied with the regular price. | GBP |
| products[].promotions | array | Offers running on the product. | 1 records |
| products[].promotions[].buy_quantity | null | Number of items in a multibuy deal, if the offer is one. | null |
| products[].promotions[].description | string | The offer as Sainsbury’s shows it. | Buy 1 save 25% |
| products[].promotions[].end | string | When the offer ends, in UTC. | 2026-10-05T23:00:00Z |
| products[].promotions[].for_amount | null | Total price in pounds for a multibuy deal. | null |
| products[].promotions[].id | string | Sainsbury’s ID for the offer. | 10763381 |
| products[].promotions[].member_scheme | string | Loyalty scheme the offer needs, such as Nectar. | nectar |
| products[].promotions[].start | string | When the offer starts, in UTC. | 2026-09-22T23:00:00Z |
| products[].promotions[].type | string | Kind of offer: member, multibuy or price_cut. | member |
| products[].unit_price.amount | number | Price per unit in pounds, such as per litre. | 3.75 |
| 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_kg |
| count | integer | Number of products on this page. | 30 |
| has_more | boolean | Whether more pages of results follow. | true |
| next_page | integer | Page number to ask for next, or null on the last page. | 2 |
| page | integer | Page number of these results. | 1 |
| page_size | integer | Most products returned per page. | 30 |
| products | array | Products on offer on this page. | 30 records |
| total | integer | How many products are on offer in all. | 9844 |
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.promotions.list", "input": {}}'
import jsonimport osimport requestspayload = json.loads(r'''{ "capability": "sainsburys.promotions.list", "input": {}}''')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.promotions.list", "input": {}}),});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 read the first default-size page of Sainsbury’s offers. Separate numeric member prices from multibuy terms and flag missing amounts or expired offers.
More from the Sainsbury's Groceries API
The same data from other platforms
Sainsbury's Groceries Offers API FAQ
The short answers. The docs have the long ones.
How much does the Sainsbury's Groceries Offers 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?
Every input is optional; the input fields below list what each one does.
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.promotions.list, 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.