# Coles, Woolworths & ALDI Scraper – Australian Grocery Prices (`brii3343/coles-woolworths-aldi-scraper`) Actor

Coles, Woolworths and ALDI Australia in one run, same fields for all three: price, was-price, specials, multi-buy, unit price, category, barcode, image, URL. Search products, whole departments, every special or any store URL. Checked 30/30 against product pages. $1 per 1,000 products.

- **URL**: https://apify.com/brii3343/coles-woolworths-aldi-scraper.md
- **Developed by:** [Brian Gastaldelli](https://apify.com/brii3343) (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.90 / 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

### Coles, Woolworths & ALDI Scraper — Australian grocery prices in one format

Get product prices, specials, multi-buy offers and unit prices from **Coles, Woolworths and ALDI Australia** in a single run, with **the same fields for all three stores**. Search any product, take whole departments or the full catalogue, or paste any store URL. No login, no browser, no proxy to set up.

#### Why this Actor

- **Three supermarkets, one dataset.** Search `milk` once and get Coles, Woolworths and ALDI side by side, ready to compare by unit price.
- **Built for reliability.** Coles and Woolworths protect their sites against bots. This Actor connects directly while it can and switches to Apify Proxy (Australian residential IPs) on its own when a store blocks it, so runs don't fail, at no extra cost to you. In our tests: 7,464 of 7,470 Coles specials, 2,271 of 2,271 products of a whole Coles department, all 5,698 Woolworths grocery specials.
- **Checked against the real product pages.** 30 products (10 per store, including specials) compared with each product's own page: price, was-price and unit price identical in 30 of 30.
- **Specials done right.** Was-price, savings, half-price and percentage-off labels, multi-buy offers (`2 for $7.00`), and ALDI's own Super Savers and Lower Prices ranges.
- **Fair price:** $1.30 per 1,000 products on the Starter plan, less on higher plans, for all three stores.

#### Use cases

- **Price comparison apps and newsletters**: the cheapest milk, coffee or nappies across the three chains, every day.
- **Brands and suppliers**: monitor shelf prices, promotions and availability of your products and your competitors'.
- **Deal hunting**: every product on special this week, per store or per department.
- **Research and journalism**: grocery inflation, unit prices, private label vs brands, promotions over time.
- **Retail analytics**: full catalogue snapshots with categories, sizes and barcodes (Woolworths).

#### Input

| Field | Description |
|---|---|
| Search terms | Products to search, one per line (`milk`, `coffee beans`, `nappies`). Each term is searched in every selected store. |
| Stores | Coles, Woolworths, ALDI (default: all three). |
| Categories | Whole departments with one common name for the three stores: fruit & vegetables, meat & seafood, dairy, bakery, deli, pantry, snacks, drinks, frozen, liquor, health & beauty, baby, pet, cleaning & household, international foods, lunchbox, home & garden. |
| Whole catalogue | Every product of the selected stores; with *Specials only*, every product on special. |
| Start URLs | Any search, category, specials or product page of coles.com.au, woolworths.com.au or aldi.com.au. |
| Specials only | Keep only products on special. |
| Include Woolworths Everyday Market | Off by default: products sold on woolworths.com.au by third-party sellers (fashion, homewares, electronics) are left out, so results are groceries. Turn on to include them. |
| Max products per source | Limit per search term per store, per category per store and per URL (default 100; 0 = all). |
| Max products in total | Stop the run after this many products (0 = no limit). |

Example:

```json
{
  "searchTerms": ["milk", "coffee beans"],
  "stores": ["coles", "woolworths", "aldi"],
  "specialsOnly": false,
  "maxItemsPerSource": 50
}
```

#### Output

One item per product (real example):

```json
{
  "store": "woolworths",
  "productId": "83273",
  "name": "Sanitarium So Good Barista Oat Long Life Milk",
  "brand": "Sanitarium",
  "size": "1L",
  "price": 3,
  "wasPrice": 4,
  "isOnSpecial": true,
  "savings": 1,
  "specialText": "25% Off",
  "multibuy": null,
  "unitPrice": 3,
  "unitPriceMeasure": "1L",
  "unitPriceText": "$3.00 / 1L",
  "inStock": true,
  "category": "Pantry",
  "subcategory": "Milk",
  "barcode": "9300652809770",
  "imageUrl": "https://cdn1.woolworths.media/content/wowproductimages/large/083273.jpg",
  "url": "https://www.woolworths.com.au/shop/productdetails/83273/sanitarium-so-good-barista-oat-long-life-milk",
  "currency": "AUD",
  "source": "search: milk",
  "position": 7,
  "scrapedAt": "2026-09-29T00:41:17.771Z"
}
```

| Field | Meaning |
|---|---|
| `price`, `wasPrice`, `savings` | Current price, previous price (only when higher) and the difference, in AUD. |
| `isOnSpecial`, `specialText` | The store's own special flag and label (`1/2 Price`, `25% Off`, `Save $1.20`, `ALDI Super Savers`…). |
| `multibuy` | Multi-buy offer, e.g. `2 for $7.00` (Coles and Woolworths). |
| `unitPrice`, `unitPriceMeasure`, `unitPriceText` | Comparable price, e.g. `1.65` per `1L`, as shown by the store. |
| `inStock` | Online availability (Coles, Woolworths; ALDI does not sell groceries online, so it is empty). |
| `category`, `subcategory` | The store's department and aisle. |
| `barcode` | EAN/GTIN (Woolworths). |
| `source`, `position` | Which search, category or URL found the product, and its rank there. |

Rows with a `status` are not products and are **not charged**:

| Status | Meaning |
|---|---|
| `no_results` | The store found nothing for this search or category. |
| `invalid_input` | URL of another website, or nothing to do. |
| `error` | The page does not exist (e.g. a removed product) or the store kept refusing (rare). |

#### Tested (September 2026, on the Apify platform)

| Test | Result |
|---|---|
| Default input (`milk`, 20 per store) | 60 products in about 4 seconds |
| Price, was-price and unit price vs each product's own page | 30 / 30 identical |
| Whole *Dairy, Eggs & Fridge* department | Coles 2,271 / 2,271, Woolworths 1,676 / 1,678, ALDI 238 / 238 |
| Every product on special | Coles 7,464 / 7,470, ALDI 533 / 533, Woolworths 5,698 (all grocery specials, in 14 minutes) |
| Whole ALDI catalogue | 3,135 / 3,162 |
| Search, category, specials and product URLs of the three sites | 12 / 12 |

#### Honest limits

- Prices are the stores' **online prices for their default location**. Coles and Woolworths prices can differ slightly in some regions and stores.
- **ALDI Australia does not sell groceries online**: its prices are the ones published on aldi.com.au, and it rarely shows a was-price, so its specials are the products of its Super Savers and Lower Prices ranges.
- Search results follow each store's own search engine: a vague term can return loosely related products (Coles returns its closest matches even for a misspelled word).
- Sponsored products appear in the stores' results; the Actor keeps each product once per run.
- Gift cards (Woolworths "Front of Store") are not included in the whole catalogue: the store refuses that department.

#### Pricing

**$1.30 per 1,000 products** on the Starter plan, down to **$0.90** on Business (`product` event; the Pricing tab shows the price for your plan), for any of the three stores. Error and no-result rows are free. Set a maximum charge in the run options and the Actor stops there.

# Actor input Schema

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

Products to search for, one per line, for example <code>milk</code>, <code>coffee beans</code>, <code>nappies</code>. Each term is searched in every store you select, so you can compare prices across Coles, Woolworths and ALDI in one run.

## `stores` (type: `array`):

Which supermarkets to search. Leave empty for all three.

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

Whole departments, with the same name for all three stores (each store's matching department is used). ALDI has no International foods, Lunchbox or Home & garden department.

## `allCategories` (type: `boolean`):

Every product of the selected stores (tens of thousands). With <b>Specials only</b> on, every product on special. The per-source limit does not apply; use <b>Max products in total</b> to cap it.

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

Any Coles, Woolworths or ALDI page with products: a search, a category, the specials page or a single product, for example <code>https://www.coles.com.au/browse/pantry</code>, <code>https://www.woolworths.com.au/shop/browse/specials/half-price</code>, <code>https://www.aldi.com.au/products/freezer/k/980000000</code>.

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

Keep only products on special (price drops, half price, multi-buy offers).

## `includeMarketplace` (type: `boolean`):

Everyday Market products are sold on woolworths.com.au by third-party sellers (fashion, homewares, electronics…). Off by default so that results are groceries; turn it on to include them.

## `maxItemsPerSource` (type: `integer`):

Limit for each search term in each store, each category in each store and each start URL. 0 = everything the store lists.

## `maxItems` (type: `integer`):

Stop after this many products in the whole run. 0 = no limit.

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

Not needed: the scraper connects directly and switches to Apify Proxy (Australian residential if necessary) only when a store blocks it. Set a proxy here only to force one.

## Actor input object example

```json
{
  "searchTerms": [
    "milk"
  ],
  "stores": [
    "coles",
    "woolworths",
    "aldi"
  ],
  "categories": [],
  "allCategories": false,
  "startUrls": [],
  "specialsOnly": false,
  "includeMarketplace": false,
  "maxItemsPerSource": 20,
  "maxItems": 0,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

One item per product: store, name, brand, size, price, was price, special and multi-buy offers, unit price, stock, category, barcode (Woolworths), image and link.

# 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"
    ],
    "stores": [
        "coles",
        "woolworths",
        "aldi"
    ],
    "maxItemsPerSource": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("brii3343/coles-woolworths-aldi-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": ["milk"],
    "stores": [
        "coles",
        "woolworths",
        "aldi",
    ],
    "maxItemsPerSource": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("brii3343/coles-woolworths-aldi-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": [
    "milk"
  ],
  "stores": [
    "coles",
    "woolworths",
    "aldi"
  ],
  "maxItemsPerSource": 20
}' |
apify call brii3343/coles-woolworths-aldi-scraper --silent --output-dataset

```

## MCP server setup

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