# ALDI Australia Product Scraper — Prices & Special Buys (`genial_candlestand/aldi-au-product-scraper`) Actor

Returns ALDI Australia (aldi.com.au) products with price, unit price, pack size, brand, category, images and Special Buy on-sale date. Search terms, categories, Special Buys, URLs or the whole catalogue. Optional ingredients and stock. No login.

- **URL**: https://apify.com/genial_candlestand/aldi-au-product-scraper.md
- **Developed by:** [Flowo](https://apify.com/genial_candlestand) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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

## ALDI Australia Product Scraper — Prices, Special Buys & Stock

This actor returns products from ALDI Australia (aldi.com.au) as flat rows with `title`, `brand`, `price`, `unitPriceText`, `packSize`, `category`, `isSpecialBuy`, `onSaleDate` and `imageUrl`. Search by keyword, list whole categories, pull Special Buys by on-sale date or theme, open product URLs, or scrape the full catalogue. No login is needed.

### What does ALDI Australia Product Scraper do?

It reads the public product data of aldi.com.au and returns one row per product:

- shelf price in AUD (`price`, `priceText`) and comparison price (`unitPrice`, `unitPriceText`, e.g. "$2.38 per 100 g");
- `brand`, `packSize`, `category`, `categoryPath`, `categoryId`, `imageUrl` and all `images`;
- Special Buys: `isSpecialBuy`, `onSaleDate` and `onSaleText` (e.g. "While Stocks Last");
- optional product details: `description`, `ingredients`, `allergens`, `storageInstructions`, `usageInstructions`, `countryOfOrigin`;
- optional Special Buys stock level at a chosen store: `stockLevel` (green, yellow, orange, red) and `stockText`.

Sources can be combined in one run: search terms, categories (slug, name or numeric key), Special Buys dates and themes, Start URLs and the whole catalogue (about 3,300 products). Each row says which source produced it (`sourceType`, `query`, `position`).

The row shape follows our Coles and Woolworths scrapers (`id`, `title`, `brand`, `packSize`, `price`, `unitPrice`, `unitPriceText`, `wasPrice`, `category`, `imageUrl`, `url`), so Australian supermarket prices are easy to compare. ALDI shows no was-prices, so `wasPrice` is null in practice.

### How to use

1. Open the actor and add search terms (e.g. `milk`, `dog food`), categories, Special Buys dates or Start URLs.
2. Optionally set the Store ID, the sort order and the result limits.
3. Run it, then download the dataset as JSON, CSV or Excel, or call it through the API or on a schedule.

Example input:

```json
{
  "queries": ["milk", "cheese"],
  "sortBy": "price_asc",
  "maxItems": 100,
  "storeId": "G452"
}
```

### Pricing

Pay per event:

| Event | Price |
|---|---|
| Product (one result row) | $0.001 (about $1 per 1,000 products) |
| Product details (only with *Include product details*) | $0.0005 per product |
| Store stock level (only with *Include Special Buys stock level*, only when ALDI returns a level) | $0.0005 per Special Buy |
| Actor start | $0.00005 per run (per GB of memory) |

Searches with no results are free, and failed detail lookups are free. Product URLs always include the details at no extra charge. Platform usage is separate.

### Input

- **Search terms** (`queries`): keywords, one per line; each is its own source.
- **Categories** (`categories`): slug path such as `dairy-eggs-fridge/milk`, a category name such as "Lower Prices", or a numeric key.
- **Special Buys dates** (`specialBuysDates`): `latest`, `all` or a date `YYYY-MM-DD`; **Special Buys themes** (`specialBuysThemes`) narrow them, e.g. "Gardening".
- **Whole catalogue** (`allProducts`): every listed product, still capped by Max results.
- **Start URLs** (`startUrls`): product, category, Special Buys and search page URLs.
- **Store ID** (`storeId`, default `G452`): prices are national; the store changes the assortment a little and is the store for Special Buys stock.
- **Sort by** (`sortBy`): `relevance` (default), `price_asc`, `price_desc`, `name_asc` or `name_desc`.
- **Max results** (`maxItems`, default 1000) and **Max results per source** (`maxItemsPerSource`).
- **Include product details** (`includeDetails`) and **Include Special Buys stock level** (`includeStoreStock`).
- **Proxy** (`proxyConfiguration`): the default Apify datacenter proxy works.

### Output

Each dataset item is one product. Real example (shortened):

```json
{
  "url": "https://www.aldi.com.au/product/choceur-milk-mouse-milk-chocolate-168g-000000000538441002",
  "id": "000000000538441002",
  "title": "Milk Mouse - Milk Chocolate 168g",
  "brand": "CHOCEUR",
  "packSize": "168 g",
  "price": 3.99,
  "priceText": "$3.99",
  "currency": "AUD",
  "unitPrice": 2.38,
  "unitPriceText": "$2.38 per 100 g",
  "soldByWeight": false,
  "wasPrice": null,
  "isSpecialBuy": false,
  "onSaleDate": null,
  "category": "Confectionery",
  "categoryPath": "Pantry > Confectionery",
  "categoryId": "1111111181",
  "imageUrl": "https://dm.apac.cms.aldi.cx/is/image/aldiprodapac/product/jpg/scaleWidth/600/d0097d9d-25d6-4cd1-b1dd-1ea5f7a154ba/choceur-milk-mouse-milk-chocolate-168g",
  "isDiscontinued": false,
  "storeId": "G452",
  "sourceType": "search",
  "query": "milk",
  "position": 1,
  "scrapedAt": "2026-10-24T21:07:56.009Z"
}
```

The detail fields (`description`, `ingredients`, `allergens`, `storageInstructions`, `usageInstructions`, `countryOfOrigin`) and the stock fields (`stockLevel`, `stockText`) are null unless requested.

### Use cases

- Price monitoring: schedule runs over keywords, categories or the whole catalogue and compare `price` and `unitPrice` over time.
- Special Buys tracking: list upcoming and past on-sale dates by theme, with optional stock level at your store.
- Cross-supermarket comparison with Coles and Woolworths data.
- Product data for apps, spreadsheets, BI or AI agents: ingredients, allergens, images and categories.

### Limitations

- Only products listed on aldi.com.au. ALDI has no online shop, so there is no cart or online availability.
- Regular products have no stock data; the stock level exists only for Special Buys.
- ALDI shows no was-prices, so `wasPrice` is null in practice.
- Prices are national and the same in every store. An unknown Store ID fails the run.
- Some products have no `brand`, `packSize` or `unitPrice` (null).
- Ingredients and allergens are only present where ALDI lists them, mostly for food.

### FAQ

**Do I need an ALDI account?** No. The actor reads public product data and needs no login or cookies.

**Is it legal?** It collects publicly available product and price information, no personal data. You are responsible for using it in line with applicable law and aldi.com.au's terms.

**Can I get only the cheapest products?** Yes: set `sortBy` to `price_asc` and limit with Max results per source.

**How do I get everything?** Enable Whole catalogue and set Max results to 5000.

**Does the store matter?** Prices do not change by store; Store ID affects the assortment slightly and the Special Buys stock level.

### Other actors

- [Coles Product Scraper](https://apify.com/genial_candlestand/coles-product-scraper): Coles products with price, was-price, unit price, specials and stock.
- [Woolworths Product Scraper](https://apify.com/genial_candlestand/woolworths-product-scraper): Woolworths prices, specials, unit prices, stock and barcodes.

# Actor input Schema

## `queries` (type: `array`):

Keywords to search on aldi.com.au, one per line, e.g. "milk" or "dog food". Each term is its own source with its own result list. Blank lines are ignored. Combine freely with categories, Special Buys and URLs.

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

Categories to list in full, one per line: a slug path ("dairy-eggs-fridge/milk", "lower-prices"), a category name ("Lower Prices", case-insensitive) or a numeric category key ("960000000"). Category page URLs go into Start URLs. Unknown categories are skipped with a warning.

## `specialBuysDates` (type: `array`):

Special Buys on-sale dates: "latest" (the current on-sale date), "all" (every date in ALDI's Special Buys calendar, usually ~5) or a date YYYY-MM-DD. Past dates still list the items sold "While Stocks Last". Any other value is an input error.

## `specialBuysThemes` (type: `array`):

Optional Special Buys themes, e.g. "Gardening", "Pet Essentials" (case-insensitive). With Special Buys dates: only these themes of those dates. Without dates: each theme across all on-sale dates.

## `allProducts` (type: `boolean`):

Scrape every product ALDI Australia lists (about 3,300, 60 per request) — for full price monitoring. Still capped by Max results (set it to 5000 to get everything).

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

aldi.com.au URLs: product pages (/product/<name>-<sku>), category pages (/products/.../k/<key>), Special Buys pages (/special-buys/<YYYY-MM-DD>, optional ?theme=) and search pages (/results?q=). Other URLs are skipped with a warning.

## `storeId` (type: `string`):

ALDI store id (e.g. G452 Glenmore Park NSW, G330 VIC). Prices are national and the same in every store; the store changes the assortment a little and is the store for Special Buys stock levels. An unknown store id fails the run with an input error.

## `sortBy` (type: `string`):

Order of results: relevance, price_asc (low to high), price_desc (high to low), name_asc (A to Z) or name_desc (Z to A). Use with Max results per source to get e.g. the cheapest N products.

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

Stop after this many products in total across all sources. Every product row is charged.

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

Optional cap for each search term, category, Special Buys date/theme and the whole catalogue. Empty = no per-source cap (only Max results applies).

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

Add description, ingredients, allergens, storage and usage instructions and country of origin (one extra request per product, charged as "Product details"). Product URLs always include them at no extra charge.

## `includeStoreStock` (type: `boolean`):

For Special Buys, add the stock level (green/yellow/orange/red) at the chosen store (one extra request per Special Buy, charged as "Store stock level" only when ALDI returns a level). Regular products have no stock data and are never requested.

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

Proxy settings. The default Apify datacenter proxy works; switch to residential only if you see blocks (HTTP 403).

## Actor input object example

```json
{
  "queries": [
    "milk",
    "cheese"
  ],
  "allProducts": false,
  "storeId": "G452",
  "sortBy": "relevance",
  "maxItems": 1000,
  "includeDetails": false,
  "includeStoreStock": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

Dataset with all scraped products

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

Products in the overview table view

# 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 = {
    "queries": [
        "milk",
        "cheese"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("genial_candlestand/aldi-au-product-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 = { "queries": [
        "milk",
        "cheese",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("genial_candlestand/aldi-au-product-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 '{
  "queries": [
    "milk",
    "cheese"
  ]
}' |
apify call genial_candlestand/aldi-au-product-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,genial_candlestand/aldi-au-product-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/bm4Y3nWND3P7s0t1q/builds/pVEuD8gR3CmtcFdqH/openapi.json
