# Fragrantica Perfume Scraper — Notes, Accords, Votes & Reviews (`unfenced-group/fragrantica-perfume-scraper`) Actor

Extract Fragrantica perfume profiles: note pyramid, accords, perfumers, ratings, and full community votes for longevity, sillage, seasons, gender and price value. Similar perfumes, pros and cons, optional reviews. Search, filters or URLs. 23 languages.

- **URL**: https://apify.com/unfenced-group/fragrantica-perfume-scraper.md
- **Developed by:** [Unfenced Group](https://apify.com/unfenced-group) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.77 / 1,000 perfume profiles

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

![Fragrantica Perfume Scraper](https://api.apify.com/v2/key-value-stores/YSG2rYABQkPo2rHcY/records/banner.png)

Extract perfume profiles from Fragrantica.com: the full note pyramid, main accords with strength, perfumers, ratings, and the complete community votes for longevity, sillage, seasons, gender and price value. Search by keyword, filter by brand, note, perfumer, gender, year or rating, or paste any Fragrantica URL. Reviews are optional. No API key required.

***

### Why this scraper?

#### 🗳️ The full community votes

Every vote breakdown Fragrantica shows on a perfume page: longevity (very weak to eternal), sillage (intimate to enormous), price value, winter/spring/summer/autumn, day/night, gender (female to male) and how many members have, had or want the perfume. Each comes with its vote counts, total and average.

#### 🌸 Complete scent profile

Top, middle and base notes with note IDs, links and relative weight, flat note lists for perfumes without a pyramid, main accords with strength and colour, fragrance family, perfumers, launch year, awards and description.

#### 🔎 Search and filters that match the site

Keyword search, brands, notes (all must be present), perfumers, gender, launch year range, minimum rating, minimum number of votes and niche brands only. Large brands are collected in full, past Fragrantica's own 1,000-result search limit.

#### 🔗 Related perfumes and opinions

The "This perfume reminds me of" list with yes and no votes for each match, and Fragrantica's summarised pros and cons with agree and disagree counts.

#### 📊 Exact popularity data

Exact review counts per language (not the rounded number on the page), the rating distribution from 1 to 5 stars, popularity scores, the date of the latest review and a 29-day visitor trend.

#### 💬 Reviews with reviewer votes

Optional review records: text, date, author name, whether it is a recent or a popular positive or negative review, and the votes that reviewer cast for the perfume.

#### 🌍 23 language editions

English, German, Spanish, French, Italian, Dutch, Polish, Portuguese, Romanian, Czech, Hungarian, Swedish, Turkish, Greek, Russian, Ukrainian, Serbian, Mongolian, Hebrew, Arabic, Japanese, Chinese and Korean. Notes, accords, descriptions and reviews come in the chosen language.

***

### Input parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `searchQueries` | array | `[]` | Keywords to search: a perfume name, brand or collection. Each query runs separately. |
| `startUrls` | array | `[]` | Fragrantica perfume, designer, note, perfumer or search URLs. Designer, note and perfumer pages return every perfume listed under them. |
| `brands` | array | `[]` | Only perfumes from these brands. Names are matched to Fragrantica's spelling. |
| `notes` | array | `[]` | Only perfumes that contain all of these notes (English names). |
| `perfumers` | array | `[]` | Only perfumes by one of these perfumers. |
| `gender` | string | `"any"` | `any`, `female`, `male` or `unisex`. |
| `yearFrom` | integer | `0` | Only perfumes launched in or after this year. 0 means no limit. |
| `yearTo` | integer | `0` | Only perfumes launched in or before this year. 0 means no limit. |
| `minRating` | string | `"any"` | Minimum average rating: `any`, `3`, `3.5`, `4` or `4.5`. |
| `minVotes` | integer | `0` | Minimum number of rating votes. |
| `nicheOnly` | boolean | `false` | Only perfumes from niche brands. |
| `scrapeDetails` | boolean | `true` | On: full perfume profiles. Off: faster, cheaper listing records with search data only. |
| `includeCommunityVotes` | boolean | `true` | Adds the vote breakdowns, similar perfumes and pros and cons. Turn off for faster runs without these fields. |
| `includeReviews` | boolean | `false` | Also save reviews as separate records. |
| `maxReviewsPerPerfume` | integer | `20` | Maximum reviews per perfume. 0 means all reviews on the page (up to about 210). |
| `language` | string | `"en"` | Fragrantica language edition. |
| `maxResults` | integer | `20` | Maximum number of perfumes across all inputs. Reviews do not count. 0 means no limit. |
| `proxyConfiguration` | object | Apify Proxy | Proxy settings. The default works; change only if you have a reason to. |

With no search, filter or URL, the actor searches "Sauvage" as an example.

***

### Output schema

The dataset holds three record types, marked by `recordType`. Fields the source does not publish for a perfume are returned as `null` or an empty list rather than omitted.

#### Perfume profile (`recordType: "perfume"`)

| Field | Type | Description |
|---|---|---|
| `recordType` | string | Always `perfume`. |
| `perfumeId` | integer | Fragrantica perfume ID. |
| `url` | string | Perfume page URL in the chosen language edition. |
| `language` | string | Language edition code, e.g. `en`. |
| `name` | string | Perfume name. |
| `brand` | string | Brand (designer) name. |
| `brandUrl` | string | Brand page URL. |
| `fullTitle` | string | Page title as shown, e.g. "Coco Mademoiselle Chanel for women". |
| `gender` | string | `female`, `male` or `unisex`. |
| `genderLabel` | string | Gender label as shown on the page, in the chosen language. |
| `year` | integer | Launch year (null if unknown). |
| `collection` | string | Collection the perfume belongs to (null if none). |
| `fragranceFamily` | string | Fragrance family, e.g. "Oriental Floral" (English, German, Italian and Spanish editions; null if not classified). |
| `ratingValue` | number | Average rating out of 5 (null when nobody has rated it). |
| `ratingCount` | integer | Number of rating votes. |
| `ratingDistribution` | object | Votes per star, keys `1` to `5` (null without community votes). |
| `reviewsCount` | integer | Exact number of reviews across all language editions. |
| `reviewsByLanguage` | object | Exact review count per language code. |
| `popularityScore` | integer | Fragrantica popularity score. |
| `recentPopularityScore` | integer | Popularity score over the recent period. |
| `lastReviewAt` | string | ISO date and time of the most recent review (null if none). |
| `mainAccords` | array | Main accords: `name`, `strength` (0–100, relative to the strongest), `color`. |
| `notesTop` | array | Top notes: `name`, `noteId`, `url`, `imageUrl`, `weight` (0–1, relative prominence). |
| `notesMiddle` | array | Middle (heart) notes, same shape as `notesTop`. |
| `notesBase` | array | Base notes, same shape as `notesTop`. |
| `notesUnsorted` | array | Notes of perfumes without a pyramid, same shape. |
| `hasPyramid` | boolean | Whether the notes are split into top, middle and base. |
| `allNotes` | array | All note names in one list. |
| `perfumers` | array | Perfumers: `name`, `url` (empty if not credited). |
| `voteDataAvailable` | boolean | Whether the community vote fields below were collected. |
| `longevity` | object | `votes` (veryWeak, weak, moderate, longLasting, eternal), `average` (1–5), `total`. |
| `sillage` | object | `votes` (intimate, moderate, strong, enormous), `average` (1–4), `total`. |
| `priceValue` | object | `votes` (wayOverpriced, overpriced, ok, goodValue, greatValue), `average` (1–5), `total`. |
| `genderVotes` | object | `votes` (female, moreFemale, unisex, moreMale, male), `total`. |
| `seasonVotes` | object | Votes for `winter`, `spring`, `summer`, `autumn`, `day`, `night`. |
| `ownership` | object | Members who `have`, `had` or `want` the perfume. |
| `similarPerfumes` | array | "Reminds me of" matches: `perfumeId`, `name`, `brand`, `gender`, `url`, `imageUrl`, `votesYes`, `votesNo`. |
| `pros` | array | Summarised pros: `text`, `shortText`, `votesYes`, `votesNo` (English edition only). |
| `cons` | array | Summarised cons, same shape as `pros` (English edition only). |
| `awards` | array | Awards the perfume won (empty if none). |
| `shopOffers` | array | Shop offers listed on the page: `shop`, `itemCount`, `priceMin`, `priceMax`, `currency`, `approximate` (empty if none). |
| `descriptionHtml` | string | Fragrantica's description as HTML. |
| `descriptionText` | string | Description as plain text. |
| `descriptionMarkdown` | string | Description as Markdown. |
| `imageUrl` | string | Bottle image, 375 × 500. |
| `imageUrlLarge` | string | Large bottle image. |
| `alternativeNames` | array | Names in other scripts: `language`, `name`. |
| `languageUrls` | object | URLs of the same perfume in the other language editions, by language code. |
| `visitorTrend` | array | Daily page visitors over the last 29 days. |
| `reviewsScraped` | integer | Number of review records saved for this perfume in this run. |
| `sourceMode` | string | How the perfume was found: `search`, `filter`, `designer`, `note`, `perfumer` or `url`. |
| `searchQuery` | string | Search query that found it (null for other modes). |
| `position` | integer | Position in the search or listing results. |
| `source` | string | Always `fragrantica.com`. |
| `scrapedAt` | string | ISO timestamp of extraction. |
| `contentHash` | string | Hash of the key values, for change detection between runs. |

#### Review (`recordType: "review"`, with `includeReviews: true`)

| Field | Type | Description |
|---|---|---|
| `recordType` | string | Always `review`. |
| `reviewId` | integer | Fragrantica review ID. |
| `perfumeId` | integer | ID of the perfume reviewed. |
| `perfumeName` | string | Perfume name. |
| `brand` | string | Brand name. |
| `perfumeUrl` | string | Perfume page URL. |
| `url` | string | Direct link to the review. |
| `language` | string | Language edition code. |
| `reviewCategory` | string | `recent`, `popularPositive` or `popularNegative`. |
| `authorName` | string | Reviewer's display name. |
| `datePublished` | string | Review date, `YYYY-MM-DD`. |
| `reviewText` | string | Review text. |
| `reviewerVotes` | object | The reviewer's own votes: `rating`, `longevity`, `sillage`, `gender`, `ownership`, `seasons` (null where the reviewer did not vote). |
| `reviewerSignaturePerfume` | string | URL of the perfume the reviewer shows as their signature (null if none). |
| `source` | string | Always `fragrantica.com`. |
| `scrapedAt` | string | ISO timestamp of extraction. |

#### Listing (`recordType: "perfume-listing"`, with `scrapeDetails: false`)

| Field | Type | Description |
|---|---|---|
| `recordType` | string | Always `perfume-listing`. |
| `perfumeId` | integer | Fragrantica perfume ID. |
| `name` | string | Perfume name. |
| `brand` | string | Brand name. |
| `url` | string | Perfume page URL. |
| `slug` | string | URL path of the perfume, e.g. `Dior/Sauvage`. |
| `gender` | string | `female`, `male` or `unisex`. |
| `year` | integer | Launch year (null if unknown). |
| `collection` | string | Collection (null if none). |
| `ratingValue` | number | Average rating out of 5, four decimals. |
| `ratingCount` | integer | Number of rating votes. |
| `reviewsCount` | integer | Exact review count across all languages. |
| `reviewsByLanguage` | object | Review count per language code. |
| `popularityScore` | integer | Popularity score. |
| `recentPopularityScore` | integer | Recent popularity score. |
| `compoundPopularityScore` | integer | Combined popularity score. |
| `lastReviewAt` | string | ISO date and time of the latest review (null if none). |
| `alternativeNames` | array | Names in other scripts: `language`, `name`. |
| `imageUrl` | string | Bottle image. |
| `thumbnailUrl` | string | Small bottle image. |
| `language` | string | Language edition code. |
| `sourceMode` | string | How the perfume was found. |
| `searchQuery` | string | Search query that found it (null for other modes). |
| `position` | integer | Position in the results. |
| `source` | string | Always `fragrantica.com`. |
| `scrapedAt` | string | ISO timestamp of extraction. |

#### Example record

```json
{
  "recordType": "perfume",
  "perfumeId": 31861,
  "url": "https://www.fragrantica.com/perfume/Dior/Sauvage-31861.html",
  "language": "en",
  "name": "Sauvage",
  "brand": "Dior",
  "brandUrl": "https://www.fragrantica.com/designers/Dior.html",
  "fullTitle": "Sauvage Dior for men",
  "gender": "male",
  "genderLabel": "for men",
  "year": 2015,
  "collection": "Sauvage Collection",
  "fragranceFamily": "Aromatic Fougere",
  "ratingValue": 3.8496,
  "ratingCount": 34238,
  "ratingDistribution": {
    "1": 1869,
    "2": 4572,
    "3": 3592,
    "4": 11011,
    "5": 13194
  },
  "reviewsCount": 6770,
  "reviewsByLanguage": {
    "en": 4154,
    "ru": 664,
    "es": 640,
    "pt": 628,
    "sr": 160,
    "pl": 145,
    "it": 144
  },
  "popularityScore": 120540,
  "recentPopularityScore": 29848,
  "lastReviewAt": "2026-07-20T05:34:50.000Z",
  "mainAccords": [
    {
      "name": "fresh spicy",
      "strength": 100,
      "color": "#83C928"
    },
    {
      "name": "amber",
      "strength": 70.85,
      "color": "#bc4d10"
    },
    {
      "name": "citrus",
      "strength": 69.42,
      "color": "#F9FF52"
    }
  ],
  "notesTop": [
    {
      "name": "Calabrian bergamot",
      "noteId": 75,
      "url": "https://www.fragrantica.com/notes/Bergamot-75.html",
      "imageUrl": "https://fimgs.net/mdimg/sastojci/t.75.jpg",
      "weight": 1
    },
    {
      "name": "Pepper",
      "noteId": 158,
      "url": "https://www.fragrantica.com/notes/Pepper-158.html",
      "imageUrl": "https://fimgs.net/mdimg/sastojci/t.158.jpg",
      "weight": 1
    }
  ],
  "notesMiddle": [
    {
      "name": "Sichuan Pepper",
      "noteId": 213,
      "url": "https://www.fragrantica.com/notes/Sichuan-Pepper-213.html",
      "imageUrl": "https://fimgs.net/mdimg/sastojci/t.213.jpg",
      "weight": 0.9567
    },
    {
      "name": "Lavender",
      "noteId": 1,
      "url": "https://www.fragrantica.com/notes/Lavender-1.html",
      "imageUrl": "https://fimgs.net/mdimg/sastojci/t.1.jpg",
      "weight": 0.9232
    }
  ],
  "notesBase": [
    {
      "name": "Ambroxan",
      "noteId": 563,
      "url": "https://www.fragrantica.com/notes/Ambroxan-563.html",
      "imageUrl": "https://fimgs.net/mdimg/sastojci/t.563.jpg",
      "weight": 1
    },
    {
      "name": "Cedar",
      "noteId": 41,
      "url": "https://www.fragrantica.com/notes/Cedar-41.html",
      "imageUrl": "https://fimgs.net/mdimg/sastojci/t.41.jpg",
      "weight": 0.8356
    }
  ],
  "notesUnsorted": [],
  "hasPyramid": true,
  "allNotes": [
    "Calabrian bergamot",
    "Pepper",
    "Sichuan Pepper",
    "Lavender",
    "Pink Pepper",
    "Vetiver",
    "Patchouli",
    "Geranium",
    "elemi",
    "Ambroxan",
    "Cedar",
    "Labdanum"
  ],
  "perfumers": [
    {
      "name": "François Demachy",
      "url": "https://www.fragrantica.com/noses/Fran%C3%A7ois_Demachy.html"
    }
  ],
  "voteDataAvailable": true,
  "longevity": {
    "votes": {
      "veryWeak": 534,
      "weak": 938,
      "moderate": 6705,
      "longLasting": 10519,
      "eternal": 1820
    },
    "average": 3.5924,
    "total": 20516
  },
  "sillage": {
    "votes": {
      "intimate": 1336,
      "moderate": 8342,
      "strong": 8958,
      "enormous": 1746
    },
    "average": 2.5453,
    "total": 20382
  },
  "priceValue": {
    "votes": {
      "wayOverpriced": 1227,
      "overpriced": 4460,
      "ok": 7561,
      "goodValue": 1936,
      "greatValue": 425
    },
    "average": 2.7355,
    "total": 15609
  },
  "genderVotes": {
    "votes": {
      "female": 150,
      "moreFemale": 39,
      "unisex": 576,
      "moreMale": 2700,
      "male": 13468
    },
    "total": 16933
  },
  "seasonVotes": {
    "winter": 10249,
    "spring": 15159,
    "summer": 14118,
    "autumn": 14014,
    "day": 15021,
    "night": 13704
  },
  "ownership": {
    "have": 55004,
    "had": 19230,
    "want": 13209
  },
  "similarPerfumes": [
    {
      "perfumeId": 43402,
      "name": "Luna Rossa Carbon Eau de Toilette",
      "brand": "Prada",
      "gender": "male",
      "url": "https://www.fragrantica.com/perfume/Prada/Luna-Rossa-Carbon-Eau-de-Toilette-43402.html",
      "imageUrl": "https://fimgs.net/mdimg/perfume/s.43402.jpg",
      "votesYes": 2195,
      "votesNo": 506
    }
  ],
  "pros": [
    {
      "text": "Good projection",
      "shortText": null,
      "votesYes": 1678,
      "votesNo": 107
    }
  ],
  "cons": [
    {
      "text": "In-your-face aroma chemicals",
      "shortText": null,
      "votesYes": 1199,
      "votesNo": 501
    }
  ],
  "awards": [],
  "shopOffers": [],
  "descriptionHtml": "<p><b>Sauvage</b> by <b>Dior</b> is a Aromatic Fougere fragrance for men. <b>Sauvage</b> was launched in 2015. ...</p>",
  "descriptionText": "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 a ...",
  "descriptionMarkdown": "**Sauvage** by **Dior** is a Aromatic Fougere fragrance for men. **Sauvage** was launched  ...",
  "imageUrl": "https://fimgs.net/mdimg/perfume-thumbs/375x500.31861.jpg",
  "imageUrlLarge": "https://fimgs.net/mdimg/perfume/o.31861.jpg",
  "alternativeNames": [
    {
      "language": "ar",
      "name": "ديور سوفاج"
    },
    {
      "language": "gr",
      "name": "Ντιόρ Σοβάζ"
    }
  ],
  "languageUrls": {
    "de": "https://www.fragrantica.de/Parfum/Dior/Sauvage-31861.html",
    "es": "https://www.fragrantica.es/perfume/Dior/Sauvage-31861.html"
  },
  "visitorTrend": [
    2252,
    2303,
    2362,
    2448,
    2453
  ],
  "reviewsScraped": 0,
  "sourceMode": "search",
  "searchQuery": "Sauvage",
  "position": 1,
  "source": "fragrantica.com",
  "scrapedAt": "2026-09-19T13:34:08.225Z",
  "contentHash": "aeb07ffe1ddb2dc8"
}
```

***

### Examples

**Search for perfumes by name, with reviews:**

```json
{
  "searchQueries": ["Baccarat Rouge 540", "Aventus"],
  "includeReviews": true,
  "maxReviewsPerPerfume": 10,
  "maxResults": 20
}
```

**Top-rated niche perfumes with oud from recent years:**

```json
{
  "notes": ["Oud"],
  "nicheOnly": true,
  "yearFrom": 2022,
  "minRating": "4",
  "minVotes": 300,
  "maxResults": 100
}
```

**Every perfume of a brand or perfumer from a Fragrantica URL:**

```json
{
  "startUrls": [
    { "url": "https://www.fragrantica.com/designers/Maison-Francis-Kurkdjian.html" },
    { "url": "https://www.fragrantica.com/noses/Alberto_Morillas.html" }
  ],
  "maxResults": 0
}
```

**Fast catalogue feed of a brand, search data only, in German:**

```json
{
  "brands": ["Lattafa"],
  "scrapeDetails": false,
  "language": "de",
  "maxResults": 0
}
```

***

### 💰 Pricing

**$0.79 per 1,000 perfume profiles** — you only pay for records that are saved. Failed retries are never charged.

| Perfume profiles | Cost |
|---|---|
| 100 | ~$0.08 |
| 1,000 | ~$0.79 |
| 10,000 | ~$7.90 |
| 100,000 | ~$79.00 |

| Record type | Price per 1,000 |
|---|---|
| Perfume profile | $0.79 |
| Review | $0.39 |
| Listing (search data only) | $0.29 |

Each run also carries a start fee of $0.001 per GB of memory: $0.008 at the default 8 GB, $0.001 for listing runs on 1 GB.

> Flat-rate alternatives typically charge $29–$49/month regardless of usage.

Subscription tiers lower the rate further, down to $0.77 per 1,000 profiles, $0.37 per 1,000 reviews and $0.27 per 1,000 listings. Use **Max perfumes** and **Max reviews per perfume** to control your spend exactly.

***

### Performance

| Run size | Typical time |
|---|---|
| 20 full profiles | under 1 minute |
| 100 full profiles | about 2 minutes |
| 1,000 full profiles | 15–20 minutes |
| 1,000 listings | under 30 seconds |

***

### Known limitations

- Pros and cons are published on the English edition only; other editions return empty lists.
- Fragrance family is read from the English, German, Italian and Spanish descriptions; other editions return null.
- Reviews are limited to those shown on the perfume page: about 200 of the most recent plus the most popular positive and negative ones.
- Fragrantica's per-note votes ("main notes according to your votes") are not included.

***

### Technical details

- **Source:** fragrantica.com and its 22 other language editions
- **Coverage:** over 140,000 perfumes, searchable by name, brand, note, perfumer, gender, year and rating
- **Memory:** 8 GB default for full profiles with community votes; 1 GB is enough for listings or profiles without votes
- **Retry:** automatic retry on network errors with exponential backoff and session rotation

***

### Rate this actor

If this scraper does its job, a short review on the **Reviews** tab helps other users find it. Something not working? Open an issue on the **Issues** tab instead — issues get fixed.

***

### Need a custom scraper?

**[Unfenced Group](https://www.unfencedgroup.nl)** builds Apify actors for any website — for free.

If the site you need isn't in our portfolio yet, just ask. We scope, build, and publish it at no cost to you. You only pay for results — we absorb the compute and proxy costs ourselves. Same pay-per-result pricing, same quality, same standards as every actor in this portfolio.

**Get in touch:** [www.unfencedgroup.nl](https://www.unfencedgroup.nl)

# Actor input Schema

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

Keywords to search on Fragrantica: a perfume name, brand or collection. Each query runs separately. Example: \["Sauvage", "Baccarat Rouge"].

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

Fragrantica pages to scrape. A perfume page returns that perfume. A designer, note or perfumer page returns every perfume listed under it. A search URL with ?query= runs that search. Any language edition works. Example: https://www.fragrantica.com/designers/Chanel.html

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

Only perfumes from these brands (designers). Names are matched to Fragrantica's spelling. Example: \["Chanel", "Maison Francis Kurkdjian"]. Works with or without a search query.

## `notes` (type: `array`):

Only perfumes that contain all of these notes, in English. Example: \["Oud", "Rose"].

## `perfumers` (type: `array`):

Only perfumes created by one of these perfumers (noses). Example: \["Francis Kurkdjian"].

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

Only perfumes Fragrantica lists for this gender. Example: "unisex".

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

Only perfumes launched in or after this year. 0 means no limit. Example: 2020.

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

Only perfumes launched in or before this year. 0 means no limit. Example: 2025.

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

Only perfumes with at least this average community rating (out of 5). Example: "4".

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

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

## `nicheOnly` (type: `boolean`):

Only perfumes from brands Fragrantica classifies as niche. Example: true.

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

On: every perfume is opened for the full profile (notes, accords, perfumers, votes, similar perfumes, pros and cons). Off: fast, cheaper listing records from Fragrantica's search index only (name, brand, year, gender, rating, review counts, popularity). Example: true.

## `includeCommunityVotes` (type: `boolean`):

Adds the full vote breakdowns for longevity, sillage, price value, seasons, day/night, gender and ownership, plus similar perfumes and pros/cons. Turn off for faster runs without these fields. Only applies when full profiles are on. Example: true.

## `includeReviews` (type: `boolean`):

Also save member reviews from each perfume page as separate records (recordType "review"), with each reviewer's own votes. Up to about 210 reviews per perfume: the most recent ones plus the most popular positive and negative. Example: false.

## `maxReviewsPerPerfume` (type: `integer`):

Maximum reviews saved per perfume when reviews are on. 0 means all reviews on the page. Example: 20.

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

Fragrantica edition to read. Note names, accords, descriptions and reviews come in that language. Example: "en".

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

Maximum number of perfumes to return across all queries, filters and URLs. Reviews do not count toward this limit. 0 means no limit. Example: 100.

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

Proxy settings. The default Apify Proxy works for Fragrantica; change only if you have a reason to. Example: {"useApifyProxy": true}.

## Actor input object example

```json
{
  "searchQueries": [
    "Sauvage"
  ],
  "startUrls": [
    {
      "url": "https://www.fragrantica.com/perfume/Chanel/Coco-Mademoiselle-611.html"
    }
  ],
  "brands": [],
  "notes": [],
  "perfumers": [],
  "gender": "any",
  "yearFrom": 0,
  "yearTo": 0,
  "minRating": "any",
  "minVotes": 0,
  "nicheOnly": false,
  "scrapeDetails": true,
  "includeCommunityVotes": true,
  "includeReviews": false,
  "maxReviewsPerPerfume": 20,
  "language": "en",
  "maxResults": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (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 = {
    "searchQueries": [
        "Sauvage"
    ],
    "startUrls": [
        {
            "url": "https://www.fragrantica.com/perfume/Chanel/Coco-Mademoiselle-611.html"
        }
    ],
    "maxResults": 10,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("unfenced-group/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 = {
    "searchQueries": ["Sauvage"],
    "startUrls": [{ "url": "https://www.fragrantica.com/perfume/Chanel/Coco-Mademoiselle-611.html" }],
    "maxResults": 10,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("unfenced-group/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 '{
  "searchQueries": [
    "Sauvage"
  ],
  "startUrls": [
    {
      "url": "https://www.fragrantica.com/perfume/Chanel/Coco-Mademoiselle-611.html"
    }
  ],
  "maxResults": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call unfenced-group/fragrantica-perfume-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,unfenced-group/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/mhO3lsiIJ56cF20f3/builds/s61D91oM0eyskdmkx/openapi.json
