Sainsbury's Scraper: UK Grocery Prices
Pricing
from $1.00 / 1,000 results
Sainsbury's Scraper: UK Grocery Prices
Search Sainsbury's online groceries by any term. Get rows with shelf price, unit price, Nectar price, promotions with dates, ratings, categories and EAN barcodes. Filter by price, rating and promotions. Unofficial.
Pricing
from $1.00 / 1,000 results
Rating
0.0
(0)
Developer
reventadata
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Sainsbury's Scraper: Grocery Prices, Nectar and Promotions
Unofficial. This Actor is not affiliated with, authorised by, endorsed by, or in any way officially connected to Sainsbury's. "Sainsbury's" is a trademark of its respective owner and is used here only to describe what this tool reads. It reads the same public search pages a browser does.
Search the UK Sainsbury's online grocery store (sainsburys.co.uk) for any grocery term and get one clean row per product: shelf price in pounds sterling, price per litre, kilo or item, Nectar card price, promotions with their dates, rating, categories and barcodes.
What does it do?
For each search term it walks the result pages of the Sainsbury's online grocery search, reads the
product data the page embeds, and saves one row per product. Only products the page itself tags as
search results are saved; tiles without that tag are not. On the milk page 1 capture of 2026-10-21,
11 of 66 product objects had no tag, and 9 of those 11 are the ids listed in the page's sponsored-ad
metadata; none of the 55 tagged ones is. The other 2 were not attributed.
Why use it?
- Prices as shoppers see them.
priceis the price printed on the product tile. When the tile shows a Nectar card price,priceis that price,priceIsNectaris true andregularPriceholds the price without it. - Unit prices.
unitPriceandunitMeasure(per litre, per kg or perea) make products of different sizes comparable. - Promotions as data. Each promotion carries its type, its text (for example
Meal Deal for £5.50), whether it needs a Nectar card, its price before the promotion, and its start and end dates. - Filters that run before you pay. Price band, minimum rating, promotions only, exact matches only, words the name or category must or must not contain.
- Barcodes.
eanslists the product's EAN codes for matching against other retailers.
How to use it
- Put one or more grocery terms in
searchQueries, for examplemilkoroat milk. - Set
maxItems(rows to save) and, if you want, a sort order and filters. - Run the Actor and download the dataset as JSON, CSV or Excel.
Input
| Field | Type | Description |
|---|---|---|
searchQueries | array | Grocery search terms, one search per term. |
maxItems | integer | Total products to save across all queries, counted after the filters. Default 100. Queries run in the order given and the run stops once the cap is reached, so later queries may never be searched. |
maxPages | integer | Result pages per query, 1 to 20. Default 6, which gives up to about 360 products per query (60 per page). The site serves pages until its own result total is used up; the Actor stops at the first empty page. |
sort | string | RELEVANCE, PRICE_ASC, PRICE_DESC or RATING. The site sorts by the price on the tile in pounds, not by unit price. |
minPrice, maxPrice | number | Price band in pounds. |
minRating | number | Minimum average rating, 0 to 5. Unrated products are dropped when set. |
onlyPromotions | boolean | Keep only products with at least one promotion. |
exactMatchesOnly | boolean | Drop the lower-ranked related results the site appends (rows whose relevance is 2). |
includeKeywords, excludeKeywords | array | Words the product name or category must / must not contain, ignoring case and accents. |
proxyConfiguration | object | Apify Unblocker (default, and the only transport measured to work with this Actor's HTTP client, httpx). Plain and datacenter requests get an Access Denied page; a residential proxy returned it on 25 of 25 test pages with this Actor's HTTP client. |
Sample input
{"searchQueries": ["milk"],"maxItems": 20,"maxPages": 1,"sort": "PRICE_ASC"}
Output
One row per product:
| Field | Type | Description |
|---|---|---|
id | string | Sainsbury's product id. |
name | string | Product name. |
url | string | Product page URL. |
price | number | Shelf price in GBP, the Nectar price when priceIsNectar is true. |
currency | string | Always GBP. |
unitPrice, unitMeasure | number / string | Price per unit and the unit, or null. Values seen: ltr, kg and ea. |
regularPrice | number / null | The price before the product's fixed-price promotion (SIMPLE_FIXED_PRICE), or null when it has none. Multibuy and meal-deal promotions do not set it; their price is the normal shelf price. |
priceIsNectar | boolean | True when price needs a Nectar card. |
onPromotion | boolean | True when the product has at least one promotion. |
promotions | array | type, text, isNectar, regularPrice, startsAt, endsAt for each promotion. Inside a promotion, regularPrice is the product's price before the promotion: for a fixed-price promotion it is higher than price, for multibuy and meal deals it equals price. |
rating | number / null | Average rating out of 5, null when the product has no reviews. |
reviewCount | integer | Number of reviews, 0 when there are none. |
categories | array | Category names. |
image | string | Image URL. |
eans | array | EAN barcodes. |
isAvailable | boolean | Availability flag the site reports. |
relevance | integer | 1 for an exact match, 2 for a related result. |
matchedKeyword | string | The query that returned the product. |
page | integer | Result page the product came from. |
scrapedAt | string | ISO 8601 timestamp. |
Sample output
Taken from a real row (2026-10-21), with scrapedAt set to a fixed time:
{"id": "7657802","name": "Sainsbury's 2L Fresher for Longer Filtered Semi-Skimmed Milk","url": "https://www.sainsburys.co.uk/groceries/product/sainsburys-2l-fresher-for-longer-filtered-semi-skimmed-milk","price": 1.95,"currency": "GBP","unitPrice": 0.98,"unitMeasure": "ltr","regularPrice": 2.2,"priceIsNectar": true,"onPromotion": true,"promotions": [{"type": "SIMPLE_FIXED_PRICE","text": "Buy 1 for 1.95","isNectar": true,"regularPrice": 2.2,"startsAt": "2026-10-06T23:00:00Z","endsAt": "2026-10-27T00:00:00Z"}],"rating": 4.77,"reviewCount": 362,"categories": ["Fresh milk","Dairy & chilled essentials"],"image": "https://assets.sainsburys-groceries.co.uk/gol/7657802/image.jpg","eans": ["0000000133845"],"isAvailable": true,"relevance": 1,"matchedKeyword": "milk","page": 1,"scrapedAt": "2026-10-21T12:00:00+00:00"}
Limits
- Results per query follow the site's own total. Measured 2026-10-21 with
maxPages7 or more:milkhad 329 results over 6 pages,bread371 over 7 pages (page 7 held 11 products) andchocolate770 over 13 pages. With the defaultmaxPagesof 6 a query stops at about 360 products, so raisemaxPages(ceiling 20, about 1,200 products) for broad terms. Beyond 770 results for one term was not measured; split a very broad term into several narrower searches. - Some results are related products, not exact matches. On
bread228 of 368 rows hadrelevance2. Turn onexactMatchesOnlyto keep onlyrelevance1. - Prices and promotions are what the site serves to an anonymous visitor with no postcode, store or delivery slot set; the proxy exit's location is not pinned.
- Prices are in pounds sterling (
GBP). - Rows are read from the page as served; the Actor reports a failed run when it cannot read any product.
- A run that saves zero rows fails instead of finishing empty, so a mistyped term or an over-strict filter is visible.
How fast is it?
About 5 to 7 seconds per result page of up to 60 products. Measured 2026-10-21: 769 chocolate products (site total 770)
over 14 pages (the last one empty) in 94 seconds. bread (7 pages, 368 products) took 33 seconds.
How much does it cost to scrape Sainsbury's?
Pay-per-event: $0.001 per result saved to the dataset ($1.00 per 1,000 results), plus $0.00005 charged once when the run starts. No subscription. Filters run before a row is saved, so rows they drop are not charged.
FAQ
Is a proxy required? Yes. Sainsbury's returns an Access Denied page to plain and datacenter requests. The Actor
defaults to Apify Unblocker, the transport that returned a real search page on 25 of 25 test searches (2026-10-21).
Is price the Nectar price? When the tile shows a Nectar card price, yes: priceIsNectar is true and regularPrice
holds the price without the card. Otherwise price is the plain shelf price.
Why is rating null but reviewCount 0? The product has no reviews. In 1,137 rows from two runs on 2026-10-21, 194
had no reviews: rating null, reviewCount 0.
Why do I get products that are not what I typed? After the exact matches the site appends related products.
They are marked relevance 2; exactMatchesOnly drops them.
Does it cover stores outside the UK? No. It reads sainsburys.co.uk only, which is the UK storefront.
Does it use my Sainsbury's or Nectar account? No. It sends no login and sees what an anonymous visitor sees.
More scrapers
| Actor | What it scrapes |
|---|---|
| Amazon Product & Price Scraper | Amazon product listings and prices |
| Idealo Price Comparison Scraper | Idealo price comparison listings |
| Gumtree UK Scraper | Gumtree UK, any category, second-hand listings |
| AliExpress Product & Price Scraper | AliExpress products and prices |
| Shopify Store Monitor | Price and stock changes on Shopify stores |