# Fragrantica Notes Scraper (`aboo.script/fragrantica-notes-scraper`) Actor

\[💰$4 / 1K] ⚡ Fast Fragrantica notes scraper that works on Cloudflare-protected pages. No login, no API key. One row per perfume ingredient: latin name, group, odor profile, description, images, perfume counts, top brands, perfumers, paired notes, 200 popular perfumes. By note URL, index or name.

- **URL**: https://apify.com/aboo.script/fragrantica-notes-scraper.md
- **Developed by:** [Aboo Script](https://apify.com/aboo.script) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.80 / 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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Fragrantica Notes Scraper

![Fragrantica Notes Scraper](https://i.postimg.cc/yxg2JMrB/image.png)

**Fragrantica Notes Scraper** extracts perfume notes (fragrance ingredients) from [Fragrantica](https://www.fragrantica.com/) into clean, structured data you can download as JSON, CSV, Excel, or HTML. Paste a note page, the note index, or one note group, or simply type a note name, and get one row per note with its latin name, other names, group, odor profile, description, images, perfume counts, top brands and perfumers, paired notes, and the most popular perfumes that use it. No account or login required.

### Introduction

[Fragrantica](https://www.fragrantica.com/) is the largest online perfume encyclopedia, with more than 140,000 perfumes and an ingredient guide of almost 2,000 notes, from bergamot and rose to oud and modern aroma molecules. Each note page explains what the ingredient is, how it smells, and which perfumes use it.

This Fragrantica scraper turns that ingredient guide into a ready-to-use dataset. Use it as a Fragrantica API alternative for notes: run it once to get the whole catalog, schedule it to keep your data fresh, or connect it to your own tools.

### What data can you extract from Fragrantica?

- 🌿 Note name, ID, latin name, and other names
- 🗂️ Note group (citrus, flowers, woods and mosses, spices, and more) with a link to the group
- 👃 Odor profile and the full description of the ingredient
- 🖼️ Note images
- 🔢 Number of perfumes with the note, split into women, men, and unisex perfumes
- 🏷️ Top brands and top perfumers that use the note, with perfume counts
- 🎨 Top fragrance families (for example Oriental Floral or Woody Aromatic) of perfumes with the note
- 🤝 Paired notes: the notes most often combined with it
- 🧴 Up to 200 most popular perfumes with the note: name, brand and brand page, year, gender, review count, image, and URL
- 🔗 Direct URL to each note page

### Use Cases

- 🤖 **Perfume recommendation apps**: match perfumes by the notes people love and suggest notes that pair well.
- 🧠 **AI and machine learning datasets**: train models on ingredient descriptions, odor profiles, and note pairings.
- 🧪 **Perfume formulation and product development**: see which notes are combined most often and which brands use them.
- 📈 **Market research**: compare how popular each ingredient is and which fragrance families it appears in.
- 📚 **Educational content**: build ingredient guides, glossaries, and blog posts with accurate names and descriptions.

### How to scrape Fragrantica notes step by step

1. Paste one or more Fragrantica note URLs into **Start URLs**, or type note names into **Search notes**.
2. Set **Maximum number of notes** to how many notes you want per URL or per search.
3. Click **Start** and wait for the run to finish.
4. Download your data in JSON, CSV, Excel, or HTML from the **Output** tab.

### Input

- **Start URLs**: Fragrantica URLs to scrape. Supported pages:
  - A single note page, such as `https://www.fragrantica.com/notes/Bergamot-75.html`.
  - The note index with every note: `https://www.fragrantica.com/notes/`.
  - One note group of the index, such as `https://www.fragrantica.com/notes/#groupnotes_group_01_title` for citrus. Groups are numbered in the order of the index: 01 citrus, 02 fruits, vegetables and nuts, 03 flowers, 04 white flowers, 05 greens, herbs and fougeres, 06 spices, 07 sweets and gourmand smells, 08 woods and mosses, 09 resins and balsams, 10 musk, amber, animalic smells, 11 beverages, 12 natural and synthetic, popular and weird, 13 uncategorized.
- **Search notes**: note names to search, one per line, for example rose, vanilla, or oud. Every note whose name contains the text is scraped, exact matches first.
- **Maximum number of notes**: how many notes to collect for each start URL or search. Set 0 to get every note.
- **Proxy configuration**: Fragrantica blocks many IP addresses. The default Apify Proxy works well.

You can use start URLs, searches, or both in the same run.

### Input Examples

Scrape notes of the citrus group:

```json
{
  "startUrls": [
    { "url": "https://www.fragrantica.com/notes/#groupnotes_group_01_title" }
  ],
  "maxResults": 5,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

Search notes by name:

```json
{
  "searchQueries": ["rose"],
  "maxResults": 5,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

### Output

Each note is saved as one item in the dataset. Here is an example of a single item (long text and lists are shortened):

```json
{
  "url": "https://www.fragrantica.com/notes/Bergamot-75.html",
  "id": 75,
  "name": "Bergamot",
  "latinName": "Citrus bergamia",
  "otherNames": ["Bergamot Orange"],
  "group": "CITRUS SMELLS",
  "groupUrl": "https://www.fragrantica.com/notes/#groupnotes_group_01_title",
  "imageUrl": "https://fimgs.net/mdimg/sastojci/t.75.jpg?1733161295",
  "images": [
    "https://fimgs.net/mdimg/sastojci/t.75.jpg?1733161295",
    "https://fimgs.net/mdimg/sastojci/t2.75.jpg?1733161288",
    "https://fimgs.net/mdimg/sastojci/t3.75.jpg?1733161293"
  ],
  "odorProfile": "citrusy, bitter & tart, elegant, light note with mild spicy tone, complex with nuances of fruit and aromatic elements, reminiscent of eau de Cologne, it flavors Earl Grey tea.",
  "description": "Bergamot orange (Citrus aurantium var. bergamia) is a small, roughly per-shaped citrus fruit, which grows on small trees known as bergamots. It is a cross betwe...",
  "perfumeCount": 30238,
  "womenPerfumeCount": 9479,
  "menPerfumeCount": 6710,
  "unisexPerfumeCount": 14049,
  "topBrands": [
    { "name": "The Dua Brand", "perfumeCount": 386 },
    { "name": "Guerlain", "perfumeCount": 305 },
    { "name": "Zara", "perfumeCount": 300 }
  ],
  "topPerfumers": [
    { "name": "Alberto Morillas", "perfumeCount": 225 },
    { "name": "Olivier Cresp", "perfumeCount": 149 },
    { "name": "Christian Provenzano", "perfumeCount": 136 }
  ],
  "topFragranceFamilies": [
    { "name": "Oriental Floral", "perfumeCount": 2559 },
    { "name": "Floral", "perfumeCount": 2290 },
    { "name": "Floral Fruity", "perfumeCount": 2205 }
  ],
  "pairedNotes": [
    { "name": "Musk", "perfumeCount": 16228 },
    { "name": "Jasmine", "perfumeCount": 11238 },
    { "name": "Vanilla", "perfumeCount": 10554 }
  ],
  "popularPerfumes": [
    {
      "url": "https://www.fragrantica.com/perfume/Yves-Saint-Laurent/MYSLF-Eau-de-Parfum-84094.html",
      "id": 84094,
      "name": "MYSLF Eau de Parfum",
      "brand": "Yves Saint Laurent",
      "brandUrl": "https://www.fragrantica.com/designers/Yves-Saint-Laurent.html",
      "year": 2023,
      "gender": "male",
      "reviewCount": 1695,
      "imageUrl": "https://fimgs.net/mdimg/perfume-thumbs/270x270.84094.jpg"
    },
    {
      "url": "https://www.fragrantica.com/perfume/Montblanc/Explorer-52002.html",
      "id": 52002,
      "name": "Explorer",
      "brand": "Montblanc",
      "brandUrl": "https://www.fragrantica.com/designers/Montblanc.html",
      "year": 2019,
      "gender": "male",
      "reviewCount": 1957,
      "imageUrl": "https://fimgs.net/mdimg/perfume-thumbs/270x270.52002.jpg"
    }
  ]
}
```

You can download the dataset in JSON, CSV, Excel, XML, or HTML, or access it through the Apify API.

### Notes

- Only fragrantica.com note pages, the note index, and its group links are supported. Other URLs (for example perfume pages or the perfume groups page) are skipped.
- Each note lists at most its 200 most popular perfumes, the same list Fragrantica shows on the note page. The total number of perfumes, the women, men, and unisex counts, and the top brands, perfumers, families, and paired notes cover every perfume with the note.
- Fragrantica updates its perfume counts with a short delay, so a brand-new note can show fewer perfumes in the counts than in its popular list. The perfume count is never lower than the list.
- Top brands, top perfumers, top fragrance families, and paired notes contain the top 10 entries each.
- Not every note has a latin name, other names, an odor profile, or a long description; missing values are returned as `null` or an empty list.
- A perfume year is `null` when Fragrantica does not show a launch year.
- A note reached from several start URLs (for example a note page and the index) is saved only once.
- Unknown note URLs are skipped with a warning.
- Need the full perfume list of a note (some notes have more than 30,000 perfumes) or other data without these limits? Ask for a custom version using the contact below.

### Why use the Fragrantica Notes Scraper?

- ✅ **No login needed**: works with public data only, so there is no account to manage.
- 🛡️ **Works on Cloudflare-protected pages**: get results reliably with the default proxy settings.
- 🌍 **The whole ingredient guide in one run**: scrape every note of the index, one group, or just the notes you search for.
- 📊 **More than the note page**: perfume counts by gender, top brands, top perfumers, fragrance families, and paired notes for every note.
- 🧹 **Clean data**: numbers are real numbers, text is free of HTML, and every URL is absolute.
- 🔄 **Ready for automation**: schedule runs, export to Google Sheets, or connect to Make, Zapier, and n8n.

### FAQ

#### How many notes can I scrape?

Fragrantica has almost 2,000 notes. Use the note index URL with **Maximum number of notes** set to 0 to get all of them in one run.

#### Do I need a Fragrantica account?

No. The actor only collects publicly available data. You do not need to log in or provide any account details.

#### Can I scrape data on a schedule?

Yes. Use Apify Schedules to run the actor every day, week, or month, and get fresh perfume counts automatically.

#### Can I request a new feature or filter?

Yes. Right now the actor supports note pages, the note index, note groups, and note name searches. If you need other inputs or data, get in touch and they can be added.

#### Can I get a custom or private version?

Yes. The actor can be customized for your workflow, delivered as a private version, or a new scraper can be built for a different website. Use the contact details below.

### Need to scrape other perfume data?

- [Fragrantica Scraper](https://apify.com/aboo.script/fragrantica-scraper): perfume details from Fragrantica, including the notes pyramid, accords, perfumers, ratings, and community votes.
- [Fragrantica Designers Scraper](https://apify.com/aboo.script/fragrantica-designers-scraper): perfume brands from Fragrantica, with country, parent company, website, perfume counts, perfumers, and collections.
- [Fragrantica Reviews Scraper](https://apify.com/aboo.script/fragrantica-reviews-scraper): perfume reviews from Fragrantica, one row per review with the reviewer's rating, longevity, sillage, and season votes.

***

**Need help or want a custom solution?**

- 📧 Email: aboo.script@gmail.com
- 🧩 More scrapers: [Apify profile](https://apify.com/aboo.script)

### Image Credit

Image credit: [Fragrantica](https://www.fragrantica.com/)

# Actor input Schema

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

Fragrantica note pages (https://www.fragrantica.com/notes/Bergamot-75.html), the note index with every note (https://www.fragrantica.com/notes/), or one note group of the index (https://www.fragrantica.com/notes/#groupnotes_group_01_title for citrus, *02* fruits, *03* flowers ... *13* uncategorized).

## `searchQueries` (type: `array`):

Note names to search on Fragrantica, for example rose, vanilla or oud. Every note whose name contains the text is scraped, exact matches first.

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

Maximum number of notes to scrape per start URL or search query. Set 0 to get every note.

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

Fragrantica blocks many IP addresses. Apify Proxy (datacenter) works well.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.fragrantica.com/notes/#groupnotes_group_01_title"
    }
  ],
  "searchQueries": [
    "rose"
  ],
  "maxResults": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# 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 = {
    "startUrls": [
        {
            "url": "https://www.fragrantica.com/notes/#groupnotes_group_01_title"
        }
    ],
    "searchQueries": [
        "rose"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("aboo.script/fragrantica-notes-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 = {
    "startUrls": [{ "url": "https://www.fragrantica.com/notes/#groupnotes_group_01_title" }],
    "searchQueries": ["rose"],
}

# Run the Actor and wait for it to finish
run = client.actor("aboo.script/fragrantica-notes-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.fragrantica.com/notes/#groupnotes_group_01_title"
    }
  ],
  "searchQueries": [
    "rose"
  ]
}' |
apify call aboo.script/fragrantica-notes-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,aboo.script/fragrantica-notes-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/eAdSvZjdf22Oqwtdq/builds/BKlLItsj0QrRKa8s3/openapi.json
