# Grocery Price Comparison: Woolworths vs ALDI Australia (`precious_bathmat/aussie-grocery-price-comparison`) Actor

Is ALDI really cheaper? Give it a shopping list and get an item-by-item verdict on price per kilo and per litre, with specials, own-brand prices, every product read and a basket result. Woolworths and ALDI Australia; no account needed.

- **URL**: https://apify.com/precious\_bathmat/aussie-grocery-price-comparison.md
- **Developed by:** [Mariam Ahmed](https://apify.com/precious_bathmat) (community)
- **Categories:** E-commerce, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 item compareds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## Grocery Price Comparison: Woolworths vs ALDI Australia

**Is ALDI actually cheaper?** Give this Actor a shopping list and it answers item by item, on price per kilo and per litre, with the products it compared shown so you can check the working.

Prices come straight from **Woolworths** and **ALDI Australia**. No account, no API key.

### What does this do?

Supermarket scrapers hand you a pile of products from one shop. This one puts two shops side by side and gives a verdict per item and for the basket.

```mermaid
flowchart LR
    A[Your shopping list] --> B[Woolworths search]
    A --> C[ALDI search]
    B --> D[Products matched<br/>to what you asked for]
    C --> D
    D --> E[Price per kg / per L<br/>for each shop]
    E --> F[Who is cheaper,<br/>item by item]
    E --> G[Every product<br/>as a row]
```

### Who is it for?

| You are | You use it to |
|---|---|
| **Households watching the bill** | See which shop is cheaper for the things you actually buy, not for a survey basket |
| **Journalists and researchers** | Put a number on the gap between the chains, with the products and dates behind it |
| **Brand and category managers** | Track your product's shelf price against ALDI's own-brand equivalent, week after week |
| **Price comparison and cashback sites** | Feed a live Australian grocery price table |
| **Anyone building a budgeting app** | Pull prices, unit prices and specials for a shopping list on a schedule |

### What data do you get?

One row per item on your list:

| Field | Meaning |
|---|---|
| `cheaperChain`, `cheaperByPercent` | Which shop is cheaper for this item, and by how much |
| `comparedPer` | The measure both shops quote for it: per kg, per L, each, per 100 sheets |
| `woolworthsTypicalUnitPrice`, `aldiTypicalUnitPrice` | The **middle** unit price among the matching products at each shop — this is what the verdict is based on |
| `woolworthsUnitPrice`, `aldiUnitPrice` | The cheapest unit price found at each shop |
| `woolworthsCheapestPrice`, `aldiCheapestPrice` | The cheapest pack price, whatever its size |
| `woolworths` / `aldi` | Per shop: products matched, how many the site holds in total, the cheapest pack, the cheapest per unit, the cheapest own-brand line, how many are on special, the biggest saving, and how many results were ignored as unrelated |
| `specials`, `note` | Markdowns found, and anything that stopped a straight comparison |

The run summary (`RUN_SUMMARY`) adds the basket verdict: how many items each shop won, and how much cheaper the middle item is.

With **Also return every product as a row** on (the default), a second table holds every product read at both shops: name, brand, pack size, price, unit price as shown on the site, on special, was price, own brand, in stock, and a link to the product page.

### Example: a twelve-item list, September 2026

Run from Apify's servers on 20 September 2026, 24 products read per item per shop, 8 seconds for the lot:

| Item | Cheaper | By | Woolworths (typical) | ALDI (typical) |
|---|---|---|---|---|
| chicken breast | **ALDI** | 41.9% | $21.75 /kg | $12.64 /kg |
| bananas | **ALDI** | 44.5% | $17.95 /kg | $9.97 /kg |
| milk | **ALDI** | 37.3% | $2.79 /L | $1.75 /L |
| olive oil | **ALDI** | 27.7% | $24.00 /L | $17.35 /L |
| coffee | **ALDI** | 22.6% | $64.50 /kg | $49.90 /kg |
| butter | **ALDI** | 22.7% | $18.10 /kg | $14.00 /kg |
| eggs | **ALDI** | 14.2% | $11.65 /kg | $10.00 /kg |
| bread | **ALDI** | 3.6% | $5.60 /kg | $5.40 /kg |
| weet-bix | **ALDI** | 1.4% | $10.75 /kg | $10.60 /kg |
| pasta | **Woolworths** | 24.0% | $3.95 /kg | $5.20 /kg |
| rice | **Woolworths** | 5.7% | $6.60 /kg | $7.00 /kg |
| toilet paper | same | – | $0.31 /100 sheets | $0.31 /100 sheets |

ALDI was cheaper on 9 of the 11 items that could be compared, and on the middle item it was 22.6% cheaper.

### How the comparison is kept honest

- **Unit prices, not pack prices.** A 3 L bottle and a 2 L bottle cannot be compared on the sticker. Both shops publish a unit price; this Actor converts them to the same measure (grams become kilos, millilitres become litres) and compares those.
- **The typical product, not the cheapest one.** Supermarket search is generous: ALDI answers "butter" with bread-and-butter pickles, which are cheap per kilo. The verdict uses the **middle** unit price among the matching products, so one odd match cannot run away with it. The cheapest match is still reported next to it.
- **Products have to match what you searched for.** A result whose name does not carry the words you typed is left out and counted in `ignoredAsUnrelated`. Half the words is enough, so "toilet paper" still finds "toilet tissue". Turn **Only count products that match the search** off to compare everything the sites return.
- **A draw is a draw.** When both shops sit at the same unit price, no winner is declared.
- **One shop only?** If an item exists at just one chain, the row says so rather than crowning it.
- **Prices are the national online prices** each site shows a logged-out visitor; in-store prices can differ, and ALDI's range rotates weekly, so a Special Buy may be gone next week.

### Why not Coles?

Coles blocks datacenter traffic after about five searches and does not let go, so a run including it would return holes rather than prices. This Actor sticks to the two shops it can read completely, every time.

### Pricing

**$0.01 per item compared** plus **$0.0002 per product row** ($0.20 per 1,000 products). An item neither shop stocks costs nothing.

A weekly 20-item basket costs about $0.30 with all the product rows, and runs in seconds: the example above used $0.001 of platform usage at 256 MB.

### Input

| Setting | What it does |
|---|---|
| **Shopping list** | One item per line, as you would type it into a supermarket search |
| **Supermarkets** | Woolworths, ALDI, or both (both are needed for a verdict) |
| **Products to read per item, per shop** | 1 to 60 search results each |
| **Only products on special** | Compare just this week's markdowns |
| **Only count products that match the search** | On by default; keeps unrelated results out of the verdict |

### Popular comparisons

Ready-made shopping lists you can run in one click, or copy and swap in your own:

- [Woolworths vs ALDI: A Weekly Shop Compared](https://apify.com/precious_bathmat/aussie-grocery-price-comparison/examples/woolworths-vs-aldi-weekly-shop)
- [Cheapest Milk, Bread and Eggs: Woolworths vs ALDI](https://apify.com/precious_bathmat/aussie-grocery-price-comparison/examples/cheapest-milk-bread-eggs-australia)
- [ALDI vs Woolworths Meat Prices: Chicken, Beef, Bacon](https://apify.com/precious_bathmat/aussie-grocery-price-comparison/examples/aldi-vs-woolworths-meat-prices)
- [ALDI vs Woolworths Fruit and Vegetable Prices](https://apify.com/precious_bathmat/aussie-grocery-price-comparison/examples/aldi-vs-woolworths-fruit-vegetables)
- [ALDI vs Woolworths Dairy Prices: Milk, Cheese, Yoghurt](https://apify.com/precious_bathmat/aussie-grocery-price-comparison/examples/aldi-vs-woolworths-dairy-prices)
- [ALDI vs Woolworths Pantry Prices: Rice, Pasta, Flour](https://apify.com/precious_bathmat/aussie-grocery-price-comparison/examples/aldi-vs-woolworths-pantry-staples)
- [ALDI vs Woolworths Breakfast Prices: Cereal and Oats](https://apify.com/precious_bathmat/aussie-grocery-price-comparison/examples/aldi-vs-woolworths-breakfast-cereal)
- [ALDI vs Woolworths Baby Prices: Nappies and Formula](https://apify.com/precious_bathmat/aussie-grocery-price-comparison/examples/aldi-vs-woolworths-baby-prices)
- [ALDI vs Woolworths Cleaning and Paper Prices](https://apify.com/precious_bathmat/aussie-grocery-price-comparison/examples/aldi-vs-woolworths-cleaning-prices)
- [ALDI vs Woolworths Snack Prices: Chips and Chocolate](https://apify.com/precious_bathmat/aussie-grocery-price-comparison/examples/aldi-vs-woolworths-snack-prices)
- [ALDI vs Woolworths Drink Prices: Coffee, Tea, Soft Drink](https://apify.com/precious_bathmat/aussie-grocery-price-comparison/examples/aldi-vs-woolworths-drinks-prices)
- [ALDI vs Woolworths Frozen Food Prices Compared](https://apify.com/precious_bathmat/aussie-grocery-price-comparison/examples/aldi-vs-woolworths-frozen-prices)
- [ALDI vs Woolworths Pet Food Prices: Dog, Cat, Litter](https://apify.com/precious_bathmat/aussie-grocery-price-comparison/examples/aldi-vs-woolworths-pet-food-prices)
- [ALDI vs Woolworths Toiletries: Shampoo and Toothpaste](https://apify.com/precious_bathmat/aussie-grocery-price-comparison/examples/aldi-vs-woolworths-toiletries-prices)
- [This Week's Specials: Woolworths vs ALDI Markdowns](https://apify.com/precious_bathmat/aussie-grocery-price-comparison/examples/aldi-woolworths-specials-this-week)

### Integrations

Runs on a schedule and connects to Google Sheets, Slack, Zapier, Make or your own code through the Apify API. Results export as JSON, CSV or Excel. Weekly runs build a price history without any extra work.

### Is it legal?

This Actor reads the same public prices any shopper sees on the Woolworths and ALDI websites, and stores no personal data.

# Actor input Schema

## `items` (type: `array`):

One item per line, the way you would search a supermarket site: "milk", "weet-bix", "olive oil". Short searches match more.

## `chains` (type: `array`):

Which chains to read. Both are needed for a comparison.

## `maxProductsPerItem` (type: `integer`):

How many search results to read for each item at each chain. More results means a better chance of finding the cheapest pack.

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

Compare only the items each chain has marked down this week.

## `strictMatching` (type: `boolean`):

On by default. Supermarket search is generous — ALDI answers "eggs" with vanilla custard — so products whose name does not carry the words you searched for are left out of the comparison.

## `includeProducts` (type: `boolean`):

A second table with every product read at both chains: price, unit price, pack size, special, brand and a link. Charged per product; turn it off to pay for the comparisons only.

## Actor input object example

```json
{
  "items": [
    "nappies",
    "coffee",
    "pasta sauce"
  ],
  "chains": [
    "woolworths",
    "aldi"
  ],
  "maxProductsPerItem": 24,
  "onlySpecials": false,
  "strictMatching": true,
  "includeProducts": true
}
```

# Actor output Schema

## `comparisons` (type: `string`):

Which chain is cheaper for each item, per kilo or per litre.

## `products` (type: `string`):

Every product read at both chains, when that option is on.

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

The basket verdict and what was found per item.

# 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 = {
    "items": [
        "milk",
        "bread",
        "eggs",
        "butter",
        "rice"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("precious_bathmat/aussie-grocery-price-comparison").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 = { "items": [
        "milk",
        "bread",
        "eggs",
        "butter",
        "rice",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("precious_bathmat/aussie-grocery-price-comparison").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 '{
  "items": [
    "milk",
    "bread",
    "eggs",
    "butter",
    "rice"
  ]
}' |
apify call precious_bathmat/aussie-grocery-price-comparison --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,precious_bathmat/aussie-grocery-price-comparison"
        }
    }
}
```

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/uPr0tlzrt4y7R6bQN/builds/hUvcXm46gdvkyv81z/openapi.json
