# ALDI Ireland Product Scraper — Prices, Unit Prices, Specialbuys (`architekture/aldi-ie-scraper`) Actor

Scrape ALDI Ireland products by keyword, category or SKU: EUR prices, was-prices, unit prices, Specialbuys dates, ingredients and allergens. Misses never charged. Pay per result.

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

## Pricing

from $1.00 / 1,000 products

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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 Ireland Product Scraper — Prices, Unit Prices, Specialbuys

**Recorded 18 Oct 2026 from Apify datacenter IPs: a "milk" search on aldi.ie returned all 86 products in 2 requests, and the Chilled Food category listed 578. Every row had a price in euro, a unit price and its category. Nothing was blocked across a 20-request burst.**

From **Architekture**, makers of the ALDI AU, Tesco UK, Woolworths, Coles, Pak'nSave and New World scrapers.

Search aldi.ie by keyword, browse by category or look up SKUs, and get clean JSON for each product: name, brand, pack size, price, was-price, saving, unit price, category path, image and product URL. Turn on details to add ingredients, allergens, storage instructions and nutritional claims. It uses ALDI Ireland's own public product API, with no browser and no residential proxy.

🤖 **Built for AI workflows.** Every row is deterministic, schema-stable JSON — feed it straight to LLM apps, RAG pipelines, or agent tool calls via the Apify API, the Apify MCP server (`mcp.apify.com`), or AI coding agents like Claude Code and Cursor.
| 🏪 Retailer | 📍 Market | 💰 From | 🔑 Standout fields |
|---|---|---|---|
| ALDI | Ireland 🇮🇪 | $1.00 / 1,000 products | Ingredients, allergens, storage |

### 🚀 Why choose this actor

- 🗂️ **Built for Ireland, in euro.** `currency: "EUR"`, Irish categories (Chilled Food, Food Cupboard, Specialbuys, Savers), and Irish product URLs.
- 💸 **The Irish grocery schema.** Field names are the same as in the other Architekture Ireland grocery actors, so one pipeline reads them all: `price`, `wasPrice`, `onSale`, `unitPrice` with `unitPriceLabel`, `availability`, `categoryPath`.
- 💸 **Sale detection.** A row gets `wasPrice` only when it is above today's price, plus ALDI's own `savingsText` (e.g. `"7%"`).
- 📈 **Specialbuys dates.** `onSaleDate` / `onSaleDateText` on products ALDI schedules for a date.
- 💸 **Pay only for real detail.** With `includeDetails` on, a row is charged as `product-detail` only when ALDI actually returned ingredients, allergens or similar. If it didn't, the row is a plain `product`.
- 💸 **Never pay for misses.** An unknown category, an unknown SKU or a blocked request gets one free status row, never a charge.

### ⚠️ Worth knowing up front

- 💸 **ALDI Ireland does not sell groceries online.** The API lists the in-store range, so every product comes back with `availability: "in_store_only"`. Prices are ALDI's national shelf prices.
- 🔬 **No barcodes (EAN/GTIN) and no per-100 g nutrition table.** ALDI does not publish them. You get `nutritionalClaims` only where ALDI lists them.
- 💸 **No stock levels**, and no prices for individual stores.
- 🔬 **Detail is sparse on some products.** For example, ALDI's protein milk lists ingredients "1% Fat" and storage instructions, but no description. We pass on what ALDI publishes and never fill gaps.

### ⚡ Try the example

```json
{
  "searchTerms": ["milk"],
  "maxItemsPerQuery": 60
}
```

Add `"includeDetails": true` for ingredients and allergens, or `"categories": ["Chilled Food"]` for a whole aisle.

### ⚙️ Input parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `searchTerms` | array | — | Keywords, e.g. `milk`, `coffee pods`. Up to 50 terms + categories. |
| `categories` | array | — | Category name (`Chilled Food`, `Milk`), slug (`chilled-food/milk`) or aldi.ie category URL. |
| `skus` | array | — | SKU (`422541` or `000000000000422541`) or aldi.ie product URL. Always returns detail fields where ALDI has them. Up to 500. |
| `maxItemsPerQuery` | integer | `100` | Cap per search term or category. `0` = everything (up to 5,000). |
| `includeDetails` | boolean | `false` | Adds ingredients, allergens, storage, usage, nutritional claims and description. One extra request per product. |
| `sort` | select | `relevance` | `relevance`, `price_asc`, `price_desc`, `name_asc`, `name_desc`. |
| `proxyConfiguration` | proxy | Apify datacenter | Blocked or rate-limited requests are retried on a fresh IP. |
| `feedback` | string | — | A note to the maintainers. Read by a human. |

Results are de-duplicated by SKU across every term, category and SKU in a run, so a product found twice is delivered and charged once. SKUs you list are fetched first, so they always come back with their detail fields.

### 🧱 Stable fields for automations

Product rows have `recordType: "product"`; status rows have `recordType: "query"`. Fields are **omitted, never `null`**, when ALDI does not publish them. New fields are only ever added.

| Field | Meaning |
|---|---|
| `recordType`, `retailer` | `product`; `"ALDI IE"`. |
| `sku`, `name`, `brand`, `size` | 18-digit ALDI SKU, product name, brand, pack size (e.g. `"1 l"`). |
| `price`, `currency` | Current shelf price (float), `"EUR"`. |
| `wasPrice`, `onSale`, `savingsText` | Previous price, sale flag, ALDI's saving label. |
| `unitPrice`, `unitPriceLabel` | Comparison price and its unit, e.g. `1.49` per `"1 L"`. |
| `availability` | `in_store_only`, `available`, `discontinued` or `unknown`. |
| `category`, `categoryPath` | `"Milk"`, `"Chilled Food > Milk"`. |
| `image`, `url` | 800 px product image, aldi.ie product page. |
| `onSaleDate`, `onSaleDateText` | Specialbuys date, where scheduled (ALDI-specific). |
| `source` | `{source: "search" \| "category" \| "sku", searchTerm?, category?, categoryUrl?, page?}`. |
| Detail rows: `description`, `ingredients`, `allergens`, `countryOfOrigin`, `storageInstructions`, `usageInstructions`, `nutritionalClaims`, `warnings` | Where ALDI publishes them. |
| Status rows: `query`, `status`, `reason` | `NOT_FOUND`, `BLOCKED` or `ERROR`, and why. |

### 📦 Output example

```json
{
  "recordType": "product",
  "retailer": "ALDI IE",
  "sku": "000000000000417675",
  "name": "Barista Style Oat Drink",
  "brand": "ACTILEAF",
  "size": "1 l",
  "price": 1.19,
  "currency": "EUR",
  "wasPrice": 1.29,
  "onSale": true,
  "savingsText": "7%",
  "unitPrice": 1.19,
  "unitPriceLabel": "1 L",
  "availability": "in_store_only",
  "category": "Milk",
  "categoryPath": "Chilled Food > Milk",
  "image": "https://dm.emea.cms.aldi.cx/is/image/aldiprodeu/product/jpg/scaleWidth/800/d8cfa282-c33b-4b48-880a-04492a5ad3f9/image",
  "url": "https://www.aldi.ie/product/actileaf-barista-style-oat-drink-000000000000417675",
  "source": { "source": "category", "category": "Chilled Food", "page": 1 }
}
```

With details on, the protein milk row also carries `"ingredients": "1% Fat"`, `"storageInstructions": "Keep refrigerated below 5°C."` and `"nutritionalClaims": [{"label": "May contain", "value": "Nuts"}]`. A category that does not exist returns:

```json
{ "recordType": "query", "query": "category:Nope", "status": "NOT_FOUND", "reason": "no ALDI IE category matches 'Nope'" }
```

### 🧠 Advanced usage

- 💸 **Weekly price tracking:** schedule the same categories weekly and join on `sku` to watch `price` and `wasPrice`.
- 💸 **Ireland price comparison:** run this alongside the other Architekture Ireland grocery actors. They share the same fields, so match products on normalised `name` + `size`.
- 🔬 **Allergen audits:** `skus` or `includeDetails` gives `allergens` and `ingredients` for a product list.
- 💸 **Completion check:** read `RUN_SUMMARY`, which has `status` (`COMPLETE`, `PARTIAL`, `NO_PRODUCTS`, `BUDGET_LIMIT`, `TIME_LIMIT`, `STATE_SAVE_FAILED`, `INVALID_INPUT`, `NOT_CONFIGURED`), `products`, `charged`, and `queries[]` (each with `status`, `delivered`, `listed`).

### 🔌 Integrations

Export as JSON, CSV or Excel; push to Google Sheets; trigger from Make, Zapier or n8n; get a webhook when a run finishes; schedule with the Apify Scheduler.

### 💸 How much does it cost?

1,000 products ≈ **$1.00**; with detail $4.00 / 1,000. Failed requests and misses are free. Platform usage is included.

### 💰 Pricing

| Event | Price | Covers |
|---|---|---|
| `product` | $1.00 / 1,000 | One product row |
| `product-detail` | $4.00 / 1,000 | One product row that came back with detail fields (ingredients, allergens, storage…) |

Platform usage is included. Status rows are free, and nothing is charged for failed requests. A run stops cleanly at your spending limit, with charges equal to rows delivered.

### ❓ FAQ

**Can I order or check stock?** No. ALDI Ireland has no online grocery shop, and the data is the in-store range at national prices.

**Why no barcode?** ALDI does not publish EANs in Ireland or Australia.

**What do I get for an SKU that no longer exists?** A free `NOT_FOUND` row.

### 🤖 For AI agents & LLM apps

`architekture/aldi-ie-scraper` returns ALDI Ireland products — name, brand, size, price in EUR, was-price, unit price, category, optionally ingredients and allergens — as deterministic, schema-stable JSON: one object per product, the same fields on every run, and the same field names as the other Architekture Ireland grocery actors. Invoke it from any agentic workflow via the Apify API or the Apify MCP server (`mcp.apify.com`) as a tool call. Pay-per-event billing means a run's cost is bounded before it starts: $1 per 1,000 products, or $4 per 1,000 for rows with detail fields (`includeDetails`, `skus`). `maxItemsPerQuery` caps each search or category, and a spending limit stops the run cleanly. Every query gets a machine-readable status in `RUN_SUMMARY`, and misses come back as free `recordType: "query"` rows, so an agent can branch on them instead of parsing logs. Honest limits: in-store range only, national prices, no barcodes, no stock.

Works out of the box with LangChain, LlamaIndex and AI coding agents — call it as a tool from Claude Code, Cursor, or any MCP client via `mcp.apify.com`.

### 🧰 More Architekture scrapers

- 📍 **Ireland:** ALDI IE (you are here) · [Dunnes Stores fashion & home](https://apify.com/architekture/dunnes-ie-scraper)
- **UK:** [Tesco UK](https://apify.com/architekture/tesco-uk-scraper) · [Sainsbury's UK](https://apify.com/architekture/sainsburys-uk-scraper)
- **Australia / New Zealand:** [ALDI AU](https://apify.com/architekture/aldi-au-product-scraper) · [Woolworths AU](https://apify.com/architekture/woolworths-au-product-scraper) · [Coles AU](https://apify.com/architekture/coles-au-product-scraper) · [Pak'nSave NZ](https://apify.com/architekture/paknsave-nz-scraper)
- 🔎 **E-commerce:** [Shopify Products](https://apify.com/architekture/shopify-products-scraper) · [AliExpress Search](https://apify.com/architekture/aliexpress-search-scraper)

### 🙋 Support

Open an Issue on this actor's page; a human replies within a day.

### ⚖️ Legal compliance

This actor reads publicly available product data from ALDI Ireland's public website API, without logging in. You are responsible for how you use the data, including ALDI's terms, intellectual property in product content and images, and data-protection law where it applies.

### 📝 Changelog

- 🔎 **2026-10-18**: 1.0. Search, category and SKU modes; shared Irish grocery schema; detail charged only when ALDI returns detail; free status rows; clean stops at spending limit and timeout; resumable after platform migration.

# Actor input Schema

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

Keywords to search on aldi.ie, e.g. milk or coffee pods. Results are de-duplicated by SKU across all terms and categories.

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

ALDI IE categories by name (Chilled Food, Milk), slug (chilled-food/milk) or aldi.ie category URL. A category that does not exist gets one free status row.

## `skus` (type: `array`):

Specific products by SKU (422541 or 000000000000422541) or aldi.ie product URL. Always returns detail fields where ALDI publishes them. Up to 500.

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

0 = everything (up to 5,000 per query).

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

One extra request per product. Rows that come back with detail fields are charged as product-detail; rows ALDI publishes no detail for are charged as product.

## `sort` (type: `string`):

Order in which ALDI returns results (matters when maxItemsPerQuery cuts a result set).

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

Apify datacenter proxy is the tested default. Blocked or rate-limited requests are retried on a fresh IP.

## `feedback` (type: `string`):

Tell the maintainers what you needed and did not get. Read by a human; does not change the output.

## Actor input object example

```json
{
  "searchTerms": [
    "milk"
  ],
  "maxItemsPerQuery": 60,
  "includeDetails": false,
  "sort": "relevance",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

One row per product; queries that found nothing or failed add one free recordType: query row.

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

RUN_SUMMARY: status per query and charges.

# 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"
    ],
    "maxItemsPerQuery": 60,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("architekture/aldi-ie-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"],
    "maxItemsPerQuery": 60,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("architekture/aldi-ie-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"
  ],
  "maxItemsPerQuery": 60,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call architekture/aldi-ie-scraper --silent --output-dataset

```

## MCP server setup

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