Sainsbury's Groceries Product Detail API
Check a Sainsbury’s product ID or official link, with regular and public member prices separated where supplied.
- 2 credits per call
- Failed calls are free
- Updated
- sainsburys.product.detail.get
{ "product": { "name": "Clean & Clear Dual Action Moisturiser Face Cream 100ml", "available": true, "brand": "Clean & Clear", "gtin": "5000207007159", "image": "https://www.sainsburys.co.uk/wcsstore/ExtendedSitesCatalogAssetStore/images/catalog/productImages/59/5000207007159/5000207007159_L.jpeg", "pack_size": "100ml", "retailer_product_id": "6010343", "url": "https://www.sainsburys.co.uk/gol-ui/product/clean-clear-dual-action-moisturiser-face-cream-100ml", "price": { "amount": 3.5, "currency": "GBP" }, "unit_price": { "amount": 35, "currency": "GBP", "measure_amount": 1, "unit": "per_litre" }, "member_prices": [ { "promotion_id": "10757348", "scheme": "nectar", "price": { "amount": 2.6, "currency": "GBP" } } ], "promotions": [ { "buy_quantity": null, "description": "Save 25% with Nectar", "end": "2026-10-12T23:00:00Z", "for_amount": null, "id": "10757348", "member_scheme": "nectar", "start": "2026-09-01T23:00:00Z", "type": "member" } ] }}
What you send
The input
object of the request, with every field the endpoint accepts.
- Send a product ID or a Sainsbury’s product link. Save the returned product ID so later checks follow the same pack.
| Field | Type | Required | What it does | Example |
|---|---|---|---|---|
| product_id | string | no | Product identifier. | 6010343 |
| url | string | no | Public URL of the page to fetch. |
Fields it returns
What each record in the response holds, with the values from the sample above.
| Field | Type | What it is | Example |
|---|---|---|---|
| product.member_prices[].price | object | The price Nectar members pay, with its currency. | 2 fields |
| product.member_prices[].promotion_id | string | Sainsbury’s ID for the offer behind this price. | 10757348 |
| product.member_prices[].scheme | string | Loyalty scheme the price is for, such as Nectar. | nectar |
| product | object | The product with its prices and offers. | 12 fields |
| product.available | boolean | Public catalog flag, not local stock. | true |
| product.brand | string | Brand where supplied; lists may omit it. | Clean & Clear |
| product.gtin | string | Barcode where supplied, retained as text. | 5000207007159 |
| product.image | string | Product image URL where supplied. | https://www.sainsburys.co.uk/wcsstore/ExtendedSitesCatalogAsset… |
| product.member_prices | array | Nectar member prices for the product, if any. | 1 records |
| product.name | string | Product or category name as returned; use its identifier to join records. | Clean & Clear Dual Action Moisturiser Face Cream 100ml |
| product.pack_size | string | Size expression where supplied; null stays unknown. | 100ml |
| product.price | object | Regular pack amount, separate from member prices. | 2 fields |
| product.price.amount | number | Regular shelf price in pounds, before any Nectar price. | 3.5 |
| product.price.currency | string | Currency code supplied with the regular price. | GBP |
| product.promotions | array | Offers running on the product. | 1 records |
| product.promotions[].buy_quantity | null | Number of items in a multibuy deal, if the offer is one. | null |
| product.promotions[].description | string | The offer as Sainsbury’s shows it. | Save 25% with Nectar |
| product.promotions[].end | string | When the offer ends, in UTC. | 2026-10-12T23:00:00Z |
| product.promotions[].for_amount | null | Total price in pounds for a multibuy deal. | null |
| product.promotions[].id | string | Sainsbury’s ID for the offer. | 10757348 |
| product.promotions[].member_scheme | string | Loyalty scheme the offer needs, such as Nectar. | nectar |
| product.promotions[].start | string | When the offer starts, in UTC. | 2026-09-01T23:00:00Z |
| product.promotions[].type | string | Kind of offer: member, multibuy or price_cut. | member |
| product.retailer_product_id | string | Sainsbury’s identifier for matching the same pack. | 6010343 |
| product.unit_price | object | Retailer’s published unit amount; do not assume Nectar basis. | 4 fields |
| product.unit_price.amount | integer | Price per unit in pounds, such as per litre. | 35 |
| product.unit_price.currency | string | Currency of the unit price, such as GBP. | GBP |
| product.unit_price.measure_amount | integer | Quantity the unit price is for, such as 1 litre. | 1 |
| product.unit_price.unit | string | Keep the unit with the amount when comparing packs. | per_litre |
| product.url | string | Official product page link. | https://www.sainsburys.co.uk/gol-ui/product/clean-clear-dual-ac… |
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.product.detail.get", "input": { "product_id": "6010343" }}'
import jsonimport osimport requestspayload = json.loads(r'''{ "capability": "sainsburys.product.detail.get", "input": { "product_id": "6010343" }}''')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.product.detail.get", "input": { "product_id": "6010343" }}),});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 Sainsbury’s product 6010343. Show the regular price and any public Nectar amount separately, keeping the pack size and offer dates.
More from the Sainsbury's Groceries API
The same data from other platforms
Sainsbury's Groceries Product Detail API FAQ
The short answers. The docs have the long ones.
How much does the Sainsbury's Groceries Product Detail API cost?
2 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.product.detail.get, 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.