# Notino Slovenia Scraper — Perfume & Cosmetics Prices (`studio-amba/notino-si-scraper`) Actor

Scrape Notino Slovenia (notino.si): perfume and cosmetics product names, brands, EUR prices, size variants, ratings, reviews, stock, EAN/GTIN, categories and images. Search by brand or keyword, or pass product URLs. No login, no cookies.

- **URL**: https://apify.com/studio-amba/notino-si-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 result scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Notino Slovenia Scraper

Scrape Notino Slovenia (notino.si): perfume and cosmetics product names, brands, EUR prices, size variants, ratings, reviews, stock status, EAN/GTIN barcodes, categories, images and descriptions. Search by brand or product keyword, or pass product URLs directly. No login, no cookies.

### Why use this actor?

Notino is one of the largest perfume and cosmetics retailers in Europe, with a catalogue running to tens of thousands of fragrances, makeup, skincare, haircare and drugstore products. This actor gives you a clean, structured feed of that catalogue for price monitoring, competitor benchmarking, product matching, market research, or building a beauty price comparison. You get the same data the Notino website shows shoppers, including every size variant and its price, without needing an account.

**Clean data from the source.** Every Notino product page ships a full schema.org Product record: name, brand, SKU, GTIN-13 barcode, category, image, average rating, review count, and one offer per size variant with its own price and stock status. This actor reads that record directly, so the output is structured and consistent rather than scraped from fragile page markup.

**Every size variant, priced.** A single fragrance is usually sold in several sizes (30 ml, 50 ml, 100 ml, 150 ml), each at its own price. The actor returns the default variant at the top level and a `variants` array with the size, price, SKU and stock status of every option, so you never lose the price ladder.

Notino sits behind Cloudflare, so ordinary scrapers hit a "Just a moment..." challenge before any product loads. This actor routes every request through the Bright Data Web Unlocker, which solves the Cloudflare challenge and returns the fully rendered page, so you get reliable results run after run.

### How to scrape notino.si data

1. Add this actor to your Apify account.
2. Choose what to scrape:
   - Set `searchQuery` to a brand or product name, e.g. `dior`, `chanel`, `la roche posay` or `jadore`. The query is matched against Notino's product URLs, which carry the brand and product name.
   - Or paste a list of Notino product page URLs into `startUrls`, e.g. `https://www.notino.si/dior/miss-dior-esprit-de-parfum-parfumska-voda-za-zenske/`.
   - Leave everything empty to pull popular Dior products (the default query).
3. Provide a Bright Data API key (field `brightDataApiKey`, stored as a secret) or set the `BRIGHT_DATA_API_KEY` environment variable. This is required because Notino is behind Cloudflare.
4. Set `maxResults` to cap the run (prefilled 20 for a quick test).
5. Run the actor. Results stream to the dataset and can be exported as JSON, CSV, Excel or fed to an API.

The keyword search works by scanning Notino's own product sitemaps and collecting the URLs whose slug contains every word in your query, then fetching each product page. Because Notino slugs carry the brand and product name (for example `/dior/miss-dior-esprit-de-parfum-parfumska-voda-za-zenske/`), brand and product searches resolve cleanly. Each matched product page is then fetched through the Web Unlocker and parsed.

### Input

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `searchQuery` | String | No | Brand or product keyword to search for (e.g. `dior`, `jadore`). Default `dior`. Ignored when `startUrls` is set. |
| `startUrls` | Array | No | One or more Notino Slovenia product page URLs to scrape directly |
| `maxResults` | Integer | No | Maximum number of products to return (prefilled 20) |
| `brightDataApiKey` | String (secret) | Yes | Bright Data Web Unlocker API key. Falls back to the `BRIGHT_DATA_API_KEY` env var. |
| `proxyConfiguration` | Object | No | Proxy for the best-effort direct fallback when no Bright Data key is set |

#### Example input

```json
{
    "searchQuery": "dior",
    "maxResults": 20
}
```

Or scrape specific products:

```json
{
    "startUrls": [
        { "url": "https://www.notino.si/dior/miss-dior-esprit-de-parfum-parfumska-voda-za-zenske/" },
        { "url": "https://www.notino.si/dior/sauvage-toaletna-voda-za-moske/" }
    ]
}
```

### Output

| Field | Type | Example | Description |
|-------|------|---------|-------------|
| `name` | String | `DIOR Miss Dior Esprit de Parfum` | Product name |
| `brand` | String | `DIOR` | Brand name |
| `price` | Number | `187` | Current price of the default size variant, in EUR |
| `currency` | String | `EUR` | Currency code (EUR on notino.si) |
| `sku` | String | `CHDMDEW_AEDP10` | Notino SKU of the default variant |
| `ean` | String | `3348901069878` | Barcode (GTIN-13) where available |
| `productId` | String | `CHDMDEW_AEDP10` | Notino product identifier |
| `inStock` | Boolean | `true` | Whether any variant is available for sale |
| `rating` | Number | `4.7` | Average review rating (0-5) |
| `reviewCount` | Integer | `20` | Number of reviews |
| `category` | String | `parfumska voda za ženske` | Notino product category |
| `imageUrl` | String | `https://cdn.notinoimg.com/...jpg` | Primary product image |
| `variants` | Array | `[{ "size": "100 ml", "price": 187, "sku": "CHDMDEW_AEDP10", "inStock": true }]` | Size variants with price, SKU and stock |
| `productDescription` | String | `Miss Dior Esprit de Parfum...` | Product description (plain text, truncated) |
| `url` | String | `https://www.notino.si/dior/miss-dior-esprit-de-parfum-parfumska-voda-za-zenske/` | Product page URL |
| `scrapedAt` | String | `2026-07-07T12:00:00.000Z` | Timestamp |

#### Example output

```json
{
    "name": "DIOR Miss Dior Esprit de Parfum",
    "brand": "DIOR",
    "price": 187,
    "currency": "EUR",
    "sku": "CHDMDEW_AEDP10",
    "ean": "3348901069878",
    "productId": "CHDMDEW_AEDP10",
    "inStock": true,
    "category": "parfumska voda za ženske",
    "imageUrl": "https://cdn.notinoimg.com/order_2k/dior/3348901069878xx_01/miss-dior.jpg",
    "variants": [
        { "size": "100 ml", "price": 187, "sku": "CHDMDEW_AEDP10", "inStock": true }
    ],
    "productDescription": "Miss Dior Esprit de Parfum...",
    "url": "https://www.notino.si/dior/miss-dior-esprit-de-parfum-parfumska-voda-za-zenske/",
    "scrapedAt": "2026-07-07T12:00:00.000Z"
}
```

### Cost estimate

Each product page is one Bright Data Web Unlocker request (about $0.0015 on Bright Data's side), plus one or two sitemap fetches per run to resolve the search. A run of 500 products therefore costs roughly $0.75 of Web Unlocker usage plus a small amount of Apify compute. Keyword searches over a common brand usually resolve from the first sitemap alone.

### Limitations / known issues

- A Bright Data Web Unlocker key is required. Notino is behind Cloudflare and direct requests get the "Just a moment..." challenge. The Apify residential proxy fallback is best-effort only and is usually blocked.
- `rating` and `reviewCount` are only present for products that have reviews.
- Keyword search matches your query against product URL slugs, which are in the storefront's language. Brand and product names resolve well; generic category words may match fewer products than a full on-site search.
- Notino does not expose historical prices; each run captures a snapshot (use scheduled runs to build a price history).
- Some brands (for example Chanel) are not sold on Notino and will return no results.

### Notino across Europe

Notino runs the same platform on around twenty storefronts (notino.de, notino.fr, notino.it, notino.es, notino.pl, notino.cz, notino.co.uk, notino.at and more). This actor is built so a sibling for another country is a configuration swap (domain, country, currency, sitemap suffix) with no code change. Ask if you need a specific country storefront.

### Related Scrapers

- [Boots Scraper](https://apify.com/studio-amba/boots-scraper) — UK health and beauty catalogue
- [dm Scraper](https://apify.com/studio-amba/dm-scraper) — German drugstore products and prices
- [Rossmann Scraper](https://apify.com/studio-amba/rossmann-scraper) — German drugstore and cosmetics
- [Kruidvat Scraper](https://apify.com/studio-amba/kruidvat-scraper) — Benelux health and beauty
- [Shop Apotheke Scraper](https://apify.com/studio-amba/shop-apotheke-scraper) — European online pharmacy

# Actor input Schema

## `searchQuery` (type: `string`):

Brand or product keyword to search for on Notino Slovenia (e.g. 'dior', 'chanel', 'la roche posay', 'jadore'). Matched against Notino product URLs, which carry the brand and product name. Ignored when Start URLs are set.

## `startUrls` (type: `array`):

One or more Notino Slovenia product page URLs to scrape directly (e.g. https://www.notino.si/dior/miss-dior-esprit-de-parfum-parfumska-voda-za-zenske/). Overrides the search query.

## `maxResults` (type: `integer`):

Maximum number of products to return.

## `brightDataApiKey` (type: `string`):

Bright Data API key for the Web Unlocker zone. Required — Notino is behind Cloudflare and the Web Unlocker solves the challenge that blocks direct requests. Falls back to the BRIGHT\_DATA\_API\_KEY environment variable.

## `proxyConfiguration` (type: `object`):

Proxy used for the best-effort direct fallback when no Bright Data key is set. Page fetches normally go through the Bright Data Web Unlocker.

## Actor input object example

```json
{
  "searchQuery": "dior",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "SI"
  }
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchQuery": "dior",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "SI"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/notino-si-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchQuery": "dior",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "SI",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/notino-si-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQuery": "dior",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "SI"
  }
}' |
apify call studio-amba/notino-si-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=studio-amba/notino-si-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/smYxbklvaWksNtoLo/builds/eXa63SBeLdSeZyo2I/openapi.json
