# Notino API scraper — Europe's largest online perfume & cosmetics retailer (notino.*): search 27 countries, read the full product (every size/shade with its own price, price per litre/100 ml, was-price, EU 30-day lowest price, voucher prices, EAN, ingredients, delivery dates), reviews and autocomplete. No account, no browser.

> Search a Notino storefront by keyword, or browse a category/brand page, with the site's own sorts, price range and facet filters. Each row: product (variant) id, catalog master id, brand, name, annotation, price (price_basis says whether it is this variant's price or the cheapest shade of a grouped product), unit price per litre/100 ml, voucher / conditional-voucher prices, discount reason, rating + count, stock bucket, variants (size/shade labels), category and image. A keyword the site maps to a category or brand is followed and reported (redirect_to). No-match padding and sponsored rows are dropped and counted.
> ReefAPI engine `notino` · 4 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/notino/v1/<action>` with a JSON body.
- **Auth:** header `x-api-key: <YOUR_REEFAPI_KEY>` — create one free (1,000 credits, no card): https://reefapi.com/signup
- **Response (every call):** `{ ok: boolean, data: ..., meta: { record_count, credits, ... }, error: { code, message } }` — branch on `ok`. Failed calls are free except verified SHEIN NOT_FOUND on product/detail and price (4 credits).
- **One key + one shared credit pool** across every ReefAPI API. Per-call credits are listed on each endpoint below.
- **Use it from an AI agent (MCP):** connect `https://api.reefapi.com/mcp` (remote streamable-http, `Authorization: Bearer <key>`) and your assistant can call these actions directly.

## Endpoints

### POST /notino/v1/search — 1 credit
Search a Notino storefront by keyword, or browse a category/brand page, with the site's own sorts, price range and facet filters. Each row: product (variant) id, catalog master id, brand, name, annotation, price (price_basis says whether it is this variant's price or the cheapest shade of a grouped product), unit price per litre/100 ml, voucher / conditional-voucher prices, discount reason, rating + count, stock bucket, variants (size/shade labels), category and image. A keyword the site maps to a category or brand is followed and reported (redirect_to). No-match padding and sponsored rows are dropped and counted.

**Parameters:**
- `country` (enum, optional, default "de") — Notino storefront. All 27 run on one platform; currency and language follow the country. [one of: de, at, ch, cz, sk, pl, hu, ro, bg, hr, si, gr, it, es, pt, fr, be, nl, uk, ie, dk, se, fi, lt, lv, ee, ua]
- `query` (string, optional) — Keyword to search (brand, product or product type, in the store's language). Optional when `category` is given.
- `category` (string, optional) — A category or brand page to browse: its slug ('lippenstifte', 'dior') or a notino URL/path (from `related_categories`, a breadcrumb or a redirect_to).
- `sort` (enum, optional, default "relevance") — Result ordering (the site's own sorts). [one of: relevance, bestseller, price_asc, price_desc, top_rated, newest]
- `page` (integer, optional, default 1) — 1-based page; 24 products per page.
- `filters` (string, optional) — Comma-separated facet value ids from `include_facets` (brand, shade, gender, rating, offers …). Ids are per store for brand/offer facets.
- `price_min` (number, optional) — Minimum price in the country currency.
- `price_max` (number, optional) — Maximum price in the country currency.
- `include_facets` (boolean, optional, default false) — Also return the filter facets (brands, shades, offers, ratings …) with their ids.
- `include_sponsored` (boolean, optional, default false) — Also return sponsored (paid placement) rows, flagged; dropped by default.
- `include_fallback_results` (boolean, optional, default false) — When a keyword has no real match the site pads the page with unrelated products; they are dropped by default. true returns them under fallback_results.

**Returns:** results[]{product_id, catalog_master_id, master_id, product_code, master_product_code, title, brand, name, sub_name, annotation, url, price, currency, price_basis, was_price, discount_percent, dual_price, member_price, unit_price{value,per_amount,per_unit}, voucher{code,price,discount_percent}, conditional_voucher{code,min_basket,condition_type,discount_percent,applies_to}, discount_reason, free_delivery, is_new, rating, rating_count, rating_scale, search_index_stock, variant_count, variants[{product_id,label,colors}], category{kind,category,subcategory,type}, image, is_pharmacy, sponsored}, count, total_results, total_pages, page, page_size, has_more, sort, query, category, country, currency, page_title, redirect_to, related_categories[{name,url}], price_range{min,max}, sponsored_dropped, fallback_results_dropped, fallback_results (opt-in), facets (opt-in)

**Example request body:**
```json
{
  "country": "de",
  "query": "dior sauvage"
}
```

### POST /notino/v1/product/detail — 1 credit
The full Notino product by product id, catalog master id or URL: title, brand, manufacturer, the requested variant's price, was-price with its type and discount, EU 30-day lowest price, unit price, voucher and conditional-voucher prices, loyalty points, stock state + count, EAN, order code, images, description, ingredients, warnings, usage, characteristics, fragrance notes, rating + counts, breadcrumb, category, delivery options with dates and prices, gifts/samples, and every size/shade variant each with its own price block, EAN and stock.

**Parameters:**
- `country` (enum, optional, default "de") — Notino storefront. All 27 run on one platform; currency and language follow the country. [one of: de, at, ch, cz, sk, pl, hu, ro, bg, hr, si, gr, it, es, pt, fr, be, nl, uk, ie, dk, se, fi, lt, lv, ee, ua]
- `product_id` (string, optional) — Notino product (variant) id — the number in a product URL (…/p-15676582/). Every search row returns one.
- `catalog_master_id` (string, optional) — Instead of product_id: the catalog master id (search rows return it); saves a lookup.
- `url` (string, optional) — Instead of product_id: a notino product URL (…/p-<id>/).

**Returns:** product{product_id, catalog_master_id, master_id, master_product_code, title, brand, brand_id, manufacturer, name, collection, annotation, url, catalog_id, label, variant_name, product_code, order_code, ean, price, currency, was_price, was_price_type, discount_percent, lowest_price_30d, unit_price, tax_percent, member_price, loyalty_points, voucher, conditional_voucher{code,condition_type,conditions[{min_basket,discount_percent,price_if_met,product_meets_condition}],applies_to,valid_until}, amount{value,unit,package}, colors, availability{state,stock_code,stock_count,max_order_quantity}, in_stock, images, gender, description, ingredients, warnings, instructions, important_notice, characteristics[{name,values}], fragrance_notes[{name,values}], rating, rating_count, text_review_count, rating_scale, breadcrumb[{name,url}], category, deliveries[{carrier,method,date,date_from,date_to,price,free_shipping,unavailable_reason}], delivery_estimate, gifts[{campaign_id,type,for_product_id,text,image}], variant_display_type, variant_count, variants[...same price/stock/ean block per variant], related_product_ids}

**Example request body:**
```json
{
  "country": "de",
  "product_id": "15676582"
}
```

### POST /notino/v1/product/reviews — 1 credit
Customer reviews of a Notino product (the storefront's own reviews, in its language): text, title, star rating, date, verified flag, likes/dislikes, pros/cons, photos, the reviewed variant, and the rating histogram. Sort newest/oldest/rating/most helpful, filter by stars or photos; 8 per page.

**Parameters:**
- `country` (enum, optional, default "de") — Notino storefront. All 27 run on one platform; currency and language follow the country. [one of: de, at, ch, cz, sk, pl, hu, ro, bg, hr, si, gr, it, es, pt, fr, be, nl, uk, ie, dk, se, fi, lt, lv, ee, ua]
- `product_id` (string, optional) — Notino product (variant) id — the number in a product URL (…/p-15676582/). Every search row returns one.
- `catalog_master_id` (string, optional) — Instead of product_id: the catalog master id (search rows return it); saves a lookup.
- `url` (string, optional) — Instead of product_id: a notino product URL (…/p-<id>/).
- `sort` (enum, optional, default "newest") — Review order. [one of: newest, oldest, rating_desc, rating_asc, most_helpful]
- `page` (integer, optional, default 1) — 1-based page; 8 reviews per page (the site's size).
- `rating` (string, optional) — Only these star ratings, comma-separated 1-5.
- `with_images` (boolean, optional, default false) — Only reviews that carry customer photos.

**Returns:** reviews[{id, title, text, rating, created_at, author, verified, author_type, likes, dislikes, variant_id, source_language, original_title, original_text, pros, cons, images[{thumbnail,full}], agency{name,url}}], count, page, total_pages, total_reviews, has_more, rating_histogram{1..5}, verified_count, with_images_count, product{catalog_master_id, master_product_code, rating, rating_count, text_review_count}, sort, country

**Example request body:**
```json
{
  "country": "de",
  "catalog_master_id": "361339"
}
```

### POST /notino/v1/suggest — 1 credit
Notino autocomplete for a partial query: suggested products (id, title, annotation, product code, url, image) and the brand, collection and category pages it proposes.

**Parameters:**
- `query` (string, optional) — A partial keyword.
- `country` (enum, optional, default "de") — Notino storefront. All 27 run on one platform; currency and language follow the country. [one of: de, at, ch, cz, sk, pl, hu, ro, bg, hr, si, gr, it, es, pt, fr, be, nl, uk, ie, dk, se, fi, lt, lv, ee, ua]

**Returns:** products[{product_id, title, annotation, product_code, url, image}], sections[{title, kind, items[{name, url, kind}]}], count, country

**Example request body:**
```json
{
  "country": "de",
  "query": "chanel"
}
```

## More
- Try it live, no code: https://reefapi.com/playground?engine=notino
- Human docs page: https://reefapi.com/docs/notino
- Overview page: https://reefapi.com/notino-api
- Every ReefAPI API in one file (for your AI): https://reefapi.com/llms-full.txt
