# ALDI UK Scraper: Prices, Price Drops & Specialbuys (`zaiq/aldi-uk-scraper`) Actor

Scrape ALDI UK (aldi.co.uk) products and prices: search, categories, Price Drops, Specialbuys with in-store dates, the whole range or product URLs. Gets price, was price, unit price, size, category and image. UK home connections. Failed lookups are free.

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

## Pricing

from $3.20 / 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.
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 UK Scraper: Prices, Price Drops & Specialbuys

Get products and prices from ALDI UK (aldi.co.uk) as structured data: price, was price, unit price, size, Price
Drops, and Specialbuys with their in-store dates, plus category and image. Search aldi.co.uk, read categories, the
Specialbuys calendar, Price Drops or the whole range, or look up products by URL or SKU.

The Actor reads the same product data the ALDI UK website loads for any visitor, through home (residential)
internet connections in Great Britain by default, and directly if those fail (ALDI serves every address the same
store prices). It does not log in and needs no account.

### What it does

- **Search** aldi.co.uk for any words.
- **Categories**: give a category page (or its key) and every product in it is read, 60 at a time.
- **Specialbuys**: every in-store date ALDI publishes (usually the last two weeks and the next two drops), the ones
  already in store, or only the ones coming. A Specialbuys page URL with a theme works too.
- **Price Drops**: every product on ALDI's Price Drops page, with the earlier price.
- **Whole range**: every product aldi.co.uk lists (3,974 on 4 October 2026).
- **Product lookups**: product page URLs or SKUs, 60 per request.
- **Details** (optional): description, ingredients, country of origin and allergens for each product.
- **One clean row per product**: a product found by two inputs is written and charged once.
- **Unit prices** normalised to a number and a unit (for example 1.38 per kg), and pack sizes normalised to grams,
  millilitres or items.
- **Run summary** in the key-value store (`RUN-SUMMARY`).

ALDI UK does not sell groceries online: its website shows store prices. Every row says whether the product is in
stores now or, for a Specialbuy, from which date.

### Who uses it

- **Price comparison and grocery apps** that need ALDI's shelf prices and unit prices.
- **Deal and Specialbuys sites** that publish each Thursday's and Sunday's Specialbuys ahead of time.
- **Analysts** comparing discounter prices with the big four supermarkets.

### Example

Runs on 4 October 2026, through UK home connections:

| Input | Result |
|---|---|
| Whole range | 3,974 products in 90 seconds (68 requests). ALDI reports 4,027; 3,974 is every product its listing returns (the same with two different sort orders). |
| Specialbuys, every date | 237 products across six in-store dates (24 September to 11 October 2026) in 11 seconds; 97 still to come. |
| Price Drops | 68 products, each with the earlier price where ALDI shows one. |
| Four searches (milk, cheese, chocolate, air fryer), maximum 400 | 400 products in 10 seconds. |
| Category pages (Milk; Food Cupboard; a Specialbuys theme page), maximum 1,000 | 1,000 products in 24 seconds. |

### Input

```json
{
  "searchTerms": ["milk"],
  "categoryUrls": ["https://www.aldi.co.uk/products/chilled-food/milk/k/1588161416978051001"],
  "productUrls": ["000000000000543221"],
  "specialBuys": "upcoming",
  "priceDrops": true,
  "wholeRange": false,
  "includeDetails": false,
  "maxItems": 100
}
```

| Field | What it does |
|---|---|
| `searchTerms` | Words to search for on aldi.co.uk. |
| `categoryUrls` | Category pages (`/products/.../k/<key>`), Specialbuys pages (`/special-buys/2026-10-08`, a `theme` in the address is kept) or category keys. |
| `productUrls` | Product page URLs or SKUs such as `000000000000543221`. Up to 5,000. |
| `specialBuys` | `none` (default), `all`, `in-store` (already in stores) or `upcoming`. |
| `priceDrops` | Read ALDI's Price Drops page. |
| `wholeRange` | Read every product aldi.co.uk lists. Set `maxItems` to 0 or high enough. |
| `offersOnly` | Keep only Price Drops, Specialbuys and products with an earlier price. The others are not charged. |
| `includeDetails` | Add description, ingredients, country of origin and allergens (one extra request per product; same price). |
| `maxItems` | Stop after this many products (default 100; 0 means no limit). |
| `proxyConfiguration`, `maxConcurrency` | UK home connections by default, direct if they fail; inputs worked on at once (default 4). |

### Output

One row per product. A row from the Price Drops page:

```json
{
  "retailer": "ALDI UK",
  "productId": "000000000000308242",
  "sku": "000000000000308242",
  "gtin": null,
  "name": "Macaroni Pasta 500g",
  "brand": "CUCINA",
  "size": "0.5 KG",
  "quantity": 500.0,
  "quantityUnit": "g",
  "packCount": null,
  "price": 0.69,
  "wasPrice": 0.72,
  "currency": "GBP",
  "unitPrice": 1.38,
  "unitPriceUnit": "kg",
  "memberPrice": null,
  "memberPriceProgram": null,
  "memberPriceValidFrom": null,
  "memberPriceValidTo": null,
  "onOffer": true,
  "promotionText": "Was £0.72",
  "promotionType": "price-cut",
  "offerStartDate": null,
  "offerEndDate": null,
  "promotions": [
    {"text": "Was £0.72", "type": "price-cut", "id": null, "validFrom": null, "validTo": null,
     "memberOnly": false, "requiredQuantity": null, "price": null}
  ],
  "available": true,
  "availability": "in_store",
  "availabilityText": "Sold in ALDI stores (not online)",
  "category": "Food Cupboard > Rice, Pasta & Noodles",
  "categoryPath": ["Food Cupboard", "Rice, Pasta & Noodles"],
  "imageUrl": "https://dm.emea.cms.aldi.cx/is/image/aldiprodeu/product/jpg/scaleWidth/600/3b2fda96-f8d0-4a89-860b-10f6c99fe6b3/Macaroni%20Pasta%20500g",
  "productUrl": "https://www.aldi.co.uk/product/cucina-macaroni-pasta-500g-000000000000308242",
  "rating": null,
  "reviewCount": null,
  "sponsored": false,
  "gtins": [],
  "description": null,
  "sourceType": "offers",
  "source": "Price Drops",
  "position": 2,
  "scrapedAt": "2026-10-04T16:08:21Z",
  "charged": true
}
```

- A Specialbuy has `promotionType` `special-buy`, `offerStartDate` = its in-store date, and `availability`
  `coming_soon` until that date (then `in_store`, "While Stock Lasts").
- ALDI does not publish barcodes, ratings or stock levels online, so those fields are empty.
- The same fields are used by our other UK grocery scrapers (Waitrose, Ocado, Lidl GB), so their data can be joined.

### Use it from code, automations and AI agents

- **API**: run it and get the results in one call: `POST https://api.apify.com/v2/acts/zaiq~aldi-uk-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN` with the input as JSON. The API tab on this page has ready-made Python, JavaScript and cURL examples.
- **Python** (`pip install apify-client`):

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_TOKEN")
run = client.actor("zaiq/aldi-uk-scraper").call(run_input={'searchTerms': ['milk'], 'maxItems': 20})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

- **No code**: connect it to Google Sheets, Zapier, Make or n8n from the Integrations tab, schedule runs in Apify Console, and get a webhook when a run finishes.
- **AI agents (MCP)**: add it as a tool to Claude, Cursor or any MCP client through Apify's MCP server: `https://mcp.apify.com?tools=zaiq/aldi-uk-scraper`.

### Pricing

**$4.00 per 1,000 products** (event `product-scraped`, $0.004 per product row). Apify platform usage is included.

You pay only for product rows with a price. Searches that find nothing, failed or blocked requests, products not
found, products found again by a second input and products without a price cost nothing. Examples: the 20-product
test input costs $0.08; the whole range (3,974 products) costs $15.90; all Specialbuys on the calendar (237) cost
$0.95.

### Limits

- Prices are ALDI's store prices as shown on aldi.co.uk; prices in some stores can differ.
- Specialbuys are sold while stocks last; the Actor reports the in-store date, not remaining stock.
- The Actor reads what the website shows; if ALDI changes its site, the Actor needs an update (failed inputs are
  free and listed in the run summary).
- Search text is cleaned before it is sent: markup and code characters such as `< > " ; = ( )` are removed and long
  text is cut to 73 characters (ALDI's own limit), because ALDI blocks or rejects them otherwise (the run summary lists every change).

### FAQ

**Does it need an ALDI account?** No. It reads public product data without logging in.

**When do new Specialbuys appear?** ALDI lists the next Thursday and Sunday drops in advance (on Sunday 4 October 2026
its calendar already showed 8 and 11 October). Schedule a run with `specialBuys` set to `upcoming` twice a week.

**Is it legal?** The Actor reads data the website shows to any visitor. Check ALDI's terms and the law that applies
to your use before you use the data.

This Actor is not affiliated with ALDI.

# Actor input Schema

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

Words to search for on aldi.co.uk, for example milk or air fryer.

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

ALDI UK category pages such as https://www.aldi.co.uk/products/chilled-food/milk/k/1588161416978051001, Specialbuys pages such as https://www.aldi.co.uk/special-buys/2026-10-08 (a theme in the address is kept), or category keys such as 1588161416978051001.

## `productUrls` (type: `array`):

Product pages such as https://www.aldi.co.uk/product/cowbelle-chocolate-milk-000000000000543221, or SKUs such as 000000000000543221. Up to 5,000.

## `specialBuys` (type: `string`):

Read Specialbuys by their in-store date, as ALDI publishes them (usually the last two weeks and the next two drops). Each row has the in-store date as its offer start date.

## `priceDrops` (type: `boolean`):

Read ALDI's Price Drops page: products whose price was cut, with the previous price.

## `wholeRange` (type: `boolean`):

Read every product aldi.co.uk lists (about 4,000 in October 2026). Set the maximum products to 0 or high enough.

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

The run stops after writing this many products. 0 means no limit. Each product is written and charged once, even when several inputs find it.

## `offersOnly` (type: `boolean`):

Keep only products with a promotion, a lower price than before, or a member price. Products left out are not charged.

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

Read each product's own record as well, for its description, ingredients, country of origin and allergens. One extra request per product; the price per product is the same.

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

UK home (residential) connections are the default (Apify Proxy, group RESIDENTIAL, country GB). ALDI's product data answers any address with the same store prices, so if the proxy cannot be used or keeps failing, requests go direct.

## `maxConcurrency` (type: `integer`):

How many inputs are worked on at the same time. The site is never sent more than this many requests at once.

## Actor input object example

```json
{
  "searchTerms": [
    "milk"
  ],
  "specialBuys": "none",
  "priceDrops": false,
  "wholeRange": false,
  "maxItems": 20,
  "offersOnly": false,
  "includeDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "GB"
  },
  "maxConcurrency": 4
}
```

# Actor output Schema

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

Dataset with one row per product: prices, offers, unit price, availability, category, image and page.

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

What each input found, products not found, why the run stopped, the UK connections used and the traffic.

# 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"
    ],
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "GB"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("zaiq/aldi-uk-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"],
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "GB",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("zaiq/aldi-uk-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"
  ],
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "GB"
  }
}' |
apify call zaiq/aldi-uk-scraper --silent --output-dataset

```

## MCP server setup

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