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

Sainsbury's Groceries Category Products API

Pass a category ID and page through its products, keeping each pack’s identifier with its price.

  • 1–15 credits per call
  • Failed calls are free
  • Updated
  • sainsburys.category.products.list
Response completed
{  "count": 30,  "has_more": true,  "next_page": 2,  "page": 1,  "page_size": 30,  "total": 31,  "products": [    {      "name": "Bulldog Skincare Original Moisturiser 100ml",      "available": true,      "brand": null,      "gtin": "5060144640024",      "image": "https://assets.sainsburys-groceries.co.uk/gol/6585985/image.jpg",      "pack_size": "100ml",      "retailer_product_id": "6585985",      "url": "https://www.sainsburys.co.uk/gol-ui/product/bulldog-skincare-original-moisturiser-100ml",      "price": {        "amount": 6.6,        "currency": "GBP"      },      "unit_price": {        "amount": 66,        "currency": "GBP",        "measure_amount": 1,        "unit": "per_litre"      },      "member_prices": [        {          "promotion_id": "10762837",          "scheme": "nectar",          "price": {            "amount": 4.4,            "currency": "GBP"          }        }      ],      "promotions": [        {          "buy_quantity": null,          "description": "Save 1/3 with Nectar",          "end": "2026-10-12T23:00:00Z",          "for_amount": null,          "id": "10762837",          "member_scheme": "nectar",          "start": "2026-09-01T23:00:00Z",          "type": "member"        }      ]    },    {      "name": "Nivea Men Sensitive Moisturiser 75ml",      "available": true,      "brand": null,      "gtin": "5025970023397",      "image": "https://assets.sainsburys-groceries.co.uk/gol/6026520/image.jpg",      "pack_size": "75ml",      "retailer_product_id": "6026520",      "url": "https://www.sainsburys.co.uk/gol-ui/product/nivea-men-sensitive-moisturiser-75ml",      "price": {        "amount": 8,        "currency": "GBP"      },      "unit_price": {        "amount": 106.67,        "currency": "GBP",        "measure_amount": 1,        "unit": "per_litre"      },      "member_prices": [        {          "promotion_id": "10763079",          "scheme": "nectar",          "price": {            "amount": 3.8,            "currency": "GBP"          }        }      ],      "promotions": [        {          "buy_quantity": null,          "description": "Better than Half Price with Nectar",          "end": "2026-10-12T23:00:00Z",          "for_amount": null,          "id": "10763079",          "member_scheme": "nectar",          "start": "2026-09-01T23:00:00Z",          "type": "member"        }      ]    }  ]}
Try it live, free
Input

What you send

The input object of the request, with every field the endpoint accepts.

  • Category labels can repeat. Use the category ID, and its parent relationships from the categories endpoint, to place each shelf.
  • Keep the default page size of 30; larger pages do not work reliably yet.
  • Send the category ID and move the page number on, keeping the page size the same. Each response says whether more pages follow.
FieldTypeRequiredWhat it doesExample
category_id string yes Category identifier. 1020694
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. Bulldog Skincare Original Moisturiser 100ml
products[].retailer_product_id string Sainsbury’s identifier for matching the same pack. 6585985
products[].pack_size string Size expression where supplied; null stays unknown. 100ml
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 string Barcode where supplied, retained as text. 5060144640024
products[].url string Official product page link. https://www.sainsburys.co.uk/gol-ui/product/bulldog-skincare-or…
products[].image string Product image URL where supplied. https://assets.sainsburys-groceries.co.uk/gol/6585985/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. 10762837
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. 6.6
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. Save 1/3 with Nectar
products[].promotions[].end string When the offer ends, in UTC. 2026-10-12T23: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. 10762837
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-01T23:00:00Z
products[].promotions[].type string Kind of offer: member, multibuy or price_cut. member
products[].unit_price.amount integer Price per unit in pounds, such as per litre. 66
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. 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 in the category on this page. 30 records
total integer How many products the category holds in all. 31
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.category.products.list",  "input": {    "category_id": "1020694"  }}'
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 list the first page of Sainsbury’s category 1020694 with the default page size. Show product IDs and regular prices, and label the report as one page.

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 Category Products 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 Category Products 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 category_id. 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.category.products.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.