# ALDI Australia Products & Prices Scraper (`fetch_cat/aldi-australia-products-scraper`) Actor

Collect public ALDI Australia grocery prices, categories, specials and product details for comparison and price monitoring.

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

## Pricing

from $1.05 / 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

Collect public **ALDI Australia products and prices** for grocery comparisons, catalogue research and price histories. Search by keyword, choose a category or paste ALDI product and Special Buys URLs. Results include stable product IDs, AUD prices, unit pricing, pack sizes, categories and images, with optional product details.

### Quick start

Enter a keyword and a small global product limit, then start the Actor:

```json
{
  "searchTerms": ["milk"],
  "maxItems": 20,
  "fetchDetails": true
}
```

ALDI's keyword search can include related products such as milk chocolate. For a precise milk comparison, use `categories: ["1111111160"]` instead of `searchTerms`.

Prefer a video guide? This short Apify walkthrough shows you how to set up and run an Actor. It uses a different Actor, but the setup steps are the same.

https://youtu.be/1OW8gOqlZbY?t=25

### What you get

- **Product prices:** numeric AUD prices, previous prices when supplied, savings and ALDI's unit-price display.
- **Catalogue coverage:** keyword searches, current categories, whole-catalogue URLs and dated Special Buys listings, continuing through available pages until your limits.
- **Product context:** brand, selling size, category hierarchy, image gallery, promotion dates and source flags.
- **Optional details:** available descriptions, ingredients, nutritional claims, origin, storage and usage information.
- **Comparison-ready records:** stable SKU, content fingerprint, observation time and source URL, plus a summary showing whether each scan completed.

### Who is it for?

**Australian grocery analysts** can join products by SKU and compare price and pack size across collection dates.

**Catalogue and retail teams** can inspect current grocery categories and promotional ranges. **Data engineers** can export the records or pass them into their own comparison and alerting workflows.

### Input recipes and settings

| Setting | Purpose |
| --- | --- |
| `searchTerms` | One or more ALDI keyword searches. |
| `categories` | Exact current category names, paths or numeric keys. |
| `urls` | Public ALDI product, category, search, catalogue or Special Buys links. |
| `maxItems` | Global saved-product cap, from 1 to 5,000. Default 50. |
| `maxPages` | Page cap per target, from 1 to 334. |
| `fetchDetails` | Add available full product information. Direct product URLs always include details. |
| `sortBy` | Source relevance, name or price ordering. |
| `brands`, `themes` | Source filters using exact current labels. |
| `minPrice`, `maxPrice`, `onSaleOnly` | Keep products meeting your price or promotion criteria. |
| `excludeCategories` | Exclude exact category names or paths in each product's own hierarchy. |
| `previousProducts`, `emitUnchanged` | Compare public SKU/fingerprint pairs against an explicit baseline. |

With no keywords, categories or URLs, the Actor starts from the whole catalogue, still limited by `maxItems`. You can combine targets, with up to 50 total. Products found more than once are saved once, attributed to the first source that returned them.

**Category recipe:**

```json
{
  "categories": ["1111111160"],
  "sortBy": "price_asc",
  "maxItems": 50,
  "fetchDetails": true
}
```

**Current Special Buys recipe:**

```json
{
  "urls": ["https://www.aldi.com.au/special-buys"],
  "maxItems": 100
}
```

The landing URL discovers ALDI's current dates and themes, then collects theme-scoped products. `matchedThemes` records the first matching scope. It is not an exhaustive list of every theme a product could belong to. You can also paste a specific dated link. URL filters take precedence over the equivalent inputs. Current `brandName`, `categoryTree`, `theme`, `sort` and `page` parameters are supported. The older `brand-name` and `category-tree` spellings are normalized to the current source parameters.

### Output data

Each dataset row represents one real product.

| Field group | Meaning |
| --- | --- |
| `sku`, `abstractSku`, `name`, `brand`, `url` | Product identity and public product link. |
| `price`, `currency`, `wasPrice`, `savingsAmount`, `savingsPercent` | Numeric AUD pricing and available discount information. |
| `unitPrice`, `unitPriceDisplay`, `sellingSize` | Compare unit prices together with the displayed unit and pack size. |
| `categories`, `categoryPath` | The product's own category hierarchy. |
| `matchedThemes` | First matching requested or discovered theme scope. Empty outside theme-scoped collection. |
| `onSale`, `onSaleDate`, `onSaleDateDisplay` | Promotional indicators and dates supplied by ALDI. |
| `images`, `imageUrl` | Image gallery and main image link. |
| `notForSale`, `discontinued` | Source flags, not a guarantee of physical-store stock. |
| `detailFetched`, `description`, `ingredients`, `nutritionalClaims` | Available detail enrichment. Missing source values remain null. |
| `fingerprint`, `sourceUrl`, `scrapedAt` | Content comparison key, discovery source and observation time. |
| `changeType` | With a baseline, `NEW`, `UPDATED` or `UNCHANGED`. |

The run's key-value store contains `RUN_SUMMARY` with per-target totals, completion and stop reasons. Where used, `CATEGORY_TREE`, `SPECIAL_BUYS_CALENDAR` and `FILTERS_n` provide current discovery information without adding product rows.

#### Download your results

Open your run's dataset, choose **Export** and select JSON, CSV or Excel. JSON keeps nested fields together. CSV and Excel are useful when you want to review the records in a spreadsheet.

See [Apify's download and export guide](https://docs.apify.com/storage/dataset#apify-console) for the available formats and field options.

### Pricing

The `apify-actor-start` event is charged when a run starts, including runs that find no products.

Product charges apply to real products saved to the dataset. Duplicate products, rejected products and suppressed unchanged records do not add product charges. Requested detail enrichment is included in the product charge.

See the [live Pricing tab](https://apify.com/fetch_cat/aldi-australia-products-scraper/pricing) for current rates and discounts.

### Tips for best results

- **Use categories for precise comparisons.** Keyword searches can include loosely related products.
- **Start with a small cap.** Inspect the returned fields before requesting a larger refresh.
- **Read the scan summary.** A successful capped run is not a complete catalogue snapshot.
- **Compare like with like.** Keep detail and filtering settings consistent when reusing fingerprints.

### Limits and caveats

- Public ALDI Australia data only. No login, member data, checkout or private store-stock access.
- `notForSale` does not mean an item is unavailable in a physical store. On-sale dates do not guarantee stock. `onSale` can indicate a promotional date or badge, not necessarily a reduced price.
- Ingredient, origin and other detail fields can be missing at the source. This Actor does not infer them.
- Item/page caps and a finite processing allowance bound each run. Slow or highly selective scans can return fewer than `maxItems`, especially when most products are filtered or unchanged. A `workBudget` stop means an incomplete scan, **not** no matches or expired products. Inspect `RUN_SUMMARY` before treating results as a complete snapshot.
- Blocking responses, broken listings and failed required details are reported as failures rather than false no-results successes. Earlier useful rows can remain available.
- Searches with no source matches and explicit unavailable product pages can finish successfully without product rows, with truthful reasons in the summary.
- Fingerprint comparison never declares missing products expired. An incomplete scan cannot prove that a product disappeared.
- An interrupted run is not automatically resumed by resurrecting it. Start a new run with an explicit baseline to avoid returning unchanged products.

### Automation and integrations

#### Save your settings for next time

Once you have an input that works for you, [save it as an Apify task](https://docs.apify.com/actors/running/tasks). This keeps your settings together so you can use them again without filling in the form from scratch.

#### Run on a schedule

Apify supports [scheduling an Actor or saved task](https://docs.apify.com/actors/running/schedules). Each run collects the data again. Configure scheduling only in an account where you intend and authorize it.

For changed-only output, supply `previousProducts` as an array of `{ "sku": "<previous SKU>", "fingerprint": "<previous fingerprint>" }` pairs from your earlier results. Unchanged products are suppressed unless `emitUnchanged` is enabled. Comparison, history retention and alerts belong in your workflow. This Actor does not create schedules or retrieve another account's baseline.

#### Send results to your other tools

Use **n8n, Make or Zapier** to connect this scraper to the rest of your workflow. For example, you could pass its results to an AI assistant or add records to a spreadsheet. Follow the [Apify integration guides](https://docs.apify.com/integrations) for your chosen tool.

For a custom connection, an [Apify webhook](https://docs.apify.com/integrations/webhooks) can notify your app when a run finishes or fails. Your app can then fetch the results or handle the failure.

### API usage

Want to collect this data from your own app or automation? The examples below send input to the scraper and show how to collect its results.

The Node.js and Python examples wait for the run to finish before reading its results. The cURL example starts the run and returns its details. Wait for that run to finish, then use its `defaultDatasetId` to fetch the results.

For setup instructions, see Apify's [JavaScript client guide](https://docs.apify.com/api/client/js), [Python client guide](https://docs.apify.com/api/client/python) and [Actor runs API reference](https://docs.apify.com/api/v2/acts-runs-post).

#### cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/fetch_cat~aldi-australia-products-scraper/runs' \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"searchTerms":["milk"],"maxItems":20}'
```

#### Node.js

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('fetch_cat/aldi-australia-products-scraper').call({
  searchTerms: ['milk'], maxItems: 20
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### Python

```python
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('fetch_cat/aldi-australia-products-scraper').call(
    run_input={"searchTerms": ["milk"], "maxItems": 20}
)
for item in client.dataset(run['defaultDatasetId']).iterate_items():
    print(item)
```

### MCP and AI agents

You can ask your AI assistant to collect data with **ALDI Australia Products & Prices Scraper** and help you work with the results. The scraper returns the data, and your assistant can then summarize it, compare records or prepare notes.

Connect your assistant through the [Apify MCP server](https://mcp.apify.com/). MCP gives your assistant a way to find this scraper, run it and read the results. Follow the [official setup and sign-in guide](https://docs.apify.com/mcp) for your app.

#### Easier setup with an Apify plugin

If you use a supported coding assistant, the [official Apify plugin](https://docs.apify.com/agents/plugins) can set up the connection for you. It connects your assistant to Apify and includes instructions for common tasks. Follow the guide for your particular app.

#### Use Apify AI in Console

Prefer to keep everything in Apify? Open [Apify AI in Console](https://docs.apify.com/account/apify-ai) and ask it to find Fetch Cat's **ALDI Australia Products & Prices Scraper**. You can describe the data you want and ask questions about the results.

Apify AI is currently in beta. It asks for confirmation before starting an Actor, and normal run charges apply.

#### Choose your assistant

- **Claude and Claude Code (Anthropic):** [Apify setup guide](https://docs.apify.com/integrations/claude).
- **ChatGPT and Codex (OpenAI):** [Apify setup guides](https://docs.apify.com/integrations/openai).
- **Grok Bot (xAI):** [Apify plugin guide](https://docs.apify.com/integrations/grok-bot).
- **Gemini CLI (Google):** [MCP server setup guide](https://geminicli.com/docs/tools/mcp-server/). Use the server URL below with the HTTP configuration supported by Gemini CLI.

#### Connect just this scraper

To keep your setup focused on this scraper, add this server configuration to a compatible MCP client:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=fetch_cat/aldi-australia-products-scraper"
    }
  }
}
```

Sign in to Apify when your client asks. If your client uses a Bearer token instead, follow its setup guide and keep the token in its secure configuration. Configuration formats vary by app, so use the linked guide if your client needs a different format.

#### Use Apify's general server

Already connected to the general Apify MCP server at `https://mcp.apify.com`? You can use it to find this scraper without adding another server. Ask your assistant to use **ALDI Australia Products & Prices Scraper** by Fetch Cat, or give it the identifier `fetch_cat/aldi-australia-products-scraper`.

Your assistant can check the available settings and retrieve the results from the returned run. If the run is still working, it should follow that run rather than start it again. Both connection options use Apify's hosted service.

#### Example requests

- “Collect milk prices from ALDI Australia's milk category and make a table comparing pack sizes and unit prices.”
- “Get the products in ALDI Australia's current Special Buys listings and group them by their advertised on-sale dates.”
- “Collect product details for these public ALDI Australia links and summarize the ingredients and origin information that is actually available.”

Normal Apify charges apply. Check the [live Pricing tab](https://apify.com/fetch_cat/aldi-australia-products-scraper/pricing) before asking your assistant to run a larger batch.

### Pay with x402

If your AI agent has a funded wallet, it can pay for Apify usage through [x402](https://docs.apify.com/integrations/x402). This experimental option lets an agent use Apify without a conventional account.

[Apify AGI](https://agi.apify.com/) provides a prepaid API token with a spending cap after payment. Your agent can use that token to run this scraper through the Apify API or an authenticated MCP connection.

Direct per-request MCP payments are a separate route with platform pricing, permission and Standby requirements. That route has not been verified for this Actor. Use the prepaid API-token flow instead of assuming direct-payment eligibility.

Follow the official guide for wallet setup, supported payment options and current terms. Apify handles the payments. Keep wallet keys and payment tokens in your agent's secure configuration.

#### Other ways for agents to pay

Apify also supports **MPP** for prepaid access through AGI and **Skyfire** for eligible Actors. If your agent already uses one of these, see the [agentic payment guide](https://docs.apify.com/agents/payments) to choose the right setup.

### FAQ

**Why does a milk search include chocolate?**

These are ALDI's own search results. Use the milk category when you need milk products rather than all keyword matches.

**Does notForSale mean the store is out of stock?**

No. Normal priced ALDI groceries can carry this flag because they are not offered for online purchase. It is not a physical-store stock measurement.

**Can I download only products whose price changed?**

Supply an explicit SKU/fingerprint baseline from earlier output to return changed or new records. The fingerprint covers more than price. For price-only changes, compare the `price` field in your own history.

### Related Actors

- [Amazon Products & Search Scraper](https://apify.com/fetch_cat/amazon-products-search-scraper) — collect Amazon search listings and product details across marketplaces.
- [Walmart Products Scraper](https://apify.com/fetch_cat/walmart-products-scraper) — collect Walmart product prices, ratings, sellers and public product links.
- [Costco Products Scraper](https://apify.com/fetch_cat/costco-products-scraper) — collect public Costco search, category and product-page data for retail comparisons.
- [AliExpress Products Scraper](https://apify.com/fetch_cat/aliexpress-products-scraper) — collect marketplace product prices, shipping details and seller links for sourcing comparisons.
- [eBay Marketplace Scraper](https://apify.com/fetch_cat/ebay-marketplace-scraper) — collect active listings with prices, shipping and seller information across supported eBay marketplaces.

### Support and feedback

For custom additions or integrations, email <hello@fetchcat.dev>.

Found an error or have a feature request? [Open an issue](https://apify.com/fetch_cat/aldi-australia-products-scraper/issues) with the run URL, a non-sensitive input example and what you expected.

Need help sharing it? See [Apify’s guide to sharing a run when reporting an issue](https://docs.apify.com/account/collaboration/general-resource-access#automatically-sharing-runs-via-actor-issues). Sharing a run can give the developer access to its input, logs and results, so use a run that contains no sensitive data. Please leave out API tokens, passwords, cookies, private documents and personal data. Use a public sample URL or a redacted example instead.

Tried this scraper? We'd love to hear how it worked for you. [Leave a review](https://apify.com/fetch_cat/aldi-australia-products-scraper/reviews) to help others choose the right tool and help us improve it. Your feedback means a lot to us.

Made with care for curious people, AI agents and the possibilities in data. ♥

# Changelog

This Actor's version history is a separate document: https://apify.com/fetch_cat/aldi-australia-products-scraper/changelog.md

# Actor input Schema

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

ALDI keyword searches, for example milk or coffee. The source can match any word and milk can include milk chocolate. Leave empty to use categories/URLs or the whole catalogue.

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

Exact current category name, path or key, for example Dairy, Eggs & Fridge, dairy-eggs-fridge/milk or 1111111160. Names are resolved from ALDI's current tree, saved as CATEGORY_TREE.

## `urls` (type: `array`):

HTTPS aldi.com.au product, category, /products, /results?q=..., /special-buys or dated Special Buys URLs. Source brand-name/theme/category-tree/sort/page query parameters are preserved. URL filters override the corresponding inputs. No credentials or other hosts.

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

Global maximum saved products across all targets, after deduplication and filtering. This is not per search. A capped run is explicitly marked incomplete. Zero/unlimited is not supported.

## `maxPages` (type: `integer`):

Safety cap on source listing pages per search, category or dated Special Buys scope. ALDI currently returns 30 products per page. Source exhaustion, Max products and the independent runtime/request ceilings can stop earlier.

## `fetchDetails` (type: `boolean`):

Add available descriptions, ingredients, nutrition/allergen claims, origin, storage, usage and full image data. Adds one request per listing product. Direct product URLs always return details. Missing source fields remain null.

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

Applied by ALDI before the item cap. A URL's own sort parameter takes precedence.

## `brands` (type: `array`):

Source brand filter, using exact ALDI brand names. A URL brand-name parameter takes precedence. Available source filters are saved in FILTERS_n.

## `themes` (type: `array`):

Source theme filter, using exact current names such as Pet Essentials. A URL theme parameter takes precedence.

## `excludeCategories` (type: `array`):

Exclude an exact category name or path in the product's own category hierarchy. Filtered products are not saved or billed.

## `minPrice` (type: `number`):

Only save products with a known price at least this amount. Must not exceed Maximum price.

## `maxPrice` (type: `number`):

Only save products with a known price no greater than this amount. Must not be less than Minimum price.

## `onSaleOnly` (type: `boolean`):

Keep products with a was-price, on-sale date or source promotional category. An on-sale date is not proof of current store availability.

## `previousProducts` (type: `array`):

Explicit baseline of sku/fingerprint pairs from earlier output. Adds NEW, UPDATED or UNCHANGED changeType. By default unchanged products are suppressed and not billed. Use the same fetchDetails and filters for comparable fingerprints. No automatic schedules, cross-account reads or expired-product inference.

## `emitUnchanged` (type: `boolean`):

With previousProducts, also save and bill unchanged products. Ignored without a baseline.

## Actor input object example

```json
{
  "searchTerms": [
    "milk"
  ],
  "maxItems": 50,
  "maxPages": 334,
  "fetchDetails": false,
  "sortBy": "relevance",
  "onSaleOnly": false,
  "emitUnchanged": false
}
```

# Actor output Schema

## `products` (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 = {
    "searchTerms": [
        "milk"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("fetch_cat/aldi-australia-products-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 = { "searchTerms": ["milk"] }

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,fetch_cat/aldi-australia-products-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/D8ZRORUqTWbPiB5e8/builds/eel6lhSI216slVkJ4/openapi.json
