# ALDI Australia Product & Price Scraper (`stralium/aldi-au-products`) Actor

Scrape ALDI Australia (aldi.com.au) products by search term, category, Special Buys or product URL: price, unit price, pack size, category, Special Buy on-sale dates, images, plus optional description, ingredients and allergens. Fast JSON API, no browser.

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

## Pricing

from $0.65 / 1,000 product results

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

### What does ALDI Australia Product & Price Scraper do?

It returns **ALDI Australia (aldi.com.au) products with current prices** from any search term, category page, the **Special Buys** pages or individual product URLs. Each product comes with its price, unit price, pack size, category, Special Buy on-sale date and status, and images. Optionally it adds the **description, ingredients, allergen statements, storage and usage instructions and country of origin**.

- ⚡ **Fast and cheap.** Reads ALDI's own product JSON with no headless browser. 1,000 products take well under a minute.
- 🗓️ **Special Buys done properly.** Paste `/special-buys` and get every Wednesday and Saturday range ALDI currently advertises, each product tagged with its on-sale date and whether it is `upcoming` or `on-sale` now.
- ⚖️ **Unit prices as numbers.** Price per 1 kg / 1 L / 100 g as a number, plus per-kg price and approximate piece weight for loose fruit and veg.
- 🔎 **Any entry point.** Search terms, `/products/.../k/...` categories, `/results?q=...`, `/special-buys`, `/special-buys/<date>?theme=...`, `/product/...` URLs, or `/products` for the whole catalogue.
- 🧾 **Clean output.** Flat JSON with numeric prices, ready for spreadsheets, databases and AI agents.

### What data can I extract from ALDI?

| Field | Example |
|---|---|
| `productId`, `fullName`, `brand`, `name`, `size` | 000000000000398691 · FARMDALE Light Milk 2L · FARMDALE · Light Milk 2L · 2 l |
| `price`, `priceText`, `currency` | 3.39 · $3.39 · AUD |
| `unitPrice`, `unitOfMeasure`, `unitPriceText` | 1.7 · 1l · $1.70 per 1 L |
| `isWeighted`, `pricePerKg`, `approxWeightKg` | true · 9.99 · 0.9 (loose produce priced per piece) |
| `isSpecialBuy`, `specialBuyDate`, `specialBuyStatus`, `availabilityText` | true · 2026-10-21 · upcoming · On Sale Wed 21 Oct |
| `available`, `discontinued`, `ageRestricted` | true · false · false |
| `category`, `subCategory`, `categoryPath`, `categoryId` | Dairy, Eggs & Fridge · Milk · Dairy, Eggs & Fridge > Milk · 960000000 |
| `imageUrl`, `images`, `nutritionImageUrl`, `url` | 1000px product photos, the nutrition panel image when ALDI has one, and the product link |
| `wasPrice`, `savingsText`, `isOnSpecial` | Filled only on the rare products where ALDI shows a was-price |
| With details: `description`, `ingredients`, `allergenContains`, `allergenMayContain`, `storageInstructions`, `usageInstructions`, `countryOfOrigin`, `variantProductIds` | Reduced fat milk that is a good source of calcium... · Chilled: Keep refrigerated. Store below 4°C. |

Prices are the standard prices shown on aldi.com.au, in AUD.

### How much does it cost to scrape ALDI?

You pay **per product returned**, plus a small add-on per product when **Include product details** is on. Failed searches cost nothing. See the Pricing tab for the current rate.

Set **Max products per search term or URL** to control spend exactly.

### How do I use it?

1. Enter **Search terms** and/or **ALDI URLs** (category, Special Buys or product pages).
2. Optionally tick **Only Special Buys** or **Include product details**, or pick a **Sort order**.
3. Click **Start**, then download the results as JSON, CSV or Excel, or fetch them by API.

#### Input example

```json
{
  "searchTerms": ["milk", "coffee pods"],
  "startUrls": [
    "https://www.aldi.com.au/products/dairy-eggs-fridge/k/960000000",
    "https://www.aldi.com.au/special-buys",
    "https://www.aldi.com.au/special-buys/2026-10-14?theme=Grocery+Specials"
  ],
  "maxResultsPerSource": 500,
  "onlySpecials": false,
  "includeDetails": false,
  "sortBy": "price_asc"
}
```

#### Output example

```json
{
  "source": "milk",
  "position": 1,
  "productId": "000000000000398691",
  "fullName": "FARMDALE Light Milk 2L",
  "brand": "FARMDALE",
  "size": "2 l",
  "price": 3.39,
  "unitPrice": 1.7,
  "unitOfMeasure": "1l",
  "unitPriceText": "$1.70 per 1 L",
  "isSpecialBuy": false,
  "specialBuyDate": null,
  "available": true,
  "category": "Dairy, Eggs & Fridge",
  "subCategory": "Milk",
  "imageUrl": "https://dm.apac.cms.aldi.cx/is/image/aldiprodapac/product/jpg/scaleWidth/1000/93645b60-eb11-4046-b28e-2b441f8585a4/Light%20Milk%202L",
  "url": "https://www.aldi.com.au/product/farmdale-light-milk-2l-000000000000398691",
  "scrapedAt": "2026-10-08T03:30:17.000Z"
}
```

A Special Buy looks like this:

```json
{
  "fullName": "FELDSCHLÖSSCHEN Beer Bottle 500ml",
  "price": 3.99,
  "isSpecialBuy": true,
  "specialBuyDate": "2026-10-21",
  "specialBuyStatus": "upcoming",
  "availabilityText": "On Sale Wed 21 Oct",
  "available": false,
  "ageRestricted": true
}
```

### Use cases

- **Price monitoring:** track ALDI prices for your products or competitors daily.
- **Grocery price comparison:** unit prices as numbers make cross-brand and cross-retailer comparisons simple (pair it with our Coles scraper).
- **Special Buys alerts:** pull `/special-buys` twice a week (new ranges land Wednesday and Saturday) and alert on upcoming items before they sell out.
- **Product data:** descriptions, ingredients and allergen statements for apps, research and FMCG analytics.

### FAQ

**Does it need an ALDI account or cookies?** No. It reads the public website data.

**Does it show stock levels?** ALDI does not publish store stock online. `available` is `false` only for discontinued products and Special Buys that are not on sale yet; `availabilityText` carries ALDI's own note such as "While Stocks Last".

**Why is `wasPrice` usually empty?** ALDI rarely shows was-prices. Its price drops live in categories such as https://www.aldi.com.au/products/lower-prices/k/1588161425841179, which you can scrape like any other category.

**Which store are prices for?** The default store the ALDI website uses before you pick one. ALDI notes prices can vary between stores.

**Is this affiliated with ALDI?** No. This is an independent tool that reads publicly available product information.

**Something broke?** The scraper is checked automatically every day and fixed when aldi.com.au changes. Open an issue and it will be looked at.

# Actor input Schema

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

Words you would type into the ALDI search box, e.g. "milk", "coffee pods", "air fryer".

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

Any aldi.com.au category (/products/.../k/...), search (/results?q=...), Special Buys (/special-buys for every advertised date, or /special-buys/2026-10-07 for one date, with optional ?theme=) or product (/product/...) URL. Use https://www.aldi.com.au/products for the whole catalogue.

## `maxResultsPerSource` (type: `integer`):

Stop after this many products for each search term or URL. You are charged per product returned.

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

Keep only Special Buys (limited-run products with an on-sale date). Useful with search terms or category URLs.

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

Also fetch each product's detail record to add the description, ingredients, allergen statements, storage and usage instructions, country of origin and variants. Charged as an add-on per product. Product URLs always include details.

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

Order in which ALDI returns products. Matters when Max products is lower than the number of matches.

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

Optional. By default the scraper connects directly and automatically escalates to Apify Proxy only if ALDI starts blocking it.

## Actor input object example

```json
{
  "searchTerms": [
    "milk"
  ],
  "startUrls": [
    "https://www.aldi.com.au/special-buys"
  ],
  "maxResultsPerSource": 200,
  "onlySpecials": false,
  "includeDetails": false,
  "sortBy": "relevance"
}
```

# Actor output Schema

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

One item per product: price, unit price, pack size, category, Special Buy dates, images, optional description/ingredients/allergens.

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

Per-source result counts, Special Buys dates covered and any searches or URLs that returned nothing.

# 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"
    ],
    "startUrls": [
        "https://www.aldi.com.au/special-buys"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("stralium/aldi-au-products").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"],
    "startUrls": ["https://www.aldi.com.au/special-buys"],
}

# Run the Actor and wait for it to finish
run = client.actor("stralium/aldi-au-products").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"
  ],
  "startUrls": [
    "https://www.aldi.com.au/special-buys"
  ]
}' |
apify call stralium/aldi-au-products --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,stralium/aldi-au-products"
        }
    }
}
```

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/qHLn8CzNS3dP8v8kF/builds/rh3wvPLBaX9n7X9gV/openapi.json
