EU Beauty Price Corridor — Notino Prices in 24 Countries avatar

EU Beauty Price Corridor — Notino Prices in 24 Countries

Under maintenance

Pricing

from $4.00 / 1,000 corridor rows

Go to Apify Store
EU Beauty Price Corridor — Notino Prices in 24 Countries

EU Beauty Price Corridor — Notino Prices in 24 Countries

Under maintenance

Compare 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

Studio Amba

Maintained by Community

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

  1. EAN/GTIN barcode — the primary key, when Notino exposes it for that product.
  2. 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.
  3. 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

  1. Enter a product name or brand in Search Query, e.g. dior sauvage or chanel no 5. Fragrance queries resolve fastest; skincare and OTC queries (e.g. la roche posay effaclar) also work but take longer.
  2. 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.
  3. Set Max Items Per Source to control how many candidate products each country's site contributes.
  4. Run the actor. All selected countries are queried in parallel, so adding countries doesn't multiply the run time.
  5. 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.
  6. Use cheapestCountry and priceSpreadPct to sort straight to the products with the widest cross-border price gaps.

Input

FieldTypeDescription
searchQuerystringProduct name or brand to price-check on Notino. Defaults to "dior sauvage".
countriesarrayWhich 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.
maxItemsPerSourceintegerMax candidate products considered per country per query (1-50, default 10).
timeoutPerSourceSecsintegerMax seconds to wait for each country's scraper before treating it as failed (30-600, default 120).
proxyConfigurationobjectProxy 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

FieldTypeDescription
querystringThe search query this row was matched against
productNamestringCanonical product name
brandstringProduct brand, when exposed
eanstringNormalized EAN barcode used for matching, or null
notinoProductIdstringNotino's own product ID, used as the secondary match key
countrystringISO country code of the Notino storefront this row refers to
currencyLocalstringCurrency code as returned by that country's site (EUR, GBP, PLN, CZK, ...)
priceLocalnumberRegular price in local currency, null on an absence row
priceEurnumberRegular price converted to EUR via the ECB daily reference rate
promoPriceLocal / promoPriceEurnumberReserved for a discounted price; Notino's product data doesn't expose a separate promo price today, so these are currently always null
availablebooleanFalse on an absence row
urlstringProduct page URL on that country's Notino site
imageUrlstringProduct image URL
matchTypestringean (barcode), productId (Notino's own ID), or name (fuzzy match)
cheapestCountrystringCountry with the lowest EUR price for this matched product
priceSpreadPctnumberPercentage gap between the highest and lowest EUR price found
absenceReasonstringnot_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/promoPriceEur are placeholders in this version.
  • Data is scraped from public Notino pages and may change without notice.

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:

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.