Albert Heijn Scraper avatar

Albert Heijn Scraper

Pricing

from $1.00 / 1,000 products

Go to Apify Store
Albert Heijn Scraper

Albert Heijn Scraper

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.

Pricing

from $1.00 / 1,000 products

Rating

0.0

(0)

Developer

Sleep Mode Systems

Sleep Mode Systems

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

15 hours ago

Last modified

Categories

Security

Limited permissions

Share

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?

DataFieldsFilled in last full run
IdentityexternalId, name, brand, ean, gtins100% id and name, 99.1% brand, 95.6% barcode
SizesizeText, packCount, quantity, unit100% size text, 99.9% parsed quantity and unit
Priceprice, currency, unitPrice, unitPriceUnit100% price, 78.0% unit price
Promotion (Bonus)promoPrice, promoText, promoType, promoLabels, promoStart, promoEnd18.5% of products had a promotion (4,090)
Product factsorganic, nutriScore100% organic flag (1,305 organic), 60.6% Nutri-Score
CategorycategoryPath, categoryIds, category100%
Links and stockurl, imageUrl, inStock, availabilityLabel100% 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.

EventPrice
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

ScenarioProductsCost
Small test, maxItems: 100100$0.10
Keyword search, keywords: ["melk"]153$0.15
Barcode lookup, 100 barcodesup to 100up to $0.10
Promotions only, onlyBonus: true4,090$4.09
Full assortment22,114$22.11
Full assortment every week, 4 runs a month88,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?

FieldTypeDefaultMeaning
keywordsarray of stringsemptySearch for these words instead of reading the full assortment.
eansarray of stringsemptyLook up these barcodes instead of reading the full assortment, 8 to 14 digits.
onlyBonusbooleanfalseKeep only products with a promotion, in any mode.
maxItemsinteger100000Stop after this many products. The default covers the full assortment.
minItemsinteger1Fail 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.

{}

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.

{
"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.

{
"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.

{
"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.

FieldSourceMeaning
chainFixedAlways albert-heijn.
storeFixedAlways null: prices are national.
externalIdAHAlbert Heijn product id.
eanAHCurrent barcode (GTIN-14).
gtinsAHEvery barcode the product has carried, current one included.
nameAHProduct name.
brandAHBrand.
sizeTextAHSize as Albert Heijn states it, such as 4 x 90 g or per stuk.
packCountDerivedUnits in a multipack, read from sizeText; 1 when not a multipack.
quantityDerivedSize of one unit, read from sizeText: 4 x 90 g gives 90.
unitDerivedUnit of quantity: g, kg, ml, l, stuk, and so on.
priceAHRegular price in EUR.
currencyFixedAlways EUR.
unitPriceAHPrice per kg, litre or metre in EUR.
unitPriceUnitAHUnit of unitPrice: KG, LT or meter.
promoPriceDerivedCurrent price when lower than price, otherwise null.
promoTextAHThe deal as shown, such as 2 + 2 gratis or VOOR 3.99.
promoTypeAHKind of deal: NATIONAL, AHONLINE, ETOS or GALL.
promoLabelsAHThe deal label from the product card (topText, centerText, bottomText, emphasis, title, variant, size).
promoStartAHFirst day of the deal, YYYY-MM-DD.
promoEndAHLast day of the deal, YYYY-MM-DD.
organicDerivedtrue when Albert Heijn marks the product organic.
nutriScoreAHNutri-Score: A to E, or N/A.
categoryPathAHCategory path, such as Fruit, verse sappen/Blauwe bessen.
categoryIdsAHCategory ids from top level to leaf.
categoryDerivedTop-level category, the first part of categoryPath.
urlDerivedProduct page on ah.nl.
imageUrlAHProduct image, 800 x 800 px.
inStockAHtrue when the product can be ordered online.
availabilityLabelAHAvailability note, such as Alleen in de winkel or Leverbaar vanaf 09-11.
searchTermInputThe keyword or barcode that found the product; null in full-assortment mode.
scrapedAtFixedTime the product was read, ISO 8601.

Albert Heijn Scraper output example

{
"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:

{
"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": []
}
FieldMeaning
itemsPushed, distinctIdsProducts stored. Only products Apify accepted count.
productsReadDistinct products read from Albert Heijn, including those left out by onlyBonus, maxItems or your charge limit.
expectedTotalAlbert Heijn's own product count, read at the start. null in search mode.
coverageproductsRead / expectedTotal. null in search mode.
categoriesAlbert Heijn's count and the collected count for each of the 28 top-level categories.
categorySumSum of the category counts; higher than expectedTotal because a product can sit in several categories.
searchesIn search mode, Albert Heijn's count and the collected count per keyword or barcode.
secondPassRequestsRequests spent re-reading categories or keywords that came up short.
stoppedAtChargeLimittrue when the run stopped at your maximum charge.
concurrencyReducedtrue when Albert Heijn answered HTTP 429 or 403; the actor then halves its parallel requests from 12 to 6.
statusCodes, retries, errorsEvery 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 Scraperharvestedge/albert-heijn-apistudio-amba/albert-heijn-scraperincognito_mode/albert-heijn-product-scraper
Price per 1,000$1.00$5.00from $2.00, plus $0.02 per runfrom $4.00
Full assortmentyes, defaultnot statednot statedyes, with maxItems raised from the default 500
Category modefull assortment onlynoyes, by taxonomy idyes, 27 root categories or chosen ids
Barcode lookupyes, exact, eansnoyes, an EAN as search querynot stated
EAN in outputyes, plus barcode historynot listedyesnot listed
Promotion start and end datesyesnot listednot listednot listed
Promotions-only filteryesnonot statedyes, bonusOnly
Completeness check against AH's countyes, every runnot statednot statednot 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.

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.

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

ActorWhat it extractsPrice per 1,000
Albert Heijn ScraperAlbert Heijn products: prices, Bonus deals, EAN, Nutri-Score$1.00you are here
Jumbo ScraperJumbo products: prices, deals with dates, EAN, organic, shelf life$1.50
Dirk ScraperDirk products: prices, next week's deals, EAN, Nutri-Score$2.00
PLUS ScraperPLUS products: prices, deals with dates, EAN, Nutri-Score, vegan$1.50
DekaMarkt ScraperDekaMarkt products: prices, next week's deals, EAN, organic$2.00
Hoogvliet ScraperHoogvliet products: prices, next week's deals, EAN, ingredients, vegan$2.00
Vomar ScraperVomar products: prices, every EAN barcode, BIO, categories$1.00
Poiesz ScraperPoiesz products: prices, deals with dates, EAN, deposit, ingredients$1.50
Ekoplaza ScraperEkoplaza products: prices, next week's deals, EAN, allergens, Ekoscope$2.00
Aldi NL ScraperAldi 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.