↑ ↓ to move ↵ to open
Sainsbury's Groceries API · Endpoint

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
Response completed
{  "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"        }      ]    }  ]}
Try it live, free
Input

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.
FieldTypeRequiredWhat it doesExample
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.
Response

Fields it returns

What each record in the response holds, with the values from the sample above.

FieldTypeWhat it isExample
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
REST API · MCP server

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": {}}'
In your AI agent Claude · Cursor · any MCP client
1Add the Upscrape MCP server
https://data.upscrape.com/mcp
2Ask for the data in plain words

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.

The agent finds the endpoint, shows you the price, and runs it with your credits.
Sainsbury's Groceries

More from the Sainsbury's Groceries API

Same data, other platforms

The same data from other platforms

Questions

Sainsbury's Groceries Offers API FAQ

The short answers. The docs have the long ones.

Still have a question? Talk to the people who build the endpoints.
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.

Get started

Your first Sainsbury's Groceries call is free.

Up to 100 free credits to start, no card needed.