# Notino Product Scraper (Cheap) (`data_api/notino-product-scraper-cheap`) Actor

Scrape product data, prices, ratings, and reviews from any Notino domain. Built for market research and e-commerce price comparison without getting blocked.

- **URL**: https://apify.com/data\_api/notino-product-scraper-cheap.md
- **Developed by:** [Data API](https://apify.com/data_api) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.99 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use 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 Product Scraper

![Notino Product Scraper](cover.jpg)

Pulling product data off Notino by hand gets old fast. You open a category, scroll through the grid as it lazy-loads, and copy names, prices, and ratings one tile at a time. Switch to a different country store and the whole layout shifts on you. This scraper handles that part. Give it a category handle or a full Notino category URL and it walks the listing pages, reads the product data sitting in each one, and gives you a clean row per product: name, brand, current and pre-discount price, rating, review count, stock status, and the direct link. Point it at one category or a whole list across the UK, Czech, Polish, German, Romanian, or Slovak store.

### What you get

One row per product, with the same columns every time so the data drops straight into a sheet or database. Fields that Notino does not show for a given product come back as `null` rather than disappearing. Each row carries:

- **Identity** — `itemId`, `masterId`, `itemName`, `itemSubtitle`, `brandName`, `sku`
- **Pricing** — `currentPrice`, `listPrice`, `taxRate`, `currencyCode`
- **Reputation** — `starRating`, `reviewsTotal`
- **Links and media** — `itemUrl`, `imageLink`
- **Context** — `itemNote`, `stockStatus`, `categoryPath`, `sourceUrl`, `collectedAt`

### Quick start

1. Click **Try for free** and open the input form.
2. Add one or more category handles (like `makeup`) or full Notino category URLs to **Category handles or page URLs**, one per line.
3. If you used handles instead of full links, pick the country store under **Notino store region**.
4. Set **Products per category** to cap how many products come back per entry.
5. Press **Start**, then download the results as JSON, CSV, Excel, or XML once the run finishes.

![How it works](how-it-works.jpg)

### Use cases

- **Price tracking** — watch how `currentPrice` and `listPrice` move on the products you care about across regional stores
- **Brand monitoring** — pull every product under a brand to check coverage, pricing, and stock
- **Competitor research** — see which products lead a category and how they are rated
- **Catalog building** — turn a handful of category links into a structured product feed
- **Review analysis** — collect `starRating` and `reviewsTotal` to find the best- and worst-received items
- **Market entry** — compare assortment and pricing between the UK, German, Polish, and other Notino stores

### Input

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `categoryUrls` | array of strings | Yes | Category handles (e.g. `makeup`) or full Notino category page URLs, one per line. Each entry runs on its own with pagination. |
| `storeRegion` | string | No | Which national Notino store a bare handle is read from. Ignored for full URLs. Default `co.uk`. |
| `resultsLimit` | integer | No | Maximum products to return per handle or URL. Default `30`. |
| `timeoutSeconds` | integer | No | Seconds to wait on each page request before giving up. Default `45`. |

#### Example input

```json
{
    "categoryUrls": [
        "makeup",
        "https://www.notino.co.uk/fragrance/"
    ],
    "storeRegion": "co.uk",
    "resultsLimit": 30,
    "timeoutSeconds": 45
}
````

### Output

Each product becomes one row. Every field below is present on every row; anything Notino does not publish for that product is returned as `null`, so your dataset stays rectangular.

#### Example output

```json
{
    "itemId": 1480521,
    "masterId": 1480500,
    "itemName": "Soft Matte Foundation",
    "itemSubtitle": "long-wear liquid foundation",
    "brandName": "Lumiere",
    "itemUrl": "https://www.notino.co.uk/lumiere/soft-matte-foundation/",
    "imageLink": "https://cdn.notinoimg.com/detail_thumb/lumiere/soft-matte-foundation.jpg",
    "itemNote": "Bestseller",
    "stockStatus": "InStock",
    "sku": "LUM-SMF-30",
    "starRating": 4.6,
    "reviewsTotal": 218,
    "currentPrice": 24.9,
    "listPrice": 32.0,
    "taxRate": 20.0,
    "currencyCode": "GBP",
    "categoryPath": "Makeup > Face > Foundation",
    "sourceUrl": "https://www.notino.co.uk/makeup/",
    "collectedAt": "2026-06-30T12:00:00.000000+00:00"
}
```

#### Output fields

| Field | Type | Description |
|-------|------|-------------|
| `itemId` | integer | Notino product identifier |
| `masterId` | integer | Parent product identifier grouping shade or size variants |
| `itemName` | string | Product name |
| `itemSubtitle` | string | Secondary descriptive line under the name |
| `brandName` | string | Brand the product belongs to |
| `itemUrl` | string | Direct link to the product page |
| `imageLink` | string | Link to the product thumbnail image |
| `itemNote` | string | Short badge or note such as "Bestseller" |
| `stockStatus` | string | Availability status reported by Notino |
| `sku` | string | Product code |
| `starRating` | number | Average review score |
| `reviewsTotal` | integer | Number of reviews on the product |
| `currentPrice` | number | Selling price shown on the listing |
| `listPrice` | number | Price before discount, when one applies |
| `taxRate` | number | Tax rate applied to the price |
| `currencyCode` | string | Three-letter currency code matching the store region |
| `categoryPath` | string | Category trail, for example Makeup > Face > Foundation |
| `sourceUrl` | string | The category page or handle this product came from |
| `collectedAt` | string | ISO 8601 timestamp of when the row was captured |

### Tips for best results

- **Test with a small limit first.** Set `resultsLimit` to 20 or 30 on the first run to confirm the columns fit your pipeline before pulling a full category.
- **Full URLs beat handles for precision.** A copied category URL keeps your filters and sort order; a bare handle just opens the default category page.
- **Match the store to the handle.** When you pass handles, set `storeRegion` so prices come back in the right currency; the actor reads the region straight from full URLs.
- **Raise `timeoutSeconds` on heavy categories.** Large grids take longer to load, so bump it toward 60 if pages start timing out.
- **Expect some `null` fields.** Not every product carries a discount, note, or review, so `listPrice`, `itemNote`, `starRating`, and `reviewsTotal` may be empty on individual rows.

### How can I use Notino product data?

**How can I use the Notino Product Scraper to track cosmetics prices?**
Feed it the category handles or URLs you follow and run it on a schedule. Each run returns `currentPrice`, `listPrice`, and `currencyCode` per product, so you can chart price drops, spot discounts as they land, and compare the same product across the UK, German, or Polish store.

**How can I pull a full brand catalog from Notino?**
Paste the brand or category pages you want and set `resultsLimit` high enough to cover them. You get one row per product with `brandName`, `itemName`, `sku`, and `itemUrl`, which turns a scattered set of listings into a clean product feed you can export to CSV or Excel.

**How can I scrape Notino ratings and reviews for product research?**
Every row includes `starRating` and `reviewsTotal` alongside the product name and price. Sort by either field to surface the best-loved items in a category, flag low-rated products, or build a shortlist backed by real review counts rather than guesswork.

**How can I compare Notino assortment between countries?**
Run the same category handle once per `storeRegion` value. Lining up the results shows which products each national store carries, how pricing shifts between markets, and where stock differs, useful groundwork before expanding into a new region.

### Is it legal to scrape data?

Our actors are ethical and do not extract any private user data, such as email addresses or private contact information. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.

However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

You can also read Apify's blog post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

### Support

Questions, feature requests, or a field you'd like added? Reach out at <data.apify@proton.me> and we'll get back to you.

# Actor input Schema

## `categories` (type: `array`):

Enter one or more category handles (e.g., 'face', 'hair') or full Notino category page URLs (e.g., 'https://www.notino.co.uk/face/'), one per line.

## `domain` (type: `string`):

If you entered a category handle instead of a full URL, select the country domain to use.

## `maxItems` (type: `integer`):

Maximum number of products to extract per category or URL.

## `requestTimeoutSecs` (type: `integer`):

Per-request timeout in seconds.

## Actor input object example

```json
{
  "categories": [
    "face",
    "https://www.notino.co.uk/hair/"
  ],
  "domain": "co.uk",
  "maxItems": 25,
  "requestTimeoutSecs": 60
}
```

# 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 = {
    "categories": [
        "face"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("data_api/notino-product-scraper-cheap").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 = { "categories": ["face"] }

# Run the Actor and wait for it to finish
run = client.actor("data_api/notino-product-scraper-cheap").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 '{
  "categories": [
    "face"
  ]
}' |
apify call data_api/notino-product-scraper-cheap --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Notino Product Scraper (Cheap)",
        "description": "Scrape product data, prices, ratings, and reviews from any Notino domain. Built for market research and e-commerce price comparison without getting blocked.",
        "version": "0.0",
        "x-build-id": "JgWVxwrdDgZjT4ogX"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/data_api~notino-product-scraper-cheap/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-data_api-notino-product-scraper-cheap",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/data_api~notino-product-scraper-cheap/runs": {
            "post": {
                "operationId": "runs-sync-data_api-notino-product-scraper-cheap",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/data_api~notino-product-scraper-cheap/run-sync": {
            "post": {
                "operationId": "run-sync-data_api-notino-product-scraper-cheap",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "categories"
                ],
                "properties": {
                    "categories": {
                        "title": "Category handles or URLs",
                        "type": "array",
                        "description": "Enter one or more category handles (e.g., 'face', 'hair') or full Notino category page URLs (e.g., 'https://www.notino.co.uk/face/'), one per line.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "domain": {
                        "title": "Notino country domain",
                        "enum": [
                            "co.uk",
                            "cz",
                            "pl",
                            "de",
                            "ro",
                            "sk"
                        ],
                        "type": "string",
                        "description": "If you entered a category handle instead of a full URL, select the country domain to use.",
                        "default": "co.uk"
                    },
                    "maxItems": {
                        "title": "Max items per category/URL",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Maximum number of products to extract per category or URL.",
                        "default": 25
                    },
                    "requestTimeoutSecs": {
                        "title": "Request timeout (seconds)",
                        "minimum": 5,
                        "maximum": 120,
                        "type": "integer",
                        "description": "Per-request timeout in seconds.",
                        "default": 60
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
