# ALDI UK Scraper - Prices, Categories & Ingredients (`vulnv/aldi-scraper`) Actor

Scrape the ALDI UK catalogue by category, keyword, brand or URL. Get in-store price, price per unit, pack size, offers, brand, full category trail, images, ingredients, storage instructions and 'free from' claims.

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

## Pricing

$2.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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## ALDI UK Scraper

Extract the **ALDI UK** product catalogue at scale - in-store price, **price per unit**, pack
size, offers, brand, the full category trail and images, plus the **ingredients, storage
instructions and "free from" claims** ALDI publishes - as clean, structured JSON.

Scrape by **category**, by **search keyword**, by **brand**, by pasting **aldi.co.uk URLs** -
or leave every field blank and sweep the **whole catalogue** (about 3,700 products).

### 🚀 How to use

1. Click **Try for free** / **Start**.
2. Type the **categories** you want (e.g. `Bakery`, `Fresh Food`) - or a **search keyword**, a
   **brand**, or paste **ALDI URLs**. Leave them all blank for the entire catalogue.
3. Set **Max products**.
4. Run the Actor and download results as **JSON, CSV, Excel, HTML or via API**.

### ✨ Features

- 💷 **Full pricing** - shelf price as a number and as ALDI displays it, plus the **price per
  unit** (per kg / litre / 100 g) that makes ranges comparable across retailers.
- 🏷️ **Offers** - the previous "was" price and the saving, wherever ALDI shows one.
- 📦 **Pack size and brand** on every product, e.g. `800 G` / `VILLAGE BAKERY`.
- 🗂️ **Category trail** - the product's full path, e.g. `Bakery > Bread`, from a live tree of
  more than 130 categories read straight from ALDI's own navigation.
- 🥗 **Back-of-pack label data** - **ingredients**, **"free from"** allergen claims, storage
  instructions, usage instructions, warnings and age restrictions.
- 🔎 **Search, browse or sweep** - keyword, category, brand and sort all work together, and an
  empty input returns the whole catalogue.
- 🖼️ **Ready-to-use images** - full-size image URLs with ALDI's size placeholders resolved.
- ⚡ **Efficient** - one listing request returns up to 60 products.
- 🛟 **Resilient** - a page that fails is retried and the sweep continues, results are stored as
  they land, and a short run says so in the log instead of looking complete.

### 🧭 Input

Every field is optional. With none of them set, the Actor sweeps the whole catalogue.

| Field | Type | Description |
|-------|------|-------------|
| `categories` | array | Category names as shown on the site, e.g. `Bakery`, `Bread`. A numeric category id works too. |
| `keyword` | string | Search the catalogue for a term, e.g. `oat milk`. Combines with a category. |
| `brands` | array | Brand names exactly as they appear on products, e.g. `COWBELLE`. Case matters. |
| `urls` | array | ALDI product or category URLs. |
| `maxItems` | integer | Stop after this many products across the run. Default `200`. |
| `maxCategories` | integer | How many matched categories to collect from. Default `25`. |
| `sort` | string | `relevance`, `name_asc`, `name_desc`, `price_asc` or `price_desc`. |
| `onlyUnique` | boolean | Drop repeats across categories and searches. Default `true`. |

#### Example input

```json
{
  "categories": ["Bakery"],
  "maxItems": 500
}
```

The whole ALDI UK catalogue:

```json
{
  "maxItems": 5000
}
```

The 20 cheapest items in a category:

```json
{
  "categories": ["Food Cupboard"],
  "sort": "price_asc",
  "maxItems": 20
}
```

### 📤 Output

One record per product. Abridged example:

```json
{
  "sku": "000000000000381829",
  "name": "Honey Soaked Sliced Seeded Bloomer",
  "brand": "VILLAGE BAKERY",
  "sellingSize": "800 G",
  "url": "https://www.aldi.co.uk/product/village-bakery-honey-soaked-sliced-seeded-bloomer-000000000000381829",

  "currency": "GBP",
  "price": 1.49,
  "priceText": "£1.49",
  "unitPrice": 0.19,
  "unitPriceText": "£0.19/100 G",
  "onOffer": false,
  "wasPriceText": "",
  "savingsText": "",

  "department": "Bakery",
  "category": "Bread",
  "categoryPath": "Bakery > Bread",
  "categoryId": "1588161416978049001",

  "imageUrl": "https://dm.emea.cms.aldi.cx/is/image/aldiprodeu/product/jpg/scaleWidth/1500/...",

  "description": "Soft and seeded for your enjoyment.\nWeight: 800g (approx.)\nNo artificial flavourings\nBaked in Britain\nHigh in Fibre",
  "ingredients": "Wheat Flour (Wheat Flour, Calcium Carbonate, Iron, Niacin, Thiamin), Water, ...",
  "freeFrom": "Milk, eggs",
  "storageInstructions": "Store in a cool, dry place away from strong odours and direct sunlight.",
  "countryOfOrigin": "",
  "ageRestriction": null,

  "scrapedAt": "2026-08-02T12:00:00+00:00"
}
```

The flat fields are what the dataset table and the CSV/Excel exports show. `priceDetail`,
`nutritionalClaims` and `rawCategories` keep ALDI's original objects for programmatic use.

#### Dataset views

- **Products** - price, price per unit, pack size and category for every product.
- **Ingredients & label data** - the back-of-pack fields.

### 💡 Use cases

- **Grocery price monitoring** - track ALDI shelf prices and price per unit over time.
- **Competitor analysis** - benchmark a range against the UK's largest discounter.
- **Catalogue enrichment** - pull images, descriptions and pack sizes into your own data.
- **Dietary and allergen filtering** - build "free from" product lists from ALDI's own claims.
- **Range tracking** - spot new lines and delistings across the whole catalogue.

### 📋 Notes and limits

- **ALDI UK is a browse-only catalogue.** ALDI does not sell groceries online in the UK, so the
  data is the in-store range and its shelf prices. There is no per-store stock level and no
  delivery availability to report, and the Actor does not invent one.
- **A listing request returns up to 60 products**, which is ALDI's own maximum - the API rejects
  a larger page size outright rather than clamping it.
- **The catalogue is about 3,700 products in total.** ALDI's own result counter runs slightly
  ahead of the products it will actually serve, so a full sweep finishing a few short of the
  advertised number is normal.
- **Label data is published for part of the range.** Roughly half of ALDI's products carry
  ingredients, and there is **no nutrition table** anywhere in ALDI's published data. Every
  product in a run is looked up, so an empty `ingredients` means ALDI publishes none - it never
  means the lookup was skipped.
- **ALDI's own text is passed through verbatim.** A handful of products have ingredients that
  are truncated at source; the Actor reports exactly what ALDI publishes rather than quietly
  repairing or dropping it.
- **Allergens come from `freeFrom`.** ALDI carries allergen information as "free from" claims
  rather than a structured allergen list.
- **Brand names are case-sensitive** and are written in capitals, e.g. `SPECIALLY SELECTED`.
- Some top-level categories are merchandising collections (`Price Drops`, `Specially Selected`,
  `Picky Bits`) whose products also sit in a real department, so their counts overlap.

### 💳 Pricing

This Actor is monetized **pay-per-event**: a flat rate per product returned, and nothing else -
no Actor start fee and no platform usage charges. Free-plan users can try it with a capped
sample per run. See the **Pricing** tab for the current rate.

### ❓ FAQ

**Is scraping ALDI data legal?**
The Actor collects only publicly available product information published on ALDI's website. It
reads no personal data and needs no login. As with any scraping, use the data responsibly and
in line with applicable laws and the site's terms.

**Is this an official ALDI product?**
No. This is an unofficial Actor and is not affiliated with, endorsed by, or sponsored by ALDI.
"ALDI" is a trademark of its respective owner.

**Can I get the whole catalogue?**
Yes. Leave `categories`, `keyword`, `brands` and `urls` blank and set `maxItems` high enough -
about 3,700 covers everything.

**Is there nutrition data?**
No. ALDI UK does not publish per-100 g nutrition tables. You get ingredients, "free from"
claims, storage and usage instructions where ALDI provides them.

**How do I test cheaply?**
Set `maxItems` to a small number, e.g. 5.

### 🛠️ Our Other Scrapers

Explore our full suite of scraping tools to power your data needs:

- **[Tesco UK & Ireland Scraper](https://apify.com/vulnv/tesco-scraper)** — Tesco groceries with GTIN barcodes, Clubcard prices and nutrition.
- **[Morrisons Groceries Scraper](https://apify.com/vulnv/morrisons-scraper)** — Morrisons prices, markdowns, allergens and nutrition.
- **[Sainsbury's Groceries Scraper](https://apify.com/vulnv/sainsburys-scraper)** — Sainsbury's prices, EAN barcodes and nutrition.
- **[Amazon Product Scraper](https://apify.com/vulnv/amazon-product-scraper)** — Extract Amazon product data, pricing and reviews.

📬 **Need help or have a feature request?** Contact us at <support@vulnv.com> or visit our [Apify profile](https://apify.com/vulnv).

# Actor input Schema

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

Category names as they appear on the site, e.g. 'Bakery', 'Fresh Food', 'Bread'. Naming a department collects that whole department. You can also paste a numeric category id.

## `keyword` (type: `string`):

Search the catalogue for a term, e.g. 'oat milk'. Combine it with a category to search inside that category.

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

ALDI brand names, exactly as they appear on products, e.g. 'COWBELLE', 'SPECIALLY SELECTED', 'VILLAGE BAKERY'. Case matters.

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

Product or category URLs to scrape.

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

Stop after this many products across the whole run. The entire ALDI UK catalogue is about 3,700 products. Free-plan users are capped at 50 per run.

## `maxCategories` (type: `integer`):

How many matched categories to collect from. The product budget is shared evenly between them, so no single category can consume the whole run.

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

How ALDI should order results before we take them. Useful with a small 'Max products' to grab, say, the cheapest items in a category.

## `onlyUnique` (type: `boolean`):

Drop repeats when the same product appears in more than one category or search.

## Actor input object example

```json
{
  "categories": [
    "Bakery"
  ],
  "keyword": "oat milk",
  "maxItems": 200,
  "maxCategories": 25,
  "sort": "relevance",
  "onlyUnique": true
}
```

# 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 = {
    "categories": [
        "Bakery"
    ]
};

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

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

```

## MCP server setup

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