# DekaMarkt Scraper (`sleepmodesystems/dekamarkt`) Actor

DekaMarkt product API alternative: all ~10,100 dekamarkt.nl products with prices, deals with dates, next week's deals, EAN barcodes on every product, unit prices and organic flag, in about a minute, no proxy. Checked against DekaMarkt's own sitemap. Keyword and barcode search included.

- **URL**: https://apify.com/sleepmodesystems/dekamarkt.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 $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/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

DekaMarkt Scraper extracts products from DekaMarkt (https://www.dekamarkt.nl): prices, unit prices, deals (aanbiedingen) with their dates and multi-buy texts, **next week's deals before they start**, EAN barcodes on every product, organic flag, badges and categories. Every full run checks itself against DekaMarkt's own product sitemap: the last one collected 10,059 of the sitemap's 10,079 products, the other 20 having no price, plus 4 products on sale that the sitemap does not list.

**Price: $2.00 per 1,000 products. A full run reads all 10,063 products in about a minute, with no proxy.**

### What does the DekaMarkt Scraper extract?

| Data          | Fields                                              | Filled in last full run                                  |
| ------------- | --------------------------------------------------- | -------------------------------------------------------- |
| Identity      | `externalId`, `name`, `brand`, `ean`, `gtins`       | 100% id and name, 10,062 of 10,063 barcodes, 93.3% brand |
| Size          | `sizeText`, `packCount`, `quantity`, `unit`         | 100% size text, 99.9% parsed quantity and unit           |
| Price         | `price`, `currency`, `unitPrice`, `unitPriceUnit`   | 100% price, 98.7% unit price                             |
| Deals         | `promoPrice`, `promoText`, `promoStart`, `promoEnd` | 609 products on a deal (6.1%), all with dates            |
| Product facts | `organic`, `badges`, `soldByWeight`                 | 100% organic flag (568 organic), 41.5% badges            |
| Category      | `categoryPath`, `categoryIds`, `category`           | 100%                                                     |
| Links         | `url`, `imageUrl`                                   | 100% url, 99.0% image                                    |
| Run           | `priceDate`, `searchTerm`, `scrapedAt`              | 100%                                                     |

Last full run: 2026-11-04, 10,063 products, 200 requests, all HTTP 200.

### Who uses the DekaMarkt Scraper?

- **Price comparison sites** load the full catalog and match it to Albert Heijn, Jumbo, Dirk and PLUS on `ean`, which every DekaMarkt product but one has.
- **Deal and folder apps** publish next week's DekaMarkt aanbiedingen before the folder week starts on Tuesday, with `nextWeek`.
- **Brand and category managers** follow their products' price and deals at DekaMarkt week by week.
- **Retail and market analysts** track a regional chain's prices, its own brands (`G'woon` 948 products, `DekaVers` 431) and deal share.
- **Food and diet apps** filter on `organic` and badges such as `Glutenvrij`, `Beter Leven` or `MSC Vis`.
- **Developers** who need a DekaMarkt product API without maintaining one call this actor from JavaScript, Python or REST.

### How much does the DekaMarkt 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.002                                 |
| Actor start                | $0.00005 per run at the default 512 MB |

#### DekaMarkt Scraper cost examples

| Scenario                                       | Products  | Cost        |
| ---------------------------------------------- | --------- | ----------- |
| Small test, `maxItems: 100`                    | 100       | $0.20       |
| Keyword search, `keywords: ["halfvolle melk"]` | 19        | $0.04       |
| Barcode lookup, 100 barcodes in one run        | up to 100 | up to $0.20 |
| This week's deals, `onlyBonus: true`           | 609       | $1.22       |
| Next week's deals, `onlyBonus` and `nextWeek`  | 640       | $1.28       |
| Full catalog                                   | 10,063    | $20.13      |
| Full catalog every week, 4 runs a month        | 40,252    | $80.50      |

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 DekaMarkt Scraper?

| Field       | Type             | Default | Meaning                                                                                 |
| ----------- | ---------------- | ------- | --------------------------------------------------------------------------------------- |
| `keywords`  | array of strings | empty   | Search for these words instead of reading the full catalog. At most 250 results a word. |
| `eans`      | array of strings | empty   | Look up these barcodes instead of reading the full catalog.                             |
| `onlyBonus` | boolean          | `false` | Keep only products on a deal, in any mode.                                              |
| `nextWeek`  | boolean          | `false` | Prices and deals as they will be on the coming Tuesday, instead of today's.             |
| `maxItems`  | integer          | 100000  | Stop after this many products. The default covers the full catalog.                     |
| `minItems`  | integer          | 1       | Fail the run if fewer products were found.                                              |

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

### How do you scrape the full DekaMarkt catalog with the DekaMarkt Scraper?

Use it for a complete DekaMarkt product list with prices and barcodes. Leave the input empty. The actor reads DekaMarkt's 146 categories, then the products in DekaMarkt's sitemap that no category lists, and fetches every product's barcode.

```json
{}
```

### How do you get next week's DekaMarkt aanbiedingen with the DekaMarkt Scraper?

Use it to publish or plan around next week's folder before it starts. DekaMarkt's deal week runs Tuesday to Monday. With `nextWeek`, prices and deals are those of the coming Tuesday: on Wednesday 4 November the run returned 640 deals for Tuesday 10 November, 544 of which had not started yet.

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

### How do you get this week's DekaMarkt aanbiedingen with the DekaMarkt Scraper?

`onlyBonus` keeps products on a deal and works with every mode. On the full catalog it reads all products and stores those on a deal: 609 in the last run, 535 of them running Tuesday 3 to Monday 9 November, each with its start and end date and DekaMarkt's deal text, such as `1+1 GRATIS` or `2 voor 2,99`.

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

### How do you search DekaMarkt by keyword with the DekaMarkt Scraper?

Use it when you need a product group. One DekaMarkt search runs per keyword; products DekaMarkt does not price are left out. `halfvolle melk` returned 19 products. The search returns at most 250 results; the run summary marks such a search as `capped`.

```json
{
    "keywords": ["halfvolle melk", "pindakaas"]
}
```

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

Use it to check the price and deal of products you already know. DekaMarkt's own search does not find barcodes, so the actor reads the barcodes of the whole catalog until it has found yours: about a minute, however many you give. Leading zeros are optional. A barcode not in the catalog gives no item and `expected: 0` in the run summary, so it is truly not on sale.

```json
{
    "eans": ["8710624283131", "8710624289294"]
}
```

### Which fields does the DekaMarkt Scraper output?

Source: **DekaMarkt** = DekaMarkt'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 `dekamarkt`.                                                                            |
| `store`             | Fixed     | Always `null`: the prices dekamarkt.nl shows, the same for every visitor.                      |
| `externalId`        | DekaMarkt | DekaMarkt product id, such as `26554`. The same id is used at Dirk.                            |
| `ean`               | DekaMarkt | Barcode, mostly EAN-13.                                                                        |
| `gtins`             | Derived   | The barcode in a list, for the same field on other chains.                                     |
| `name`              | DekaMarkt | Product name.                                                                                  |
| `brand`             | DekaMarkt | Brand.                                                                                         |
| `sizeText`          | DekaMarkt | Size as DekaMarkt writes it, such as `300 g`, `6 x 330 ml` or `Per stuk`.                      |
| `packCount`         | Derived   | Units in a multipack; 1 when not a multipack.                                                  |
| `quantity`          | Derived   | Size of one unit: `6 x 330 ml` gives 330.                                                      |
| `unit`              | Derived   | Unit of `quantity`: `g`, `kg`, `ml`, `cl`, `l`, `stuk`, `zakje`, and so on.                    |
| `price`             | DekaMarkt | Regular price in EUR.                                                                          |
| `currency`          | Fixed     | Always `EUR`.                                                                                  |
| `unitPrice`         | Derived   | Regular price per kg, litre or piece in EUR: DekaMarkt gives none.                             |
| `unitPriceUnit`     | Derived   | Unit of `unitPrice`: `kg`, `l` or `stuk`.                                                      |
| `promoPrice`        | DekaMarkt | Deal price in EUR, when lower than `price`.                                                    |
| `promoText`         | DekaMarkt | The deal as shown, such as `2 voor 2,99`, `1+1 GRATIS`, `25% KORTING` or `per stuk 0,99`.      |
| `promoType`         | Fixed     | Always `null` on DekaMarkt; kept for the same field on other chains.                           |
| `promoLabels`       | Fixed     | Always `null` on DekaMarkt; kept for the same field on other chains.                           |
| `promoStart`        | DekaMarkt | First day of the deal, `YYYY-MM-DD`, usually a Tuesday.                                        |
| `promoEnd`          | DekaMarkt | Last day of the deal, `YYYY-MM-DD`, usually a Monday.                                          |
| `organic`           | DekaMarkt | `true` when DekaMarkt shows its `Biologisch` logo.                                             |
| `nutriScore`        | DekaMarkt | Always `null` today: DekaMarkt shows no Nutri-Score.                                           |
| `badges`            | DekaMarkt | DekaMarkt's logos, such as `lekker laag`, `Gewoon Transparant`, `Beter Leven 1`, `Glutenvrij`. |
| `soldByWeight`      | DekaMarkt | `true` when the product is sold by weight.                                                     |
| `categoryPath`      | DekaMarkt | Department and group, such as `Vlees & vis/Vleeswaren`.                                        |
| `categoryIds`       | DekaMarkt | Department id and group id.                                                                    |
| `category`          | DekaMarkt | Department.                                                                                    |
| `url`               | Derived   | Product page on dekamarkt.nl.                                                                  |
| `imageUrl`          | DekaMarkt | Product image.                                                                                 |
| `inStock`           | Fixed     | Always `null`: DekaMarkt gives no stock information.                                           |
| `availabilityLabel` | Fixed     | Always `null` on DekaMarkt.                                                                    |
| `priceDate`         | Derived   | The day the prices apply to: today, or the coming Tuesday with `nextWeek`.                     |
| `searchTerm`        | Input     | The keyword or barcode that found the product; `null` in full-catalog mode.                    |
| `scrapedAt`         | Fixed     | Time the product was read, ISO 8601.                                                           |

#### DekaMarkt Scraper output example

```json
{
    "chain": "dekamarkt",
    "store": null,
    "externalId": "52898",
    "ean": "8710624289294",
    "gtins": ["8710624289294"],
    "name": "Bio+ Spekreepjes gerookt",
    "brand": "Bio+",
    "sizeText": "200 g",
    "packCount": 1,
    "quantity": 200,
    "unit": "g",
    "price": 4.89,
    "currency": "EUR",
    "unitPrice": 24.45,
    "unitPriceUnit": "kg",
    "promoPrice": 2.99,
    "promoText": "per pak 2,99",
    "promoType": null,
    "promoLabels": null,
    "promoStart": "2026-11-03",
    "promoEnd": "2026-11-09",
    "organic": true,
    "nutriScore": null,
    "badges": ["Beter Leven 3", "Biologisch", "Glutenvrij"],
    "soldByWeight": false,
    "categoryPath": "Vlees & vis/Vleeswaren",
    "categoryIds": ["2", "22"],
    "category": "Vlees & vis",
    "url": "https://www.dekamarkt.nl/producten/vlees-vis/vleeswaren/bio-spekreepjes-gerookt-200-g/52898",
    "imageUrl": "https://web-fileserver.dekamarkt.nl/artikelen/405306_2026-11-04_02-32-53-673_d0dfb21e-49b5-4ed1-aaa8-e47f638cf1a6.png",
    "inStock": null,
    "availabilityLabel": null,
    "priceDate": "2026-11-04",
    "searchTerm": null,
    "scrapedAt": "2026-11-04T21:32:07.082Z"
}
```

### How does the DekaMarkt Scraper report on its run?

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

```json
{
    "mode": "catalog",
    "priceDate": "2026-11-04",
    "itemsPushed": 10063,
    "distinctIds": 10063,
    "productsRead": 10063,
    "sitemapProducts": 10079,
    "sitemapCollected": 10059,
    "sitemapNotOnSale": 20,
    "notInSitemap": 4,
    "barcodesMissing": 1,
    "stoppedAtChargeLimit": false,
    "blocked": false,
    "concurrencyReduced": false,
    "eanCatalogScan": false,
    "partialAnswers": 1,
    "durationSec": 57,
    "requests": 200,
    "statusCodes": { "200": 200 },
    "errors": [],
    "retries": [],
    "categories": [{ "id": 1, "name": "Aardappelen, groente & fruit/Aardappelen", "collected": 41 }],
    "searches": []
}
```

| Field                              | Meaning                                                                                                             |
| ---------------------------------- | ------------------------------------------------------------------------------------------------------------------- |
| `itemsPushed`, `distinctIds`       | Products stored. Only products Apify accepted count.                                                                |
| `productsRead`                     | Distinct products on sale that were read, including those left out by `onlyBonus`, `maxItems` or your charge limit. |
| `sitemapProducts`                  | Products in DekaMarkt's own product sitemap. DekaMarkt publishes no other total.                                    |
| `sitemapCollected`                 | Of those, products collected.                                                                                       |
| `sitemapNotOnSale`                 | Of those, products DekaMarkt gives no price: not on sale.                                                           |
| `notInSitemap`                     | Products on sale that only a category lists.                                                                        |
| `barcodesMissing`                  | Products whose barcode could not be read.                                                                           |
| `partialAnswers`                   | Barcode or price answers where one product failed and the others were kept.                                         |
| `eanCatalogScan`                   | `true` when barcodes were looked up in the catalog.                                                                 |
| `categories`                       | Products on sale per category.                                                                                      |
| `searches`                         | In search mode, the products on sale found and collected per keyword or barcode; `capped` at 250 results.           |
| `stoppedAtChargeLimit`             | `true` when the run stopped at your maximum charge.                                                                 |
| `blocked`                          | `true` when DekaMarkt refused twice in a row (HTTP 403); the run then fails with the products it already had.       |
| `concurrencyReduced`               | `true` when DekaMarkt answered 403 or 429; the actor then sends 1 request at a time.                                |
| `statusCodes`, `retries`, `errors` | Every HTTP status received, every retry with its reason, and requests that failed after 3 retries.                  |

A full-catalog run is suspect when `sitemapCollected + sitemapNotOnSale` is below `sitemapProducts`, when `barcodesMissing` is above 1, when `blocked` or `concurrencyReduced` is `true`, or when `statusCodes` holds anything other than 200. Set `minItems` to make a bad run fail outright.

### How does the DekaMarkt Scraper compare to other DekaMarkt scrapers?

|                                | DekaMarkt Scraper                | incognito_mode/dekamarkt-product-scraper         | harvestedge/dutch-supermarkets-all-11 |
| ------------------------------ | -------------------------------- | ------------------------------------------------ | ------------------------------------- |
| Price per 1,000                | $2.00                            | from $4.00                                       | $5.00                                 |
| Full catalog                   | yes, default                     | yes, with `maxItems` raised from the default 500 | no, keyword search                    |
| EAN barcode                    | yes, every product but one       | not mentioned                                    | no                                    |
| Next week's deals              | yes, `nextWeek`                  | no                                               | no                                    |
| Deal dates and multi-buy texts | yes                              | deal label only                                  | no                                    |
| Organic flag, badges           | yes                              | not mentioned                                    | no                                    |
| Unit price                     | yes, computed                    | yes, parsed                                      | yes                                   |
| Keyword and barcode search     | yes                              | no                                               | keyword only                          |
| Completeness check             | yes, against DekaMarkt's sitemap | no                                               | no                                    |
| Proxy                          | none                             | Apify datacenter by default                      | not stated                            |

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

### Things to know about DekaMarkt data from the DekaMarkt Scraper

- **DekaMarkt's deal week runs Tuesday to Monday.** In the run of Wednesday 4 November, 535 of 609 deals ran Tuesday 3 to Monday 9 November, so "until when" is the coming Monday for most deals.
- **Next week's deals are readable before Tuesday.** On 4 November, 640 products had a deal for Tuesday 10 November, 544 of them not on a deal yet. With `nextWeek`, a product DekaMarkt will not price that day is left out.
- **Deal texts include multi-buy deals.** `2 voor 2,99` (102), `1+1 GRATIS` (85), `25% KORTING` (57), and per-unit deal prices such as `per stuk 0,99` (173). 118 deals carry no text. Multi-buy deals have no `promoPrice`: the single price does not change.
- **DekaMarkt publishes no product total.** The check is DekaMarkt's product sitemap, and neither source is complete alone: in the last run, 50 products on sale were in the sitemap and in no category, and 4 were in a category and not in the sitemap. The actor reads both.
- **Three departments the website hides are included.** DekaMarkt's category pages for Bloemen & planten, DekaGebak and Non food inout redirect to "niet beschikbaar", but DekaMarkt prices their products: 42, 20 and 8 of them are in the dataset.
- **DekaMarkt gives no unit price.** `unitPrice` is computed from the regular price and size. Spices and medicines have real unit prices above €1,000 per kg or litre, such as Silvo Saffraandraden, 0.4 g for €4.49.
- **No Nutri-Score.** DekaMarkt shows no Nutri-Score logo on any product; Dirk, on the same platform, does. `nutriScore` is `null`.
- **Prices are the ones dekamarkt.nl shows.** DekaMarkt says each shop has its own range, and other price lists show smaller ranges at the same prices, but none can be matched to a shop. So `store` is `null`.
- **No stock information.** A product with a price is on sale; `inStock` is always `null`.
- **One product has no barcode.** DekaMarkt's barcode query fails on "Catsuit man"; the 199 other products of its batch keep theirs.
- **DekaMarkt and Dirk share product ids.** The same product has the same `externalId` on both, with its own price at each chain.

### Is it legal to use the DekaMarkt Scraper?

This actor reads publicly available data only. DekaMarkt product data contains no personal data. It sends at most 4 requests at a time 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 DekaMarkt Scraper

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

DekaMarkt's deals change every Tuesday. Run the full catalog once a week on Tuesday, and add a run with `onlyBonus` and `nextWeek` late in the week to have the coming week's deals early.

#### Does it need proxies?

No. Requests go straight to DekaMarkt, at most 4 at a time: the last full run got HTTP 200 on all 200. If DekaMarkt answers 403 or 429, the actor goes to 1 request at a time; after a 403 it also pauses 60 seconds and tries once more, and a second 403 ends the run with `blocked: 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.

#### Can I see the DekaMarkt folder of next week?

Yes. Run with `onlyBonus` and `nextWeek`. The run of Wednesday 4 November returned 640 deals for Tuesday 10 November, 535 of them running 10 to 16 November.

#### Until when do DekaMarkt aanbiedingen run?

Most run Tuesday to Monday: each deal's `promoEnd` gives its last day. In the last run, 535 of 609 deals ended on Monday 9 November.

#### Is there an official DekaMarkt API?

No public one. DekaMarkt's website uses a GraphQL 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 get DekaMarkt's organic products?

Yes. Run the full catalog and filter on `organic: true`: 568 products carried DekaMarkt's `Biologisch` logo in the last run.

#### Can I compare DekaMarkt prices with Dirk, Albert Heijn, Jumbo and PLUS?

Yes. The scrapers for those chains by Sleep Mode Systems output the same fields. Match on `ean` (Albert Heijn writes it with a leading zero, so compare without leading zeros) and compare `unitPrice`. Against Dirk you can also match on `externalId`, which the two chains share.

#### Does it give prices per DekaMarkt store?

No. It gives the prices dekamarkt.nl shows, the same for every visitor. DekaMarkt's system holds other price lists, but none can be matched to a shop.

### Other scrapers by Sleep Mode Systems

| Actor                                                                   | What it extracts                                                       | Price per 1,000 |              |
| ----------------------------------------------------------------------- | ---------------------------------------------------------------------- | --------------- | ------------ |
| DekaMarkt Scraper                                                       | DekaMarkt products: prices, next week's deals, EAN, organic            | $2.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           |              |
| [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 DekaMarkt 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 DekaMarkt for these words instead of reading the full catalog. DekaMarkt returns at most 250 results per word. Leave empty for the full catalog.

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

Look up these barcodes instead of reading the full catalog. Leading zeros are optional. DekaMarkt's search does not find barcodes, so the actor looks them up in the whole catalog: about 1 minute. Leave empty for the full catalog.

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

Keep only products on a deal (aanbieding), in full-catalog or search mode.

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

Give prices and deals as they will be on the coming Tuesday, when DekaMarkt's deal week starts, instead of today's.

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

Stop after this many distinct products. The full DekaMarkt catalog is about 10,100 products.

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

Fail the run if fewer products were found.

## Actor input object example

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

```

## MCP server setup

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

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/bHnrXRhReteNyy1zL/builds/4eDecINMnZKVnb0iq/openapi.json
