# Woolworths NZ Scraper | Prices, Specials & Products (`mof1re/woolworths-new-zealand-scraper`) Actor

Scrape Woolworths New Zealand (woolworths.co.nz) by search, category or product URL. Get prices, specials, unit prices, stock, barcodes, ingredients, nutrition and images. Fast HTTP scraper, no browser, proxies included. Filter by specials, multibuy, half price and member price.

- **URL**: https://apify.com/mof1re/woolworths-new-zealand-scraper.md
- **Developed by:** [Vladimir Efimenco](https://apify.com/mof1re) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 1,000 product from search or categories

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Woolworths NZ Scraper | ⚡ Fast & Browserless

This Woolworths NZ scraper collects product data from woolworths.co.nz: prices, specials, unit prices, stock status, barcodes, categories and images. Search by keyword, go through any category, or pass product page links to get the full details, including ingredients, allergens and nutrition tables. It sends plain HTTP requests, no browser involved, and proxies are already included.

If you were looking for a Woolworths New Zealand scraper (the supermarket chain that used to be called Countdown), this is the one. You can get a clean dataset of the whole shelf or just the products you track.

### ⚡ What you can do with it

- Scrape Woolworths NZ prices for any search term, for example `milk`, `frozen food` or `coffee`.
- Go through a whole category by its slug or by pasting the category page link.
- Collect only what is on offer: specials, multibuy deals, half price items or member prices.
- Sort results by relevance, lowest price, highest price or lowest unit price.
- Get full product pages by URL, with description, ingredients, allergens, warnings, usage instructions and nutritional information.
- Get every product image, not only the main one.
- Run several queries, categories or product links in one go.

### 🎯 Who uses it

- Price monitoring and competitor tracking for New Zealand grocery and retail.
- Teams that follow Woolworths NZ specials and promotions week by week.
- Product catalogue and barcode (GTIN) matching between stores or suppliers.
- Nutrition, allergen and diet apps that need structured Woolworths NZ product data.
- Market researchers and analysts working with NZ grocery pricing.
- Developers who need Woolworths NZ data in a spreadsheet, database or their own app.

### 🔧 Input

The actor has three modes. Pick one with the `mode` field and fill in the matching list.

| Field | Description |
|---|---|
| `mode` | `Search Query`, `By Category` or `Product URLs` |
| `searchQueries` | Keywords to search for. Used in Search Query mode |
| `categories` | Category slugs (for example `ready-meals`) or category page links. Used in By Category mode |
| `productUrls` | Product page links from woolworths.co.nz. Used in Product URLs mode |
| `pageNumber` | Page to fetch, starting from 1. Search Query and By Category modes |
| `pageSize` | Products per page: 36, 72 or 108. Default is 108 |
| `sort` | Relevance, price low to high, price high to low, or unit price low to high |
| `staticFilters` | Any of: Specials, Multibuy, Half price, Member price. You can pick several |

A few things worth knowing:

- Every query and every category returns one page per run. To go deeper, raise `pageNumber` and run again.
- For categories you can paste a full link like `https://www.woolworths.co.nz/shop/browse/dinner/ready-meals?page=2`. The slug is picked out of it automatically, and anything after the `?` is ignored.
- Product links are cleaned up the same way, so tracking parameters do no harm. Links that are not from woolworths.co.nz are skipped with a warning in the log.

Example input for a search:

```json
{
  "mode": "SEARCH",
  "searchQueries": ["milk", "frozen food"],
  "pageNumber": 1,
  "pageSize": "108",
  "sort": "PRICE_LOW_HIGH",
  "staticFilters": ["SPECIALS"]
}
```

Example input for product pages:

```json
{
  "mode": "PRODUCT_URLS",
  "productUrls": [
    { "url": "https://www.woolworths.co.nz/shop/product-details/647699/nescafe-espresso-coffee-concentrate-sweet-vanilla" }
  ]
}
```

### 🐍 Python example

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")

run = client.actor("mof1re/woolworths-nz-scraper").call(
    run_input={
        "mode": "CATEGORY",
        "categories": ["ready-meals"],
        "pageSize": "72",
        "sort": "CUP_PRICE_LOW_HIGH",
        "staticFilters": ["SPECIALS", "MEMBER_PRICE"],
    }
)

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["name"], item["price"], item["discount_price"], item["unit_price"])
```

### 📊 Data fields

All three modes write to the same dataset with the same fields. Fields a mode cannot fill are `null`.

#### 🛒 Product

| Field | Description |
|---|---|
| `sku` | Woolworths product SKU |
| `url` | Product page link |
| `name` | Product name |
| `brand` | Brand |
| `gtin` | Barcode (GTIN/EAN) |
| `slug` | Product slug used in the page link |
| `variant` | Purchase variant key |
| `isAlcohol` | Whether the product is alcohol. Search and category modes |
| `isTobacco` | Whether the product is tobacco. Search and category modes |
| `healthStarRating` | Health Star Rating. Search and category modes |

#### 💰 Pricing

| Field | Description |
|---|---|
| `price` | Regular price. When a product is discounted, this is the price before the discount |
| `discount_price` | Current price when the product is discounted, otherwise `null` |
| `savings` | Difference between the regular and the discounted price |
| `currency` | Currency, NZD |
| `unit` | Unit the product is sold in |
| `unit_value` | Quantity the unit price is calculated for, for example `100ML` |
| `unit_price` | Price per unit |
| `isSpecial` | Whether the product is on special |
| `isClubPrice` | Whether the price is a member price |
| `isBoostOffer` | Whether the product has a boost offer |
| `price_variations` | All purchase variants with their prices and availability. Search and category modes |

#### 📦 Availability and limits

| Field | Description |
|---|---|
| `in_stock` | Whether the product is in stock |
| `minQty` | Minimum quantity per order |
| `maxQty` | Maximum quantity per order |
| `defaultQty` | Default quantity |

#### 🗂️ Categories and images

| Field | Description |
|---|---|
| `category` | Product category |
| `category_path` | Category hierarchy from the top level down |
| `imageUrl` | Main product image |
| `images` | All product image links. Product URLs mode |

#### 🧾 Full product details (Product URLs mode)

| Field | Description |
|---|---|
| `description` | Product description as plain text |
| `ingredients` | Ingredients as plain text |
| `allergencontains` | Allergen information |
| `warnings` | Product warnings |
| `usage_instructions` | Directions of use |
| `nutritionalinformation` | Nutrition tables, usually per 100g and per serve |

In Search Query and By Category modes the barcode and the category come from our own product database, so a product that was added to the store very recently can have them empty. Product URLs mode reads the barcode straight from the product page.

### 📋 Example output

Product URLs mode, shortened:

```json
[
  {
        "sku": "6082400",
        "url": "https://www.woolworths.co.nz/shop/product-details/6082400/allen-s-chocolate-block-strawberries-cream",
        "name": "Allen's Chocolate Block Strawberries & Cream 170g",
        "gtin": "9300605166455",
        "brand": "Allen's",
        "slug": "allen-s-chocolate-block-strawberries-cream",
        "imageUrl": "https://assets.woolworths.com.au:443/images/2010/6082400.jpg?impolicy=wowb2bgpkhx",
        "images": [
        "https://assets.woolworths.com.au:443/images/2010/6082400.jpg?impolicy=wowb2bgpkhx",
        "https://assets.woolworths.com.au:443/images/2010/6082400_2.jpg?impolicy=wowb2bgpkhx"
        ],
        "isAlcohol": null,
        "isTobacco": null,
        "healthStarRating": null,
        "variant": "6082400-EA",
        "in_stock": true,
        "price": 6.49,
        "discount_price": 3.99,
        "savings": 2.5,
        "currency": "NZD",
        "unit": "EA",
        "unit_value": "100G",
        "unit_price": 2.35,
        "maxQty": 36,
        "minQty": 1,
        "defaultQty": 1,
        "isSpecial": true,
        "isClubPrice": false,
        "isBoostOffer": false,
        "price_variations": null,
        "category": null,
        "category_path": [
        "Pantry",
        "Snacks & Sweets",
        "Chocolate Bars & Blocks"
        ],
        "description": "Introducing Allen's new Strawberries & Cream 170g! A smooth white choc block filled with fudge pieces and sherbet fizzy chips.\n\nIntroducing Allen's new Strawberries & Cream 170g! A smooth white choc block filled with fudge pieces and sherbet fizzy chips.",
        "allergencontains": "Milk, Soy",
        "ingredients": "Sugar, Milk Solids, Vegetable Fats Emulsifier (Soy Lecithin), Fudge Pieces (8%) (Sugar, Glucose Syrup, Vegetable Fat, Sweetened Condensed Milk, Emulsifier (Soy Lecithin)), Salt, Colour (120), Flavour), Sherbet Chips (4%) (Raising Agent (Sodium Bicarbonate), Food Acid (Citric)), Emulsifiers (Soy Lecithin, 476), Flavours.",
        "warnings": "CHILDREN LESS THAN 4 YEARS HAVE LIMITED CHEWING ABILITY AND COULD CHOKE ON SMALL PIECES",
        "usage_instructions": null,
        "nutritionalinformation": [
        {
          "__typename": "NutritionalInformation",
          "energy": "2280.0kJ",
          "protein": "6.9g",
          "fatTotal": "31.8g",
          "fatTotalSaturated": "18.8g",
          "carbohydrate": "57.7g",
          "carbohydrateSugars": "56.0g",
          "dietaryFibre": null,
          "sodium": "130.0mg",
          "quantityPerUnit": "Per 100g"
        },
        {
          "__typename": "NutritionalInformation",
          "energy": "430.0kJ",
          "protein": "1.3g",
          "fatTotal": "6.0g",
          "fatTotalSaturated": "3.6g",
          "carbohydrate": "10.9g",
          "carbohydrateSugars": "10.6g",
          "dietaryFibre": null,
          "sodium": "24.0mg",
          "quantityPerUnit": "Per Serve"
        }
        ]
  }
]
```

### ❓ FAQ

**Is this the same as Countdown?** Yes. Countdown New Zealand is now Woolworths NZ, and the data comes from woolworths.co.nz.

**Can I scrape a whole category?** Yes, use the By Category mode. One run returns one page of up to 108 products per category. Change `pageNumber` to move through the rest.

**How do I find a category slug?** It is the last part of the category link on woolworths.co.nz, for example `ready-meals` in `.../browse/dinner/ready-meals`. You can also paste the whole link and the actor will pull the slug out itself.

**Can I only get products on special?** Yes. Pick Specials, Multibuy, Half price or Member price in the filters. You can combine them.

**Do I need my own proxies?** No, they are built in.

**How fresh is the data?** Every run queries the site live, so prices and stock are what the site shows at that moment.

**Where do ingredients and nutrition come from?** From the product page. Use Product URLs mode to get them, since search and category listings do not carry those details.

### 💳 Pricing

Pay per result. Products from search and category listings and products with full details from a product page are priced separately, because a product page takes its own request while a listing page returns up to 108 products at once. You are charged for products that end up in the dataset, not for requests or pages.

### ⚠️ Notes

- Free accounts can run up to 5 times a day, with up to 3 search queries, 5 categories or 20 product links per run, and 2 requests in parallel. Paid Apify plans have no limit on the number of queries, categories or links and run up to 10 requests in parallel.
- If your account runs out of credit during a run, the actor stops and keeps everything it has already collected.
- The data is what woolworths.co.nz shows publicly at the time of the run. The site changes all the time, so prices and stock can differ a minute later.

### 🔗 See also

Need a scraper for another platform? Check out:

- [Tripadvisor Reviews Scraper](https://apify.com/mof1re/tripadvisor-reviews-scraper)
- [Booking.com Reviews Scraper](https://apify.com/mof1re/booking-reviews-scraper-browserless)
- [AirBnb Reviews Scraper](https://apify.com/mof1re/airbnb-reviews-scraper-browserless)
- [Trustpilot Reviews Scraper](https://apify.com/mof1re/trustpilot-scraper-fast-browserlessapif)
- [ULTA Reviews Scraper](https://apify.com/mof1re/ulta-reviews-scraper)
- [Zillow Listings Scraper](https://apify.com/mof1re/zillow-scraper)

# Actor input Schema

## `mode` (type: `string`):

What the actor should scrape.

## `searchQueries` (type: `array`):

Keywords to search for. Used in Search Query mode.

## `categories` (type: `array`):

Category slugs or category page URLs. Used in By Category mode.

## `productUrls` (type: `array`):

Product page URLs. Used in Product URLs mode.

## `pageNumber` (type: `integer`):

Page to start from. Used in Search Query and By Category modes.

## `pageSize` (type: `string`):

Products per page. Used in Search Query and By Category modes.

## `sort` (type: `string`):

Order of products. Used in Search Query and By Category modes.

## `staticFilters` (type: `array`):

Only return products matching the selected filters. Used in Search Query and By Category modes.

## Actor input object example

```json
{
  "mode": "SEARCH",
  "searchQueries": [
    "milk"
  ],
  "categories": [
    "ready-meals",
    "https://www.woolworths.co.nz/shop/browse/beer-wine"
  ],
  "pageNumber": 1,
  "pageSize": "108",
  "sort": "RELEVANCE"
}
```

# Actor output Schema

## `jobAds` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchQueries": [
        "milk"
    ],
    "categories": [
        "ready-meals",
        "https://www.woolworths.co.nz/shop/browse/beer-wine"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("mof1re/woolworths-new-zealand-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchQueries": ["milk"],
    "categories": [
        "ready-meals",
        "https://www.woolworths.co.nz/shop/browse/beer-wine",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("mof1re/woolworths-new-zealand-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQueries": [
    "milk"
  ],
  "categories": [
    "ready-meals",
    "https://www.woolworths.co.nz/shop/browse/beer-wine"
  ]
}' |
apify call mof1re/woolworths-new-zealand-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mof1re/woolworths-new-zealand-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/0oC6QPgeqSSf6qk4d/builds/j84r9d8hTtIPd0qwz/openapi.json
