# Fragrantica Perfume Scraper (`confidential_gnat/fragrantica-perfume-scraper`) Actor

\[No hidden charges] - Scrape perfumes from Fragrantica (fragrantica.com): name, brand, year, gender, rating, fragrance family, main accords, note pyramid, and perfumers. Use perfume, designer or note pages. Export JSON, CSV or Excel.

- **URL**: https://apify.com/confidential_gnat/fragrantica-perfume-scraper.md
- **Developed by:** [ActorFlow](https://apify.com/confidential_gnat) (community)
- **Security:** Limited permissions
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $1.00 / 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 Perfume Scraper - Notes, Accords & Ratings

![Fragrantica Perfume Scraper cover: only new perfumes every run, with notes, accords and similar perfumes and one consistent schema](https://i.postimg.cc/tC1wFmJk/Gemini-Generated-Image-50y2aq50y2aq50y2.jpg)

**Scrape perfume data from Fragrantica (fragrantica.com)**: name, brand, launch year, gender, community rating, fragrance family, **main accords**, the full **note pyramid** (top, middle and base notes), perfumers and description. Paste perfume, designer or note page URLs, or just type a brand name, press Start, and export the results as JSON, CSV or Excel - or call the scraper as an **API**.

**Target website:** [fragrantica.com](https://www.fragrantica.com)

### ✨ Features of this Fragrantica perfume scraper

- **Perfume profile extraction** - rating and vote count, fragrance family, main accords with strength and colour, top/middle/base notes, perfumers, brand logo, image and description.
- **Related perfumes** - the perfume's collection and the list of similar perfumes members also like.
- **Designer and note pages** - paste a brand page such as `/designers/Chanel.html` or a note page such as `/notes/Lavender-1.html` and get every perfume listed there.
- **Brand names as input** - type `Maison Francis Kurkdjian` and the scraper opens that brand's page for you.
- **One consistent output** - every record has the same fields; anything Fragrantica does not list is `null`, so the dataset loads cleanly into a spreadsheet or database.
- **Filtering** - gender, launch year, minimum rating and minimum number of rating votes.
- **20 language editions** - brand names are looked up in the edition you choose, and perfume pages from any edition work as start URLs.
- **Cache for scheduled runs** - set a cache project name and every run returns only perfumes you have not saved before.
- **Fast listing mode** - turn off full profiles to get cheap listing records (name, brand, year, gender, image, link) without opening each perfume.
- **Proxy support** - an optional proxy configuration if you want to choose your own proxies.
- **No browser required** - plain HTTP requests keep runs fast and cheap.

### 🚀 How to scrape Fragrantica perfume data in 5 steps

1. [Sign up](https://apify.com/sign-up) for a free Apify account - includes **$5 monthly credit**.
2. Open the actor page and click **Try for free**.
3. Fill in the **Input** fields (a Fragrantica URL or a brand name is required).
4. Click **Start** and wait for the run to complete.
5. Download results from the **Output** tab in JSON, CSV, or Excel format.

You can also run this actor via the [Apify API](https://docs.apify.com/api/v2) or integrate it directly into your workflows using [Zapier](https://zapier.com/apps/apify), [Make](https://www.make.com/), or [n8n](https://n8n.io/).

### 💰 Pricing for the Fragrantica scraper

This actor uses **pay-per-result** billing based on the compute units a run consumes.

- New Apify accounts include **$5 of free monthly credit**.
- The scraper uses plain HTTP requests instead of a headless browser, so it costs significantly less to run than browser-based scrapers.
- Proxies are disabled by default; leaving them off keeps runs cheapest.
- Perfumes skipped by the cache are not charged.
- Switching **Open each perfume page** off (listing mode) is the cheapest way to collect perfume names and links for a whole brand.

### 🖼️ Fragrantica scraper input screenshot

The input form starts with the Fragrantica URLs, the full-profile switch, the cache name and the max perfumes limit, then the optional brand and filter fields. The proxy settings are last.

![Fragrantica Perfume Scraper input form in Apify Console with the first 6 fields numbered 1 to 6: Fragrantica URLs, open each perfume page, cache project name, max perfumes per URL, brands and gender](https://i.postimg.cc/0QnRHMq1/Screenshot-2026-10-26-213642.png)

1. **Fragrantica URLs** - perfume, designer or note pages to scrape (here the Chanel designer page)
2. **Open each perfume page (full profile)** - on for the full profile, off for fast listing records
3. **Cache project name** - reuse the same name on every scheduled run to get only new perfumes
4. **Max perfumes per URL** - limit for each start URL or brand (here 500)
5. **Brands** - brand names to scrape, for example `Chanel`
6. **Gender** - filter for women, men or both (here women and men)

The language edition, launch year, rating and votes filters follow below these fields, and the proxy configuration comes last.

### 🔧 Fragrantica scraper input configuration

| Field | Type | Required | Default | Description |
| ----- | ---- | -------- | ------- | ----------- |
| Fragrantica URLs (`startUrls`) | array | — | `https://www.fragrantica.com/designers/Chanel.html` | Perfume pages, or designer and note pages. A perfume page returns that perfume; a designer or note page returns the perfumes listed on it. |
| Open each perfume page (`scrapeDetails`) | boolean | — | true | On: full profile for every perfume. Off: fast listing records only. |
| Cache project name (`cacheProjectName`) | string | — | — | Use the same name on each scheduled run to get only new perfumes. Perfumes already saved under that name are skipped and not charged. Each record gets `changeType: "new"`. |
| Max perfumes per URL (`maxItems`) | integer | — | 5 | Maximum perfumes saved for each start URL or brand. |
| Brands (`brands`) | array | — | — | Brand names spelled as on Fragrantica, for example `Chanel`. Each brand returns the perfumes on its designer page. |
| Gender (`gender`) | string | — | any | `any`, `female`, `male` or `unisex`. |
| Launched from / until (`yearFrom`, `yearTo`) | integer | — | — | Only perfumes launched in or after / in or before this year. |
| Minimum rating (`minRating`) | string | — | any | `any`, `3`, `3.5`, `4` or `4.5` (average community rating out of 5). |
| Minimum rating votes (`minVotes`) | integer | — | — | Only perfumes rated by at least this many members. |
| Language edition (`language`) | string | — | en | Fragrantica edition used for the brand names. |
| Proxy configuration (`proxyConfiguration`) | object | — | no proxy | Optional. Choose your own proxies if you want to. |

**Supported URL types:**

- Perfume page: `https://www.fragrantica.com/perfume/Dior/Sauvage-31861.html`
- Designer (brand) page: `https://www.fragrantica.com/designers/Chanel.html`
- Note page: `https://www.fragrantica.com/notes/Lavender-1.html`

Filters apply to the perfumes found on designer and note pages. Perfume pages you paste are always saved. Gender and launch year are checked before a perfume page is opened; rating and vote filters need the perfume page, so the scraper opens pages until `maxItems` perfumes match.

### 📦 Fragrantica scraper output data

The output is a dataset of JSON records with one fixed set of fields: `id`, `url`, `name`, `brand`, `brandUrl`, `brandLogoUrl`, `gender`, `year`, `imageUrl`, `ratingValue`, `ratingCount`, `reviewsCount`, `fragranceFamily`, `description`, `perfumers`, `mainAccords`, `notes`, `collection`, `similarPerfumes`, `detailsScraped`, `changeType` and `scrapedAt`. Fields without a value are `null`; records from listing mode (`detailsScraped: false`) carry only the name, brand, year, gender, image and link and `null` for the rest. `perfumers` and each note have a name, page link and image; each main accord has a name, strength and colour; `collection` holds the collection name and its perfumes; `similarPerfumes` lists the perfumes members also like. The dataset has 3 views:

- **Perfumes** - an overview table with image, name, brand, year, gender, rating, votes, family and perfumers.
- **Notes and accords** - main accords, the note pyramid and perfumers of every perfume.
- **Collection and similar perfumes** - the collection a perfume belongs to and the perfumes members also like.

**Output at a glance:**

| Perfume | Brand | Year | Gender | Rating | Votes | Family |
| ------- | ----- | ---- | ------ | ------ | ----- | ------ |
| [Antaeus Sport Cologne](https://www.fragrantica.com/perfume/Chanel/Antaeus-Sport-Cologne-125706.html) | Chanel | 1985 | male | 4.71 | 7 | Woody Aromatic |
| [Antaeus](https://www.fragrantica.com/perfume/Chanel/Antaeus-616.html) | Chanel | 1981 | male | 4.25 | 6,159 | Woody Chypre |
| [Cuir de Russie Parfum](https://www.fragrantica.com/perfume/Chanel/Cuir-de-Russie-Parfum-47794.html) | Chanel | 1924 | unisex | 4.56 | 212 | Leather |
| [Bois Noir](https://www.fragrantica.com/perfume/Chanel/Bois-Noir-34568.html) | Chanel | 1987 | male | 4.42 | 65 | Aromatic Fougere |
| [Le 1940 Rouge de Chanel](https://www.fragrantica.com/perfume/Chanel/Le-1940-Rouge-de-Chanel-45186.html) | Chanel | 1931 | female | 4.17 | 6 | Floral Aldehyde |

**Sample output (raw JSON, long lists cut to 2 items):**

```json
{
  "id": "31861",
  "url": "https://www.fragrantica.com/perfume/Dior/Sauvage-31861.html",
  "name": "Sauvage",
  "brand": "Dior",
  "brandUrl": "https://www.fragrantica.com/designers/Dior.html",
  "brandLogoUrl": "https://fimgs.net/mdimg/dizajneri/m.160.jpg",
  "gender": "male",
  "year": 2015,
  "imageUrl": "https://fimgs.net/mdimg/perfume-thumbs/375x500.31861.jpg",
  "ratingValue": 3.85,
  "ratingCount": 34772,
  "reviewsCount": 4300,
  "fragranceFamily": "Aromatic Fougere",
  "description": "Sauvage by Dior is a Aromatic Fougere fragrance for men. Sauvage was launched in 2015. The nose behind this fragrance is François Demachy. Top notes are Calabrian bergamot and Pepper; middle notes are Sichuan Pepper, Lavender, Pink Pepper, Vetiver, Patchouli, Geranium and elemi; base notes are Ambroxan, Cedar and Labdanum. Dior launches its new fragrance Sauvage, with the name originating from the fragrance Eau Sauvage from 1966, although the two don’t belong to the same collection. Sauvage is inspired by wild, open spaces; blue sky that covers rocky landscapes, hot under the desert sun. Dior in-house perfumer, François Demachy, signed this creation. The fragrance is announced as radically fresh, raw and noble at the same time. The composition is reportedly prevalent with carefully selected natural ingredients. Fresh top notes of Calabria bergamot encounter ambroxan, obtained from precious ambergris, and its woody trail. Dior Sauvage comes out in September 2015, advertised by actor Johnny Depp. It is available as 60 and 100 ml Eau de Toilette.",
  "perfumers": [
    {
      "name": "François Demachy",
      "url": "https://www.fragrantica.com/noses/Fran%C3%A7ois_Demachy.html",
      "imageUrl": "https://frgs.me/mdimg/nosevi/fit.173.jpg"
    }
  ],
  "mainAccords": [
    {
      "name": "fresh spicy",
      "strength": 100,
      "color": "#83C928"
    },
    {
      "name": "amber",
      "strength": 70.8,
      "color": "#bc4d10"
    }
  ],
  "notes": {
    "top": [
      {
        "name": "Calabrian bergamot",
        "url": "https://www.fragrantica.com/notes/Bergamot-75.html",
        "imageUrl": "https://fimgs.net/mdimg/sastojci/t.75.jpg"
      },
      {
        "name": "Pepper",
        "url": "https://www.fragrantica.com/notes/Pepper-158.html",
        "imageUrl": "https://fimgs.net/mdimg/sastojci/t.158.jpg"
      }
    ],
    "middle": [
      {
        "name": "Sichuan Pepper",
        "url": "https://www.fragrantica.com/notes/Sichuan-Pepper-213.html",
        "imageUrl": "https://fimgs.net/mdimg/sastojci/t.213.jpg"
      },
      {
        "name": "Lavender",
        "url": "https://www.fragrantica.com/notes/Lavender-1.html",
        "imageUrl": "https://fimgs.net/mdimg/sastojci/t.1.jpg"
      }
    ],
    "base": [
      {
        "name": "Ambroxan",
        "url": "https://www.fragrantica.com/notes/Ambroxan-563.html",
        "imageUrl": "https://fimgs.net/mdimg/sastojci/t.563.jpg"
      },
      {
        "name": "Cedar",
        "url": "https://www.fragrantica.com/notes/Cedar-41.html",
        "imageUrl": "https://fimgs.net/mdimg/sastojci/t.41.jpg"
      }
    ]
  },
  "collection": {
    "name": "Sauvage",
    "perfumes": [
      {
        "id": "68415",
        "name": "Sauvage Elixir",
        "brand": "Dior",
        "url": "https://www.fragrantica.com/perfume/Dior/Sauvage-Elixir-68415.html",
        "imageUrl": "https://fimgs.net/mdimg/perfume-thumbs/s.68415.jpg"
      },
      {
        "id": "48100",
        "name": "Sauvage Eau de Parfum",
        "brand": "Dior",
        "url": "https://www.fragrantica.com/perfume/Dior/Sauvage-Eau-de-Parfum-48100.html",
        "imageUrl": "https://fimgs.net/mdimg/perfume-thumbs/s.48100.jpg"
      }
    ]
  },
  "similarPerfumes": [
    {
      "id": "9099",
      "name": "Bleu de Chanel",
      "brand": "Chanel",
      "url": "https://www.fragrantica.com/perfume/Chanel/Bleu-de-Chanel-9099.html",
      "imageUrl": "https://fimgs.net/mdimg/perfume-thumbs/s.9099.jpg"
    },
    {
      "id": "25967",
      "name": "Bleu de Chanel Eau de Parfum",
      "brand": "Chanel",
      "url": "https://www.fragrantica.com/perfume/Chanel/Bleu-de-Chanel-Eau-de-Parfum-25967.html",
      "imageUrl": "https://fimgs.net/mdimg/perfume-thumbs/s.25967.jpg"
    }
  ],
  "detailsScraped": true,
  "changeType": null,
  "scrapedAt": "2026-10-26T15:33:24.895Z"
}
```

### 🔁 Scrape only new Fragrantica perfumes with the cache

Set the same **Cache project name** on every scheduled run. Perfumes already saved under that name are skipped: they are not charged and do not count towards **Max perfumes per URL**, so a brand page that has 300 perfumes only returns the ones you have not seen yet. Every saved perfume record gets `changeType: "new"`; with the cache off the field is `null`. Each name keeps its own separate cache, and perfumes skipped by the cache are never opened, so cached perfumes also save the perfume-page work. Add the actor to an Apify Schedule to pick up new releases of a brand or note automatically.

### 🐍 How to scrape Fragrantica with Python, JavaScript or the API

Run the actor programmatically with the official Apify clients. Replace `<YOUR_API_TOKEN>` with the token from your [Apify Console](https://console.apify.com/account/integrations).

**Python** (`pip install apify-client`):

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")

run = client.actor("confidential_gnat/fragrantica-perfume-scraper").call(run_input={
    "startUrls": [{"url": "https://www.fragrantica.com/designers/Chanel.html"}],
    "maxItems": 10,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

**JavaScript** (`npm install apify-client`):

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

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });

const run = await client.actor('confidential_gnat/fragrantica-perfume-scraper').call({
    startUrls: [{ url: 'https://www.fragrantica.com/designers/Chanel.html' }],
    maxItems: 10,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

**cURL** - start a run and wait for the dataset:

```bash
curl -X POST "https://api.apify.com/v2/acts/confidential_gnat~fragrantica-perfume-scraper/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"startUrls": [{"url": "https://www.fragrantica.com/designers/Chanel.html"}], "maxItems": 10}'
```

### 💡 What you can use Fragrantica perfume data for

- Building a perfume catalogue or comparison site with notes, accords and ratings.
- Fragrance recommendation engines that match perfumes by accords, notes and family.
- Market research on which brands, notes and launch years rate best with the community.
- Retail and e-commerce enrichment: add notes, accords and ratings to your own product listings.
- Trend analysis of ratings and launch years across a brand, a note or a whole catalogue.

Perfume retailers, niche brands, content creators, data analysts and fragrance app developers use this data in the beauty, fashion and e-commerce industries.

### ⚠️ Limitations of the Fragrantica scraper

- **Community vote breakdowns** - The longevity, sillage, season, gender and price-value vote charts, and the love/like/dislike rating split, are loaded by the website after the page opens and are not part of the output.
- **Keyword search and perfumer pages** - Search results pages and perfumer pages cannot be scraped. Use a brand name, a designer page or a note page instead.
- **Rounded review counts** - For popular perfumes the site shows the number of reviews rounded (for example 4.3K), and `reviewsCount` follows it. The reviews themselves are not part of this actor's output.
- **Rating and vote filters** - They need the perfume page, so a filter that few perfumes match makes the run open many pages before `maxItems` matches are found.
- **Description language** - `fragranceFamily` is read from the English description and is empty on other language editions.

### ❓ Fragrantica scraper FAQ

#### Can I scrape Fragrantica legally?

The actor only collects data that is already publicly visible on Fragrantica - no login, paywall or private content is accessed. Scraping publicly available data is generally considered lawful (see the *hiQ Labs v. LinkedIn* ruling), but you are responsible for complying with Fragrantica's Terms of Service and applicable laws such as GDPR/CCPA, especially when you store reviewer usernames.

#### What data does the Fragrantica scraper return?

Each perfume record has the name, brand, year, gender, rating and vote count, fragrance family, main accords with strength and colour, top, middle and base notes with links and images, perfumers, brand logo, image, description, the perfume's collection and similar perfumes.

#### How many perfumes can I scrape from one URL?

`maxItems` limits the perfumes saved for each start URL or brand, not for the whole run. A designer page lists every perfume of the brand, so a large brand can return several hundred perfumes.

#### Do I need a proxy to scrape fragrantica.com?

No. The proxy configuration is off by default and the scraper runs without any proxy setup. If you prefer, choose your own proxies in the proxy field.

#### How do I scrape Fragrantica with Python?

Use the Python example above: call the actor with the Apify client and iterate over the dataset items.

#### Can I run this Fragrantica scraper on a schedule?

Yes. Use [Apify Schedules](https://docs.apify.com/platform/schedules) to run the actor daily or weekly. Set a **Cache project name** and each run returns only perfumes you have not saved before; perfumes already in the cache are skipped and not charged.

#### What output formats are supported?

JSON, CSV, Excel, XML and RSS, either from the **Output** tab or through the Apify API.

#### Why are some perfumes missing perfumers or a launch year?

Fragrantica does not list a perfumer or a launch year for every perfume, especially for older or unofficial entries. Those fields are `null` in the output.

### 🔗 Relevant actors for Fragrantica perfume data

| Scraper | Description |
| ------- | ----------- |
| [🧴 Incidecoder Scraper](https://apify.com/confidential_gnat/incidecoder-scraper) | Scrapes skincare product pages: full ingredient lists and highlights. |
| [🍷 Vivino Wine Scraper](https://apify.com/confidential_gnat/vivino-wine-scraper) | Scrapes wine data from Vivino: name, winery, vintage, region and ratings. |
| [🍷 Vivino Wine Reviews Scraper](https://apify.com/confidential_gnat/vivino-reviews-scraper) | Scrapes user reviews and tasting notes from Vivino. |
| [🛍️ Google Shopping Scraper](https://apify.com/confidential_gnat/google-shopping-scraper) | Scrapes Google Shopping product listings, prices and deals for any search. |

### 🔗 Other actors you may find useful

| Scraper | Description |
| ------- | ----------- |
| [🛒 AliExpress Products Scraper](https://apify.com/confidential_gnat/aliexpress-products-scraper) | Scrape AliExpress products, prices, variants, store and shipping data. |
| [🏷️ Mercari Japan Scraper](https://apify.com/confidential_gnat/mercari-japan-listings-scraper) | Scrapes Mercari Japan listings: prices in JPY, sold status and condition. |
| [📱 Google Play Store Reviews Scraper](https://apify.com/confidential_gnat/google-play-reviews-scraper) | Scrapes user reviews from Google Play Store apps. |
| [🎒 Carousell Products Scraper](https://apify.com/confidential_gnat/carousell-products-scraper) | Scrape Carousell.sg product listings with prices and seller ratings. |
| [🧩 Shopify App Store Scraper](https://apify.com/confidential_gnat/shopify-app-store-scraper) | Scrapes apps from the Shopify App Store: ratings, pricing and developers. |

### 💬 Support & contact

If you encounter any issues or have questions, please [open an issue](https://apify.com/confidential_gnat/fragrantica-perfume-scraper/issues/open).

You can also find more of our actors on the [Actor Flow](https://apify.com/confidential_gnat) page.

# Actor input Schema

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

Perfume pages, or designer and note pages. A perfume page returns that perfume; a designer or note page returns the perfumes listed on it. Example: https://www.fragrantica.com/designers/Chanel.html. Any language edition works.

## `scrapeDetails` (type: `boolean`):

On: every perfume page is opened for notes, accords, perfumers, rating and description. Off: fast listing records only (name, year, gender, image, link). Gender, rating and vote filters need this on.

## `cacheProjectName` (type: `string`):

Use the same name on each scheduled run to get only new perfumes. Perfumes already saved under that name are skipped, not charged and not counted towards Max perfumes per URL. Each record gets changeType: new. Leave empty to turn the cache off.

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

Maximum perfumes saved for each start URL or brand. Reviews do not count towards this limit.

## `brands` (type: `array`):

Brand names to scrape, spelled as on Fragrantica, for example Chanel or Maison Francis Kurkdjian. Each brand returns the perfumes listed on its designer page.

## `gender` (type: `string`):

Only perfumes Fragrantica lists for this gender. Filters apply to the perfumes found on designer and note pages; perfume pages you paste are always saved.

## `yearFrom` (type: `integer`):

Only perfumes launched in or after this year. Example: 2020.

## `yearTo` (type: `integer`):

Only perfumes launched in or before this year. Example: 2025.

## `minRating` (type: `string`):

Only perfumes with at least this average community rating out of 5.

## `minVotes` (type: `integer`):

Only perfumes rated by at least this many members. Useful to skip obscure entries. Example: 500.

## `language` (type: `string`):

Fragrantica edition used for brand names given above. Descriptions come in that language. Start URLs keep the edition they were copied from.

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

Optional. Choose your own proxies if you want to; the scraper also runs without any proxy setup.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.fragrantica.com/designers/Chanel.html"
    }
  ],
  "scrapeDetails": true,
  "maxItems": 5,
  "gender": "any",
  "minRating": "any",
  "language": "en",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# 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/designers/Chanel.html"
        }
    ],
    "maxItems": 5,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("confidential_gnat/fragrantica-perfume-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/designers/Chanel.html" }],
    "maxItems": 5,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("confidential_gnat/fragrantica-perfume-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/designers/Chanel.html"
    }
  ],
  "maxItems": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call confidential_gnat/fragrantica-perfume-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,confidential_gnat/fragrantica-perfume-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/GePA4iG9S96jGrXeC/builds/pfUhXbTr9B3eJevwU/openapi.json
