# Albert Heijn Scraper (`sleepmodesystems/albert-heijn`) Actor

Albert Heijn product API alternative: all ~22,100 ah.nl products with prices, unit prices, Bonus deals with dates, EAN barcodes and Nutri-Score, in about 40 seconds. Every run checks its count against AH's own total. Keyword and barcode search included.

- **URL**: https://apify.com/sleepmodesystems/albert-heijn.md
- **Developed by:** [Sleep Mode Systems](https://apify.com/sleepmodesystems) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 66.7% 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

Albert Heijn Scraper extracts products from Albert Heijn (https://www.ah.nl): prices, unit prices, Bonus deals with their dates, EAN barcodes, Nutri-Score, categories and stock status. Every run checks itself: it compares the products it read with Albert Heijn's own total and reports the result as `coverage`, which was 1 (22,114 of 22,114) in the last full run.

**Price: $1.00 per 1,000 products. A full run reads all 22,114 products in about 40 seconds on Apify.**

### What does the Albert Heijn Scraper extract?

| Data              | Fields                                                                          | Filled in last full run                                      |
| ----------------- | ------------------------------------------------------------------------------- | ------------------------------------------------------------ |
| Identity          | `externalId`, `name`, `brand`, `ean`, `gtins`                                   | 100% id and name, 99.1% brand, 95.6% barcode                 |
| Size              | `sizeText`, `packCount`, `quantity`, `unit`                                     | 100% size text, 99.9% parsed quantity and unit               |
| Price             | `price`, `currency`, `unitPrice`, `unitPriceUnit`                               | 100% price, 78.0% unit price                                 |
| Promotion (Bonus) | `promoPrice`, `promoText`, `promoType`, `promoLabels`, `promoStart`, `promoEnd` | 18.5% of products had a promotion (4,090)                    |
| Product facts     | `organic`, `nutriScore`                                                         | 100% organic flag (1,305 organic), 60.6% Nutri-Score         |
| Category          | `categoryPath`, `categoryIds`, `category`                                       | 100%                                                         |
| Links and stock   | `url`, `imageUrl`, `inStock`, `availabilityLabel`                               | 100% url and stock flag, 99.9% image, 4.8% availability note |

Last full run: 2026-11-04, 22,114 products, 721 requests, all HTTP 200.

### Who uses the Albert Heijn Scraper?

- **Price comparison sites** load the full assortment and match it to other Dutch chains on `ean` and `gtins`.
- **Brand and category managers** follow their own and competing products' `price`, `promoText` and presence per week.
- **Retail and market analysts** track Albert Heijn's prices and promotion share across all 28 categories.
- **Deal and Bonus apps** read this week's and next week's promotions with `promoStart` and `promoEnd`.
- **Nutrition and health apps** use `nutriScore`, `organic` and `categoryPath` to filter products.
- **Developers** who need an Albert Heijn product API without maintaining one call this actor from JavaScript, Python or REST.

### How much does the Albert Heijn 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 GB of memory, so $0.0001 per run at the default 2 GB |

#### Albert Heijn Scraper cost examples

| Scenario                                   | Products  | Cost        |
| ------------------------------------------ | --------- | ----------- |
| Small test, `maxItems: 100`                | 100       | $0.10       |
| Keyword search, `keywords: ["melk"]`       | 153       | $0.15       |
| Barcode lookup, 100 barcodes               | up to 100 | up to $0.10 |
| Promotions only, `onlyBonus: true`         | 4,090     | $4.09       |
| Full assortment                            | 22,114    | $22.11      |
| Full assortment every week, 4 runs a month | 88,456    | $88.46      |

Product counts are from runs on 2026-11-04. 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 Albert Heijn Scraper?

| Field       | Type             | Default | Meaning                                                                        |
| ----------- | ---------------- | ------- | ------------------------------------------------------------------------------ |
| `keywords`  | array of strings | empty   | Search for these words instead of reading the full assortment.                 |
| `eans`      | array of strings | empty   | Look up these barcodes instead of reading the full assortment, 8 to 14 digits. |
| `onlyBonus` | boolean          | `false` | Keep only products with a promotion, in any mode.                              |
| `maxItems`  | integer          | 100000  | Stop after this many products. The default covers the full assortment.         |
| `minItems`  | integer          | 1       | Fail the run if fewer products were found.                                     |

With `keywords` and `eans` empty, the actor reads the full assortment.

### How do you scrape the full Albert Heijn assortment with the Albert Heijn Scraper?

Use it for a complete product dataset: price monitoring, matching, or a weekly snapshot. Leave the input empty. The actor reads the 28 top-level categories, removes duplicates, compares the count with Albert Heijn's own total, and re-reads any category that came up short.

```json
{}
```

### How do you search Albert Heijn by keyword with the Albert Heijn Scraper?

Use it when you need a product group, not the whole store. One Albert Heijn search runs per keyword, with all result pages; `melk` returned 153 products in 5 requests.

```json
{
    "keywords": ["melk", "koffie"]
}
```

### How do you look up Albert Heijn products by EAN barcode with the Albert Heijn Scraper?

Use it to check the price and promotion of products you already know. Each barcode is an exact lookup. The leading zero is optional: `8710400468431` and `08710400468431` find the same product. A barcode Albert Heijn does not sell gives no item and `expected: 0` in the run summary.

```json
{
    "eans": ["8710400468431", "08710400058519"]
}
```

### How do you get only Albert Heijn Bonus products with the Albert Heijn Scraper?

Use it to track promotions. `onlyBonus` keeps products with a promotion and works with every mode. On the full assortment it still reads all products and stores those on promotion: 4,090 in the last run.

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

### Which fields does the Albert Heijn Scraper output?

Source: **AH** = Albert Heijn's value unchanged. **Derived** = computed by this actor. **Fixed** = same in every item. **Input** = from your input. Missing values are `null`, never an empty string.

| Field               | Source  | Meaning                                                                                                               |
| ------------------- | ------- | --------------------------------------------------------------------------------------------------------------------- |
| `chain`             | Fixed   | Always `albert-heijn`.                                                                                                |
| `store`             | Fixed   | Always `null`: prices are national.                                                                                   |
| `externalId`        | AH      | Albert Heijn product id.                                                                                              |
| `ean`               | AH      | Current barcode (GTIN-14).                                                                                            |
| `gtins`             | AH      | Every barcode the product has carried, current one included.                                                          |
| `name`              | AH      | Product name.                                                                                                         |
| `brand`             | AH      | Brand.                                                                                                                |
| `sizeText`          | AH      | Size as Albert Heijn states it, such as `4 x 90 g` or `per stuk`.                                                     |
| `packCount`         | Derived | Units in a multipack, read from `sizeText`; 1 when not a multipack.                                                   |
| `quantity`          | Derived | Size of one unit, read from `sizeText`: `4 x 90 g` gives 90.                                                          |
| `unit`              | Derived | Unit of `quantity`: `g`, `kg`, `ml`, `l`, `stuk`, and so on.                                                          |
| `price`             | AH      | Regular price in EUR.                                                                                                 |
| `currency`          | Fixed   | Always `EUR`.                                                                                                         |
| `unitPrice`         | AH      | Price per kg, litre or metre in EUR.                                                                                  |
| `unitPriceUnit`     | AH      | Unit of `unitPrice`: `KG`, `LT` or `meter`.                                                                           |
| `promoPrice`        | Derived | Current price when lower than `price`, otherwise `null`.                                                              |
| `promoText`         | AH      | The deal as shown, such as `2 + 2 gratis` or `VOOR 3.99`.                                                             |
| `promoType`         | AH      | Kind of deal: `NATIONAL`, `AHONLINE`, `ETOS` or `GALL`.                                                               |
| `promoLabels`       | AH      | The deal label from the product card (`topText`, `centerText`, `bottomText`, `emphasis`, `title`, `variant`, `size`). |
| `promoStart`        | AH      | First day of the deal, `YYYY-MM-DD`.                                                                                  |
| `promoEnd`          | AH      | Last day of the deal, `YYYY-MM-DD`.                                                                                   |
| `organic`           | Derived | `true` when Albert Heijn marks the product organic.                                                                   |
| `nutriScore`        | AH      | Nutri-Score: `A` to `E`, or `N/A`.                                                                                    |
| `categoryPath`      | AH      | Category path, such as `Fruit, verse sappen/Blauwe bessen`.                                                           |
| `categoryIds`       | AH      | Category ids from top level to leaf.                                                                                  |
| `category`          | Derived | Top-level category, the first part of `categoryPath`.                                                                 |
| `url`               | Derived | Product page on ah.nl.                                                                                                |
| `imageUrl`          | AH      | Product image, 800 x 800 px.                                                                                          |
| `inStock`           | AH      | `true` when the product can be ordered online.                                                                        |
| `availabilityLabel` | AH      | Availability note, such as `Alleen in de winkel` or `Leverbaar vanaf 09-11`.                                          |
| `searchTerm`        | Input   | The keyword or barcode that found the product; `null` in full-assortment mode.                                        |
| `scrapedAt`         | Fixed   | Time the product was read, ISO 8601.                                                                                  |

#### Albert Heijn Scraper output example

```json
{
    "chain": "albert-heijn",
    "store": null,
    "externalId": "177754",
    "ean": "08710400468431",
    "gtins": ["08710400468431", "08718906233379", "08710400369318"],
    "name": "AH Blauwe bessen",
    "brand": "AH",
    "sizeText": "300 g",
    "packCount": 1,
    "quantity": 300,
    "unit": "g",
    "price": 4.49,
    "currency": "EUR",
    "unitPrice": 14.97,
    "unitPriceUnit": "KG",
    "promoPrice": 3.99,
    "promoText": "VOOR 3.99",
    "promoType": "NATIONAL",
    "promoLabels": [
        {
            "topText": "voor",
            "centerText": null,
            "bottomText": "3.99",
            "emphasis": "BOTTOM",
            "title": null,
            "variant": "DISCOUNT",
            "size": "M"
        }
    ],
    "promoStart": "2026-11-02",
    "promoEnd": "2026-11-08",
    "organic": false,
    "nutriScore": "A",
    "categoryPath": "Fruit, verse sappen/Blauwe bessen",
    "categoryIds": [20885, 20888, 4949],
    "category": "Fruit, verse sappen",
    "url": "https://www.ah.nl/producten/product/wi177754/ah-blauwe-bessen",
    "imageUrl": "https://static.ah.nl/dam/product/AHI_43545239383832393636?revLabel=1&rendition=800x800_WEBP&fileType=binary",
    "inStock": true,
    "availabilityLabel": null,
    "searchTerm": null,
    "scrapedAt": "2026-11-04T14:01:17.812Z"
}
```

### How does the Albert Heijn Scraper report on its run?

Every run saves a `SUMMARY` record in its key-value store. From the last full run:

```json
{
    "mode": "categories",
    "itemsPushed": 22114,
    "distinctIds": 22114,
    "productsRead": 22114,
    "expectedTotal": 22114,
    "coverage": 1,
    "categorySum": 28179,
    "stoppedAtChargeLimit": false,
    "concurrencyReduced": false,
    "durationSec": 53,
    "requests": 721,
    "secondPassRequests": 0,
    "statusCodes": { "200": 721 },
    "errors": [],
    "retries": [],
    "categories": [{ "id": 6401, "name": "Groente, aardappelen", "expected": 976, "collected": 976 }],
    "searches": []
}
```

| Field                              | Meaning                                                                                                             |
| ---------------------------------- | ------------------------------------------------------------------------------------------------------------------- |
| `itemsPushed`, `distinctIds`       | Products stored. Only products Apify accepted count.                                                                |
| `productsRead`                     | Distinct products read from Albert Heijn, including those left out by `onlyBonus`, `maxItems` or your charge limit. |
| `expectedTotal`                    | Albert Heijn's own product count, read at the start. `null` in search mode.                                         |
| `coverage`                         | `productsRead / expectedTotal`. `null` in search mode.                                                              |
| `categories`                       | Albert Heijn's count and the collected count for each of the 28 top-level categories.                               |
| `categorySum`                      | Sum of the category counts; higher than `expectedTotal` because a product can sit in several categories.            |
| `searches`                         | In search mode, Albert Heijn's count and the collected count per keyword or barcode.                                |
| `secondPassRequests`               | Requests spent re-reading categories or keywords that came up short.                                                |
| `stoppedAtChargeLimit`             | `true` when the run stopped at your maximum charge.                                                                 |
| `concurrencyReduced`               | `true` when Albert Heijn answered HTTP 429 or 403; the actor then halves its parallel requests from 12 to 6.        |
| `statusCodes`, `retries`, `errors` | Every HTTP status received, every retry with its reason, and requests that failed after 3 retries.                  |

A full-assortment run is suspect when `coverage` is below 1 while `stoppedAtChargeLimit` is `false`, when a category still has `collected` below `expected` (the log lists them in one warning), when `statusCodes` holds anything other than 200, when `concurrencyReduced` is `true`, or when `expectedTotal` is `null`. Set `minItems` to make a bad run fail outright.

### How does the Albert Heijn Scraper compare to other Albert Heijn scrapers?

|                                       | Albert Heijn Scraper      | harvestedge/albert-heijn-api | studio-amba/albert-heijn-scraper | incognito_mode/albert-heijn-product-scraper      |
| ------------------------------------- | ------------------------- | ---------------------------- | -------------------------------- | ------------------------------------------------ |
| Price per 1,000                       | $1.00                     | $5.00                        | from $2.00, plus $0.02 per run   | from $4.00                                       |
| Full assortment                       | yes, default              | not stated                   | not stated                       | yes, with `maxItems` raised from the default 500 |
| Category mode                         | full assortment only      | no                           | yes, by taxonomy id              | yes, 27 root categories or chosen ids            |
| Barcode lookup                        | yes, exact, `eans`        | no                           | yes, an EAN as search query      | not stated                                       |
| EAN in output                         | yes, plus barcode history | not listed                   | yes                              | not listed                                       |
| Promotion start and end dates         | yes                       | not listed                   | not listed                       | not listed                                       |
| Promotions-only filter                | yes                       | no                           | not stated                       | yes, `bonusOnly`                                 |
| Completeness check against AH's count | yes, every run            | not stated                   | not stated                       | not stated                                       |

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

### Things to know about Albert Heijn data from the Albert Heijn Scraper

- **EAN has 14 digits with a leading zero.** Albert Heijn stores GTIN-14 on all 21,148 barcodes in the last run. Drop the first zero for EAN-13. 966 products, such as flower bouquets, have no barcode.
- **`unitPrice` uses the regular price.** AH Blauwe bessen 300 g costs 4.49, on offer for 3.99; its unit price is 14.97 per kg, which is 4.49 / 0.3. Compute a promotion unit price yourself if you need one.
- **Multi-buy deals have no `promoPrice`.** For `2 + 2 gratis`, the single price does not change; the deal is in `promoText` and `promoLabels`.
- **From Friday, next week's deals show.** A product can carry a deal that starts on Monday, so `promoPrice` is not yet the shop price. Check `promoStart`.
- **Most promotions follow the Monday-to-Sunday week.** In the run of Wednesday 2026-11-04, 3,170 products had a `promoStart` of Monday 2026-11-02, the current week, and 3 had a later start.
- **Some promotions run for years.** 544 products carry a promotion from 2024-11-04 to 2026-12-31; it is still running, with a real `promoPrice`. No promotion in the last run had already ended. To keep only running deals, filter on `promoStart` <= today and `promoEnd` >= today.
- **`inStock` means orderable online.** 912 products are sold only in shops (`Alleen in de winkel`) and 156 are available from a later date (`Leverbaar vanaf ...`).
- **Prices are national.** Albert Heijn's API gives no per-store prices, so `store` is always `null`.
- **`nutriScore` is the raw value.** It can be `N/A` (184 products); 39.4% of products have none.
- **Etos and Gall & Gall products are included.** Their deals have `promoType` `ETOS` or `GALL`.
- **Albert Heijn serves 40 products per request at most.** A full run is about 721 requests.

### Is it legal to use the Albert Heijn Scraper?

This actor reads publicly available data only. Albert Heijn product data contains no 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 Albert Heijn Scraper

#### Can I get Albert Heijn 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?

Albert Heijn data changes weekly: promotions run Monday to Sunday, and next week's appear from Friday. Run the full assortment once a week, on Monday, for that week's prices and deals. Add a Friday run with `onlyBonus: true` to see next week's Bonus early.

#### Does it need proxies?

No. Every platform run so far went without proxies and got HTTP 200 on every request: 721 of 721 in the last full run. If Albert Heijn answers 429 or 403, the actor halves its parallel requests for the rest of the run and records `concurrencyReduced: true`.

#### 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.

#### Is there an official Albert Heijn API?

No public one. Albert Heijn's app and webshop use an API that is not documented for outside use. This actor reads it for you and returns a stable set of fields, so you do not maintain the integration.

#### Can I use the Albert Heijn Scraper from Python?

Yes. Install `apify-client`, call the actor with your input, and read the dataset items. The same works from JavaScript or any HTTP client.

#### Can I get this week's and next week's Albert Heijn Bonus?

Yes. Run with `onlyBonus: true`. Each product carries `promoStart` and `promoEnd`: deals starting next Monday are next week's, the others run now.

#### Can I compare Albert Heijn prices with other supermarkets?

Yes. Match products on `ean`, or on any barcode in `gtins` to catch older barcodes, and compare sizes with `packCount`, `quantity` and `unit`. Use `unitPrice` for price per kg or litre.

#### Is there a downloadable Albert Heijn product dataset?

Each full run produces one: 22,114 products in the last run, downloadable as CSV, Excel or JSON. Schedule it weekly to keep it current.

#### Which Albert Heijn products cannot be delivered?

Those with `inStock: false`. `availabilityLabel` says why: `Alleen in de winkel` (912 products, in store only) or `Leverbaar vanaf <date>` (156 products).

#### Does it cover Albert Heijn Belgium?

It reads the Dutch webshop's assortment (ah.nl). The Belgian ah.be assortment has not been tested.

### Other scrapers by Sleep Mode Systems

| Actor                                                             | What it extracts                                                       | Price per 1,000 |              |
| ----------------------------------------------------------------- | ---------------------------------------------------------------------- | --------------- | ------------ |
| Albert Heijn Scraper                                              | Albert Heijn products: prices, Bonus deals, EAN, Nutri-Score           | $1.00           | you are here |
| [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           |              |
| [Aldi NL Scraper](https://apify.com/sleepmodesystems/aldi)        | Aldi products: prices, next week's deals, special buys, seals          | $1.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 Albert Heijn 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`):

Search Albert Heijn for these words instead of reading the full assortment. One search per keyword, all result pages. Leave empty for the full assortment.

## `eans` (type: `array`):

Look up these barcodes instead of reading the full assortment, 8 to 14 digits. A leading zero is optional. Leave empty for the full assortment.

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

Keep only products with a promotion, in full-assortment or search mode.

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

Stop after this many distinct products. The full Albert Heijn assortment is about 22,000 products.

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

Fail the run if fewer products were found.

## Actor input object example

```json
{
  "keywords": [],
  "eans": [],
  "onlyBonus": 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/albert-heijn").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/albert-heijn").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/albert-heijn --silent --output-dataset

```

## MCP server setup

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

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/rixJCXshXqYPFb3qN/builds/iNfdx4cs95cASxOsg/openapi.json
