# Fragrantica Perfumers Scraper (`aboo.script/fragrantica-perfumers-scraper`) Actor

\[💰$4 / 1K] ⚡ Fast Fragrantica perfumers scraper that works on Cloudflare-protected pages. No login, no API key. One row per nose: company, title, education, photo, perfume counts, years, brands, top perfumes, optional biography and full perfume list. By name, company or profile URL.

- **URL**: https://apify.com/aboo.script/fragrantica-perfumers-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 Perfumers Scraper

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

**Fragrantica Perfumers Scraper** extracts perfumers (noses) from [Fragrantica](https://www.fragrantica.com/) into clean, structured data you can download as JSON, CSV, Excel, or HTML. Paste a perfumer profile or the perfumer index, or just type a perfumer or company name, and get one row per perfumer with their company, job title, education, photo, perfume counts, active years, brands, most popular perfumes, and optionally the biography and the full perfume list. No account or login required.

### Introduction

[Fragrantica](https://www.fragrantica.com/) is the largest online perfume encyclopedia, with more than 140,000 perfumes and over 3,000 perfumers, from master perfumers at Givaudan, dsm-firmenich, and IFF to independent creators. Each perfumer profile shows who they work for, how many perfumes they have composed, and for which brands.

This actor turns those profiles into a ready-to-use dataset, one perfumer per row, so you can map the talent behind the perfume industry, find the noses behind a brand, or follow who creates the most popular fragrances. You can run it once, schedule it to run regularly, or connect it to your own tools.

### What data can you extract from Fragrantica?

- 👤 Perfumer name, Fragrantica ID, photo, and a direct link to the profile
- 🏢 Company (for example Givaudan, dsm-firmenich, or IFF), other companies they worked for, and job title (Master Perfumer, Senior Perfumer, and more)
- 🎓 Education (for example ISIPCA or Givaudan Perfumery School)
- 🔢 Total number of perfumes and perfumes for women, men, and unisex
- 📅 Year of the first and the latest perfume
- 🏷️ Brands the perfumer created for, with the number of perfumes per brand
- ⭐ The 10 most popular perfumes: name, brand, year, gender, collection, rating, number of votes and reviews, image, and link
- 📝 Optional biography as plain text and the company website
- 🧴 Optional full perfume list with the same details as the popular perfumes

### Use Cases

- 🕵️ **Industry research**: see which fragrance houses employ which perfumers and how productive they are.
- 🤝 **Recruiting and lead generation**: build a list of perfumers by company, with their titles and education.
- 📰 **Journalism and content**: find the noses behind famous perfumes and brands, with their biography.
- 📈 **Market research**: compare brands by the perfumers they work with, or follow new launches per perfumer.
- 🤖 **AI and automation**: feed clean, structured data into spreadsheets, dashboards, or AI workflows.

### How to scrape Fragrantica perfumers step by step

1. Paste one or more Fragrantica URLs into **Start URLs**, or type perfumer or company names into **Search perfumers**.
2. Set **Maximum number of perfumers** to how many perfumers you want per URL or per search.
3. Turn on **Include the full perfume list** and **Include biography and company website** if you need them.
4. Click **Start** and wait for the run to finish.
5. Download your data in JSON, CSV, Excel, or HTML from the **Output** tab.

### Input

- **Start URLs**: Fragrantica pages to scrape. Supported pages:
  - A perfumer profile, for example `https://www.fragrantica.com/noses/Alberto_Morillas.html`
  - The perfumer index `https://www.fragrantica.com/noses/`, which returns every perfumer, most popular first
- **Search perfumers**: perfumer or company names to search on Fragrantica, one per line, for example `Kurkdjian` or `Givaudan`. Each search is scraped separately, best matches first.
- **Maximum number of perfumers**: how many perfumers to collect for each start URL or search. Set `0` to get every perfumer.
- **Include the full perfume list**: adds every perfume of the perfumer to each row. Off by default, because top perfumers have more than 500 perfumes. Counts, brands, and the 10 most popular perfumes are always included.
- **Include biography and company website**: opens each perfumer profile to add the biography and the company website. Off by default, because it makes runs slower. Profile pages need residential proxies, which is the default proxy setting.
- **Proxy configuration**: residential proxies are on by default and work for every option. Fragrantica blocks many IP addresses, so keep a proxy enabled. Without biographies, datacenter proxies also work.

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

### Input Examples

Scrape a perfumer profile and the most popular perfumers from the index:

```json
{
  "startUrls": [
    { "url": "https://www.fragrantica.com/noses/Alberto_Morillas.html" },
    { "url": "https://www.fragrantica.com/noses/" }
  ],
  "maxResults": 5,
  "includePerfumes": false,
  "includeBiography": false,
  "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
```

Search the perfumers of a company:

```json
{
  "searchQueries": ["Givaudan"],
  "maxResults": 5,
  "includePerfumes": false,
  "includeBiography": false,
  "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
```

### Output

Each perfumer is saved as one item in the dataset. Here is an example of a single item with **Include the full perfume list** and **Include biography and company website** turned on (lists and text shortened):

```json
{
  "url": "https://www.fragrantica.com/noses/Francis_Kurkdjian.html",
  "id": 39,
  "name": "Francis Kurkdjian",
  "jobTitle": null,
  "company": "Maison Francis Kurkdjian",
  "otherCompanies": ["Quest", "Takasago"],
  "education": "ISIPCA",
  "imageUrl": "https://fimgs.net/images/nosevi/o.39.jpg",
  "website": "https://www.franciskurkdjian.com/",
  "biography": "Francis Kurkdjian is a renowned perfumer known for his innovative and captivating creations. Born on May 14, 1969, near Paris, France, Kurkdjian grew up in a culturally rich environment...",
  "perfumeCount": 294,
  "womenPerfumeCount": 136,
  "menPerfumeCount": 58,
  "unisexPerfumeCount": 100,
  "firstPerfumeYear": 1995,
  "latestPerfumeYear": 2026,
  "brandCount": 47,
  "brands": [
    { "name": "Maison Francis Kurkdjian", "perfumeCount": 64 },
    { "name": "Dior", "perfumeCount": 52 },
    { "name": "Jean Paul Gaultier", "perfumeCount": 32 }
  ],
  "popularPerfumes": [
    {
      "url": "https://www.fragrantica.com/perfume/Maison-Francis-Kurkdjian/Grand-Soir-40816.html",
      "id": 40816,
      "name": "Grand Soir",
      "brand": "Maison Francis Kurkdjian",
      "year": 2016,
      "gender": "unisex",
      "collection": null,
      "rating": 4.3,
      "ratingCount": 15059,
      "reviewCount": 1985,
      "imageUrl": "https://fimgs.net/mdimg/perfume/375x500.40816.jpg"
    }
  ],
  "perfumes": [
    {
      "url": "https://www.fragrantica.com/perfume/Maison-Francis-Kurkdjian/Baccarat-Rouge-540-33519.html",
      "id": 33519,
      "name": "Baccarat Rouge 540",
      "brand": "Maison Francis Kurkdjian",
      "year": 2015,
      "gender": "unisex",
      "collection": "Baccarat Rouge 540",
      "rating": 3.75,
      "ratingCount": 29928,
      "reviewCount": 3998,
      "imageUrl": "https://fimgs.net/mdimg/perfume/375x500.33519.jpg"
    }
  ]
}
```

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

### Notes

- Only Fragrantica.com (English) perfumer profiles and the perfumer index are supported. Perfume pages, brand pages, and other URLs are skipped with a warning.
- A perfumer search returns at most 1,000 perfumers. The perfumer index has no such limit and covers every perfumer on Fragrantica (about 3,100).
- Searches match perfumer names and company names, so a search for a company returns the perfumers who work there, and the company itself when Fragrantica lists it as a perfumer.
- Perfumers listed under different spellings of the same URL are saved once.
- `website` and `biography` are only added when **Include biography and company website** is on, and `perfumes` only when **Include the full perfume list** is on.
- Some perfumers have no photo, job title, education, company, website, or biography on Fragrantica; those fields are `null` (or an empty list). A perfume without a known year has `year: null`.
- The number of reviews counts the English reviews shown on Fragrantica.com.
- Biographies come from perfumer profiles, which Fragrantica only shows to residential connections. Keep the default residential proxy when **Include biography and company website** is on; with other proxies the profiles fail.
- **Works on Cloudflare-protected pages.** Keep Apify Proxy enabled for stable runs.

### Why use the Fragrantica Perfumers Scraper?

- 👃 **One row per perfumer**: perfumer profiles, not perfume rows, ready for industry maps and lead lists.
- 🔎 **Many ways to start**: a single profile, the full perfumer index, a perfumer name, or a company name.
- 🧹 **Clean data**: numbers are real numbers, links are full URLs, and the biography is plain text.
- 💸 **Pay for what you need**: set a limit per URL or search, and add the perfume list or the biography only when you need them.
- 🔄 **Ready for automation**: schedule runs, export to Google Sheets, or connect to Make, Zapier, and n8n.

### FAQ

#### How many perfumers can I scrape?

Set any number in **Maximum number of perfumers**, or `0` for no limit. The perfumer index covers every perfumer on Fragrantica.

#### 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 track new perfumes per perfumer.

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

Yes. Right now the actor supports start URLs and perfumer or company searches. If you need other inputs, such as filtering perfumers by brand or by launch year, 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. If you need the whole Fragrantica perfumer database in one go, a private or custom actor can deliver it. Use the contact details below.

### Need to scrape other perfume data?

- [Fragrantica Designers Scraper](https://apify.com/aboo.script/fragrantica-designers-scraper): perfume brands from Fragrantica, one row per brand with country, parent company, website, perfume counts, perfumers, and collections.
- [Fragrantica Scraper](https://apify.com/aboo.script/fragrantica-scraper): perfume details from Fragrantica, including the notes pyramid, accords, perfumers, ratings, and community votes.
- [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 perfumer profile pages (https://www.fragrantica.com/noses/<Name>.html) or the perfumer index (https://www.fragrantica.com/noses/), which returns every perfumer, most popular first.

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

Perfumer or company names to search on Fragrantica, for example Kurkdjian or Givaudan. Each query is scraped separately, best matches first.

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

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

## `includePerfumes` (type: `boolean`):

Add every perfume of the perfumer (name, brand, year, gender, collection, rating, votes, reviews, image) to each row. Top perfumers have more than 500 perfumes, so rows get big. Counts, brands and the 10 most popular perfumes are always included.

## `includeBiography` (type: `boolean`):

Open each perfumer profile to add the biography and the company website. Slower than the default mode. Profile pages need residential proxies (the default proxy setting).

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

Fragrantica blocks many IP addresses. Residential proxies are on by default and work for every option; perfumer profiles (Include biography and company website) only load with residential proxies.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.fragrantica.com/noses/Alberto_Morillas.html"
    },
    {
      "url": "https://www.fragrantica.com/noses/"
    }
  ],
  "searchQueries": [
    "Givaudan"
  ],
  "maxResults": 5,
  "includePerfumes": false,
  "includeBiography": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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/noses/Alberto_Morillas.html"
        },
        {
            "url": "https://www.fragrantica.com/noses/"
        }
    ],
    "searchQueries": [
        "Givaudan"
    ]
};

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

# Run the Actor and wait for it to finish
run = client.actor("aboo.script/fragrantica-perfumers-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/noses/Alberto_Morillas.html"
    },
    {
      "url": "https://www.fragrantica.com/noses/"
    }
  ],
  "searchQueries": [
    "Givaudan"
  ]
}' |
apify call aboo.script/fragrantica-perfumers-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,aboo.script/fragrantica-perfumers-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/nvcjt0LNHIhVF9lEf/builds/zrwoIxNLYHpiPbJys/openapi.json
