# Woolworths Australia Product & Price Scraper (`stralium/woolworths-products`) Actor

Scrape Woolworths (woolworths.com.au) products by search, category, specials or product URL: price, was-price, specials and multi-buy, unit price, barcode, stock, aisle, plus optional ingredients, allergens and nutrition. Fast HTTP, no browser.

- **URL**: https://apify.com/stralium/woolworths-products.md
- **Developed by:** [Stralium](https://apify.com/stralium) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.65 / 1,000 product results

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

### What does Woolworths Australia Product & Price Scraper do?

It returns **Woolworths (woolworths.com.au) products with current prices and specials** from any search term, category page, specials page or individual product URL. Each product comes with its price, was-price and savings, half-price and multi-buy deals, unit price, stock status, **barcode (EAN/GTIN)**, category and aisle. Optionally it adds **ingredients, allergens, the nutrition panel, health star rating and country of origin**.

- ⚡ **Fast and cheap.** It reads the same JSON data the Woolworths website loads, with no headless browser. A full category of 1,000+ products takes about a minute and a half.
- 🏷️ **Specials done properly.** Half price, % off, price drops and "2 for $30" multi-buy deals, with was-price, saving and the per-item multi-buy price as numbers.
- ⚖️ **Unit prices.** Price per 1L / 100g / 1kg as a number, ready for comparisons. Loose items sold by weight are flagged.
- 🔢 **Barcodes included.** Every product comes with its EAN barcode at no extra cost, so you can match Woolworths against Coles, ALDI or your own catalogue.
- 🔎 **Any entry point.** Search terms, `/shop/browse/...` categories, the whole `/shop/browse/specials` section, or `/shop/productdetails/...` URLs.
- 🧾 **Clean output.** Flat JSON with numeric prices, ready for spreadsheets, databases and AI agents.

### What data can I extract from Woolworths?

| Field | Example |
|---|---|
| `productId`, `barcode`, `fullName`, `brand`, `name`, `size` | 888140 · 9300633556150 · Woolworths Full Cream Milk 3L · Woolworths · Woolworths Full Cream Milk · 3L |
| `price`, `wasPrice`, `saveAmount`, `savePercent`, `isOnSpecial`, `isHalfPrice` | 5.5 · 11 · 5.5 · 50 · true · true |
| `promotionType`, `promotionLabel`, `offerDescription` | Special · Half Price · Save $5.50 |
| `multiBuy` | {"quantity": 2, "totalPrice": 30, "pricePerItem": 15, "text": "2 for $30.00 - $4.00/1L"} |
| `unitPrice`, `unitOfMeasure`, `unitPriceText` | 1.65 · 1L · $1.65 / 1L |
| `soldBy`, `isWeighted`, `inStorePrice`, `onlineOnly` | each · false · 4.95 · false |
| `available`, `inStock`, `purchasable`, `supplyLimit` | true · true · true · 36 |
| `category`, `subCategory`, `aisle`, `departmentId` | Dairy, Eggs & Fridge · Milk · Full Cream Milk · 1_6E4F4E4 |
| `imageUrl`, `url`, `sponsored`, `isMarketplace` | Product image and page links, whether the listing was a paid placement, and whether it is sold by a third-party marketplace seller |
| With details: `ingredients`, `allergens`, `mayContain`, `freeFrom`, `dietary` | Pasteurised and Homogenised Full Cream Milk. · \["Milk"] · null · \["Gluten Free", ...] · \["Vegetarian", ...] |
| With details: `nutritionPerServing`, `nutritionPer100`, `servingSize`, `servingsPerPackage`, `healthStarRating` | {"Protein": "8.2g", ...} · {"Energy": "264kJ", ...} · 250 ML · 12 · 4 |
| With details: `countryOfOrigin`, `countryOfOriginStatement`, `australianIngredientsPercent` | Australia · Product of Australia · 100 |
| With details: `longDescription`, `storage`, `warnings`, `directions`, `images` | Full description, storage and warning text, and all product images |

Prices are Woolworths' standard online prices in AUD.

### How much does it cost to scrape Woolworths?

You pay **per product returned**, plus a small add-on per product when **Include product details** is on. Searches that return nothing cost nothing. See the Pricing tab for the current rate.

Set **Max products per search term or URL** to control spend exactly.

### How do I use it?

1. Enter **Search terms** and/or **Woolworths URLs** (category, specials, search or product pages). Copy the URL straight from your browser.
2. Optionally tick **Only products on special** or **Include product details**.
3. Click **Start**, then download the results as JSON, CSV or Excel, or fetch them by API.

#### Input example

```json
{
  "searchTerms": ["milk", "coffee pods"],
  "startUrls": [
    "https://www.woolworths.com.au/shop/browse/pantry",
    "https://www.woolworths.com.au/shop/browse/specials/half-price"
  ],
  "maxResultsPerSource": 500,
  "onlySpecials": true,
  "includeDetails": false
}
```

`https://www.woolworths.com.au/shop/browse/specials` scrapes the whole specials section (half price, lower shelf price, buy more save more and the rest) in one go.

#### Output example

```json
{
  "source": "tim tam",
  "position": 1,
  "productId": 36066,
  "barcode": "9310072000282",
  "fullName": "Arnott's Tim Tam Original Chocolate Biscuits 200g",
  "brand": "Arnott's",
  "size": "200g",
  "price": 6,
  "wasPrice": null,
  "isOnSpecial": false,
  "multiBuy": null,
  "unitPrice": 3,
  "unitOfMeasure": "100G",
  "unitPriceText": "$3.00 / 100G",
  "soldBy": "each",
  "available": true,
  "inStock": true,
  "category": "Pantry",
  "subCategory": "Biscuits & Crackers",
  "aisle": "Biscuits & Cookies",
  "imageUrl": "https://cdn1.woolworths.media/content/wowproductimages/large/036066.jpg",
  "url": "https://www.woolworths.com.au/shop/productdetails/36066/arnott-s-tim-tam-original-chocolate-biscuits",
  "sponsored": false,
  "scrapedAt": "2026-10-08T03:35:48.530Z"
}
```

A run summary (results per source, and any search or URL that returned nothing) is saved as `SUMMARY` in the run's key-value store.

### Use cases

- **Price monitoring:** track Woolworths prices and specials daily for your products or your competitors'.
- **Grocery price comparison:** barcodes and numeric unit prices make cross-retailer matching simple. Pair it with our Coles scraper.
- **Specials alerts:** pull `/shop/browse/specials` with **Only products on special** each Wednesday when the weekly specials change.
- **Product data:** ingredients, allergens and nutrition for food apps, dietary tools, research and FMCG analytics.

### Using it from code or an AI agent

Call it through the Apify API, or let an AI agent use it through the Apify MCP server.

```bash
curl -X POST "https://api.apify.com/v2/acts/<ACTOR_ID>/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"searchTerms": ["milk"], "maxResultsPerSource": 50}'
```

In an MCP client (Claude, Cursor and others), add the Apify MCP server (`https://mcp.apify.com`) and ask, for example, *"What's on half price at Woolworths in the snacks aisle?"*. The agent can call this Actor and get back structured prices.

### FAQ

**Does it need a Woolworths account or cookies?** No. It reads the public website as a guest.

**Which store's prices are these?** Woolworths' standard online prices, which are the same as the default prices on the website before you choose a delivery address. Prices at a particular store can differ slightly.

**Why are some products missing a price?** Products that are currently unavailable online have no price; `available` is `false` for them.

**Why do some products show `sponsored: true`?** Woolworths mixes paid placements into search and category pages. They are real products and are kept, flagged, and not repeated.

**Are member-only (Everyday Rewards) prices included?** No. You get the prices any shopper sees without logging in.

**Is this affiliated with Woolworths?** No. This is an independent tool that reads publicly available product information.

**Something broke?** The scraper is checked automatically every day and fixed when woolworths.com.au changes. Open an issue and it will be looked at.

# Actor input Schema

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

Words you would type into the Woolworths search box, e.g. "milk", "tim tam", "coffee pods".

## `startUrls` (type: `array`):

Any woolworths.com.au category (/shop/browse/...), specials (/shop/browse/specials, /shop/browse/specials/half-price), search (/shop/search/products?searchTerm=...) or product (/shop/productdetails/...) URL.

## `maxResultsPerSource` (type: `integer`):

Stop after this many products for each search term or URL. You are charged per product returned.

## `onlySpecials` (type: `boolean`):

Skip products at regular price (keeps half-price, % off, price-drop and multi-buy deals).

## `includeDetails` (type: `boolean`):

Also fetch each product's detail record to add ingredients, allergens (contains / may contain / free from), nutrition panel, health star rating, country of origin, storage, warnings and all images. Slower, and charged as an add-on per product. Product URLs always include details.

## `proxyConfiguration` (type: `object`):

Optional. By default the scraper connects directly and automatically escalates to Apify Proxy only if Woolworths starts blocking it.

## Actor input object example

```json
{
  "searchTerms": [
    "milk"
  ],
  "startUrls": [
    "https://www.woolworths.com.au/shop/browse/specials/half-price"
  ],
  "maxResultsPerSource": 200,
  "onlySpecials": false,
  "includeDetails": false
}
```

# Actor output Schema

## `results` (type: `string`):

One item per product: price, was-price, half-price and multi-buy deals, unit price, stock, barcode, category, optional ingredients/allergens/nutrition.

## `summary` (type: `string`):

Per-source result counts and any searches or URLs that returned nothing.

# 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": [
        "milk"
    ],
    "startUrls": [
        "https://www.woolworths.com.au/shop/browse/specials/half-price"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("stralium/woolworths-products").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": ["milk"],
    "startUrls": ["https://www.woolworths.com.au/shop/browse/specials/half-price"],
}

# Run the Actor and wait for it to finish
run = client.actor("stralium/woolworths-products").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": [
    "milk"
  ],
  "startUrls": [
    "https://www.woolworths.com.au/shop/browse/specials/half-price"
  ]
}' |
apify call stralium/woolworths-products --silent --output-dataset

```

## MCP server setup

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

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/kNVnZAtUVKZ7ou9c2/builds/Ms4OeSYuaW0taAclr/openapi.json
