# ALDI Stock Checker & API: Special Buys Stock by Store (`s_actors/aldi-stock-checker`) Actor

ALDI Australia stock checker and API: Special Buys stock at every store near your postcode (in stock, medium, low or none), plus prices, unit prices and on-sale dates. This week's Special Buys, search, categories or product links. Scheduled runs = restock alerts.

- **URL**: https://apify.com/s_actors/aldi-stock-checker.md
- **Developed by:** [Superior Actors](https://apify.com/s_actors) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.31 / 1,000 product rows

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 Stock Checker & API: Special Buys Stock by Store

**See which ALDI stores near any Australian postcode still have a Special Buy, the way aldi.com.au shows it: Stock available, Medium stock or Low/no stock.** Check this week's Special Buys (`latest`, `next`, `this week`, `upcoming` or a date like `2026-10-17`), a search (`air fryer`, `heater`), a category or exact product links, at up to 100 nearest stores per postcode, nearest first, with store address, suburb, state, distance and map link.

Every product also comes with price, unit price ($2.50 per 100 g), size, brand, **Special Buys on-sale date** ("On Sale Sat 17 Oct", "While Stocks Last"), category and image, so the same Actor is a full **ALDI Australia scraper** for prices and the Special Buys catalogue.

Scheduled runs with **Only report changes** become **ALDI restock alerts**: a row only when a store gets a product back in stock, its stock goes up or down, it sells out, a Special Buy goes on sale, the price changes, or a new product appears in your Special Buys, search or category.

Use cases: track products & prices, get deal & restock alerts, build Special Buys datasets for Australian deal sites. No login, no browser: an **ALDI stock checker** and **ALDI API** that returns JSON, CSV or Excel.

#### What makes it different

| | |
| --- | --- |
| 🏬 **Stock at every store near you** | The stock level ALDI shows for each store (`in_stock`, `medium_stock`, `low_or_no_stock`), up to 100 nearest stores per postcode, nearest first with distance in km; no other ALDI Actor has store stock |
| 🛒 **Special Buys by date** | `latest`, `next`, `this week`, `upcoming`, `all` or an exact date: every Wednesday and Saturday range ALDI still lists, past ones with what is left, future ones before they go on sale |
| 🔔 **Restock alerts** | `back_in_stock`, `restocked`, `low_or_sold_out`, `stock_down`, `on_sale_now`, `price_drop`, `price_rise`, `new_product`, store by store; unchanged rows are free |
| 📍 **Postcode in, stores out** | Any postcode (2000, 3000, 4000, 5000, 6000): store id, address, suburb, state, coordinates and Google Maps link |
| 📚 **Whole catalogue too** | Search, any category (`Milk`, `Limited Time Only`, `Lower Prices`, `Super Savers`, `Christmas`), five sort orders, every page to the end |
| 🔗 **Exact products** | Paste aldi.com.au product links or SKUs for a fixed watchlist |

#### Example

Input: Special Buys `latest` (Wed 14 Oct), postcode `2000` (Sydney CBD), 5 nearest stores. Real run, 15 Oct 2026:

| Product | Price | Darlinghurst 1.8 km | North Sydney 2.6 km | Broadway 2.8 km | Edgecliff 2.9 km | Waterloo 3.9 km |
| --- | --- | --- | --- | --- | --- | --- |
| French Dark Chocolate Truffles 400g | $9.99 | Medium | Stock available | Medium | Stock available | Low/no |
| Chicken Shawarma Meal Kit 810g | $14.99 | Medium | Medium | Low/no | Low/no | Low/no |
| Graphic Markers 60 Pack | $19.99 | Low/no | Low/no | Medium | Stock available | Low/no |
| A3 Light Pad | $29.99 | Low/no | Low/no | Low/no | Low/no | Medium |
| Wooden Art Box Set | $29.99 | Low/no | Low/no | Low/no | Low/no | Low/no |

20 Special Buys × 5 stores = 100 rows in 20 seconds: 39 "Stock available", 20 "Medium stock", 29 "Low/no stock", 12 without stock information at that store.

#### Input

| Field | What it does |
| --- | --- |
| **Special Buys** | `latest`, `next`, `this week`, `upcoming`, `all`, a date (`2026-10-17`) or a Special Buys link (`https://www.aldi.com.au/special-buys/2026-10-17`) |
| **Postcodes (store stock)** | Australian postcodes, e.g. `2000`; empty = prices only, no store stock |
| **Stores per postcode**, **Radius (km)** | 10 stores within 25 km by default; up to 100 stores and 200 km |
| **Search terms** | e.g. `air fryer`, `heater`, `milk` |
| **Categories** | A category link (`https://www.aldi.com.au/products/dairy-eggs-fridge/milk/k/1111111160`), path (`dairy-eggs-fridge/milk`) or name (`Milk`, `Limited Time Only`) |
| **Products** | Product links (`https://www.aldi.com.au/product/ambiano-3-5l-air-fryer-000000000000737588`) or SKUs (`737588`) |
| **Max products per query**, **Sort by** | 100 by default, 0 = all; relevance, price or name |
| **Only stores with stock**, **Only Special Buys**, **Maximum price** | Filters: you pay only for returned rows |
| **Only report changes**, **Monitor name** | Restock and price alerts for scheduled runs |

#### Output

| Field | Example |
| --- | --- |
| `name`, `brand`, `size`, `sku` | 3.5L Air Fryer, AMBIANO, null, 000000000000737588 |
| `stockStatus`, `stockText`, `hasStock` | `medium_stock` (also `in_stock`, `low_or_no_stock`, `no_info`, `not_on_sale_yet`), Medium stock, true |
| `storeId`, `storeAddress`, `storeSuburb`, `storeState`, `storePostcode` | G293, 100 Market Street, South Melbourne, VIC, 3205 |
| `distanceKm`, `storeLatitude`, `storeLongitude`, `storeMapUrl`, `postcode` | 1.9, -37.83, 144.96, Google Maps link, 3000 (the postcode you gave) |
| `price`, `unitPrice`, `unitMeasure`, `unitPriceText` | 4.99, 2.5, 100 g, $2.50 per 100 g |
| `isSpecialBuy`, `onSaleDate`, `onSaleText` | true, 2026-10-14, While Stocks Last (or "On Sale Sat 17 Oct") |
| `category`, `categoryPath`, `ageRestricted` | Biscuits & Cookies, Christmas > Biscuits & Cookies, false |
| `url`, `imageUrl` | aldi.com.au product page, image |
| `query`, `position`, `scrapedAt` | the Special Buys date, search, category or product the row came from, its place in the results |
| `change`, `previousStockStatus`, `previousPrice`, `priceChange` | back_in_stock, low_or_no_stock, 44.99, 0 (monitoring) |

Without postcodes each row is one product; with postcodes each row is one product at one store.

#### Pricing

Pay per event: **$0.001** per run and **$0.00039** per returned row ($0.39 per 1 000 rows). Apify Scale plan: $0.351 per 1 000, Business plan and above: $0.312 per 1 000.

| Example | Cost |
| --- | --- |
| This week's Special Buys (~85 products), no postcode | ~$0.03 |
| 20 Special Buys at 5 stores near a postcode (100 rows) | ~$0.04 |
| Restock alert: 10 products at 10 stores every hour, 5 changes a day | ~$0.026 a day (~$0.80 a month) |

#### FAQ

**How do I check ALDI stock in store?** Put the product link (or a search such as `air fryer`) and your postcode in the input. Each row is one nearby store with the stock level ALDI shows on its website: Stock available, Medium stock or Low/no stock.

**Is there an ALDI Special Buys stock checker for Australia?** Yes, this one: `latest` in **Special Buys** plus your postcode returns every product of the newest Special Buys range at every store near you, nearest first. Run it on Wednesday or Saturday morning before you go.

**Does ALDI have an API for prices and stock?** ALDI runs aldi.com.au on JSON endpoints, and this Actor calls them for you and returns clean rows, so you get a ready ALDI product and stock API without keys or setup. Call it from your code with the Apify API, or schedule it and download CSV / Excel.

**Why do regular groceries have no store stock?** ALDI Australia shows store stock only for Special Buys and other limited lines. Groceries get one row with price and unit price, and `stockStatus` empty.

**What does `not_on_sale_yet` mean?** The Special Buy goes on sale on a later date (`onSaleDate`): ALDI shows no store stock until then. Schedule the run with **Only report changes** to get `on_sale_now` when stock appears.

**Can I get alerts when an item is back in stock?** Yes: add the products or a Special Buys date, your postcode, turn on **Only report changes**, save it as a task and schedule it hourly or daily. Connect email, Slack or [Google Sheets](https://apify.com/s_actors/google-sheets-import-export) in Integrations.

**Which states are covered?** Every ALDI Australia store: NSW, ACT, VIC, QLD, SA and WA. ALDI has no stores in the NT and Tasmania.

#### Tips

- One stock request covers 10 stores: 10 stores per postcode = 1-2 requests per product.
- Use **Only stores with stock** to get only the stores worth the trip.
- For a restock watchlist, use **Products** with links: the same products every run. Use a separate **Monitor name** for each scheduled task.

#### Limits

- ALDI Australia (aldi.com.au) only.
- Stock is the level ALDI shows (three levels), not a unit count; ALDI publishes it only for Special Buys and limited lines.
- Prices are the aldi.com.au prices, the same in every store.

#### Other Australian supermarket tools

| Actor | What it does |
| --- | --- |
| [Coles vs Woolworths vs ALDI Price Comparison & API](https://apify.com/s_actors/coles-woolworths-aldi-price-comparison) | One shopping list priced at Coles, Woolworths and ALDI side by side: cheapest store per item, same-product matches, basket totals |
| [Coles Stock Checker & API](https://apify.com/s_actors/coles-stock-checker) | Exact stock count, prices and specials at every Coles store near a postcode, the whole specials catalogue, restock alerts |
| [Woolworths Scraper & API](https://apify.com/s_actors/woolworths-scraper) | Woolworths Australia prices, specials, half price and multibuy deals, stock, barcodes and nutrition |

#### For AI agents and API

```json
{
    "specialBuys": ["latest", "next"],
    "postcodes": ["2000", "3000"],
    "storesPerPostcode": 10,
    "products": ["https://www.aldi.com.au/product/ambiano-3-5l-air-fryer-000000000000737588"],
    "maxItemsPerQuery": 0,
    "inStockOnly": true,
    "onlyChanges": true,
    "monitorName": "aldi-restock"
}
```

Each row is one product at one store with `stockStatus`, `stockText`, `storeAddress`, `distanceKm`, `price`, `onSaleDate` and the product link.

# Actor input Schema

## `specialBuys` (type: `array`):

Special Buys ranges, one per line: "latest" (the newest on-sale date), "next" (the next one), "this week", "upcoming", "all" (every date ALDI still lists), a date (2026-10-17) or a Special Buys link (https://www.aldi.com.au/special-buys/2026-10-17).

## `postcodes` (type: `array`):

Australian postcodes, one per line (2000, 3000, 4000). For each, the stock of every product at the nearest ALDI stores. ALDI shows store stock only for Special Buys. Empty = prices only, no store stock.

## `storesPerPostcode` (type: `integer`):

How many of the nearest ALDI stores to check around each postcode.

## `radiusKm` (type: `integer`):

Only stores this close to the postcode.

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

What to search on aldi.com.au, one per line (e.g. "air fryer", "heater", "milk").

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

Whole ALDI categories, one per line: a category link (https://www.aldi.com.au/products/dairy-eggs-fridge/milk/k/1111111160), its path ("dairy-eggs-fridge/milk") or its name ("Milk", "Limited Time Only", "Lower Prices", "Super Savers", "Christmas").

## `products` (type: `array`):

Exact products, one per line: an aldi.com.au product link (https://www.aldi.com.au/product/ambiano-3-5l-air-fryer-000000000000737588) or its SKU (737588). Best for a restock watchlist.

## `maxItemsPerQuery` (type: `integer`):

How many products to take from each Special Buys date, search term or category. 0 = all of them.

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

The order of aldi.com.au, which decides the products taken when there is a limit.

## `inStockOnly` (type: `boolean`):

Return only stores showing "Stock available" or "Medium stock" (skips "Low/no stock" and products without store stock).

## `specialBuysOnly` (type: `boolean`):

Skip regular range products in searches and categories.

## `maxPrice` (type: `integer`):

Return only products at or below this price. Empty = any.

## `onlyChanges` (type: `boolean`):

For scheduled runs. The first run saves stock and prices; later runs return only what changed: back in stock, restocked, low or sold out, stock down, on sale now, price drops and rises, new products. You pay only for the changes returned.

## `monitorName` (type: `string`):

Separate monitors keep separate memory. Use a different name for each scheduled task.

## Actor input object example

```json
{
  "specialBuys": [
    "latest"
  ],
  "postcodes": [
    "2000"
  ],
  "storesPerPostcode": 5,
  "radiusKm": 25,
  "maxItemsPerQuery": 20,
  "sortBy": "relevance",
  "inStockOnly": false,
  "specialBuysOnly": false,
  "onlyChanges": false,
  "monitorName": "default"
}
```

# Actor output Schema

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

Each product at each store near your postcodes: stock level, address, distance.

## `products` (type: `string`):

Price, unit price, Special Buys date and category of every product.

## `changes` (type: `string`):

Monitoring: back in stock, restocked, low or sold out, price drops, new products.

## `stores` (type: `string`):

Store id, full address, coordinates and map link of every row.

## `all` (type: `string`):

Every field of every row.

# 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 = {
    "specialBuys": [
        "latest"
    ],
    "postcodes": [
        "2000"
    ],
    "storesPerPostcode": 5,
    "maxItemsPerQuery": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("s_actors/aldi-stock-checker").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 = {
    "specialBuys": ["latest"],
    "postcodes": ["2000"],
    "storesPerPostcode": 5,
    "maxItemsPerQuery": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("s_actors/aldi-stock-checker").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 '{
  "specialBuys": [
    "latest"
  ],
  "postcodes": [
    "2000"
  ],
  "storesPerPostcode": 5,
  "maxItemsPerQuery": 20
}' |
apify call s_actors/aldi-stock-checker --silent --output-dataset

```

## MCP server setup

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

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/DkduZ1e4q6c2JQKXO/builds/HsDAe7q38If8DBT0s/openapi.json
