Albert Heijn Scraper
Pricing
from $1.00 / 1,000 products
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
15 hours ago
Last modified
Categories
Security
Limited permissionsShare
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?
| Data | Fields | Filled in last full run |
|---|---|---|
| Identity | externalId, name, brand, ean, gtins | 100% id and name, 99.1% brand, 95.6% barcode |
| Size | sizeText, packCount, quantity, unit | 100% size text, 99.9% parsed quantity and unit |
| Price | price, currency, unitPrice, unitPriceUnit | 100% price, 78.0% unit price |
| Promotion (Bonus) | promoPrice, promoText, promoType, promoLabels, promoStart, promoEnd | 18.5% of products had a promotion (4,090) |
| Product facts | organic, nutriScore | 100% organic flag (1,305 organic), 60.6% Nutri-Score |
| Category | categoryPath, categoryIds, category | 100% |
| Links and stock | url, imageUrl, inStock, availabilityLabel | 100% 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
eanandgtins. - Brand and category managers follow their own and competing products'
price,promoTextand 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
promoStartandpromoEnd. - Nutrition and health apps use
nutriScore,organicandcategoryPathto 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.
| Event | Price |
|---|---|
| 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
| Scenario | Products | Cost |
|---|---|---|
Small test, maxItems: 100 | 100 | $0.10 |
Keyword search, keywords: ["melk"] | 153 | $0.15 |
| Barcode lookup, 100 barcodes | up to 100 | up to $0.10 |
Promotions only, onlyBonus: true | 4,090 | $4.09 |
| Full assortment | 22,114 | $22.11 |
| Full assortment every week, 4 runs a month | 88,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?
| Field | Type | Default | Meaning |
|---|---|---|---|
keywords | array of strings | empty | Search for these words instead of reading the full assortment. |
eans | array of strings | empty | Look up these barcodes instead of reading the full assortment, 8 to 14 digits. |
onlyBonus | boolean | false | Keep only products with a promotion, in any mode. |
maxItems | integer | 100000 | Stop after this many products. The default covers the full assortment. |
minItems | integer | 1 | Fail 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.
| Field | Source | Meaning |
|---|---|---|
chain | Fixed | Always albert-heijn. |
store | Fixed | Always null: prices are national. |
externalId | AH | Albert Heijn product id. |
ean | AH | Current barcode (GTIN-14). |
gtins | AH | Every barcode the product has carried, current one included. |
name | AH | Product name. |
brand | AH | Brand. |
sizeText | AH | Size as Albert Heijn states it, such as 4 x 90 g or per stuk. |
packCount | Derived | Units in a multipack, read from sizeText; 1 when not a multipack. |
quantity | Derived | Size of one unit, read from sizeText: 4 x 90 g gives 90. |
unit | Derived | Unit of quantity: g, kg, ml, l, stuk, and so on. |
price | AH | Regular price in EUR. |
currency | Fixed | Always EUR. |
unitPrice | AH | Price per kg, litre or metre in EUR. |
unitPriceUnit | AH | Unit of unitPrice: KG, LT or meter. |
promoPrice | Derived | Current price when lower than price, otherwise null. |
promoText | AH | The deal as shown, such as 2 + 2 gratis or VOOR 3.99. |
promoType | AH | Kind of deal: NATIONAL, AHONLINE, ETOS or GALL. |
promoLabels | AH | The deal label from the product card (topText, centerText, bottomText, emphasis, title, variant, size). |
promoStart | AH | First day of the deal, YYYY-MM-DD. |
promoEnd | AH | Last day of the deal, YYYY-MM-DD. |
organic | Derived | true when Albert Heijn marks the product organic. |
nutriScore | AH | Nutri-Score: A to E, or N/A. |
categoryPath | AH | Category path, such as Fruit, verse sappen/Blauwe bessen. |
categoryIds | AH | Category ids from top level to leaf. |
category | Derived | Top-level category, the first part of categoryPath. |
url | Derived | Product page on ah.nl. |
imageUrl | AH | Product image, 800 x 800 px. |
inStock | AH | true when the product can be ordered online. |
availabilityLabel | AH | Availability note, such as Alleen in de winkel or Leverbaar vanaf 09-11. |
searchTerm | Input | The keyword or barcode that found the product; null in full-assortment mode. |
scrapedAt | Fixed | Time 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": []}
| Field | Meaning |
|---|---|
itemsPushed, distinctIds | Products stored. Only products Apify accepted count. |
productsRead | Distinct products read from Albert Heijn, including those left out by onlyBonus, maxItems or your charge limit. |
expectedTotal | Albert Heijn's own product count, read at the start. null in search mode. |
coverage | productsRead / expectedTotal. null in search mode. |
categories | Albert Heijn's count and the collected count for each of the 28 top-level categories. |
categorySum | Sum of the category counts; higher than expectedTotal because a product can sit in several categories. |
searches | In search mode, Albert Heijn's count and the collected count per keyword or barcode. |
secondPassRequests | Requests spent re-reading categories or keywords that came up short. |
stoppedAtChargeLimit | true when the run stopped at your maximum charge. |
concurrencyReduced | true when Albert Heijn answered HTTP 429 or 403; the actor then halves its parallel requests from 12 to 6. |
statusCodes, retries, errors | Every 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 Scraper | harvestedge/albert-heijn-api | studio-amba/albert-heijn-scraper | incognito_mode/albert-heijn-product-scraper | |
|---|---|---|---|---|
| Price per 1,000 | $1.00 | $5.00 | from $2.00, plus $0.02 per run | from $4.00 |
| Full assortment | yes, default | not stated | not stated | yes, with maxItems raised from the default 500 |
| Category mode | full assortment only | no | yes, by taxonomy id | yes, 27 root categories or chosen ids |
| Barcode lookup | yes, exact, eans | no | yes, an EAN as search query | not stated |
| EAN in output | yes, plus barcode history | not listed | yes | not listed |
| Promotion start and end dates | yes | not listed | not listed | not listed |
| Promotions-only filter | yes | no | not stated | yes, bonusOnly |
| Completeness check against AH's count | yes, every run | not stated | not stated | not 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.
unitPriceuses 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. For2 + 2 gratis, the single price does not change; the deal is inpromoTextandpromoLabels. - From Friday, next week's deals show. A product can carry a deal that starts on Monday, so
promoPriceis not yet the shop price. CheckpromoStart. - Most promotions follow the Monday-to-Sunday week. In the run of Wednesday 2026-11-04, 3,170 products had a
promoStartof 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 onpromoStart<= today andpromoEnd>= today. inStockmeans 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
storeis alwaysnull. nutriScoreis the raw value. It can beN/A(184 products); 39.4% of products have none.- Etos and Gall & Gall products are included. Their deals have
promoTypeETOSorGALL. - Albert Heijn serves 40 products per request at most. A full run is about 721 requests.
Is it legal to use the Albert Heijn Scraper?
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
| Actor | What it extracts | Price per 1,000 | |
|---|---|---|---|
| Albert Heijn Scraper | Albert Heijn products: prices, Bonus deals, EAN, Nutri-Score | $1.00 | you are here |
| Jumbo Scraper | Jumbo products: prices, deals with dates, EAN, organic, shelf life | $1.50 | |
| Dirk Scraper | Dirk products: prices, next week's deals, EAN, Nutri-Score | $2.00 | |
| PLUS Scraper | PLUS products: prices, deals with dates, EAN, Nutri-Score, vegan | $1.50 | |
| DekaMarkt Scraper | DekaMarkt products: prices, next week's deals, EAN, organic | $2.00 | |
| Hoogvliet Scraper | Hoogvliet products: prices, next week's deals, EAN, ingredients, vegan | $2.00 | |
| Vomar Scraper | Vomar products: prices, every EAN barcode, BIO, categories | $1.00 | |
| Poiesz Scraper | Poiesz products: prices, deals with dates, EAN, deposit, ingredients | $1.50 | |
| Ekoplaza Scraper | Ekoplaza products: prices, next week's deals, EAN, allergens, Ekoscope | $2.00 | |
| Aldi NL Scraper | 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 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.