# Fragrantica Scraper (`parsebird/fragrantica-scraper`) Actor

Scrape Fragrantica perfume data: notes, main accords, ratings, perfumers, gender, launch year, and reviews. Search by keyword or designer/note/perfumer URL. Export JSON, CSV, Excel.

- **URL**: https://apify.com/parsebird/fragrantica-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Categories:** E-commerce, Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.90 / 1,000 item scrapeds

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### Fragrantica Scraper

Fragrantica Scraper extracts structured perfume data from [Fragrantica](https://www.fragrantica.com/) — notes, main accords, ratings, gender, launch year, perfumers, and user reviews — by keyword search or by pasting a Fragrantica URL.

<table><tr>
<td style="border-left:4px solid #1C1917;padding:12px 16px;font-weight:600">
Search by perfume name, brand, or note, or paste a designer, note, or perfumer page to bulk-scrape every fragrance listed on it — with optional review collection and 13 language editions.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```text
Use Apify Actor parsebird/fragrantica-scraper to scrape Fragrantica perfume data. Example with ApifyClient: client.actor("parsebird/fragrantica-scraper").call(run_input={"searchQueries":["Chanel No 5"],"startUrls":["https://www.fragrantica.com/perfume/Chanel/Chanel-No-5-Parfum-28711.html"],"maxResults":25,"includeReviews":false,"maxReviewsPerPerfume":20,"language":"en"}). Inputs: searchQueries string[] optional (perfume name, brand, or note); startUrls string[] optional (perfume, designer, note, or perfumer URL — auto-detected, designer/note/perfumer expand into their listed perfumes); maxResults integer default 100 (0 = unlimited); includeReviews boolean default false; maxReviewsPerPerfume integer default 20 (0 = all available, up to ~200); language select default "en" (en, fr, de, es, it, pt, nl, pl, ru, ja, ko, ar, tr). Output fields (recordType "perfume"): perfumeId, name, url, brand, brandUrl, gender, year, imageUrl, ratingValue, ratingCount, reviewsCount, mainAccords, notesTop, notesMiddle, notesBase, perfumers, language. recordType "designer": name, url, parentCompany, country, perfumeCount. recordType "review": perfumeId, perfumeUrl, author, date, text. API docs: https://docs.apify.com/api/client/python/ and https://docs.apify.com/api/client/js/. Token: https://console.apify.com/account/integrations.
```

### What is Fragrantica Scraper?

**Fragrantica Scraper** is a Fragrantica scraper and Fragrantica API alternative for collecting structured perfume data without manually copying it off fragrance pages. Search by keyword, or paste a Fragrantica perfume, designer, note, or perfumer URL, then download clean, analysis-ready fragrance data.

Use it when you need repeatable Fragrantica data extraction with scheduling, API access, integrations, and dataset exports in JSON, CSV, Excel, HTML, XML, or RSS through [Apify](https://apify.com/).

### What can Fragrantica Scraper do?

- 🔍 Search Fragrantica by perfume name, brand, or note — each query resolved independently.
- 🔗 Scrape a single perfume page, or paste a designer, note, or perfumer URL to expand into every fragrance listed on it. Page type is auto-detected.
- 🧪 Extract main accords with strength scores, and top/middle/base note pyramids.
- ⭐ Collect community rating, rating count, and optional full-text user reviews per perfume.
- 🌍 Read results in 13 Fragrantica language editions (English, French, German, Spanish, Italian, Portuguese, Dutch, Polish, Russian, Japanese, Korean, Arabic, Turkish).
- ⏱️ Run on demand or on a recurring schedule with [Apify schedules](https://docs.apify.com/platform/schedules).
- 🔌 Access results through the [Apify API](https://docs.apify.com/api/v2), webhooks, and [Apify integrations](https://apify.com/integrations).

### What data can you extract from Fragrantica?

| Field | Description |
|-------|-------------|
| `name` | Perfume name |
| `brand` | Designer / brand name |
| `gender` | `for women`, `for men`, or `unisex` |
| `year` | Launch year, when Fragrantica lists one |
| `mainAccords` | Scent accords as `{name, strength}`, strength 0–100 |
| `notesTop` / `notesMiddle` / `notesBase` | Note pyramid (opening, heart, dry-down) |
| `perfumers` | Perfumer ("nose") credits |
| `ratingValue` / `ratingCount` | Community rating (0–5) and number of votes behind it |
| `reviewsCount` | Number of reviews returned by this actor for the perfume |
| `imageUrl` | Bottle image URL |

### How to scrape Fragrantica

1. Open [Fragrantica Scraper](https://apify.com/parsebird/fragrantica-scraper) on Apify.
2. Add one or more `searchQueries` (a perfume name, brand, or note), or paste Fragrantica URLs into `startUrls`.
3. Keep `maxResults` low (10–50) for a first test run, then scale up. Set it to `0` for unlimited.
4. Turn on `includeReviews` if you also want user reviews, and cap them with `maxReviewsPerPerfume`.
5. Pick a `language` edition if you want results in a locale other than English.
6. Run the actor and open the dataset.
7. Export results as JSON, CSV, Excel, or connect the dataset to your workflow through the [Apify API](https://docs.apify.com/api/v2).

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `searchQueries` | string\[] | No | — | Keywords to search — a perfume name, brand, or note. Each query runs independently |
| `startUrls` | string\[] | No | `[]` | Fragrantica perfume, designer, note, or perfumer URLs. Type is auto-detected; designer/note/perfumer pages expand into their listed perfumes |
| `maxResults` | integer | No | `100` | Maximum perfumes to return across all queries and URLs. `0` = unlimited |
| `includeReviews` | boolean | No | `false` | Also collect user reviews for each perfume, returned as separate `review` records |
| `maxReviewsPerPerfume` | integer | No | `20` | Maximum reviews per perfume when reviews are on. `0` = all available (up to ~200) |
| `language` | select | No | `en` | Fragrantica edition: English, French, German, Spanish, Italian, Portuguese, Dutch, Polish, Russian, Japanese, Korean, Arabic, or Turkish |
| `proxyConfiguration` | object | No | Apify Proxy enabled | Proxy settings for more reliable requests |

At least one of `searchQueries` or `startUrls` must be provided.

### Output example

```json
{
    "recordType": "perfume",
    "perfumeId": "9828",
    "name": "Aventus",
    "url": "https://www.fragrantica.com/perfume/Creed/Aventus-9828.html",
    "brand": "Creed",
    "brandUrl": "https://www.fragrantica.com/designers/Creed.html",
    "gender": "for men",
    "year": 2010,
    "imageUrl": "https://fimgs.net/mdimg/perfume-thumbs/375x500.9828.jpg",
    "ratingValue": 4.32,
    "ratingCount": 27918,
    "reviewsCount": 210,
    "mainAccords": [
        { "name": "fruity", "strength": 100 },
        { "name": "sweet", "strength": 55 },
        { "name": "woody", "strength": 54 }
    ],
    "notesTop": ["Bergamot", "Black Currant", "Apple", "Lemon", "Pink Pepper"],
    "notesMiddle": ["Pineapple", "Patchouli", "Moroccan Jasmine"],
    "notesBase": ["Birch", "Musk", "oak moss", "Cedarwood", "Ambroxan"],
    "perfumers": ["Erwin Creed", "Jean-Christophe Hérault"],
    "popularityScore": null,
    "language": "en"
}
```

Every row carries a `recordType` field (`perfume`, `designer`, or `review`) so you can filter cleanly downstream. Download results in JSON, CSV, Excel, HTML, XML, or RSS from the Apify dataset.

### Python API example

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

run = client.actor("parsebird/fragrantica-scraper").call(run_input={
    "searchQueries": ["Chanel No 5"],
    "maxResults": 25,
})

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

### JavaScript API example

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

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });

const run = await client.actor('parsebird/fragrantica-scraper').call({
  startUrls: ['https://www.fragrantica.com/designers/Tom-Ford.html'],
  maxResults: 100,
});

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

See Apify's official [Python client](https://docs.apify.com/api/client/python/) and [JavaScript client](https://docs.apify.com/api/client/js/) documentation for more options.

### Use cases

- Build or enrich a fragrance database with notes, accords, and ratings.
- Monitor a perfume house's full catalog by scraping its designer page.
- Research notes and accords for perfumery, retail merchandising, or content sites.
- Analyze user review sentiment and ratings for specific perfumes or brands.
- Feed Fragrantica data into spreadsheets, BI tools, databases, or automation workflows.

### How it works

1. The actor resolves `searchQueries` into candidate perfume pages and normalizes `startUrls`.
2. For designer, note, or perfumer URLs, it fetches the page and expands it into every perfume listed on it.
3. It deduplicates the resulting perfume URLs and applies `maxResults`.
4. It fetches each perfume page in the selected `language` edition and parses notes, accords, ratings, and metadata.
5. When `includeReviews` is on, it also parses reviews already rendered on the perfume page, up to `maxReviewsPerPerfume`.
6. It pushes each record to the default Apify dataset and charges one PPE event per item on the Apify platform.

### How much does it cost to scrape Fragrantica?

**What is the price per Fragrantica record?**

| Event | Free | Bronze, Silver, Gold |
|-------|------|-----------------------|
| `item-scraped` | $0.0012 per record (**$1.20 / 1,000**) | $0.0009 per record (**$0.90 / 1,000**) |

Each `item-scraped` event means one perfume, designer, or review record was extracted and pushed to the dataset. A run returning 1,000 records costs $1.20 on the Free plan, or $0.90 on Bronze, Silver, and Gold. Apify's free trial credits cover test runs at this rate.

### Is it legal to scrape Fragrantica?

**Is scraping Fragrantica legal?**

Scraping publicly available web data is generally allowed in many jurisdictions, but you should review Fragrantica's terms, avoid collecting private or sensitive information, and make sure your use case complies with applicable laws. For more background, read Apify's guide: [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/).

### Other Fragrantica scrapers / Related Actors

More ParseBird actors:

- [YouTube Search Scraper](https://apify.com/parsebird/youtube-search-scraper) — Extract structured YouTube search results.
- [Product Hunt Scraper](https://apify.com/parsebird/product-hunt-scraper) — Scrape product launches and maker data.
- [Pinterest Search Scraper](https://apify.com/parsebird/pinterest-search-scraper) — Extract structured Pinterest search result data.
- [Unsplash Image Scraper](https://apify.com/parsebird/unsplash-image-scraper) — Collect image search data from Unsplash.

### FAQ

**Can I use this as a Fragrantica scraper API?**

Yes. Start runs and fetch datasets through the Apify API, Python client, JavaScript client, webhooks, or integrations.

**Can I scrape an entire perfume house at once?**

Yes. Paste a designer URL (e.g. `https://www.fragrantica.com/designers/Tom-Ford.html`) into `startUrls` — it expands into every perfume Fragrantica lists for that house.

**How does `searchQueries` find perfumes?**

Fragrantica's own search box is a JavaScript-only widget with no public results endpoint, so this actor resolves each keyword to matching Fragrantica perfume pages and scrapes those directly. For a guaranteed exact match, paste the perfume's URL into `startUrls` instead.

**Why is `reviewsCount` sometimes lower than the total reviews shown on Fragrantica?**

`reviewsCount` reflects the reviews returned by this actor (Fragrantica renders up to roughly its 200 most recent reviews per perfume, per language edition), not necessarily the perfume's all-time review total.

**Why is `popularityScore` always `null`?**

Fragrantica doesn't expose a numeric popularity ranking on individual perfume pages, so this actor never fabricates one. The field is kept in the output for schema compatibility.

**Does this actor require a Fragrantica account or API key?**

No. It's designed for public Fragrantica pages and doesn't use any private API credentials.

**Where can I report issues or request fields?**

Open the Issues tab on the actor page and include your input example, run ID, and the fields you expected.

# Actor input Schema

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

Keywords to search on Fragrantica — a perfume name, brand, or note. Each query runs independently.

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

Fragrantica URLs to scrape. Supports a single perfume page, or a designer, note, or perfumer page (expands into every perfume listed on that page). Page type is auto-detected.

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

Maximum number of perfumes to return across all search queries and start URLs combined. Set to 0 for unlimited. Start with 10-50 to test, then scale up.

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

Also collect user reviews for each perfume. Each review is returned as its own result with recordType "review".

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

Maximum reviews to return per perfume when Include Reviews is on. Set to 0 for all available (up to ~200 most-recent). Ignored when Include Reviews is off.

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

Edition/locale for results. Perfume names, gender labels, notes, and descriptions are read from the matching Fragrantica language edition.

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

Use Apify Proxy for more reliable requests, especially for Search Queries.

## Actor input object example

```json
{
  "searchQueries": [
    "Chanel No 5"
  ],
  "startUrls": [
    "https://www.fragrantica.com/perfume/Chanel/Chanel-No-5-Parfum-28711.html"
  ],
  "maxResults": 25,
  "includeReviews": false,
  "maxReviewsPerPerfume": 20,
  "language": "en",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `dataset` (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": [
        "Chanel No 5"
    ],
    "startUrls": [
        "https://www.fragrantica.com/perfume/Chanel/Chanel-No-5-Parfum-28711.html"
    ],
    "maxResults": 25,
    "maxReviewsPerPerfume": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/fragrantica-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": ["Chanel No 5"],
    "startUrls": ["https://www.fragrantica.com/perfume/Chanel/Chanel-No-5-Parfum-28711.html"],
    "maxResults": 25,
    "maxReviewsPerPerfume": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/fragrantica-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": [
    "Chanel No 5"
  ],
  "startUrls": [
    "https://www.fragrantica.com/perfume/Chanel/Chanel-No-5-Parfum-28711.html"
  ],
  "maxResults": 25,
  "maxReviewsPerPerfume": 20
}' |
apify call parsebird/fragrantica-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parsebird/fragrantica-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/6OPRlHQmek5CDCUxq/builds/99THUOfr8t1ehU0wM/openapi.json
