EU Beauty Price Corridor — Notino Prices in 24 Countries
Under maintenancePricing
from $4.00 / 1,000 corridor rows
EU Beauty Price Corridor — Notino Prices in 24 Countries
Under maintenanceCompare beauty and OTC product prices across 24 Notino country storefronts in one run. Matches products by EAN barcode and Notino product ID with a fuzzy-name fallback, normalizes every price to EUR via ECB rates, and flags the cheapest market and spread.
Pricing
from $4.00 / 1,000 corridor rows
Rating
0.0
(0)
Developer
Studio Amba
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
7 days ago
Last modified
Categories
Share
EU Beauty Price Corridor
Compare beauty and OTC product prices across all 24 Notino country storefronts in a single run. Give it a product name or brand, and it returns one row per product per country: the price in local currency, the same price converted to EUR, and whether that country's Notino site carries the product at all.
This actor does not scrape a website itself. It runs our 24 Notino country scrapers in parallel (fr, de, it, es, pl, cz, co-uk, nl, at, be, bg, dk, ee, fi, gr, hr, hu, ie, lt, lv, ro, se, si, sk), matches what comes back by EAN barcode and by Notino's own product ID, converts every price to EUR, and builds the cross-border comparison from the results.
Why use this actor?
Notino runs one platform across ~24 European storefronts with the same catalogue at different local prices. Parallel-import traders and beauty/OTC pricing managers need to know where a SKU is cheapest and how wide the spread is, right now. Checking that by hand across 24 sites, in 15 different currencies, is slow. This actor fans out to every storefront, matches the SKU, normalizes the currency, and returns a flat table you can sort straight to the widest price gaps.
What makes the match reliable
Notino is a single platform, not 24 independent retailers. That means the same product carries the same Notino product ID on every country site — a much stronger match key than the fuzzy name matching most cross-retailer comparisons have to fall back on. This actor uses three tiers, in priority order:
- EAN/GTIN barcode — the primary key, when Notino exposes it for that product.
- Notino product ID — the secondary key. Since it's one platform, the same product on notino.fr and notino.de shares the same ID even when the barcode field is empty on one side.
- Fuzzy product name — a last-resort fallback (60% token overlap) for products where neither of the above is available.
Every row's matchType field tells you which tier produced that group, so you can judge match confidence directly in the data.
What it returns
Each row in the output is one product at one country's Notino site. If a country doesn't carry that product (or its scraper failed for this run), you still get a row for it, marked available: false, so "we checked and it's not there" is distinguishable from "we didn't check."
[{"query": "la roche posay effaclar duo","productName": "La Roche-Posay Effaclar Duo+ Corrective Anti-Blemish Care","brand": "La Roche-Posay","ean": "3337875597969","notinoProductId": "156234","country": "fr","currencyLocal": "EUR","priceLocal": 16.90,"priceEur": 16.90,"promoPriceLocal": null,"promoPriceEur": null,"available": true,"url": "https://www.notino.fr/la-roche-posay/effaclar-duo-soin-correcteur-anti-imperfections/","imageUrl": "https://cdn.notino.com/...","matchType": "ean","cheapestCountry": "pl","priceSpreadPct": 34.2,"absenceReason": null},{"query": "la roche posay effaclar duo","productName": "La Roche-Posay Effaclar Duo+ Corrective Anti-Blemish Care","brand": "La Roche-Posay","ean": "3337875597969","notinoProductId": "156234","country": "co-uk","currencyLocal": "GBP","priceLocal": 14.20,"priceEur": 16.90,"promoPriceLocal": null,"promoPriceEur": null,"available": true,"url": "https://www.notino.co.uk/la-roche-posay/effaclar-duo-corrective-unclogging-care/","imageUrl": "https://cdn.notino.com/...","matchType": "ean","cheapestCountry": "pl","priceSpreadPct": 34.2,"absenceReason": null}]
Use cases
- Parallel-import traders looking for beauty/OTC SKUs that are meaningfully cheaper in one EU market than another.
- Beauty and OTC pricing managers monitoring how a brand's Notino price varies across the 24 markets it sells in.
- Category managers building an EUR-normalized reference price for a shopping list of SKUs.
- EAN/GTIN matching for teams with a barcode list who want a live cross-border price check on any of those products.
How to scrape Notino data
- Enter a product name or brand in Search Query, e.g.
dior sauvageorchanel no 5. Fragrance queries resolve fastest; skincare and OTC queries (e.g.la roche posay effaclar) also work but take longer. - Choose which Countries to include. The core 8 markets (France, Germany, Italy, Spain, Poland, Czechia, UK, Netherlands) are selected by default; add more from the remaining 16 for wider coverage.
- Set Max Items Per Source to control how many candidate products each country's site contributes.
- Run the actor. All selected countries are queried in parallel, so adding countries doesn't multiply the run time.
- Open the dataset. Each matched product has one row per country: a price row where it's carried, an absence row where it isn't.
- Use
cheapestCountryandpriceSpreadPctto sort straight to the products with the widest cross-border price gaps.
Input
| Field | Type | Description |
|---|---|---|
searchQuery | string | Product name or brand to price-check on Notino. Defaults to "dior sauvage". |
countries | array | Which of the 24 Notino country sites to include (fr, de, it, es, pl, cz, co-uk, nl, at, be, bg, dk, ee, fi, gr, hr, hu, ie, lt, lv, ro, se, si, sk). Defaults to the core 8. |
maxItemsPerSource | integer | Max candidate products considered per country per query (1-50, default 10). |
timeoutPerSourceSecs | integer | Max seconds to wait for each country's scraper before treating it as failed (30-600, default 120). |
proxyConfiguration | object | Proxy settings passed to the underlying Notino scrapers. Each already runs its own Bright Data Web Unlocker for the Cloudflare wall; this is only used for their best-effort direct fallback. |
Example input
{"searchQuery": "dior sauvage","countries": ["fr", "de", "it", "es", "pl", "cz", "co-uk", "nl"],"maxItemsPerSource": 10,"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }}
Output
| Field | Type | Description |
|---|---|---|
query | string | The search query this row was matched against |
productName | string | Canonical product name |
brand | string | Product brand, when exposed |
ean | string | Normalized EAN barcode used for matching, or null |
notinoProductId | string | Notino's own product ID, used as the secondary match key |
country | string | ISO country code of the Notino storefront this row refers to |
currencyLocal | string | Currency code as returned by that country's site (EUR, GBP, PLN, CZK, ...) |
priceLocal | number | Regular price in local currency, null on an absence row |
priceEur | number | Regular price converted to EUR via the ECB daily reference rate |
promoPriceLocal / promoPriceEur | number | Reserved for a discounted price; Notino's product data doesn't expose a separate promo price today, so these are currently always null |
available | boolean | False on an absence row |
url | string | Product page URL on that country's Notino site |
imageUrl | string | Product image URL |
matchType | string | ean (barcode), productId (Notino's own ID), or name (fuzzy match) |
cheapestCountry | string | Country with the lowest EUR price for this matched product |
priceSpreadPct | number | Percentage gap between the highest and lowest EUR price found |
absenceReason | string | not_found (site checked, doesn't carry it) or source_failed (that country's scraper timed out or errored) |
Currency normalization
Every price is converted to EUR using the European Central Bank's daily reference rates (eurofxref-daily.xml), fetched once at the start of each run — no API key required. If the ECB feed is unreachable for any reason, the actor falls back to an embedded table of approximate rates and logs a warning; a run never zeroes out because of an FX fetch failure.
Matching logic
Products are matched across countries in three tiers: EAN/GTIN barcode first (leading zeros stripped), then Notino's own product ID (a strong key since Notino is one platform serving all 24 storefronts), then fuzzy product-name matching (60% token overlap) as a last resort. matchType on every row tells you which tier produced that group.
FAQ
Does this actor scrape Notino itself? No. It calls our own 24 Notino country scrapers and combines their output. Each of those actors is also available separately on the Store.
Why is notinoProductId sometimes more reliable than ean?
Not every Notino product page exposes a GTIN in its structured data, but the product ID is always present. Since it's the same platform on every storefront, matching on it is close to as reliable as a barcode match.
Do I need my own Bright Data key?
No. Each underlying Notino scraper authenticates with its own Bright Data Web Unlocker key on its Apify deployment. This actor forwards its own BRIGHT_DATA_API_KEY environment variable defensively as a fallback, but normally never needs to.
How is priceSpreadPct calculated?
(highest EUR price - lowest EUR price) / lowest EUR price * 100, across whichever countries actually carry the matched product. It's null when only one country has the product.
How many countries can I check in one run? All 24, if you want. Each selected country runs its own scraper call in parallel, so adding countries doesn't multiply run time the way adding more search queries would.
Limitations
- Matching quality depends on EAN and product-ID coverage. Products with neither rely on fuzzy name matching, which can occasionally group similar-but-different pack sizes together.
- Prices reflect each Notino storefront's standard online price at the time of the run.
- EUR conversion uses the ECB's daily reference rate, which updates once per business day — intraday FX moves aren't reflected.
- Notino's product data doesn't expose a separate promotional price, so
promoPriceLocal/promoPriceEurare placeholders in this version. - Data is scraped from public Notino pages and may change without notice.
Related actors
This corridor is built on our standalone Notino country scrapers, each of which you can also run on its own for a full-catalogue pull:
- Notino France Scraper
- Notino Germany Scraper
- Notino Italy Scraper
- Notino Spain Scraper
- Notino Poland Scraper
We run this comparison as a managed service too: scheduled runs, a fixed SKU list, and delivery to your inbox, Google Sheets, or API, maintenance included. See studioamba.dev/services or email hello@studioamba.dev for a free data sample.