Woolworths NZ Scraper: Grocery Prices & Specials avatar

Woolworths NZ Scraper: Grocery Prices & Specials

Pricing

$1.50 / 1,000 products

Go to Apify Store
Woolworths NZ Scraper: Grocery Prices & Specials

Woolworths NZ Scraper: Grocery Prices & Specials

Scrape woolworths.co.nz (ex-Countdown) departments and specials: price, member (Everyday Rewards) vs non-member price, price per 100g/kg, EAN barcode, brand, size, availability. Pay per result.

Pricing

$1.50 / 1,000 products

Rating

0.0

(0)

Developer

Hexagone Data

Hexagone Data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Woolworths NZ Scraper — New Zealand Grocery Prices, EANs & Specials

Collect product information from woolworths.co.nz (Woolworths New Zealand, former Countdown), the country's biggest supermarket chain. Paste department URLs for full listings, the specials page for promotions, or product URLs for product-page records. Every record carries the price context the site applied, so you know what the numbers mean.

Use dated exports to track an assortment, match products by barcode (EAN) when available, or monitor specials and club prices over time.

Try it with 20 products

  1. Paste a department URL into Start URLs.
  2. Set Maximum number of products to 20.
  3. Start the Actor and open its dataset.
  4. Read Run summary before exporting JSON, CSV or Excel: a successful process can still contain incomplete URLs or check warnings.
{
"startUrls": [{"url": "https://www.woolworths.co.nz/shop/browse/fruit-veg"}],
"maxItems": 20
}

The form's product-count prefill is 20, while the schema default is 500. Set maxItems explicitly in API calls; 0 removes the product-count limit. Departments hold thousands of products (Pantry: ~5 100 at the time of writing): start small.

What to paste

InputDataNotes
Department /shop/browse/fruit-vegEvery product of the department, paginated to the end of the list (48 products per page)Includes all sub-categories. Sub-category URLs themselves are not supported yet.
Specials /shop/specialsCurrent specials across the storeIncludes out-of-stock items when the site lists them.
Product /shop/productdetails?stockcode=123456One product recordRicher category path; no barcode (the product API does not publish one).

You can mix all three. Explicit product URLs are processed first; a product-page record takes precedence over its duplicate listing record. Products are deduplicated within the run.

Search pages (/shop/search…) are disallowed by the site's robots.txt and rejected with a reason; so are checkout, account and shopping-list pages.

Prices are the site's default-store prices

The Actor browses like a signed-out visitor, and the site then applies its default store and home delivery to every price. The store the site applied is written in each record's priceContext (store: "Glenfield", method: "Courier" at the time of writing). These are not the prices of a store you chose, and they are not a national average: compare exports only with that context in mind.

About isClubPrice — member and non-member prices

When isClubPrice is true, the site shows two prices: "Member price" and "Non-member price". The record keeps both:

  • price = the member price, what Everyday Rewards (former Onecard) members pay;
  • originalPrice = the non-member price, what everyone else pays.

For example the site showing "Member price $5.00" and "Non-member price $5.39" gives price: 5.00, originalPrice: 5.39, isClubPrice: true. Never treat a club price as the price for everyone: without the loyalty card, the number to use is originalPrice. isSpecial: true marks regular weekly specials, open to everyone.

Output

FieldMeaning
skuWoolworths stockcode (numeric product code).
barcodeUsually EAN-13; shorter numeric codes exist for items sold by weight. Null on product-page records.
nameProduct name as filed in the site's catalogue (internal label, lowercase). The product page often shows a longer marketing title (brand, flavour, pack count) that this field does not carry — see Known limits.
url, imagePublic product page and image.
brand, variety, unit, size, packageTypeSite classification; unit says how it is sold (Each or Kg), size is the pack size shown next to the name.
price, priceCurrencyDisplayed price in NZD — the member price when isClubPrice is true.
originalPrice, savePriceReference price (crossed-out for specials, non-member price for club prices) and announced saving, else null.
isSpecial, isClubPriceWeekly special / member-price flags (see the member price section).
unitPrice, unitPriceMeasurePrice per measure exactly as the site shows it (e.g. 2.00 + "100g" for "$2.00 / 100g"); null when the site shows none.
averagePricePerSingleUnitSite-computed average price of a single piece (e.g. one loose pear) — a different number from unitPrice.
availabilitySite availability: in_stock, low_stock or out_of_stock — the online shop's stock for the default context, not your local store.
departmentCategory path, e.g. Pantry > Snacks & Sweets > Chips.
priceContextStore and delivery method the site applied (see above).
position, page, sourceUrl, scrapedAtCollection provenance.

A field the site does not publish is null, never an empty string.

priceContext and unitPrice-related fields aside, records are flat. Account for priceContext (an object) when transforming JSON or choosing spreadsheet columns. Retain scrapedAt with your exports: this Actor returns observations, not a maintained history of price changes.

Real output example

The following product record was collected on 22 October 2026. It demonstrates the format, not today's price or stock.

{
"sku": "6033995",
"barcode": null,
"name": "bluebird originals mix potato chips multipack ready salted, s&v, chicken",
"url": "https://www.woolworths.co.nz/shop/productdetails?stockcode=6033995",
"brand": "bluebird originals mix",
"variety": "ready salted, s&v, chicken",
"unit": "Each",
"size": "360g",
"packageType": "20 pack",
"price": 7.95,
"priceCurrency": "NZD",
"originalPrice": 8.4,
"savePrice": 0.45,
"isSpecial": true,
"isClubPrice": true,
"unitPrice": 2.21,
"unitPriceMeasure": "100g",
"averagePricePerSingleUnit": null,
"availability": "in_stock",
"image": "https://assets.woolworths.com.au/images/2010/6033995.jpg?impolicy=wowcdxwbjbx&w=900&h=900",
"department": "Pantry > Snacks & Sweets > Chips",
"priceContext": {"store": "Glenfield", "method": "Courier"},
"position": null,
"page": null,
"sourceUrl": "https://www.woolworths.co.nz/shop/productdetails?stockcode=6033995",
"scrapedAt": "2026-10-22T06:18:00+00:00"
}

This record is a club price: $7.95 is the Everyday Rewards member price, $8.40 the non-member price, and $2.21 per 100g is what the site shows next to it.

Run summary

The OUTPUT record (and its readable SUMMARY page) tells, for every pasted URL, how many products were delivered and why a URL delivered nothing (no_products, not_found, blocked_by_site, …), plus the anomalies list — empty when the automatic checks found nothing unusual. An invalid URL never blocks the others; a URL that really fails is reported, and the run fails only if nothing at all could be collected.

Known limits

  • Default store only. No store or postcode can be selected; see the price-context section above.
  • Sub-category URLs (/shop/browse/<department>/<aisle>…) are rejected for now: paste the department URL, which contains all its sub-categories.
  • Catalogue name vs on-screen title. name is the site's internal catalogue label (lowercase); the product page frequently shows a longer marketing title that cannot be rebuilt from the API fields (e.g. catalogue shapes light & crispy crackers honey soy shown as "Arnott's Shapes Light & Crispy Crackers Honey Soy Chicken 120g"). Match products on sku or barcode, not on the exact wording of name.
  • Member vs non-member prices. On club prices, price is the member price and originalPrice the non-member price: see isClubPrice.
  • The site lists a few products twice across pages of the same listing; duplicates are deduplicated by sku within a run.

Proxy

Not needed by default. Only enable the proxy configuration if your runs get blocked; the Actor then retries through it, and as a last resort through Apify datacenter then New-Zealand residential proxies.