Etos Scraper — Dutch Drugstore Products & Prices avatar

Etos Scraper — Dutch Drugstore Products & Prices

Pricing

from $1.20 / 1,000 result scrapeds

Go to Apify Store
Etos Scraper — Dutch Drugstore Products & Prices

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

Studio Amba

Maintained by Community

Actor 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?

FieldTypeDescription
nameStringFull product title
brandStringBrand name (Andrelon, Nivea, L'Oreal, Etos eigen merk, etc.)
priceNumber | nullCurrent selling price in EUR
currencyStringAlways "EUR"
originalPriceNumber | nullPrice before a promotional price cut, when shown
discountString | nullDiscount percentage computed from price vs originalPrice, e.g. "-40%"
promotionString | nullEtos's own promotion label, e.g. "2+3 GRATIS" -- not always a price cut
productIdStringEtos internal product code
inStockBoolean | nullStock signal; null when the source gives no usable signal (never coerced to false)
categoryString | nullDeepest category in the breadcrumb
categoriesArrayFull category breadcrumb path
imageUrlStringPrimary product image
urlStringFull product page URL
scrapedAtStringISO 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.

ScenarioPages fetchedEstimated 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 ApifyClient
client = 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

ParameterTypeDefaultDescription
categoryUrlStringAn etos.nl category or brand URL to browse, e.g. https://www.etos.nl/haarverzorging/shampoo/
searchQueryString"shampoo"Best-effort keyword match against known categories/brands (not a live search)
maxResultsInteger100Maximum number of products to return. Hard-capped at 20,000
inStockOnlyBooleanfalseOff by default. When enabled, products explicitly marked out of stock are excluded
requestDelaySecsInteger0Minimum pause between page requests. Raise for large runs if throttled
proxyConfigurationObjectLeft 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 categoryUrl for 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) -- inStock is null, never coerced to false, 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:

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.