Albert Heijn Product Scraper
Under maintenancePricing
from $4.00 / 1,000 product results
Albert Heijn Product Scraper
Under maintenanceScrape every Albert Heijn (ah.nl) product: name, brand, price, bonus/discount, unit price, pack size, category and image. Clean JSON/CSV. National pricing, no login needed. Filter by category or search keyword. 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
Albert Heijn Product Scraper — Prices, Bonus Discounts, Unit Prices & Images from AH.nl
Turn the entire Albert Heijn Netherlands (ah.nl) assortment into clean, structured JSON or CSV: product name, brand, current price, Bonus offer/discount, per-unit price (€/kg, €/l), pack size, category, image, and the product link — one tidy record per product.
Browse the whole catalog by category, or search by keyword, and get back data ready to drop into a spreadsheet, database, price-comparison site, or app. No login and no account needed — and you are never billed for failed requests.
Good to know: this Actor runs through a Dutch residential proxy (already pre-selected in the input — just keep it enabled). AH uses a single national price list, so one run captures the price every shopper in the Netherlands sees.
Why this Actor
- National pricing in one run. Albert Heijn publishes one price list for the whole country — no per-store fan-out, no store IDs. One run = the price everyone sees.
- Bonus offers and discounts, detected for you. Each record carries the current
price, the pre-discountpriceBeforeBonus, anisBonusflag, and adiscountLabel(AH's own Bonus wording, e.g.2 voor 3or25% korting) — filter the whole assortment down to this week's deals in one expression. - Per-unit prices for real comparison.
pricePerUnit+pricePerUnitType(per kg, l, piece, …) are parsed from AH's own unit-price 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 one of AH's 27 root categories, list specific category taxonomy IDs, or pass a search keyword.
- Complete product detail. Brand, description, pack size, main/sub category, the product image, and the canonical ah.nl product URL — one normalized record.
- You never pay for failures. Failed requests, timeouts, 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, so large jobs finish without burning credits.
- 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, Bonus offer, and unit price as JSON |
| A market researcher / analyst | Grocery-price and inflation tracking needs structured, repeatable data | Dated, normalized records per product — 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 in a single run |
| An app / chatbot / agent developer | You need AH 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 Bonus deals means clicking through the site | Pull the assortment and filter on isBonus / discountLabel, or run with Only bonus products on |
What data you get
Each available product becomes one dataset record:
| Field | Description |
|---|---|
id | Stable record id, wi + AH's webshopId (the dedup key) |
webshopId | Albert Heijn's numeric webshop product id |
title | Product name |
brand | Brand name (incl. AH house brands like AH, AH Biologisch), when present |
description | Full or highlight product description, when available |
categoryId / categoryName | The root category's taxonomy id and Dutch name (category mode) |
mainCategory / subCategory | AH's own category labels from the product, when present |
price | Current price as a EUR float (Bonus price when on offer, else the shelf price) |
currency | Always EUR |
priceBeforeBonus | The pre-discount price when the product is on Bonus and it is higher than now (else null) |
isBonus | true when the product is currently in the AH Bonus (on promotion) |
discountLabel | AH's Bonus wording (e.g. 2 voor 3), or a computed N% korting (else null) |
unitSize | Pack / sales unit text (e.g. 500 g, 1 l, per stuk) |
pricePerUnit / pricePerUnitType | Per-unit price and its unit (kg, l, stuk, …) |
imageUrl | Product image (widest available rendition) |
productUrl | Canonical ah.nl product page |
source | Constant source tag carried on every record |
scrapedAt | ISO 8601 timestamp of the run |
rawData | Optional: the full raw AH product object, when Include raw product data is on |
Example output
{"id": "wi83937","webshopId": 83937,"title": "AH Biologisch Halfvolle melk","brand": "AH Biologisch","description": "Biologische halfvolle melk, 1 liter.","categoryId": "1730","categoryName": "Zuivel, eieren","mainCategory": "Zuivel, plantaardig en eieren","subCategory": "Melk","price": 1.29,"currency": "EUR","priceBeforeBonus": 1.59, // present because this product is on Bonus"isBonus": true,"discountLabel": "25% korting","unitSize": "1 l","pricePerUnit": 1.29, // i.e. € 1.29 / l"pricePerUnitType": "l","imageUrl": "https://static.ah.nl/dam/product/.../1600x1600.jpg","productUrl": "https://www.ah.nl/producten/product/wi83937","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": "…", "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.
- Choose what to scrape:
- Everything (default): leave the inputs empty to scrape the full AH assortment (all 27 root categories).
- Specific categories: add one AH category taxonomy ID per line under
Category taxonomy IDs, e.g.
1730(Zuivel, eieren) or9344(Vlees). - A keyword: type a term like
melkunder Search keyword (when set, the category list is ignored).
- (Optional) Turn on Only bonus / discounted products to get just this week's deals.
- Keep the Dutch residential proxy enabled (recommended — see above).
- 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 |
|---|---|---|---|
| Category taxonomy IDs | list | (empty) | One AH taxonomy ID per line (e.g. 1730, 9344). Empty = scrape all 27 root categories (full assortment). |
| Search keyword | string | – | Scrape products matching a term (e.g. melk) instead of browsing categories. When set, the category list is ignored. |
| Only bonus / discounted products | boolean | false | When on, only products currently in the AH Bonus (on promotion) are returned. |
| Include raw product data | boolean | false | Adds the full raw AH product object under rawData. Increases item size. |
| Proxy configuration | object | Apify Residential, NL | Recommended — keep the Dutch residential default enabled. |
| Max concurrency | integer | 5 | Parallel requests (1–20). Kept moderate to be respectful. |
| 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). |
What to expect
In category mode the Actor covers each selected root category in full; in search mode it returns the products matching your keyword. Either way, products are de-duplicated by their webshop id, prices are returned as euro floats (the Bonus price when a product is on promotion, otherwise the shelf price), and per-unit prices are normalized so you can compare value across pack sizes.
A product with no usable price (out of stock / not orderable) is skipped — every record you receive has a real price.
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. Failed requests, timeouts, 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 |
| Bonus offers & discount labels | Yes | You maintain it | One product at a time |
| Per-unit prices (€/kg, €/l) | Yes | You compute it | Mental math |
| Dutch residential proxy built in | Yes | You source proxies | – |
| Reliable access handled for you | Yes | You maintain it | – |
| 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 totals, successes, failures, and billing counts — ideal for monitoring automated pipelines.
FAQ
Do I need an Albert Heijn account or login? No. There is no login or account to set up — just start the Actor.
Why is a Dutch proxy recommended?
The Actor ships with a Dutch residential proxy pre-selected for reliable access — keep it
on. If you disable it, runs may return no products (any issue is reported in SUMMARY).
Are prices per store? No — Albert Heijn uses a single national price list, so one run reflects the price nationwide.
What does "Bonus" mean?
"Bonus" is Albert Heijn's term for a promotion / discount. When a product is on Bonus,
isBonus is true, price is the promo price, priceBeforeBonus holds the pre-discount
price, and discountLabel carries AH's wording (e.g. 2 voor 3).
How do I get only discounted products?
Turn on Only bonus / discounted products, or scrape everything and filter on
isBonus == true (or a non-null discountLabel).
What are the category taxonomy IDs?
They are AH's numeric category identifiers (e.g. 1730 = Zuivel/eieren, 9344 = Vlees).
Leave the field empty to scrape all 27 root categories automatically.
How fresh is the data? Each run fetches live data, so you get exactly what ah.nl shows 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 — the same clean schema and pay-per-event billing across every chain, so you can mix and match for full-market coverage:
- Lidl Product Scraper — includes Lidl Plus member prices.
- Plus Product Scraper — per-store pricing.
- Dirk van den Broek Product Scraper — store-specific pricing.
- DekaMarkt Product Scraper — store-specific pricing.
- Hoogvliet Product Scraper — pairs with the Hoogvliet Category Scraper (run category first to map the tree, then product).
Add the others alongside this Albert Heijn run to benchmark prices and Bonus offers across every major Dutch grocer in one consistent dataset.
Disclaimer
This Actor is intended for personal and research use. You are responsible for ensuring your use complies with Albert Heijn'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 Albert Heijn.