# Aldi NL Scraper (`sleepmodesystems/aldi`) Actor

Aldi product API alternative: the full aldi.nl assortment of ~2,800 products with price, Aldi's unit price, this week's and next week's aanbiedingen and special buys with dates, Beter Leven, Vegan, Biologisch and Nutri-Score seals. Every category checked against Aldi's own count. No proxy.

- **URL**: https://apify.com/sleepmodesystems/aldi.md
- **Developed by:** [Sleep Mode Systems](https://apify.com/sleepmodesystems) (community)
- **Security:** Limited permissions
- **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 NL Scraper extracts the full product assortment of Aldi Nederland (https://www.aldi.nl): prices, Aldi's own unit prices, **this week's and next week's deals (aanbiedingen) and special buys with their dates and deal prices**, sizes, descriptions, categories and Aldi's quality seals in fields: Beter Leven, Vegan, Biologisch, Nutri-Score, Planetproof, NIX18. Every run checks itself: each of Aldi's 197 category pages is compared with Aldi's own product count for it, and the last run read all of them in full.

**Price: $1.00 per 1,000 products. A full run reads all 2,797 products in under a minute to about 2 minutes on Apify, with no proxy.**

### What does the Aldi NL Scraper extract?

| Data     | Fields                                                                         | Filled in last full run                                                |
| -------- | ------------------------------------------------------------------------------ | ---------------------------------------------------------------------- |
| Identity | `externalId`, `articleNumber`, `name`, `brand`, `description`                  | 100% id and name, 99.8% article number, 74.3% brand                    |
| Size     | `sizeText`, `quantity`, `unit`, `packCount`                                    | 99.8% size text, 90.0% as a number, 305 multipacks                     |
| Price    | `price`, `currency`, `unitPrice`, `unitPriceUnit`                              | 89.3% price, 46.0% Aldi's unit price per kg or litre                   |
| Deals    | `promoPrice`, `promoText`, `promoType`, `promoStart`, `promoEnd`, `specialBuy` | 259 deals this week, all with dates: 190 special buys, 60 price cuts   |
| Seals    | `badges`, `organic`, `vegan`, `vegetarian`, `nutriScore`, `ageRestriction`     | seals on 59.1%: 173 Beter Leven, 100 Vegan, 42 organic, 26 Nutri-Score |
| Category | `categoryPath`, `categoryIds`, `category`                                      | 95.4%, 25 top categories                                               |
| Links    | `url`, `imageUrl`, `inStock`                                                   | 100% url and image                                                     |
| Run      | `priceDate`, `searchTerm`, `scrapedAt`                                         | 100%                                                                   |

Last full run: 2026-11-05 on Apify, 2,797 products in 200 requests, all HTTP 200: 43 seconds, and 130 seconds on a first run when Aldi's cache was cold. aldi.nl gives no barcodes, ingredients or nutrition tables, so `ean` stays `null`.

### Who uses the Aldi NL Scraper?

- **Price comparison sites** add Aldi's prices and unit prices to Albert Heijn, Jumbo, Dirk, PLUS, DekaMarkt, Hoogvliet, Vomar, Poiesz and Ekoplaza.
- **Deal and folder apps** publish Aldi's aanbiedingen and special buys of this week, and of next week from the Wednesday before, with `nextWeek`.
- **Non-food deal watchers** follow Aldi's special buys (OP=OP), sold while stocks last: 190 this week, from Toylino toys to Sint products.
- **Brand and category managers** track Aldi's own brands (`MILSANI` 110 products, `DAYLICIOUS` 93, `TRADER JOE'S` 78) and its price cuts.
- **Sustainability and diet researchers** count Beter Leven, Planetproof, Rainforest Alliance, Vegan and Biologisch seals across the assortment.
- **Developers** who need an Aldi Nederland product API without maintaining one call this actor from JavaScript, Python or REST.

### How much does the Aldi NL Scraper cost?

Pay per event. You pay for products written to the dataset and a tiny start fee. Platform usage is included.

| Event                      | Price                                  |
| -------------------------- | -------------------------------------- |
| Product written to dataset | $0.001                                 |
| Actor start                | $0.00005 per run at the default 512 MB |

#### Aldi NL Scraper cost examples

| Scenario                                      | Products | Cost   |
| --------------------------------------------- | -------- | ------ |
| Small test, `maxItems: 100`                   | 100      | $0.10  |
| Keyword filter, `keywords: ["biologisch"]`    | 38       | $0.04  |
| This week's deals, `onlyBonus: true`          | 259      | $0.26  |
| Next week's deals, `nextWeek` and `onlyBonus` | 267      | $0.27  |
| Full assortment                               | 2,797    | $2.80  |
| Full assortment every week, 4 runs a month    | 11,188   | $11.19 |

Product counts are from runs on 2026-11-05. Set `maxItems` to cap any run. Set the run's maximum charge in Apify to cap spend; the actor stops cleanly when it is reached and reports how many products it got.

### How do you configure the Aldi NL Scraper?

| Field       | Type             | Default | Meaning                                                                                   |
| ----------- | ---------------- | ------- | ----------------------------------------------------------------------------------------- |
| `keywords`  | array of strings | empty   | Keep only products whose name, brand or description holds every word of a keyword.        |
| `onlyBonus` | boolean          | `false` | Keep only deals and special buys.                                                         |
| `nextWeek`  | boolean          | `false` | Prices and deals as on the coming Monday, when Aldi's deal week starts.                   |
| `maxItems`  | integer          | 100000  | Stop after this many products; a smaller run also stops reading early (500 in 4 seconds). |
| `minItems`  | integer          | 1       | Fail the run when it stores fewer products: a guard for scheduled runs.                   |

### How do you scrape the full Aldi assortiment with the Aldi NL Scraper?

Leave every field empty. The actor reads every category page of aldi.nl, 2 at a time, and this week's deals list: 200 requests for 2,797 products. That is 2,659 products from the 197 category pages plus 138 special buys found only in the deals list.

```json
{}
```

### How do you get the Aldi aanbiedingen of this week with the Aldi NL Scraper?

Set `onlyBonus`. The run of 2026-11-05 returned 259 deals for the week from Monday 2 to Sunday 8 November 2026: 190 special buys (OP=OP), 60 price cuts with their deal price, 23.0% off on average and up to 52% (Shoarma, 4.94 for 2.39), and 5 multi-buys. 201 come from Aldi's deals list; 58 more are deals the products carry themselves, such as potatoes at 0.99 instead of 1.19.

```json
{
    "onlyBonus": true
}
```

### How do you get the Aldi aanbiedingen of next week with the Aldi NL Scraper?

Set `nextWeek`, and `onlyBonus` for the deals only. Aldi puts next week's deals online on the Wednesday before. The run of Thursday 2026-11-05 returned 267 deals for the week from Monday 9 November: 197 special buys, 67 price cuts with their deal price (25.7% off on average, up to 50%: Conference peren, 1.79 for 0.89) and 3 multi-buys, in 39 seconds on Apify. Deals that start later in that week, on Wednesday or Saturday, are included; `priceDate` is the Monday.

```json
{
    "nextWeek": true,
    "onlyBonus": true
}
```

### How do you filter Aldi products by keyword with the Aldi NL Scraper?

Give one or more keywords. aldi.nl's search runs in the browser only, so the actor reads the full assortment and keeps the products whose name, brand or description holds every word of a keyword, case and accents ignored: `biologisch` matched 38 products, `bier` 30, `kaas` 168. Each product is stored once, under the first keyword that matched (`searchTerm`).

```json
{
    "keywords": ["biologisch", "bier"]
}
```

### Which fields does the Aldi NL Scraper output?

Source: **Aldi** = Aldi's value unchanged. **Derived** = computed by this actor. **Fixed** = same in every item. Missing values are `null`, never an empty string.

| Field               | Source  | Meaning                                                                                                |
| ------------------- | ------- | ------------------------------------------------------------------------------------------------------ |
| `chain`             | Fixed   | Always `aldi`.                                                                                         |
| `store`             | Fixed   | Always `null`: the prices aldi.nl shows.                                                               |
| `externalId`        | Aldi    | Aldi's product id, as text.                                                                            |
| `articleNumber`     | Aldi    | Aldi's article number.                                                                                 |
| `ean`               | Fixed   | Always `null`: aldi.nl gives no barcodes.                                                              |
| `gtins`             | Fixed   | Always `null` on Aldi.                                                                                 |
| `name`              | Aldi    | Product name as aldi.nl shows it.                                                                      |
| `brand`             | Aldi    | Brand as Aldi writes it: `MILSANI`, `DAYLICIOUS`, `TRADER JOE'S`.                                      |
| `description`       | Aldi    | Aldi's short description.                                                                              |
| `sizeText`          | Aldi    | Sales unit as Aldi gives it: `500 g`, `0.75 l`, `4x125 g`, `Per stuk`.                                 |
| `packCount`         | Derived | Packs or pieces in a multipack (`4x125 g`: 4).                                                         |
| `quantity`          | Derived | Size as a number, in `unit`; a multipack in total; centilitres become ml.                              |
| `unit`              | Derived | `g`, `kg`, `ml`, `l` or `stuk`.                                                                        |
| `price`             | Aldi    | Regular price in EUR; during a price cut, the price before it (Aldi's strike-through price).           |
| `currency`          | Fixed   | Always `EUR`.                                                                                          |
| `unitPrice`         | Aldi    | Aldi's price per kg or litre, for the regular price.                                                   |
| `unitPriceUnit`     | Aldi    | `kg` or `l`.                                                                                           |
| `promoPrice`        | Aldi    | Deal price of a price cut in EUR; `null` for special buys and multi-buys.                              |
| `promoText`         | Aldi    | Aldi's deal label: `-15%`, `OP=OP`, `2 VOOR 3.50`, `v.a. wo. 11.11.`.                                  |
| `promoType`         | Derived | `price`, `multibuy` or `specialBuy`.                                                                   |
| `promoLabels`       | Fixed   | Always `null` on Aldi.                                                                                 |
| `promoStart`        | Aldi    | First day of the deal or special buy (YYYY-MM-DD).                                                     |
| `promoEnd`          | Aldi    | Last day of the deal, inclusive.                                                                       |
| `specialBuy`        | Derived | `true` for Aldi's special buys, sold while stocks last (OP=OP).                                        |
| `organic`           | Derived | `true` with Aldi's Biologisch seal or the BIO brand.                                                   |
| `vegan`             | Derived | `true` with Aldi's Vegan seal.                                                                         |
| `vegetarian`        | Derived | `true` with the Vegan or Vegetarisch seal.                                                             |
| `nutriScore`        | Aldi    | Nutri-Score `A` to `E`, when Aldi shows its seal.                                                      |
| `badges`            | Aldi    | Aldi's seals in words: `Beter Leven 1 ster`, `Planetproof`, `Rainforest Alliance`, `Koeling`, `NIX18`. |
| `ageRestriction`    | Derived | `18` for products with the NIX18 seal.                                                                 |
| `categoryPath`      | Aldi    | Category and sub-category, joined with `/`.                                                            |
| `categoryIds`       | Aldi    | Aldi's category ids of the product.                                                                    |
| `category`          | Aldi    | Top category.                                                                                          |
| `url`               | Derived | Product page on aldi.nl.                                                                               |
| `imageUrl`          | Aldi    | Product image.                                                                                         |
| `inStock`           | Aldi    | Aldi's availability flag.                                                                              |
| `availabilityLabel` | Fixed   | Always `null` on Aldi.                                                                                 |
| `priceDate`         | Derived | The day the prices and deals hold for: today, or next Monday with `nextWeek`.                          |
| `searchTerm`        | Derived | Keyword that matched the product; `null` in a full run.                                                |
| `scrapedAt`         | Derived | When the product was read (ISO 8601, UTC).                                                             |

#### Aldi NL Scraper output example

Molenland Goudse kaas jong belegen, from the full run of 2026-11-05, on a 32% price cut.

```json
{
    "chain": "aldi",
    "store": null,
    "externalId": "1207429",
    "articleNumber": "2002186",
    "ean": null,
    "gtins": null,
    "name": "Goudse kaas jong belegen 48+ stuk",
    "brand": "MOLENLAND",
    "description": "Romige smaak, perfect voor brood en borrel. Natuurgerijpt. 950 g stuk voor de hele familie. Haal af bij jouw ALDI!",
    "sizeText": "950 g",
    "packCount": null,
    "quantity": 950,
    "unit": "g",
    "price": 8.16,
    "currency": "EUR",
    "unitPrice": 8.59,
    "unitPriceUnit": "kg",
    "promoPrice": 5.49,
    "promoText": "-32%",
    "promoType": "price",
    "promoLabels": null,
    "promoStart": "2026-11-02",
    "promoEnd": "2026-11-08",
    "specialBuy": false,
    "organic": false,
    "vegan": false,
    "vegetarian": false,
    "nutriScore": null,
    "badges": ["Koeling", "Van Nederlandse bodem"],
    "ageRestriction": null,
    "categoryPath": "Kaas en vleeswaren/Kaas",
    "categoryIds": ["kaas", "molenland"],
    "category": "Kaas en vleeswaren",
    "url": "https://www.aldi.nl/product/goudse-kaas-jong-belegen-48-stuk-1207429.html",
    "imageUrl": "https://s7g10.scene7.com/is/image/aldinord/product_1207429_main_cms_2_nl_nl_goudse_kaas_jong_belegen_48_stuk_cw01_2024",
    "inStock": true,
    "availabilityLabel": null,
    "priceDate": "2026-11-05",
    "searchTerm": null,
    "scrapedAt": "2026-11-05T21:46:37.600Z"
}
```

### How does the Aldi NL Scraper report on its run?

Every run saves a `SUMMARY` record in its key-value store. From the full run of 2026-11-05 on Apify, with the 197 categories shortened to 2:

```json
{
    "mode": "catalog",
    "onlyBonus": false,
    "nextWeek": false,
    "priceDate": "2026-11-05",
    "itemsPushed": 2797,
    "distinctIds": 2797,
    "productsRead": 2797,
    "categoryPages": 197,
    "categoryProducts": 2659,
    "dealsListed": 201,
    "dealsOnlyInList": 138,
    "dealWeek": { "from": "2026-11-02", "to": "2026-11-08" },
    "stoppedAtChargeLimit": false,
    "blocked": false,
    "durationSec": 41,
    "requests": 200,
    "statusCodes": { "200": 200 },
    "errors": [],
    "retries": [],
    "categories": [
        { "page": "producten/kaas-vleeswaren/kaas.html", "category": "kaas", "expected": 88, "collected": 88 },
        {
            "page": "producten/zuivel-eieren-boter/verse-zuivel.html",
            "category": "verse-zuivel",
            "expected": 68,
            "collected": 68
        }
    ],
    "searches": []
}
```

A run is suspect when a category's `collected` is below its `expected` (the actor then logs a warning), when `categoryPages` drops well below 197, when `dealsListed` is 0, when `blocked` is `true`, or when `errors` is not empty. Set `minItems` to make a bad run fail outright.

### How does the Aldi NL Scraper compare to other Aldi scrapers?

|                                 | Aldi NL Scraper                    | blackfalcondata ALDI Scraper | studio-amba Aldi Scraper   | niktor76 Aldi Nord Offers |
| ------------------------------- | ---------------------------------- | ---------------------------- | -------------------------- | ------------------------- |
| Price per 1,000                 | $1.00                              | $2.00, plus $0.01 a start    | $2.00, plus $0.005 a start | $1.00                     |
| Scope                           | aldi.nl, full assortment and deals | 14 countries                 | several European countries | offers only, DE, NL, FR   |
| Next week's deals               | yes, with dates and deal prices    | not stated                   | not stated                 | yes                       |
| Check against Aldi's own counts | yes, every category                | not stated                   | not stated                 | not stated                |
| Seals (Beter Leven, Vegan, Bio) | yes, in fields                     | not stated                   | not stated                 | not stated                |

Figures read from each actor's public page on 2026-11-05.

### Things to know about Aldi data from the Aldi NL Scraper

- **No barcodes, ingredients or nutrition.** aldi.nl shows none, on its lists or product pages, so `ean` is `null`. For a barcode match with other chains, compare on name and size.
- **Some products have no online price.** 171 available products, mostly A-brands such as Calvé pindakaas, show no price on aldi.nl: `price` is `null`.
- **Two kinds of deals.** Special buys (`OP=OP`, `v.a. wo. 11.11.`) are sold while stocks last at their own price, mostly non-food, so `promoPrice` is `null`. Price cuts carry a strike-through price: `price` is the old price, `promoPrice` the new one.
- **Deals beyond the deals list.** Besides the 201 products in this week's list, 58 carry a running deal themselves: price cuts such as potatoes (1.19, now 0.99) and earlier weeks' special buys still on sale until 5 December.
- **"2 VOOR" is a price for two.** Aldi gives 3.50 for 2 Low carb crackers; `promoText` holds `2 VOOR 3.50`, `price` the price of one (1.99).
- **Aldi's deal week runs Monday to Sunday.** Special buys also start on Wednesday, Friday or Saturday; those of the week count for it.
- **Unit prices are Aldi's own**, for the price shown, scaled back to the regular price during a price cut: Goudse kaas, 950 g for 8.16, is 8.59 per kg.
- **Keyword filtering is by words.** `vegan` matches 43 products by name or description, while 100 carry the Vegan seal: filter the full assortment on `vegan` for those.
- **129 special buys are in no category.** Aldi lists them only in its deals; `categoryPath` is `null` for them.

### Is it legal to use the Aldi NL Scraper?

This actor reads publicly available data only. It collects product data, not personal data. It respects rate limits and does not bypass any login or paywall. You are responsible for how you use the data, including any terms that apply to you. See Apify's [guide to web scraping legality](https://blog.apify.com/is-web-scraping-legal/).

### Frequently asked questions about the Aldi NL Scraper

#### Can I get Aldi products as CSV or Excel?

Yes. Every run's dataset downloads as CSV, Excel, JSON or XML from Apify, or through the API.

#### How often should I run it?

Aldi's deals change every Monday, and next week's appear the Wednesday before. A run each Monday keeps a deal list current; a run with `nextWeek` from Wednesday gives the coming week in advance.

#### Does it need proxies?

No. The actor reads aldi.nl's own page data, 2 pages at a time, with no proxy: every request of every run on 2026-11-05 answered HTTP 200.

#### Can I schedule it and send results somewhere?

Yes. Use Apify Schedules, and a webhook or integration to send each run's dataset to your database, Google Sheets, Slack or Notion.

#### Does it work with the Apify API and SDK?

Yes. Any Apify client (JavaScript, Python, REST) can start the actor and read the dataset.

#### What are the Aldi aanbiedingen this week?

Run the actor with `onlyBonus`: on 2026-11-05 it returned 259 deals valid in the week of 2 to 8 November 2026, 60 of them with a lower price.

#### Can I get the Aldi aanbiedingen of next week?

Yes. Set `nextWeek` and `onlyBonus`: on 2026-11-05 the actor returned 267 deals for the week from 9 November, 67 of them with their deal price.

#### Can I get Aldi's non-food special buys?

Yes: run with `onlyBonus` and keep `specialBuy: true`: 191 products this week, 129 of them in no category at all. The most common brands were Toylino (35) and Home Creation (19).

#### Can I get Aldi's vegan or biologische producten?

Yes: filter the full assortment on `vegan` (100 products with Aldi's Vegan seal) or `organic` (42 with the Biologisch seal or the BIO brand).

#### Is there an official Aldi API?

Aldi offers no public API for its Dutch assortment. This actor reads the page data behind aldi.nl, so it gives the same prices and deals as the website.

#### Can I compare Aldi prices with other Dutch supermarkets?

Yes. The scrapers for Albert Heijn, Jumbo, Dirk, PLUS, DekaMarkt, Hoogvliet, Vomar, Poiesz and Ekoplaza by Sleep Mode Systems output the same fields. Aldi has no barcodes, so compare on `name`, `quantity` and `unitPrice`.

### Other scrapers by Sleep Mode Systems

| Actor                                                                   | What it extracts                                                       | Price per 1,000 |              |
| ----------------------------------------------------------------------- | ---------------------------------------------------------------------- | --------------- | ------------ |
| Aldi NL Scraper                                                         | Aldi products: prices, next week's deals, special buys, seals          | $1.00           | you are here |
| [Albert Heijn Scraper](https://apify.com/sleepmodesystems/albert-heijn) | Albert Heijn products: prices, Bonus deals, EAN, Nutri-Score           | $1.00           |              |
| [Jumbo Scraper](https://apify.com/sleepmodesystems/jumbo)               | Jumbo products: prices, deals with dates, EAN, organic, shelf life     | $1.50           |              |
| [Dirk Scraper](https://apify.com/sleepmodesystems/dirk)                 | Dirk products: prices, next week's deals, EAN, Nutri-Score             | $2.00           |              |
| [PLUS Scraper](https://apify.com/sleepmodesystems/plus)                 | PLUS products: prices, deals with dates, EAN, Nutri-Score, vegan       | $1.50           |              |
| [DekaMarkt Scraper](https://apify.com/sleepmodesystems/dekamarkt)       | DekaMarkt products: prices, next week's deals, EAN, organic            | $2.00           |              |
| [Hoogvliet Scraper](https://apify.com/sleepmodesystems/hoogvliet)       | Hoogvliet products: prices, next week's deals, EAN, ingredients, vegan | $2.00           |              |
| [Vomar Scraper](https://apify.com/sleepmodesystems/vomar)               | Vomar products: prices, every EAN barcode, BIO, categories             | $1.00           |              |
| [Poiesz Scraper](https://apify.com/sleepmodesystems/poiesz)             | Poiesz products: prices, deals with dates, EAN, deposit, ingredients   | $1.50           |              |
| [Ekoplaza Scraper](https://apify.com/sleepmodesystems/ekoplaza)         | Ekoplaza products: prices, next week's deals, EAN, allergens, Ekoscope | $2.00           |              |

All of them share the same output fields, so you can combine their datasets directly. The Aldi NL Scraper adds `articleNumber`, `description`, `specialBuy`, `vegan`, `vegetarian`, `ageRestriction` and `priceDate`, and has no barcodes; the Ekoplaza Scraper adds `articleNumber`, `vegan`, `vegetarian`, `ekoscope`, `origin`, `shelfLifeDays`, `ageRestriction`, `soldByWeight`, `detailsDate`, `description`, `ingredients`, `allergens`, `mayContain`, `freeFrom`, `nutrition` and `priceDate`; the Poiesz Scraper adds `promoDescription`, `deposit`, `depositAmount`, `ageRestriction`, `alcoholPercentage`, `purchaseLimit`, `soldByWeight`, `detailsRead`, `detailsDate`, `ingredients`, `allergens`, `mayContain`, `freeFrom`, `nutrition` and `storage`; the Vomar Scraper adds `soldByWeight`, and fills `gtins` with every barcode Vomar lists; the Hoogvliet Scraper adds `promoDescription`, `vegan`, `vegetarian`, `shelfLifeDays`, `ageRestriction`, `soldByWeight`, `ingredients`, `nutrition`, `storage`, `origin`, `alcoholPercentage` and `priceDate`; the DekaMarkt and Dirk Scrapers add `soldByWeight` and `priceDate`; PLUS adds `vegan`, `vegetarian`, `deposit`, `storeOnly`, `detailsRead` and `detailsDate`; Jumbo adds `promotions` and `shelfLifeDays`. Category ids are text on Jumbo, Dirk, DekaMarkt, Hoogvliet, Vomar, Poiesz, Ekoplaza and Aldi, numbers on Albert Heijn, and not given by PLUS.

### Support for the Aldi NL Scraper

Questions, a missing field, or a custom pipeline on top of this data: write to Imad at imad@sleepmodesystems.com. Bugs go in the Issues tab of this actor.

# Actor input Schema

## `keywords` (type: `array`):

Keep only products whose name, brand or description holds every word of a keyword (case and accents ignored). The actor reads the full assortment and filters it: Aldi's website search needs a browser. Leave empty for everything.

## `onlyBonus` (type: `boolean`):

Keep only products on a deal (aanbieding) or special buy (OP=OP): this week's, or next week's with nextWeek.

## `nextWeek` (type: `boolean`):

Give the deals of the coming Monday, when Aldi's deal week starts, with their prices and dates, instead of today's. Aldi publishes next week's deals from the Wednesday before.

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

Stop after this many products. The full Aldi assortment is about 2,800 products.

## `minItems` (type: `integer`):

Fail the run if fewer products were found.

## Actor input object example

```json
{
  "keywords": [],
  "onlyBonus": false,
  "nextWeek": false,
  "maxItems": 100000,
  "minItems": 1
}
```

# Actor output Schema

## `results` (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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("sleepmodesystems/aldi").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("sleepmodesystems/aldi").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 '{}' |
apify call sleepmodesystems/aldi --silent --output-dataset

```

## MCP server setup

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

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/Tc3rYdSbly6Xd0mt3/builds/5BL9z7tXFyvIaF6Sa/openapi.json
