Etos Scraper — Dutch Drugstore Products & Prices
Pricing
from $1.20 / 1,000 result scrapeds
Etos Scraper — Dutch Drugstore Products & Prices
Scrape product listings, prices, promotions, and availability from Etos.nl, the Netherlands' #2 drugstore chain (Ahold Delhaize). Beauty, personal care, health, and household products.
Pricing
from $1.20 / 1,000 result scrapeds
Rating
0.0
(0)
Developer
Studio Amba
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Etos Scraper -- Dutch Drugstore Products, Prices & Promotions
Scrape product data from Etos.nl -- the Netherlands' #2 drugstore chain, owned by Ahold Delhaize, with over 500 stores. Get structured data on beauty products, personal care, health, baby, and household essentials, including Etos's frequent "2+3 gratis" and percentage-off promotions.
How to scrape Etos data
Give the scraper a category or brand URL from etos.nl and it returns structured product records: name, brand, price, promotion, stock status, category, and image. No login or cookies required.
What is Etos?
Etos is one of the two largest drugstore chains in the Netherlands (alongside Kruidvat), owned by Ahold Delhaize -- the same group behind Albert Heijn. Etos runs on Salesforce Commerce Cloud and stocks thousands of products across beauty, personal care, health, baby, and household categories, with constant promotional cycles ("2+3 GRATIS", percentage discounts, loyalty pricing).
Who uses this scraper:
- Price comparison platforms -- Etos is a benchmark for drugstore pricing in the Netherlands, alongside Kruidvat. Track prices to power comparison features across beauty, health, and personal care.
- Brand managers & manufacturers -- Monitor how your products are priced and positioned at one of the two biggest Dutch drugstore chains. Detect unauthorized discounting or track promotional cycles.
- E-commerce competitors -- If you run a pharmacy, beauty store, or health shop in the Netherlands, Etos is one of your pricing benchmarks. Know when they run promotions before your customers do.
- Market researchers -- Analyze the Dutch drugstore market: category sizes, price distributions, brand representation, and seasonal promotional patterns.
- Deal tracking & couponing -- Etos's frequent "2+3 gratis" and percentage-off promotions create opportunities for deal-focused content and apps.
Browse a category or brand
Grab category or brand URLs from etos.nl navigation:
{"categoryUrl": "https://www.etos.nl/haarverzorging/shampoo/","maxResults": 100}
{"categoryUrl": "https://www.etos.nl/assortiment/dove/","maxResults": 100}
If categoryUrl is provided, it takes priority over searchQuery.
Search by keyword (best effort)
searchQuery matches against a shortlist of known categories and brands (shampoo, conditioner, and roughly two dozen popular brands like Dove, Nivea, CeraVe, L'Oreal). It is not a live site-wide search -- etos.nl blocks free-text search query parameters for automated fetches (see Limitations below). For a precise target, always prefer categoryUrl.
{"searchQuery": "dove","maxResults": 50}
Tip: if you leave every field empty, the scraper defaults to the shampoo category so a run always returns data.
What data does Etos Scraper extract?
| Field | Type | Description |
|---|---|---|
name | String | Full product title |
brand | String | Brand name (Andrelon, Nivea, L'Oreal, Etos eigen merk, etc.) |
price | Number | null | Current selling price in EUR |
currency | String | Always "EUR" |
originalPrice | Number | null | Price before a promotional price cut, when shown |
discount | String | null | Discount percentage computed from price vs originalPrice, e.g. "-40%" |
promotion | String | null | Etos's own promotion label, e.g. "2+3 GRATIS" -- not always a price cut |
productId | String | Etos internal product code |
inStock | Boolean | null | Stock signal; null when the source gives no usable signal (never coerced to false) |
category | String | null | Deepest category in the breadcrumb |
categories | Array | Full category breadcrumb path |
imageUrl | String | Primary product image |
url | String | Full product page URL |
scrapedAt | String | ISO 8601 timestamp |
Output
A realistic Etos product record:
{"name": "Dermolin Anti-roos Shampoo 200 ML","brand": "Dermolin","price": 5.99,"originalPrice": 9.99,"currency": "EUR","discount": "-40%","promotion": "1 VOOR € 5.99","productId": "120198808","inStock": true,"category": "Shampoo","categories": ["Verzorging", "Haarverzorging", "Shampoo"],"imageUrl": "https://www.etos.nl/dw/image/v2/BCTN_PRD/on/demandware.static/-/Sites-etos-master-catalog/default/dw3c4bc575/images/120198808/120198808_MCM_PACK_140348.png?sw=230","url": "https://www.etos.nl/producten/dermolin-anti-roos-shampoo-200-ml-120198808.html","scrapedAt": "2026-08-22T10:34:13.046Z"}
How much does it cost?
Every page fetch goes through the Bright Data Web Unlocker to clear Etos's Akamai bot protection, and each fetch returns roughly 24 products -- a cost estimate of roughly $0.0004-0.0008 per result.
| Scenario | Pages fetched | Estimated cost |
|---|---|---|
| 24 products (one category page) | 1 | ~$0.01 |
| 100 products | ~5 | ~$0.04 |
| 500 products | ~21 | ~$0.20 |
| 2,000 products | ~84 | ~$0.75 |
Your Apify usage cost only settles once a run finishes and shows as SUCCEEDED -- a run that fails partway through still bills for the requests it made.
Can I integrate?
Connect Etos data to your tools:
- Google Sheets -- track Dutch drugstore prices in a spreadsheet
- Webhooks -- trigger alerts when promotions start or prices drop
- Zapier / Make -- build automated workflows around price changes
- Slack -- daily notifications on Etos deals in specific categories
- Amazon S3 / Google Cloud Storage -- archive weekly pricing snapshots
- PostgreSQL / MySQL -- feed data into your analytics database
Can I use it as an API?
Python
from apify_client import ApifyClientclient = ApifyClient("YOUR_API_TOKEN")run = client.actor("studio-amba/etos-scraper").call(run_input={"categoryUrl": "https://www.etos.nl/haarverzorging/shampoo/","maxResults": 100,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():price_info = f"EUR {item['price']}"if item.get('originalPrice'):price_info += f" (was EUR {item['originalPrice']})"print(f"{item['brand']} - {item['name']} -- {price_info}")
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });const run = await client.actor('studio-amba/etos-scraper').call({categoryUrl: 'https://www.etos.nl/haarverzorging/shampoo/',maxResults: 100,});const { items } = await client.dataset(run.defaultDatasetId).listItems();items.forEach(item => {const sale = item.originalPrice ? ` (was EUR ${item.originalPrice})` : '';console.log(`${item.brand} - ${item.name} -- EUR ${item.price}${sale}`);});
Input parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
categoryUrl | String | An etos.nl category or brand URL to browse, e.g. https://www.etos.nl/haarverzorging/shampoo/ | |
searchQuery | String | "shampoo" | Best-effort keyword match against known categories/brands (not a live search) |
maxResults | Integer | 100 | Maximum number of products to return. Hard-capped at 20,000 |
inStockOnly | Boolean | false | Off by default. When enabled, products explicitly marked out of stock are excluded |
requestDelaySecs | Integer | 0 | Minimum pause between page requests. Raise for large runs if throttled |
proxyConfiguration | Object | Left at default -- traffic is routed through Bright Data, not the Apify proxy pool |
FAQ
Why can't I search etos.nl for any keyword I want?
etos.nl's robots.txt disallows the query parameters the site's own search and pagination use (q=, start=, sz=, and every filter parameter). The scraper respects that and never requests a disallowed URL, so free-text search is limited to a curated shortlist of common categories and brands. Use categoryUrl for anything specific -- copy the URL straight from etos.nl's own navigation.
How do I get more than 24 products from one category?
The scraper automatically fans out to related subcategory and brand pages discovered in Etos's own site navigation once the seed category page is exhausted, up to maxResults. Set maxResults higher to pull from more of these related pages in a single run.
Can I track promotions like "2+3 gratis"?
Yes -- the promotion field carries Etos's own promotion label exactly as shown on the site. The discount field is only populated when the promotion is an actual price cut (a struck-through original price), which "2+3 gratis"-style bundle deals usually are not.
What language is the data in? Product data comes in Dutch, matching what's shown on etos.nl.
How often do Etos prices change? Etos runs regular promotional cycles. Scraping weekly captures new promotion rounds; daily scraping catches flash deals.
Are Etos's own-brand products included? Yes. Etos eigen merk products appear in results like any other brand.
Limitations
- Free-text search is best-effort only (see FAQ) -- use
categoryUrlfor precise targeting. - Rating and review data are not exposed on Etos listing pages, so they are not part of the output.
- Stock status reflects the signal exposed on the listing page, not individual store inventory. No explicit "out of stock" example was observed during testing (listing pages appear to only show orderable products) --
inStockisnull, never coerced tofalse, whenever the source doesn't give a clear signal. - Very large multi-category runs may take longer, since every page fetch routes through the Bright Data Web Unlocker to clear Etos's Akamai bot protection.
Other retail and beauty scrapers
Build comprehensive Dutch and European drugstore intelligence:
- Kruidvat Scraper -- Belgium & Netherlands drugstore chain (AS Watson)
- Douglas.de Scraper -- Germany's #1 perfumery and beauty chain
- BIPA Scraper -- Austria's #2 drugstore chain
- ICI PARIS XL Scraper -- Belgian beauty and perfume (premium segment)
- Rituals Scraper -- Luxury cosmetics and home fragrance
- Action Scraper -- Pan-European discount retailer
Your feedback
Found an issue or want a new feature? Let us know through the Apify Store actor page. We fix bugs quickly and actively maintain this scraper.