# Woolworths Scraper & API: Prices, Specials & Nutrition (`s_actors/woolworths-scraper`) Actor

Woolworths Australia scraper and API: prices, unit prices, specials, half price and multibuy deals, stock, barcodes, ingredients, allergens and nutrition. Search, categories, the whole Specials catalogue, product links or barcodes. Scheduled runs = price drop alerts.

- **URL**: https://apify.com/s_actors/woolworths-scraper.md
- **Developed by:** [Superior Actors](https://apify.com/s_actors) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.29 / 1,000 products

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 Scraper & API: Prices, Specials, Stock & Nutrition

**Get any product from Woolworths Australia (woolworths.com.au) as clean data: shelf price, unit price, specials, stock, barcode and nutrition.** Search by keyword (`tim tam`, `coffee pods`), scrape whole categories (`/shop/browse/dairy-eggs-fridge/milk`) or **the whole weekly Specials catalogue** (half price, lower shelf price, buy more save more), or check exact products by link, stockcode or **barcode**.

Every product comes with price, was price and savings, **half price and multibuy deals** ("2 for $24.00"), unit price ($2.25 / 100G), in-store price, stock and purchase limit, brand, size, Woolworths category, **ingredients, allergens, dietary claims, health stars and nutrition per 100 g**.

Scheduled runs with **Only report changes** become **Woolworths price drop alerts**: a row only when a price drops or rises, a special starts or ends, a product comes back in stock or sells out, or a new product appears in your search or category.

Use cases: track products & prices, get deal alerts, build grocery price datasets, compare Australian supermarkets. No login, no browser: a **Woolworths scraper** and **Woolworths API** that returns JSON, CSV or Excel.

#### What makes it different

| | |
| --- | --- |
| 🏷️ **The whole Specials catalogue in one line** | `specials` walks Half Price, Lower Shelf Price, Buy More Save More, Online Only and Seasonal specials (~5 000 products a week) |
| 💸 **Real deal fields** | `wasPrice`, `savings`, `isHalfPrice`, `multibuy` ("2 for $24.00"), `promotionText`, plus **Minimum discount %** (50 = half price and better) |
| 🔔 **Price drop alerts** | `price_drop`, `price_rise`, `special_started`, `special_ended`, `back_in_stock`, `out_of_stock`, `new_product`, with the previous price; unchanged products are free |
| 🥫 **Nutrition without extra calls** | Ingredients, allergens (contains / may contain), dietary claims, health star rating and nutrition per 100 g / mL in every row |
| 🔢 **Barcode lookup** | Paste an EAN barcode (9310072000282) and get the Woolworths product, price and stockcode |
| 📚 **Whole categories** | Any category link, slug (`milk`) or name, every page to the end (36 products per Woolworths page) |

#### Example

Real run, 14 Oct 2026:

| Product | Price | Was | Deal | Unit price |
| --- | --- | --- | --- | --- |
| Arnott's Tim Tam Original Chocolate Biscuits 200g | $4.50 | $6.00 | special, save $1.50 | $2.25 / 100G |
| Coca-Cola Zero Sugar Soft Drink Bottle | $2.25 | $4.50 | **half price** | |
| Pringles Sour Cream & Onion Potato Chips | $2.75 | $5.50 | **half price** | |
| Coca-Cola Classic Soft Drink | $24.00 | | **2 for $24.00** (multibuy) | $3.33 / 1L |
| Dairy Farmers Full Cream Milk 2L | $4.70 | | | $2.35 / 1L |

`specials` with **Minimum discount %** 50 and 80 products per section: 112 half-price-or-better products out of 389.

#### Input

| Field | What it does |
| --- | --- |
| **Search terms** | e.g. `tim tam`, `milk`, `coffee pods`; a barcode works too |
| **Categories** | A category link (`https://www.woolworths.com.au/shop/browse/dairy-eggs-fridge/milk`), its slug (`milk`) or name (`Cheese`); `specials` = the weekly Specials catalogue |
| **Products** | Product links (`…/shop/productdetails/36066/…`), stockcodes (`36066`) or barcodes (`9310072000282`) |
| **Max products per search or category** | 100 by default, 0 = all |
| **Sort by** | Relevance, price low to high or high to low, name |
| **Only specials**, **Minimum discount %**, **Only in stock** | Filters: you pay only for returned products |
| **Only report changes**, **Monitor name** | Price drop and special alerts for scheduled runs |

#### Output

| Field | Example |
| --- | --- |
| `name`, `brand`, `packageSize` | Arnott's Tim Tam Original Chocolate Biscuits 200g, Arnott's, 200g |
| `price`, `wasPrice`, `savings`, `isOnSpecial`, `isHalfPrice` | 4.5, 6.0, 1.5, true, false |
| `multibuy`, `promotionText` | 2 for $24.00, "2 for $24.00 - $3.33/1L" |
| `unitPrice`, `unitMeasure`, `unitPriceText` | 2.25, 100G, $2.25 / 100G |
| `instorePrice`, `instoreIsOnSpecial` | in-store shelf price and special |
| `inStock`, `isAvailable`, `isNew`, `isOnlineOnly`, `purchaseLimit` | true, true, false, false, 36 |
| `department`, `category`, `subcategory` | Snacks & Confectionery, Biscuits & Crackers, Biscuits & Cookies |
| `healthStarRating`, `ingredients`, `allergensContains`, `allergensMayContain`, `dietary` | 0.5, Milk Chocolate (38%)…, Milk, Gluten, Soy, Wheat |
| `nutritionPer100` | {"Energy kJ": "2190.0kJ", "Protein": "4.6g", "Sugars": "46.0g", …} |
| `stockcode`, `barcode`, `url`, `imageUrl` | 36066, 9310072000282, woolworths.com.au product page, image |
| `query`, `position`, `scrapedAt` | the search, category or product the row came from, its place in the results |
| `change`, `previousPrice`, `priceChange` | price_drop, 9.7, -1.0 (monitoring) |

#### Pricing

Pay per event: **$0.001** per run and **$0.00049** per returned product ($0.49 per 1 000 products). Apify Scale plan: $0.39 per 1 000, Business plan and above: $0.29 per 1 000.

| Example | Cost |
| --- | --- |
| 100 products of one search | ~$0.05 |
| The whole Specials catalogue (~5 000 products) | ~$2.50 |
| Price alert: 200 products every day, 10 changes a day | ~$0.006 a day (~$0.18 a month) |

#### FAQ

**Does Woolworths have an API for product prices?** Woolworths runs its website on JSON endpoints, and this Actor calls them for you and returns clean rows, so you get a ready Woolworths product API without keys or setup. Call it from your code with the Apify API, or schedule it and download CSV / Excel.

**How do I get this week's Woolworths specials?** Put `specials` in **Categories** and set **Max products** to 0 for the whole catalogue. Add **Minimum discount %** 50 for half price only.

**Can I track Woolworths price drops?** Yes: add products (links or barcodes), a search or a category, turn on **Only report changes**, save it as a task and schedule it daily. Each change comes as a row with the previous price; connect email, Slack or [Google Sheets](https://apify.com/s_actors/google-sheets-import-export) in Integrations.

**Can I search by barcode?** Yes: a barcode in **Products** or **Search terms** returns the Woolworths product with its stockcode, price and nutrition.

**Is the price the same in every store?** Woolworths shows one online price per product; `instorePrice` and `instoreIsOnSpecial` are the in-store shelf price and special where Woolworths shows them.

**Can I compare Coles and Woolworths prices?** Use the `barcode` and `unitPrice` fields to match products with a Coles or ALDI dataset.

#### Tips

- One page = 36 products: a search of 100 products takes 3 requests.
- For a price watchlist, use **Products** with links or barcodes: the same products every run.
- Use a separate **Monitor name** for each scheduled task.

#### Limits

- Woolworths Australia (woolworths.com.au) only.
- Prices are the online prices of woolworths.com.au; store-by-store stock is not shown.
- "My Specials" (Everyday Rewards personal offers) need a login and are not included.

#### Other Australian supermarket tools

| Actor | What it does |
| --- | --- |
| [Coles vs Woolworths vs ALDI Price Comparison & API](https://apify.com/s_actors/coles-woolworths-aldi-price-comparison) | One shopping list priced at Coles, Woolworths and ALDI side by side: cheapest store per item, same-product matches, basket totals |
| [Coles Stock Checker & API](https://apify.com/s_actors/coles-stock-checker) | Exact stock count, prices and specials at every Coles store near a postcode, the whole specials catalogue, restock alerts |
| [ALDI Stock Checker & API](https://apify.com/s_actors/aldi-stock-checker) | ALDI Australia Special Buys stock at every store near a postcode, prices and Special Buys dates |

#### For AI agents and API

```json
{
    "searchTerms": ["tim tam", "coffee pods"],
    "categories": ["specials"],
    "products": ["https://www.woolworths.com.au/shop/productdetails/36066/arnott-s-tim-tam-original-chocolate-biscuits", "9310199012717"],
    "maxItemsPerQuery": 200,
    "minDiscountPercent": 30,
    "onlyChanges": true,
    "monitorName": "woolies-prices"
}
```

Each row is one product with `price`, `wasPrice`, `unitPrice`, `isOnSpecial`, `inStock`, `barcode` and the product link.

# Actor input Schema

## `searchTerms` (type: `array`):

What to search on woolworths.com.au, one per line (e.g. "milk", "tim tam", "coffee pods"). A barcode also works.

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

Whole Woolworths categories, one per line: a category link (https://www.woolworths.com.au/shop/browse/dairy-eggs-fridge/milk), its last part ("milk") or its name ("Cheese"). "specials" = the whole Specials catalogue of the week.

## `products` (type: `array`):

Exact products, one per line: a woolworths.com.au product link (…/shop/productdetails/36066/…), a stockcode (36066) or a barcode (9310072000282). Best for a price watchlist.

## `maxItemsPerQuery` (type: `integer`):

How many products to take from each search term or category (36 per Woolworths page). 0 = all of them.

## `sortBy` (type: `string`):

The order of woolworths.com.au, which decides the products taken when there is a limit.

## `specialsOnly` (type: `boolean`):

Return only products on special this week (price cuts, half price, multibuy).

## `minDiscountPercent` (type: `integer`):

Return only specials at least this much below the regular price (e.g. 50 = half price and better). Empty = any.

## `inStockOnly` (type: `boolean`):

Skip products Woolworths shows as unavailable.

## `onlyChanges` (type: `boolean`):

For scheduled runs. The first run saves prices; later runs return only what changed: price drops and rises, specials started or ended, back in stock, out of stock, and new products in your searches and categories. You pay only for the changes returned.

## `monitorName` (type: `string`):

Separate monitors keep separate memory. Use a different name for each scheduled task.

## `maxConcurrency` (type: `integer`):

How many requests run at the same time.

## Actor input object example

```json
{
  "searchTerms": [
    "tim tam"
  ],
  "maxItemsPerQuery": 20,
  "sortBy": "relevance",
  "specialsOnly": false,
  "inStockOnly": false,
  "onlyChanges": false,
  "monitorName": "default",
  "maxConcurrency": 4
}
```

# Actor output Schema

## `overview` (type: `string`):

Price, specials, unit price and stock of every product.

## `specials` (type: `string`):

Price cuts, half price, multibuy and member prices.

## `changes` (type: `string`):

Monitoring: price drops and rises, specials started or ended, stock changes, new products.

## `nutrition` (type: `string`):

Ingredients, allergens, dietary claims, health stars, nutrition.

## `catalog` (type: `string`):

Barcode, stockcode, brand, size and the Woolworths category of every product.

## `all` (type: `string`):

Every field of every row.

# 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 = {
    "searchTerms": [
        "tim tam"
    ],
    "maxItemsPerQuery": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("s_actors/woolworths-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 = {
    "searchTerms": ["tim tam"],
    "maxItemsPerQuery": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("s_actors/woolworths-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 '{
  "searchTerms": [
    "tim tam"
  ],
  "maxItemsPerQuery": 20
}' |
apify call s_actors/woolworths-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,s_actors/woolworths-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/YTh1NdzP1cj9jxwiX/builds/OqnrhCm3hRcbFBAZs/openapi.json
