Albert Heijn Product Scraper avatar

Albert Heijn Product Scraper

Under maintenance

Pricing

from $4.00 / 1,000 product results

Go to Apify Store
Albert Heijn Product Scraper

Albert Heijn Product Scraper

Under maintenance

Scrape 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

Elena Vance

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

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-discount priceBeforeBonus, an isBonus flag, and a discountLabel (AH's own Bonus wording, e.g. 2 voor 3 or 25% 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 problemHow this Actor solves it
A price-comparison / deals siteKeeping a grocery price database current by hand is impossibleSchedule a daily run; ingest every product with price, Bonus offer, and unit price as JSON
A market researcher / analystGrocery-price and inflation tracking needs structured, repeatable dataDated, normalized records per product — export straight to pandas, Sheets, or BI
A category manager at another retailerBenchmarking a competitor's assortment and pricing is slow and partialFull category-level coverage with price and unit price in a single run
An app / chatbot / agent developerYou need AH catalog data without building and babysitting a scraperPay per record on demand; a stable, normalized schema you can rely on
A deal hunter / content creatorFinding the best weekly Bonus deals means clicking through the sitePull 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:

FieldDescription
idStable record id, wi + AH's webshopId (the dedup key)
webshopIdAlbert Heijn's numeric webshop product id
titleProduct name
brandBrand name (incl. AH house brands like AH, AH Biologisch), when present
descriptionFull or highlight product description, when available
categoryId / categoryNameThe root category's taxonomy id and Dutch name (category mode)
mainCategory / subCategoryAH's own category labels from the product, when present
priceCurrent price as a EUR float (Bonus price when on offer, else the shelf price)
currencyAlways EUR
priceBeforeBonusThe pre-discount price when the product is on Bonus and it is higher than now (else null)
isBonustrue when the product is currently in the AH Bonus (on promotion)
discountLabelAH's Bonus wording (e.g. 2 voor 3), or a computed N% korting (else null)
unitSizePack / sales unit text (e.g. 500 g, 1 l, per stuk)
pricePerUnit / pricePerUnitTypePer-unit price and its unit (kg, l, stuk, …)
imageUrlProduct image (widest available rendition)
productUrlCanonical ah.nl product page
sourceConstant source tag carried on every record
scrapedAtISO 8601 timestamp of the run
rawDataOptional: 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)

  1. Click Try for free / Start.
  2. 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) or 9344 (Vlees).
    • A keyword: type a term like melk under Search keyword (when set, the category list is ignored).
  3. (Optional) Turn on Only bonus / discounted products to get just this week's deals.
  4. Keep the Dutch residential proxy enabled (recommended — see above).
  5. 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

FieldTypeDefaultDescription
Category taxonomy IDslist(empty)One AH taxonomy ID per line (e.g. 1730, 9344). Empty = scrape all 27 root categories (full assortment).
Search keywordstringScrape products matching a term (e.g. melk) instead of browsing categories. When set, the category list is ignored.
Only bonus / discounted productsbooleanfalseWhen on, only products currently in the AH Bonus (on promotion) are returned.
Include raw product databooleanfalseAdds the full raw AH product object under rawData. Increases item size.
Proxy configurationobjectApify Residential, NLRecommended — keep the Dutch residential default enabled.
Max concurrencyinteger5Parallel requests (1–20). Kept moderate to be respectful.
Delay between requestsinteger0Politeness delay in seconds before each request (0–10).
Max itemsinteger0Stop 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 ActorBuild your own scraperManual checking
Full assortment, normalizedYesYou maintain itImpractical
Bonus offers & discount labelsYesYou maintain itOne product at a time
Per-unit prices (€/kg, €/l)YesYou compute itMental math
Dutch residential proxy built inYesYou source proxies
Reliable access handled for youYesYou maintain it
Never billed for failuresYes
Export JSON / CSV / Excel / APIYes, built-inDIYCopy-paste
Setup time~60 secondsDays; breaks when the site changesHours 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 SUMMARY record (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.


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.