DekaMarkt Product Scraper
Under maintenancePricing
from $4.00 / 1,000 product results
DekaMarkt Product Scraper
Under maintenanceScrape every DekaMarkt (dekamarkt.nl) product from the official GraphQL API: name, brand, price, offer, unit price, size, category and image. Clean JSON/CSV. Store-specific pricing (set a store ID), no login. Failed lookups are never billed.
Pricing
from $4.00 / 1,000 product results
Rating
0.0
(0)
Developer
Elena Vance
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
DekaMarkt Product Scraper — Prices, Offers, Unit Prices & Images from DekaMarkt.nl
Turn the entire DekaMarkt (dekamarkt.nl) assortment into clean, structured JSON or CSV: product name, brand, current price, offer/discount, per-unit price (€/kg, €/l), pack size, category, image, and the product link — one tidy record per product, priced for the store you choose.
Browse the whole catalog by category, or focus on specific ones, and get back data ready to drop into a spreadsheet, database, price-comparison site, or app. No login, no accounts, no HTML wrangling — and you are never billed for failed requests.
Good to know: DekaMarkt prices are store-specific. Each run is priced for one store, set by Store ID (default
200= Den Helder). Pick the store whose local prices you want — leave the default if you just want a representative DekaMarkt price list. No login or account is needed, so the default (datacenter) proxy is fine and costs stay low.
Why this Actor
- Store-accurate pricing. DekaMarkt prices vary by store, so this Actor takes
a Store ID and returns exactly the prices that store charges — not a vague
national average. Default is store
200(Den Helder); ~105 stores are available. - Offers and discounts, detected for you. Each record carries the current
price, the pre-discountpriceBeforeOffer, anisOfferflag, and adiscountLabel(the on-site price sign) — filter the whole assortment down to this store's current deals in one expression. - Per-unit prices for real comparison.
pricePerUnit+pricePerUnitType(per kg, l, or piece) are parsed from DekaMarkt's pack-size text, so you can compare value across pack sizes — and against other supermarkets. - The full assortment, or a focused slice. Leave everything default to scrape every category across every department, or pass specific category IDs to scrape just those.
- Complete product detail. Brand, pack size, category, department, the product image, and the canonical dekamarkt.nl product URL — one normalized record.
- You never pay for failures. Timeouts, errors, and removed products are reported in the run summary — not written to your dataset and not billed.
- Fast and lightweight. Runs are quick and compute stays minimal.
- Clean, consistent EUR output. Prices as euro floats, whitespace-normalized text, JSON-safe values throughout.
Problems this Actor solves
| If you are… | Your problem | How this Actor solves it |
|---|---|---|
| A price-comparison / deals site | Keeping a grocery price database current by hand is impossible | Schedule a daily run; ingest every product with price, offer, and unit price as JSON |
| A market researcher / analyst | Grocery-price and inflation tracking needs structured, repeatable, store-level data | Dated, normalized records per product for a chosen store — export straight to pandas, Sheets, or BI |
| A category manager at another retailer | Benchmarking a competitor's assortment and pricing is slow and partial | Full category-level coverage with price and unit price for a real store in a single run |
| An app / chatbot / agent developer | You need DekaMarkt catalog data without building and babysitting a scraper | Pay per record on demand; a stable, normalized schema you can rely on |
| A deal hunter / content creator | Finding the best weekly discounts means clicking through the site | Pull the assortment and filter on isOffer / discountLabel |
What data you get
Each available product becomes one dataset record:
| Field | Description |
|---|---|
id / productId | DekaMarkt's stable product ID (the record's unique id; id is the string form) |
title | Product name (headerText, plus subText when present) |
brand | Brand name, when available |
categoryId / categoryName | Category id (wg_<id>) and its title (e.g. Aardappelen) |
department | Department the category belongs to (e.g. Aardappelen, groente, fruit) |
price | Current price as a EUR float (the offer price when on offer, else the normal price) |
currency | Always EUR |
normalPrice | The regular (non-offer) price |
offerPrice | The offer price when the product is on offer (else null) |
priceBeforeOffer | The pre-discount price when on offer (else null) |
isOffer | true when the product is discounted |
discountLabel | The on-site price-sign text for the offer (when present) |
unitSize | Pack / sales unit text (e.g. 500 g, 1 l) |
pricePerUnit / pricePerUnitType | Per-unit price and its unit (kg, l, piece) |
isWeightProduct | true for loose / by-weight products |
storeId | The store the prices in this record are for |
imageUrl | Product image URL |
productUrl | Canonical dekamarkt.nl product page |
scrapedAt | ISO 8601 timestamp of the run |
rawData | Optional: the full raw DekaMarkt product object, when Include raw product payload is on |
Example output
{"id": "12345","productId": 12345,"title": "DekaVers Halfvolle Melk 1 l","brand": "DekaVers","categoryId": "wg_42","categoryName": "Zuivel","department": "Zuivel, kaas, eieren","price": 0.95,"currency": "EUR","normalPrice": 1.15,"offerPrice": 0.95, // present because this product is on offer"priceBeforeOffer": 1.15, // the pre-discount price"isOffer": true,"discountLabel": "2 voor 1.90","unitSize": "1 l","pricePerUnit": 0.95, // i.e. € 0.95 / l"pricePerUnitType": "l","isWeightProduct": false,"storeId": 200,"imageUrl": "https://static.dekamarkt.nl/images/.../melk.jpg","productUrl": "https://www.dekamarkt.nl/producten/dekavers-halfvolle-melk-1-l-12345","scrapedAt": "2026-06-18T08:30:00+00:00"}
Requests that could not be fetched are not written to the dataset (and never
billed). They are listed in the run's SUMMARY record in the key-value store —
{ "failures": [ { "input": "category=42", "error": "…" } ] } — and the run's
status message tells you at a glance how many products succeeded.
How to use it (60 seconds)
- Click Try for free / Start.
- Set the Store ID for the store whose prices you want (default
200= Den Helder). This determines every price in the run. - Choose what to scrape:
- Everything (default): leave Category IDs empty to scrape the full DekaMarkt assortment (all categories across all departments).
- Specific categories: add one category ID per line under Category IDs
(e.g.
1= Aardappelen).
- Click Save & Start. Download results as JSON, CSV, Excel, or via API from the Dataset tab; check Key-value store → SUMMARY for run totals and any failed requests.
Input reference
| Field | Type | Default | Description |
|---|---|---|---|
| Store ID | integer | 200 | DekaMarkt store the prices are for. Pick the store to get that store's local prices; without a valid store ID the run returns no prices and products are skipped. 200 = Den Helder; other examples: 196 Hippolytushoef, 163 Zaandam, 182 Zwaag, 130 Zandvoort (~105 stores). |
| Category IDs | list | (empty) | One DekaMarkt category id per line to scrape only those categories. Empty = scrape every category across all departments (full assortment). |
| Include raw product payload | boolean | false | Adds the full raw DekaMarkt product object under rawData. Increases item size. |
| Proxy configuration | object | Apify Automatic | Automatic (datacenter) proxies are fine. Switch to Dutch (NL) residential only if you ever see blocked requests. |
| Max concurrency | integer | 4 | Parallel requests (1–20). Kept moderate to be respectful (~2 req/sec recommended). |
| Delay between requests | integer | 0 | Politeness delay in seconds before each request (0–10). |
| Max items | integer | 0 | Stop after N product records (0 = unlimited). |
Good to know about prices
A product with no real price for the chosen store is skipped (this is the
usual symptom of a wrong or empty Store ID), and an offerPrice of 0.00 means
no offer (not "free") — so a product is only flagged isOffer when it has a
genuine discount below its normal price. The same product can appear in several
categories; each one is de-duplicated so you get a single clean record per
product.
Pricing — what a run costs
This Actor uses transparent pay-per-event pricing with a built-in volume discount: a small Actor-start fee, a fixed price per successful product record for the first 10,000 results of a run, and a cheaper rate for every result beyond that. No subscription, no minimums, and failures are never charged. The exact per-result rate is shown on the Actor's Pricing tab.
- Failed requests are free. Timeouts, errors, and removed products are reported in the summary, never billed.
- Bigger runs cost less per item. The discount tier resets per run, so one large run is cheaper than the same job split into many small ones.
- Try it free: an Apify free account includes $5 of monthly platform credit — enough to try the Actor before paying anything.
- Stay in control: set Max items and Apify's maximum charge per run; the Actor stops gracefully at your cap, keeping everything already scraped.
Compared to the alternatives
| This Actor | Build your own scraper | Manual checking | |
|---|---|---|---|
| Full assortment, normalized | Yes | You maintain it | Impractical |
| Store-specific pricing | Yes (set a Store ID) | You build and maintain it | One store, one product at a time |
| Offers & discount labels | Yes | You maintain it | One product at a time |
| Per-unit prices (€/kg, €/l) | Yes | You compute it | Mental math |
| Never billed for failures | Yes | – | – |
| Export JSON / CSV / Excel / API | Yes, built-in | DIY | Copy-paste |
| Setup time | ~60 seconds | Days; breaks when the site changes | Hours per run |
Integrate the data
- Exports: JSON, CSV, Excel, XML from the Dataset tab — or fetch
programmatically:
GET https://api.apify.com/v2/datasets/{datasetId}/items?format=json
- Run on a schedule: use Apify Schedules to refresh prices daily or weekly, and webhooks to push finished runs into your pipeline (Sheets, Slack, your backend).
- From code: call the Actor with the Apify API or SDKs (Python / JavaScript) and read the dataset when the run finishes.
- Run summary: every run writes a
SUMMARYrecord (key-value store) with the store ID, totals, successes, failures, and billing counts — ideal for monitoring automated pipelines.
FAQ
Do I need a DekaMarkt account or API key? No. There is no login or account required.
Why do I have to choose a Store ID?
DekaMarkt prices are local to each store, so prices are returned for the one store
you pick. The Actor defaults to store 200 (Den Helder); change it to price the
run for a different store. Without a valid store ID there are no prices to return
and products are skipped (the run will look empty).
Are prices the same in every store? Not necessarily — that is exactly why the Store ID exists. Run the Actor once per store ID if you need to compare prices across stores.
Why is a product missing from my results? A product with no real price for the chosen store is skipped, and so is anything without a stable product ID. Most "missing products / empty run" cases are a wrong or empty Store ID — set a valid one and re-run.
How do I get only discounted products?
Scrape, then filter on isOffer == true (or a non-null discountLabel). Note
that an offerPrice of 0.00 is not an offer — the Actor already treats it as
"no offer".
Do I need a proxy? No — the default Automatic (datacenter) proxy is fine and no login is needed. Switch to a Dutch residential proxy only if you ever see blocked requests.
How fresh is the data? Each run fetches live data, so you get exactly what DekaMarkt shows for that store at that moment. Schedule the Actor to keep your dataset as fresh as you need.
What formats can I export? JSON, CSV, Excel, XML — from the Console or via the Apify API.
Related Actors
Part of a family of Dutch supermarket scrapers that share the same clean schema and pay-per-event billing across every chain — mix and match for full market coverage, including store-by-store price comparison.
- Albert Heijn Product Scraper — the largest NL chain; national Bonus pricing.
- Lidl Product Scraper — discounter prices, including Lidl Plus member prices.
- Plus Product Scraper — per-store pricing, like DekaMarkt.
- Dirk van den Broek Product Scraper — store-specific pricing, the closest
sibling to DekaMarkt's
storeIdmodel. - Hoogvliet Product Scraper — regional chain; pairs with the Hoogvliet Category Scraper to map the category tree first.
Comparing DekaMarkt against another chain? Run the matching Product Scraper with the same daily schedule — the records line up field-for-field. And because DekaMarkt prices are store-specific, run this Actor once per Store ID to compare prices across DekaMarkt stores, then join against a sibling chain for a complete picture.
Disclaimer
This Actor is intended for personal and research use. You are responsible for ensuring your use complies with DekaMarkt's terms and applicable law. Please scrape responsibly — keep concurrency moderate and delays reasonable. This project is not affiliated with, endorsed by, or sponsored by DekaMarkt.