# Coles vs Woolworths vs ALDI Price Comparison & API (`s_actors/coles-woolworths-aldi-price-comparison`) Actor

Compare grocery prices at Coles, Woolworths and ALDI Australia: give a shopping list, get the cheapest supermarket for each item per kg / L / each, the same product at each chain and a basket total. Prices and stock of your nearest Coles. Price change alerts.

- **URL**: https://apify.com/s_actors/coles-woolworths-aldi-price-comparison.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, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.39 / 1,000 product rows

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 vs Woolworths vs ALDI Price Comparison & API

**Give a shopping list and see which Australian supermarket is cheapest for each item: Coles, Woolworths or ALDI.** Every item (`full cream milk 2l`, `tim tam`, `free range eggs`, `bananas`, `toilet paper`) is searched at all three chains, and each chain's cheapest matching product is compared **per kg, per litre, per item or per 100 sheets**, so a 3 L bottle and a 1 L bottle, or a 32-pack and a 20-pack, are compared fairly.

Each row names the cheapest chain, its product, pack price and price per unit, the price gap in %, each chain's best product with size, special and link, and **the identical product at each chain** (same brand and size, e.g. Arnott's Tim Tam Original 200g: Coles $6.00, Woolworths $4.50, ALDI $4.49). A **basket total** prices the same amount of every item at each chain: which supermarket is cheapest for your whole list, and by how much.

Add a postcode for the **prices, specials and stock count of your nearest Coles store**. Schedule it with **Only report changes** and it becomes a **Coles, Woolworths and ALDI price tracker**: a row only when a price changes or another chain becomes the cheapest.

Use cases: grocery price comparison apps and websites, cost of living research, own-brand vs ALDI price checks, weekly price tracking for a fixed basket. No login, no browser: a **Coles, Woolworths and ALDI price comparison API** that returns JSON, CSV or Excel.

#### What makes it different

| | |
| --- | --- |
| 🧺 **Basket total per supermarket** | The same amount of every item at each chain's best price per unit, summed: "ALDI $28.80, Coles $31.53, Woolworths $31.93" for your list, plus how many items each chain wins |
| ⚖️ **One measure for all three chains** | Price per kg / L / each / 100 sheets from each chain's own unit price, so pack sizes don't fool the comparison |
| 🔁 **The identical product side by side** | Same brand and size at two or three chains (Tim Tam, a2 Milk, Sorbent) with the saving in $ |
| 🍌 **Smart matching** | `bananas` compares fresh bananas, not banana chips; `full cream milk 2l` keeps only 2 L bottles; `nappies size 4` skips size 2 |
| 📍 **Your Coles store** | Postcode or suburb in: that store's prices, specials and exact units in stock |
| 🔔 **Price tracker** | `price_drop`, `price_rise`, `cheapest_chain_changed` with what changed ("Woolworths $9.99 -> $8.00"); unchanged items are free |

#### Example

Shopping list `full cream milk 2l`, `tim tam`, `free range eggs`, `bananas`, `toilet paper` (the input form's example). Real run, 15 Oct 2026, Coles online prices:

| Item | Cheapest | Coles | Woolworths | ALDI |
| --- | --- | --- | --- | --- |
| full cream milk 2l | ALDI $3.39 | $3.40 ($1.70 / L) | $3.40 ($1.70 / L) | $3.39 ($1.70 / L) |
| tim tam | ALDI $5.99 (365g) | $6.40 365g, was $8 ($17.50 / kg) | $8.00 365g ($21.90 / kg) | $5.99 365g ($16.40 / kg) |
| free range eggs | ALDI $6.19 (700g) | $7.50 800g ($9.40 / kg) | $6.70 700g ($9.60 / kg) | $6.19 700g ($8.80 / kg) |
| bananas | ALDI $4.49 / kg | $4.90 / kg | $0.88 each (not compared) | $4.49 / kg |
| toilet paper | ALDI $13.49 (32 pack) | $4.00 4 pack ($0.26 / 100 sheets) | $8.50 20 pack ($0.24 / 100 sheets) | $13.49 32 pack ($0.23 / 100 sheets) |

Basket (the same amount of the 4 items all three sell by the same measure): **ALDI $28.80**, Coles $31.53, Woolworths $31.93. Same product: Arnott's Tim Tam Original 200g at Coles $6.00, Woolworths $4.50, ALDI $4.49. 5 items in 24 seconds.

#### Input

| Field | What it does |
| --- | --- |
| **Shopping list** | One item per line, like a supermarket search: `milk`, `full cream milk 2l`, `tim tam`, `free range eggs`, `nappies size 4`. A size (`2l`, `200g`, `24 pack`) keeps only that size |
| **Supermarkets** | Coles, Woolworths, ALDI (all three by default) |
| **Output** | `comparison`: one row per item + basket total; `products`: every matching product of every chain with a comparable price per unit |
| **Postcode or suburb (Coles store)** | e.g. `2000`, `Bondi Junction`: prices, specials and stock of the nearest Coles; empty = Coles online prices |
| **Products checked per item and chain** | 36 by default (most relevant first), up to 200 |
| **Only report changes**, **Monitor name** | Price tracker for scheduled runs |

#### Output

**Comparison** (one row per item):

| Field | Example |
| --- | --- |
| `item`, `comparedPer` | tim tam, kg |
| `cheapestChain`, `cheapestProduct`, `cheapestPrice`, `cheapestUnitPrice`, `cheapestUrl` | ALDI, Arnott's Tim Tam Value Pack 365g, 5.99, 16.4, aldi.com.au link |
| `priceGapPercent`, `chainsCompared` | 25 (the best price per unit at the dearest chain vs the cheapest), 3 |
| `colesProduct`, `colesPrice`, `colesSize`, `colesUnitPrice`, `colesPer`, `colesSpecial`, `colesInStock`, `colesUrl`, `colesMatches` | Arnott's Tim Tam Original Chocolate Biscuit Large Pack, 6.4, 365g, 17.5, kg, was $8.00, true, link, 12 |
| `woolworths…`, `aldi…` | the same for Woolworths and ALDI (`aldiSpecial` = Special Buy) |
| `colesStore`, `colesStockQuantity` | Coles Central Wynyard Express, 16 (with a postcode) |
| `sameProduct`, `sameProductSize`, `sameProductColesPrice`, `sameProductWoolworthsPrice`, `sameProductAldiPrice`, `sameProductCheapestChain`, `sameProductSaving` | Arnott's Tim Tam Original Chocolate Biscuits 200g, 200g, 6, 4.5, 4.49, ALDI, 1.51 |
| `change`, `changes`, `previousCheapestChain` | price_drop, Woolworths $9.99 -> $8.00, ALDI (monitoring) |

**Basket** (record `BASKET` in the run's key-value store, link in the Output tab): `basketTotals` per chain, `cheapestBasketChain`, `basketSaving`, `itemsCheapestAt` per chain and `lines` (the amount and cost of each item at each chain).

**Products** (output `products`): `item`, `chainName`, `name`, `brand`, `size`, `price`, `wasPrice`, `isOnSpecial`, `promotion`, `unitPriceText` (as the chain shows it), `comparablePrice` + `comparablePer` (one measure), `isCheapestAtChain`, `inStock`, `stockQuantity` (Coles store), `barcode` (Woolworths), `category`, `url`, `imageUrl`.

#### Pricing

Pay per event: **$0.001** per run, **$0.00249** per compared item ($2.49 per 1 000) and **$0.00049** per product row in the `products` output ($0.49 per 1 000). Apify Scale plan: $2.241 / $0.441 per 1 000, Business plan and above: $1.992 / $0.392 per 1 000. The basket total is free.

| Example | Cost |
| --- | --- |
| A 20-item shopping list compared at the three chains | ~$0.051 |
| Weekly price tracker of 50 items, 10 changes a week | ~$0.026 a week |
| Every matching product for 10 items (~600 rows) | ~$0.30 |

#### FAQ

**Which is cheaper, Coles, Woolworths or ALDI?** Put your own shopping list in and read the `BASKET` record: it prices the same amount of every item at each chain's best price per unit. In our test lists ALDI usually wins on staples, while Coles and Woolworths specials (half price) often beat ALDI on branded products.

**How are products matched?** Each item is searched at each chain; a product counts when its name has every word of the item (and the size, if you gave one). Each chain's cheapest product per kg / L / each is compared. Be specific for a like-for-like answer: `full cream milk 2l` rather than `milk` (which also matches soy and oat milk).

**What is "Same product"?** The identical product sold by two or three chains: same brand, same size and mostly the same name. House brands (Coles, Woolworths, ALDI's Farmdale) never match each other, so they are compared per unit instead.

**Why is a chain "not compared" for an item?** When a chain sells the item by another measure (Woolworths sells bananas each, Coles and ALDI per kg), its best price is shown in its own measure and left out of the cheapest-chain decision and the basket.

**Are ALDI prices store-specific?** No: ALDI and Woolworths online prices are the same nationally. Coles prices can differ by store (Darwin, regional stores): add your postcode for your store's prices.

**Is there a Coles, Woolworths and ALDI price API?** The three supermarket websites run on JSON endpoints, and this Actor calls them for you and returns one clean row shape for all three chains, so you get a ready grocery price comparison API without keys or setup. Call it from your code with the Apify API, or schedule it and download CSV / Excel.

**Can I track price changes?** Yes: turn on **Only report changes**, save it as a task and schedule it daily or weekly. Connect email, Slack or [Google Sheets](https://apify.com/s_actors/google-sheets-import-export) in Integrations.

#### Tips

- Write items as you would search a supermarket site. Add a size (`2l`, `500g`) for an exact like-for-like comparison.
- `products` output shows the working: every matched product with its comparable price and which one was each chain's pick.
- Use a separate **Monitor name** for each scheduled task.

#### Limits

- Coles, Woolworths and ALDI Australia only (IGA, Costco and Harris Farm are not included).
- ALDI sells in store only: its prices are its listed prices, without stock; Special Buys are included only once on sale.
- Woolworths prices are its online prices (the store cannot be chosen without a login).

#### Other Australian supermarket tools

| Actor | What it does |
| --- | --- |
| [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 |
| [Woolworths Scraper & API](https://apify.com/s_actors/woolworths-scraper) | Woolworths Australia prices, specials, half price and multibuy deals, stock, barcodes and nutrition |
| [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
{
    "items": ["full cream milk 2l", "tim tam", "free range eggs", "bananas", "toilet paper"],
    "chains": ["coles", "woolworths", "aldi"],
    "output": "comparison",
    "postcode": "2000",
    "onlyChanges": false
}
```

Each row is one item with `cheapestChain`, `cheapestUnitPrice`, `comparedPer`, each chain's `…Price` and `…UnitPrice`, and the identical product's prices; the basket total is in the `BASKET` record.

# Actor input Schema

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

One item per line, as you would search a supermarket site: "milk", "full cream milk 2l", "tim tam", "free range eggs", "bananas", "nappies size 4". A size in the item ("2l", "200g", "24 pack") keeps only products of that size. Each item is searched at every chosen chain.

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

Which chains to compare. All three by default.

## `output` (type: `string`):

Comparison = one row per shopping-list item: each chain's cheapest matching product per kg / L / each, the cheapest chain, the price gap, the identical product at each chain, plus a basket total per chain (BASKET record). Products = every matching product of every chain as a row, with a comparable price per kg / L / each.

## `postcode` (type: `string`):

Optional, e.g. 2000 or "Bondi Junction": Coles prices, specials and stock count of the nearest Coles store. Empty = Coles online prices. Woolworths and ALDI prices are the same nationally online.

## `maxProductsPerChain` (type: `integer`):

How many search results of each chain are checked for each item (most relevant first). More = a better chance of finding the cheapest pack, a bit slower.

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

For scheduled comparison runs. The first run saves prices; later runs return an item only when a chain's price changed or another chain became the cheapest. You pay only for the rows 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
{
  "items": [
    "full cream milk 2l",
    "tim tam",
    "free range eggs",
    "bananas",
    "toilet paper"
  ],
  "chains": [
    "coles",
    "woolworths",
    "aldi"
  ],
  "output": "comparison",
  "maxProductsPerChain": 36,
  "onlyChanges": false,
  "monitorName": "default",
  "maxConcurrency": 4
}
```

# Actor output Schema

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

One row per item: the cheapest chain, its product and price per unit, and each chain's best price.

## `chains` (type: `string`):

Each chain's cheapest matching product per unit with size, special and link.

## `same` (type: `string`):

The identical product (same brand and size) at two or three chains, side by side.

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

Monitoring: price drops and rises, and items whose cheapest chain changed.

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

Output "Products": every matching product of every chain with a comparable price.

## `basket` (type: `string`):

Output "Comparison": the shopping list total at each chain and how many items each chain is cheapest for.

## `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 = {
    "items": [
        "full cream milk 2l",
        "tim tam",
        "free range eggs",
        "bananas",
        "toilet paper"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("s_actors/coles-woolworths-aldi-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": [
        "full cream milk 2l",
        "tim tam",
        "free range eggs",
        "bananas",
        "toilet paper",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("s_actors/coles-woolworths-aldi-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": [
    "full cream milk 2l",
    "tim tam",
    "free range eggs",
    "bananas",
    "toilet paper"
  ]
}' |
apify call s_actors/coles-woolworths-aldi-price-comparison --silent --output-dataset

```

## MCP server setup

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