# ALDI Australia Price Tracker: Prices, Specials & Changes (`watchmere/aldi-australia-price-tracker`) Actor

Track ALDI Australia prices by category: every product with its price, unit price, size and specials, plus what changed since your last run: new and removed products, price rises and drops. Reads ALDI's public category pages; no login or API key. Schedule it for weekly price alerts.

- **URL**: https://apify.com/watchmere/aldi-australia-price-tracker.md
- **Developed by:** [Watchmere .](https://apify.com/watchmere) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 results

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

### What does ALDI Australia Scraper do?

It scrapes **ALDI Australia's product categories** (every product with its price, unit price, pack size and any
special) and tells you **what changed since your last run**: new products, removed products, price rises and price
drops.

Pick the categories you care about (dairy, fruit and veg, a sub-category like fresh herbs), run it once, then put it
on a weekly schedule with **Only what changed** and you get a short list of ALDI price moves instead of a spreadsheet
of unchanged rows.

- Any ALDI Australia category or sub-category page
- Price, "was" price on specials, unit price ("$24.95 per 1 kg") and pack size
- No login, no API key, no browser
- Export to CSV, Excel, JSON or Google Sheets, or call it from your own code, Zapier, Make or n8n

### Why use it?

- **Grocery price comparison sites and apps:** keep ALDI prices current without maintaining a scraper
- **Suppliers and brands:** see where ALDI's own-brand prices sit against yours, and when they move
- **Analysts and journalists:** build a weekly price history for food inflation tracking
- **Shoppers and budgeting tools:** catch price drops on the things you buy

### How it works

ALDI's category pages (for example `https://www.aldi.com.au/products/dairy-eggs-fridge/k/960000000`) are public and
show 30 products a page. This tool opens each page the way a browser would, about one page a second, and reads the
product data the page already contains. It only reads pages ALDI's robots.txt allows (category and product pages),
never search results, and never anything behind a login. No personal data is collected.

After each run it keeps a compact copy of what it saw in a key-value store in **your** Apify account called
`aldi-price-history`. The next run compares against it, so "what changed" means "since this account last checked this
category", whichever task or schedule ran it. A product that disappears from a category is checked on its own product
page before it's reported as removed: if it still exists (moved to another category), it isn't reported.

### How to use it

1. Open aldi.com.au, go to a category (Products → Dairy, Eggs & Fridge, for example) and copy the address. Paste one
   or more into **ALDI category pages**.
2. Choose **what to save**:
   - *Every product, with what changed*: the whole category, each row labelled `unchanged`, `price_down`, `new`...
   - *Only what changed since the last run*: just the changed rows. Best for a schedule.
3. Click **Start**. To monitor, create a **Schedule** (for example every Monday at 7:00) and add an integration
   (email, Slack, webhook...) to get the results.

The first time a category is checked in *Only what changed* mode there's nothing to compare with yet, so that run just
records a starting point and saves no rows. To see the products first, do the first run with *Every product*: it
records the same starting point.

### Input example

```json
{
  "categoryUrls": ["https://www.aldi.com.au/products/dairy-eggs-fridge/k/960000000"],
  "mode": "changes",
  "maxProductsPerCategory": 1000
}
```

### Output example

Each product is one row (values below are from a real run, October 2026):

```json
{
  "retailer": "ALDI",
  "category": "Dairy, Eggs & Fridge",
  "categoryUrl": "https://www.aldi.com.au/products/dairy-eggs-fridge/k/960000000",
  "change": "first_seen",
  "productId": "000000000000281811",
  "title": "Triple Cream Brie Cheese 200g",
  "brand": "EMPORIUM SELECTION",
  "size": "200 g",
  "price": 4.99,
  "previousPrice": null,
  "priceChangePercent": null,
  "wasPrice": null,
  "onSpecial": false,
  "unitPrice": "$24.95 per 1 kg",
  "currency": "AUD",
  "available": null,
  "previousAvailable": null,
  "url": "https://www.aldi.com.au/product/emporium-selection-triple-cream-brie-cheese-200g-000000000000281811",
  "imageUrl": "https://dm.apac.cms.aldi.cx/is/image/aldiprodapac/product/jpg/scaleWidth/600/062a3faa-4a09-48b2-bad0-521224c694eb/emporium-selection-triple-cream-brie-cheese-200g",
  "firstSeenAt": "2026-10-21T16:10:00Z",
  "lastSeenAt": "2026-10-21T16:10:00Z",
  "checkedAt": "2026-10-21T16:10:00Z"
}
```

On later checks the change fields are filled in. For example (illustrative values), a price drop looks like:

```json
{ "change": "price_down", "price": 4.49, "previousPrice": 4.99, "priceChangePercent": -10.02 }
```

| Field | Meaning |
|---|---|
| retailer / category / categoryUrl | Always `ALDI`; the category's name and the address you gave |
| change | `new`, `removed`, `price_up`, `price_down`, `unchanged`, or `first_seen` (nothing to compare with yet, e.g. on a category's first check) |
| productId | ALDI's product number (the long number at the end of the product's address) |
| title / brand / size | Product name, brand (empty for ALDI's unbranded fresh produce) and pack size; for products sold by weight, `per 1 kg` |
| price | Current shelf price in Australian dollars (per kg for products sold by weight) |
| wasPrice / onSpecial | The "was" price when the product is on special, otherwise empty |
| unitPrice | ALDI's unit price, e.g. `$24.95 per 1 kg` |
| available | ALDI doesn't publish stock per store, so this is empty, or `false` for a product ALDI marks as discontinued |
| previousPrice / priceChangePercent | The price at the last check and the change in percent |
| firstSeenAt / lastSeenAt | When this tool first and last saw the product in your account |
| url / imageUrl | Product page and main image |

Each run also saves a **SUMMARY** record (Output tab → *Run summary*) with the number of products ALDI lists and how
many were read, the count of each kind of change per category, the reason for any category that couldn't be read,
and a warning for any category that wasn't read in full.

### Good to know

- **Prices are ALDI's online prices**, the same in every Australian state on ALDI's website. ALDI's site is a
  catalogue: most products are sold in store only, and in-store prices can differ.
- **New and removed products** are only reported for categories read in full. If *Max products per category* is lower
  than the category's size, you still get prices for the products read, but nothing is reported new or removed.
- **Removals are confirmed** on the product's own page (ALDI answers "gone" for a deleted product). Up to 30 a run per
  category are checked; any left over are checked on the next run.
- **Special Buys** come and go weekly, so a Special Buys category will report many new and removed products. That's
  real, not an error.
- This tool reads public product information only. It isn't affiliated with or endorsed by ALDI.

### Pricing

Pay per event:

- **Product row**: per row saved.
- **Category scan**: per started 1,000 products read from a category, only for categories that could be read. It pays
  for reading the pages, which costs the same whether or not anything changed.

In *Only what changed* mode you pay for the scan plus only the rows that changed. The tool stops cleanly at your
spending limit, and a category it can't read costs nothing.

### FAQ

**Can it track Coles or Woolworths?** Not at the moment. Both sites block automated visitors, and this tool only reads
sites that allow ordinary, polite access.

**Is it legal?** It reads public product prices that ALDI publishes for anyone, at the pace of a person browsing, on
pages ALDI's robots.txt allows. No personal data is collected. Check that your own use of the data is allowed where
you are; this isn't legal advice.

**A category address stopped working.** ALDI sometimes reorganises its categories. The run tells you when an address
now leads somewhere else; copy the new address from aldi.com.au.

# Actor input Schema

## `categoryUrls` (type: `array`):

ALDI Australia category pages to track, one per line, copied from your browser's address bar on aldi.com.au, for example https://www.aldi.com.au/products/dairy-eggs-fridge/k/960000000. Sub-categories work too (https://www.aldi.com.au/products/fruits-vegetables/fresh-fruits/k/1111111152). Every product in the category is read, page by page.

## `mode` (type: `string`):

Every product saves the whole category each run, each row labelled with what changed since your last run. Only changes saves just the rows that changed (new, removed, price up or down), which is what you want for a daily or weekly schedule; the first run of a category in this mode only records a starting point and saves no rows. Either way you pay per row saved plus a small scan charge per 1,000 products read (see the Pricing tab).

## `maxProductsPerCategory` (type: `integer`):

Stops reading a category after this many products (at most 5,000). Keep it above the category's size if you want new and removed products reported: they're only reported when the whole category has been read.

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

Not needed: ALDI's category pages are public and are read slowly, about one page a second. Leave it off unless runs start failing.

## Actor input object example

```json
{
  "categoryUrls": [
    "https://www.aldi.com.au/products/dairy-eggs-fridge/k/960000000",
    "https://www.aldi.com.au/products/fruits-vegetables/fresh-herbs/k/1111111156"
  ],
  "mode": "all",
  "maxProductsPerCategory": 1000,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

No description

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

No description

# 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 = {
    "categoryUrls": [
        "https://www.aldi.com.au/products/dairy-eggs-fridge/k/960000000",
        "https://www.aldi.com.au/products/fruits-vegetables/fresh-herbs/k/1111111156"
    ],
    "maxProductsPerCategory": 1000,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("watchmere/aldi-australia-price-tracker").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 = {
    "categoryUrls": [
        "https://www.aldi.com.au/products/dairy-eggs-fridge/k/960000000",
        "https://www.aldi.com.au/products/fruits-vegetables/fresh-herbs/k/1111111156",
    ],
    "maxProductsPerCategory": 1000,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("watchmere/aldi-australia-price-tracker").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 '{
  "categoryUrls": [
    "https://www.aldi.com.au/products/dairy-eggs-fridge/k/960000000",
    "https://www.aldi.com.au/products/fruits-vegetables/fresh-herbs/k/1111111156"
  ],
  "maxProductsPerCategory": 1000,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call watchmere/aldi-australia-price-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,watchmere/aldi-australia-price-tracker"
        }
    }
}
```

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/D9ug2GorNHB5NKeqJ/builds/vd8efKSSJxZNfdtIo/openapi.json
