Waitrose Grocery Price & Offer Watch (UK) avatar

Waitrose Grocery Price & Offer Watch (UK)

Pricing

from $0.42 / 1,000 product scrapeds

Go to Apify Store
Waitrose Grocery Price & Offer Watch (UK)

Waitrose Grocery Price & Offer Watch (UK)

Search Waitrose & Partners groceries by keyword and get one flat row per product: price in GBP, unit price (per kg or litre), was-price, every offer with its end date, rating, review count, categories, image and URL. Sort by price, rating or name. For weekly UK grocery price and offer tracking.

Pricing

from $0.42 / 1,000 product scrapeds

Rating

0.0

(0)

Developer

Superslow Sloth

Superslow Sloth

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

18 hours ago

Last modified

Share

Search Waitrose & Partners groceries for one or more terms and get one flat row per product: the shelf price in pounds, the regular price, the was-price when an offer lowers the price, the unit price (per litre, kilo or each), every offer with its wording and end date, rating, review count, categories, image and the product URL. Run it on a schedule and diff the dataset to get a UK grocery price-change and offer watch, or read a whole aisle for price comparison against Sainsbury's, Tesco, Asda and Aldi.

No account, no API key, no login, no browser. One request returns up to 96 products.

Input

FieldNotes
searchTermsOne or more search terms, one per line. Required. A product found by two terms is returned once, under the first. Waitrose matches loosely: milk finds 488 products, including milk drinks, chocolate and cheese.
maxItemsProducts to read per search term (default 100, up to 10,000).
sortrelevance (default), popular, price-asc, price-desc, rating, name-asc, name-desc.
onlyOffersKeep only products on an offer (Waitrose's "All Offers" filter). Default off.
proxyConfigurationApify proxy by default (see "How it fetches").

About the sorts

The sorts are Waitrose's own. The response says which sort it applied, and the actor fails a term (at no charge) rather than return rows in an order that was not asked for.

  • Sponsored products are pinned to page one. Waitrose's paid placements appear at the top of the first page whatever the sort, so the first rows of a price sort can be out of order. They are flagged is_sponsored; drop them if you want a clean ranking.

Output

Prices are numbers in pounds sterling; currency is always GBP.

FieldNotes
queryThe search term that first found this product.
line_number, product_id, urlWaitrose's six-digit product id (a string, leading zeros kept), the longer id the product page ends in, and the https://www.waitrose.com/ecom/products/<slug>/<product_id> link.
name, brand, sizeAs Waitrose shows them. size is the pack size as printed (2litre, 75cl, each, per kg). Null when Waitrose sends none; brand is null for own-label lines that carry none.
product_typeG grocery, W wine, E a made-to-order or sold-by-weight line (whole fish, cakes).
categories, tags, badgesThe category path from the root, shelf attributes (Organic, British) and marketing badges (New lower price). Empty lists when none.
image_url, thumbnail_urlThe product photo, large and small.
is_sponsoredTrue when this row came from a paid sponsored slot.
priceThe price on the shelf label with a price-cutting offer applied ("Save 65p", "20% Off", "New Lower Price"). A multi-buy ("Any 2 for £4") changes nothing here.
regular_priceThe price with no offer applied.
was_priceThe regular price, only when an offer puts price below it. Null otherwise, never 0.
price_estimated, sale_unit, typical_weight_kgFor goods sold by weight (sale_unit kg or g), price is the estimate for a pack of about typical_weight_kg; the final price depends on the weight picked.
weight_range, price_range, lead_time_daysMade-to-order lines: the ranges as printed ((0.9kg-1.3kg), £32-£46) and the days of notice needed.
unit_price, unit_measure, unit_price_textThe price per litre, kg, each, 100 sheets and so on, printed under the price (offer included). Null when the label is missing or in another shape; unit_price_text always keeps the label as sent.
on_promotion, my_waitrose_offeron_promotion is true when an offer is shown on the shelf. A standing offer Waitrose marks hidden (for example "5% off 6 or more bottles of wine") does not count. my_waitrose_offer is true when an offer is marked for My Waitrose card holders.
promotionsOne object per offer: description (the shelf wording), type_code (Waitrose's own, such as FER, NLP, MV), end_date (ISO date, null for a standing offer with no end), price (the pack price under the offer, null for a multi-buy), unit_price_text, threshold (units needed), discount_type, discount_amount, discount_percent, hidden, my_waitrose, pick_your_own, promotion_id. Empty list when none.
rating, review_countStar rating out of 5 and the review count. Waitrose sends 0 for an unreviewed product; that is null here, with review_count 0.
available_datesSeasonal lines (Christmas orders) list the windows they can be ordered for: start_date, end_date, order_by. Empty for a line sold all year.

Honest nulls

A field Waitrose did not send is null, never 0 or "".

  • No availability field. Waitrose's search results carry no stock flag (stock depends on branch and delivery slot), so the dataset has none rather than a guess.
  • No was-unit-price. The only other per-unit figure Waitrose sends repeats the current one, so it cannot be read as the regular unit price. Compute it from regular_price if you need it.

Pricing

Pay per event:

  • $0.002 per run (actor-start), charged only after your input is validated, so a run that fails on bad input costs nothing.
  • $0.00042 per product row written (product-scraped), i.e. $0.42 per 1,000 products.

How it fetches

It calls the JSON search API that waitrose.com's own search page uses (POST www.waitrose.com/api/content-prod/v2/cms/publish/productcontent/search/-1) with the anonymous token the site itself sends to logged-out visitors, 96 products per request, paging with start. Offers arrive inline, so there is one request per page. The search page itself is also read: it is server-rendered with the first 48 products in the page, and if the API refuses every attempt for a term's first page, the actor reads that page instead and continues on the API from the 49th product.

Measured 2026-10-14: HTTP 200 from a plain residential connection for both the search page and the API. From Apify datacenter exits the search page was reachable in an earlier test; the API call is a POST, which that test could not make, so its behaviour on datacenter addresses is not confirmed. A refusal (403, 429, 5xx) or a 200 without the expected payload is treated as the address being blocked, and the actor rotates to a fresh one and retries; a 400 is permanent. If your runs are refused, switch proxyConfiguration to residential.

Things worth knowing, all measured:

  • Paging. Offsets step by the requested page size, and a search with 6,297 matches (food) pages to its end. The actor stops at maxItems per term, or at the last page.
  • Mid-walk empty answers. Waitrose occasionally answers one page with an empty envelope while matches remain; the actor treats that as a refusal and retries instead of ending the term early.
  • Loose matching. A short term returns many loosely related products. Make the term more specific, or use onlyOffers, to narrow it.
  • Some terms redirect. Terms such as coca cola redirect the website to a category page; the API still returns the matching products.
  • Not offered. Page size is fixed at 96 (the API refuses 100 or more), and the category and brand filters on the site are not wired into this actor.