# ALDI Australia Scraper: Grocery Prices & Specials (`devrod/aldi-com-au-products`) Actor

Scrape ALDI Australia grocery products and prices from any category: name, brand, pack size, shelf price, unit price per kg or 100 g, and Special Buys on-sale dates. Unofficial.

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

## Pricing

from $1.20 / 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.
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 Products & Prices (unofficial)

Reads products and prices from the category pages of
[aldi.com.au](https://www.aldi.com.au). This Actor is unofficial and is not
affiliated with or endorsed by ALDI.

### What it does

Give it one or more ALDI Australia category pages. It reads every page of each
category, from the first, and returns one item per product: the name, the brand
where there is one, the pack size, the shelf price, the comparison price per
kilo, 100 g or item, any label such as the date a Special Buy goes on sale, the
product image and the product's own page.

It reads the category listings only; it does not open each product's page, and
it does not use ALDI's search, which the site asks robots to leave alone.
Requests are paced at no more than two at a time and sixty a minute.

### Input

| Field          | Type             | Default            | Meaning                                              |
| -------------- | ---------------- | ------------------ | ---------------------------------------------------- |
| `categoryUrls` | list of addresses | Fruits & Vegetables | Category pages, copied from the browser's address bar. |
| `maxItems`     | integer          | 100                | Stop after this many products across all categories. |

```json
{
  "categoryUrls": ["https://www.aldi.com.au/products/fruits-vegetables/k/950000000"],
  "maxItems": 40
}
```

Addresses that are not ALDI Australia category pages are ignored, and a page
number in an address is dropped, so a category is always read from its start.
If none of the addresses you give is a category page, the run reads nothing and
returns no results; leave the field out to read Fruits & Vegetables.

### Output

One dataset item per product:

```json
{
  "sku": "000000000000364044",
  "name": "Red Seedless Grapes per kg",
  "brand": null,
  "packSize": "approx. 0.9 kg per piece",
  "priceAud": 9.89,
  "unitPriceAud": 10.99,
  "unitPriceUnit": "1 kg",
  "badge": null,
  "imageUrl": "https://dm.apac.cms.aldi.cx/is/image/aldiprodapac/product/jpg/scaleWidth/232/21fc6e90-eef6-46ab-8ee2-acc522a6c7d6/Red%20Seedless%20Grapes%20per%20kg",
  "url": "https://www.aldi.com.au/product/produce-branded-red-seedless-grapes-per-kg-000000000000364044",
  "categoryUrl": "https://www.aldi.com.au/products/fruits-vegetables/k/950000000"
}
```

| Field           | Type           | Notes                                                          |
| --------------- | -------------- | -------------------------------------------------------------- |
| `sku`           | string or null | ALDI's product number, from the product's address.             |
| `name`          | string         | Always present.                                                |
| `brand`         | string or null | Fresh produce usually has none.                                |
| `packSize`      | string or null | What the shelf price buys.                                     |
| `priceAud`      | number or null | Australian dollars, GST included.                              |
| `unitPriceAud`  | number or null | The comparison price, per `unitPriceUnit`.                     |
| `unitPriceUnit` | string or null | For example `1 kg`, `100 g` or `1 each`.                       |
| `badge`         | string or null | A label on the product, such as a Special Buy's on-sale date.  |
| `imageUrl`      | string or null | The product image.                                             |
| `url`           | string         | Always present.                                                |
| `categoryUrl`   | string         | The category the product was listed in, without a page number. |

### Pricing

You pay per result: a small fixed charge when a run starts, and a charge for each
product written to the dataset. The run stops when it reaches `maxItems` or the
spending limit you set, whichever comes first, so a run never costs more than
you allowed.

### Limits

- Prices are the ones the website shows without a store chosen; a particular
  store's shelf may differ.
- For products sold by weight, the shelf price is for the approximate weight
  shown in `packSize`; `unitPriceAud` is the price per kilo.
- Special Buys appear in their categories only while ALDI lists them.
- If ALDI changes its pages, the Actor returns fewer fields or none until it is
  repaired.

# Actor input Schema

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

ALDI Australia category pages to read, as they appear in the browser, for example https://www.aldi.com.au/products/fruits-vegetables/k/950000000. Every page of each category is read, from the first.

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

Stop after this many products across all categories. Each product is one result.

## Actor input object example

```json
{
  "categoryUrls": [
    "https://www.aldi.com.au/products/fruits-vegetables/k/950000000"
  ],
  "maxItems": 40
}
```

# Actor output Schema

## `results` (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/fruits-vegetables/k/950000000"
    ],
    "maxItems": 40
};

// Run the Actor and wait for it to finish
const run = await client.actor("devrod/aldi-com-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 = {
    "categoryUrls": ["https://www.aldi.com.au/products/fruits-vegetables/k/950000000"],
    "maxItems": 40,
}

# Run the Actor and wait for it to finish
run = client.actor("devrod/aldi-com-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 '{
  "categoryUrls": [
    "https://www.aldi.com.au/products/fruits-vegetables/k/950000000"
  ],
  "maxItems": 40
}' |
apify call devrod/aldi-com-au-products --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,devrod/aldi-com-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/383r72MQB8Ju1oNlj/builds/xNjg1LPdRYpUOCwtT/openapi.json
