# Fragrantica Scraper: Perfume Notes, Accords, Votes & Reviews (`epicscrapers/fragrantica-perfume-scraper`) Actor

Scrape Fragrantica perfumes by name, brand, note, perfumer or URL. Get the note pyramid with vote weights, accords, longevity, sillage, season and gender votes, similar perfumes, pros and cons, shop prices and ~500 reviews each. No 300-profile or 1,000-result cap. 23 languages.

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

## Pricing

from $0.60 / 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 Scraper: perfume notes, accords, community votes and reviews as clean data](https://api.apify.com/v2/key-value-stores/H9rrDk3gRooqLFgPH/records/hero.png)

### Fragrantica Scraper: perfume notes, accords, community votes and reviews

Fragrantica Scraper turns Fragrantica, the largest perfume encyclopedia (140,000+ fragrances), into a clean dataset. Search by name, filter by brand, note, perfumer, fragrance family, gender, launch year or rating, or paste any Fragrantica URL. Each perfume comes back as one JSON record. It holds the note pyramid with the community's vote weight for each note, the main accords, the perfumers, and every community vote: rating, longevity, sillage, price value, seasons, day or night, gender and ownership. You also get the "reminds me of" perfumes, the summarized pros and cons, shop prices, and up to about 500 reviews per perfume.

- **The complete profile.** Note pyramid with vote weights, accords with strength and color, perfumers, fragrance family, brand country and parent company, all vote breakdowns, similar perfumes with vote counts, pros and cons, shop offers, description, images, and links to all 23 language editions.
- **No 300-profile cap.** Fragrantica allows each visitor about 12 page loads a minute. Scrapers that load pages from one IP stop after a few hundred profiles. This one spreads its requests over many proxy IPs and keeps each IP under the limit. 100 full profiles take about 1.5 minutes, and a whole brand or note runs in one go.
- **No 1,000-result cap.** Fragrantica's search stops at 1,000 results. This Actor splits big result sets and keeps the sort order, so you can scrape an entire brand like Avon (1,385 perfumes), every perfume with oud, or the full catalogue.
- **~500 reviews per perfume.** Most scrapers return only the ~200 reviews on the perfume page. This one also collects the next 100 recent reviews and the 100 most popular positive and negative ones. Each comes with helpful votes and the reviewer's own longevity, sillage, season and gender votes.
- **Better filters than the website.** Combine required notes, excluded notes, fragrance families, perfumers, brand type (niche, designer, celebrity), brand country, gender, launch years, minimum rating and minimum votes. Sort by popularity, rating, longevity or sillage.
- **23 language editions.** Note names, accords, descriptions, pros and cons and reviews come in the edition you pick, from English and German to Arabic, Japanese and Chinese.
- **Pay per result.** No subscription, no Fragrantica account, no proxy setup. Export to JSON, CSV, Excel or Google Sheets, or call it from the API.

### What can you do with Fragrantica data?

| Goal | How |
| --- | --- |
| Build a perfume recommendation or "smells like" app | Use `mainAccords`, the note pyramid with `weight`, and `similarPerfumes` with their `votesYes` / `votesNo`. |
| Enrich a perfume shop's catalogue | Paste the Fragrantica URLs of your products, or search by name, and add notes, accords, longevity, sillage, seasons and descriptions to your product pages. |
| Find dupes and alternatives | Read each perfume's `similarPerfumes`: the "this perfume reminds me of" list that members vote on. |
| Track trends and launches | Filter by `yearFrom` and a note or fragrance family, schedule the run monthly, and compare `ratingCount`, `popularityScore` and `recentPopularityScore`. |
| Benchmark brands | Scrape a brand's whole line from its designer URL and compare ratings, longevity, price value and ownership (`have` / `had` / `want`) across products. |
| Sentiment and review analysis | Turn on reviews, pick positive or negative ones, and feed `reviewText` and `reviewerVotes` to your NLP pipeline or an LLM. |
| Train or ground an AI model | Export the full catalogue as structured JSON: a ready-made dataset of 140,000+ perfumes with notes, accords and votes. |

### How it compares

| What you need | This Actor | Typical Fragrantica scrapers |
| --- | --- | --- |
| Full profiles per run | No cap: 12 workers on separate IPs, ~70 per minute | ~300, then Fragrantica blocks the IP; ~15 per minute |
| Results per search, brand or note | All of them (large sets are split) | Up to 1,000 |
| Reviews per perfume | ~500 (recent, popular positive, popular negative) | ~200 |
| Note weights ("main notes according to your votes") | Yes, per note | Rarely |
| Filters | Notes (all of), excluded notes, families, perfumers, brands, brand type, brand country, gender, years, rating, votes | Fewer or none |
| Sort | Popularity, rating, longevity, sillage | Popularity only |
| Shop prices, brand country, parent company | Yes | Rarely |

### Quick start

1. Click **Try for free** and sign in to Apify.
2. Type a perfume name in **Search queries**, for example `Baccarat Rouge 540`, or paste a Fragrantica URL.
3. For a first run, keep **Max perfumes** at `20`.
4. Click **Start**. When the run finishes, open the **Output** tab and export the data.

```json
{
    "searchQueries": ["Baccarat Rouge 540"],
    "maxResults": 20
}
```

### Input

Use any mix of search queries, URLs and filters. Filters narrow the search queries and the designer, note and perfumer URLs. With no query or URL, the filters search the whole catalogue.

| Field | What it does |
| --- | --- |
| `searchQueries` | Perfume names, brands or collections, searched like on Fragrantica. Each query runs separately. |
| `startUrls` | Fragrantica URLs from any language edition. A perfume page returns that perfume. A designer, note or perfumer page returns all of its perfumes. A search page URL runs that search with its filters. |
| `maxResults` | Maximum number of perfumes in total (reviews don't count). `0` means no limit. |
| `sortBy` | `popularity`, `rating`, `longevity` or `sillage`. |
| `brands` | Only these brands. Spelling is matched to Fragrantica's: `maison francis` finds Maison Francis Kurkdjian. |
| `notes` / `excludedNotes` | Perfumes must contain all of `notes` and none of `excludedNotes`. |
| `fragranceFamilies` | Olfactory families such as `Chypre Floral`, `Woody Aromatic` or `Oriental Vanilla`. |
| `perfumers` | Only perfumes by these noses. |
| `gender` | `any`, `female`, `male` or `unisex`. |
| `brandType` | `niche`, `designer` (mainstream: not niche), `celebrity` or `natural`. |
| `brandCountries` | The brand's home country, such as `France` or `United Arab Emirates`. |
| `yearFrom` / `yearTo` | Launch year range. |
| `minRating` / `minVotes` | Minimum average rating (`3` to `4.5`) and minimum number of rating votes. |
| `scrapeDetails` | `true` (default): full profiles. `false`: fast, cheaper records from the search index only, thousands per minute. |
| `includeReviews` | Also save reviews as separate records. |
| `maxReviewsPerPerfume` | Reviews per perfume. `0` means all that visitors can see (~500). |
| `reviewTypes` | Any of `recent`, `positive`, `negative`, collected in that order until the maximum is reached. |
| `language` | Edition to read: `en`, `de`, `es`, `fr`, `it`, `nl`, `pl`, `pt`, `ro`, `cs`, `hu`, `sv`, `tr`, `el`, `ru`, `uk`, `sr`, `mn`, `he`, `ar`, `ja`, `zh`, `ko`. |
| `proxyConfiguration` | The default Apify datacenter proxy works. |

### Output

The dataset holds three record types, marked by `recordType`. Missing values are `null` or an empty list, never left out, so every record of a type has the same columns.

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

| Group | Fields |
| --- | --- |
| Identity | `perfumeId`, `url`, `language`, `name`, `brand`, `brandUrl`, `fullTitle`, `gender`, `genderLabel`, `year`, `collection`, `fragranceFamily`, `fragranceFamilyEnglish` |
| Brand | `brandCountry`, `brandParentCompany`, `nicheBrand` |
| Ratings and popularity | `ratingValue`, `ratingCount`, `ratingDistribution` (votes per star), `reviewsCount`, `reviewsCountInLanguage`, `reviewsByLanguage`, `popularityScore`, `recentPopularityScore`, `lastReviewAt` |
| Scent | `mainAccords` (`name`, `strength` 0–100, `color`), `notesTop`, `notesMiddle`, `notesBase`, `notesUnsorted` (each note: `name`, `ingredient`, `noteId`, `url`, `imageUrl`, `weight` 0–1, `voteScore`), `hasPyramid`, `allNotes`, `perfumers` (`name`, `url`, `imageUrl`) |
| Community votes | `longevity`, `sillage`, `priceValue` (each `votes`, `average`, `total`), `genderVotes`, `seasonVotes` (`winter`, `spring`, `summer`, `autumn`, `day`, `night`), `ownership` (`have`, `had`, `want`) |
| Opinions | `similarPerfumes` (`perfumeId`, `name`, `brand`, `gender`, `url`, `imageUrl`, `votesYes`, `votesNo`), `pros` and `cons` (`text`, `textEnglish`, `votesYes`, `votesNo`) |
| Shopping | `shopOffers` (`shop`, `itemCount`, `priceMin`, `priceMax`, `currency`) |
| Content | `descriptionHtml`, `descriptionText`, `descriptionMarkdown`, `imageUrl`, `imageUrlLarge`, `alternativeNames`, `languageUrls` |
| Run | `reviewsScraped`, `sourceMode`, `searchQuery`, `position`, `source`, `scrapedAt`, `contentHash` |

`contentHash` changes when the rating, votes, notes or accords change, so you can spot updated perfumes between scheduled runs.

```json
{
    "recordType": "perfume",
    "perfumeId": 31861,
    "url": "https://www.fragrantica.com/perfume/Dior/Sauvage-31861.html",
    "name": "Sauvage",
    "brand": "Dior",
    "brandCountry": "France",
    "brandParentCompany": "LVMH",
    "gender": "male",
    "year": 2015,
    "fragranceFamily": "Aromatic Fougere",
    "ratingValue": 3.8474,
    "ratingCount": 34752,
    "ratingDistribution": { "1": 1904, "2": 4640, "3": 3670, "4": 11179, "5": 13359 },
    "mainAccords": [
        { "name": "fresh spicy", "strength": 100, "color": "#83C928" },
        { "name": "amber", "strength": 70.84, "color": "#bc4d10" }
    ],
    "notesTop": [
        {
            "name": "Calabrian bergamot",
            "ingredient": "Bergamot",
            "noteId": 75,
            "url": "https://www.fragrantica.com/notes/Bergamot-75.html",
            "imageUrl": "https://fimgs.net/mdimg/sastojci/t.75.jpg",
            "weight": 0.804,
            "voteScore": 4135
        }
    ],
    "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" }],
    "longevity": { "votes": { "veryWeak": 535, "weak": 945, "moderate": 6754, "longLasting": 10589, "eternal": 1821 }, "average": 3.5917, "total": 20644 },
    "sillage": { "votes": { "intimate": 1341, "moderate": 8380, "strong": 9031, "enormous": 1753 }, "average": 2.546, "total": 20505 },
    "seasonVotes": { "winter": 10399, "spring": 15355, "summer": 14300, "autumn": 14209, "day": 15205, "night": 13871 },
    "ownership": { "have": 56013, "had": 19728, "want": 13463 },
    "similarPerfumes": [
        { "perfumeId": 43402, "name": "Luna Rossa Carbon Eau de Toilette", "brand": "Prada", "votesYes": 2207, "votesNo": 507 }
    ],
    "pros": [{ "text": "Good projection", "textEnglish": "Good projection", "votesYes": 1698, "votesNo": 109 }],
    "cons": [{ "text": "In-your-face aroma chemicals", "textEnglish": "In-your-face aroma chemicals", "votesYes": 1222, "votesNo": 500 }]
}
```

#### Review (`recordType: "review"`)

`reviewId`, `perfumeId`, `perfumeName`, `brand`, `perfumeUrl`, `url`, `language`, `reviewCategory` (`recent`, `popularPositive`, `popularNegative`), `translatedFrom` and `originalReviewUrl` (smaller editions also show reviews machine-translated from other editions; `null` for reviews written in the edition's language), `authorName`, `authorUrl`, `authorAvatarUrl`, `datePublished`, `publishedAt`, `reviewText`, `reviewHtml`, `votesYes`, `votesNo`, `reviewerVotes` (`rating`, `longevity`, `sillage`, `priceValue`, `gender`, `ownership`, `seasons`), `reviewerSignaturePerfume`, `scrapedAt`.

`votesYes` and `votesNo` (helpful votes) are filled for reviews beyond the first page; Fragrantica's page doesn't show them for the first ~210.

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

`perfumeId`, `url`, `slug`, `name`, `brand`, `year`, `gender`, `collection`, `ratingValue`, `ratingCount`, `reviewsCount`, `reviewsCountInLanguage`, `reviewsByLanguage`, `popularityScore`, `recentPopularityScore`, `compoundPopularityScore`, `lastReviewAt`, `alternativeNames`, `imageUrl`, `imageUrlLarge`, `thumbnailUrl`, `language`, `sourceMode`, `searchQuery`, `position`, `source`, `scrapedAt`.

### Examples

**Top-rated niche oud perfumes from recent years, without vanilla:**

```json
{
    "notes": ["Oud"],
    "excludedNotes": ["Vanilla"],
    "brandType": "niche",
    "yearFrom": 2020,
    "minRating": "4",
    "minVotes": 100,
    "sortBy": "rating",
    "maxResults": 100
}
```

**A brand's whole line and a perfumer's work, from URLs:**

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

**Negative reviews of best sellers, for sentiment analysis:**

```json
{
    "searchQueries": ["Sauvage Dior", "Aventus Creed"],
    "maxResults": 2,
    "includeReviews": true,
    "reviewTypes": ["negative"],
    "maxReviewsPerPerfume": 0
}
```

**Every perfume with at least one rating, as a fast feed in German:**

```json
{
    "minVotes": 1,
    "scrapeDetails": false,
    "language": "de",
    "maxResults": 0
}
```

### Pricing

You pay only for the records saved. Platform usage and proxy are included.

| Record | Price per 1,000 |
| --- | --- |
| Perfume profile | $0.70 (down to $0.60 on higher Apify plans) |
| Review | $0.30 (down to $0.25) |
| Listing (search index only) | $0.20 (down to $0.15) |

100 full profiles cost about $0.07, and 10,000 cost about $7. Set **Max perfumes** and **Max reviews per perfume**, or a spending limit on the run, to control the cost exactly.

### Performance

Measured on Apify on 25 October 2026 with the default settings:

| Run | Time |
| --- | --- |
| 100 full profiles | about 1.5 minutes |
| 300 full profiles with up to 50 reviews each (9,053 reviews) | about 6 minutes |
| 1 perfume with all reviews (496) | under 1.5 minutes |
| 1,385 listings (a whole brand, search index only) | about 20 seconds |
| 16,000 listings (search index only) | about 2 minutes |

Reviews add a few requests per perfume when more than ~200 are wanted, so runs with many reviews per perfume take longer.

### Known limitations

- Pros and cons exist only for perfumes Fragrantica has summarized, mostly on the English edition.
- Shop offers are the ones Fragrantica shows to US visitors, in USD.
- Fragrantica shows visitors at most ~300 recent reviews and ~100 most popular positive and negative ones per perfume and edition; older reviews need a login and are not collected.
- Sorting by longevity or sillage keeps Fragrantica's order for the first 1,000 results; beyond that, results come in batches.
- Filters other than `brands`, `notes`, `perfumers` and `fragranceFamilies` use English values (`France`, not `Frankreich`).

### For AI agents

Call `epicscrapers/fragrantica-perfume-scraper` with a minimal input:

```json
{ "searchQueries": ["Baccarat Rouge 540"], "maxResults": 5 }
```

Each perfume is one item with `recordType: "perfume"`. The key fields are `name`, `brand`, `year`, `gender`, `ratingValue`, `ratingCount`, `mainAccords[].name`, `notesTop` / `notesMiddle` / `notesBase` / `notesUnsorted` (`name`, `weight`), `perfumers[].name`, `longevity.average` (1–5), `sillage.average` (1–4), `seasonVotes`, `similarPerfumes[].name`, `pros[].text`, `cons[].text` and `url`. Add `"includeReviews": true` for review items (`recordType: "review"`, `reviewText`, `reviewerVotes`). Use `"scrapeDetails": false` for fast lists of names, ratings and popularity.

### FAQ

**Do I need a Fragrantica account or API key?** No. The Actor reads what Fragrantica shows to any visitor.

**Can I scrape a perfume in another language?** Yes. Set `language`, and paste URLs from any edition. Notes, accords, descriptions and reviews come in the chosen language; IDs are the same in all editions.

**How do I keep my data up to date?** Schedule the run (daily, weekly or monthly) in Apify and compare `contentHash` or `ratingCount` between runs.

**Is it legal to scrape Fragrantica?** The Actor collects publicly visible data. Reviews contain usernames, which are personal data in some jurisdictions; make sure your use complies with the laws that apply to you and with Fragrantica's terms.

Something not working, or a field you need? Open an issue on the **Issues** tab and it will be looked at quickly.

# Actor input Schema

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

Perfume names, brands or collections to search for, like on Fragrantica's search page. Each query runs separately. Leave empty to scrape by URL or by filters only.

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

Paste Fragrantica pages from any language edition. A perfume page returns that perfume. A designer, note or perfumer page returns every perfume listed under it (no 1,000-result cap). A search page URL runs that search with its filters.

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

Maximum number of perfumes across all queries, URLs and filters. Reviews don't count toward it. Set 0 for no limit: a whole brand, note or even the full catalogue of 140,000+ perfumes.

## `sortBy` (type: `string`):

Order of search and filter results, as on Fragrantica's search page. Matters when Max perfumes is lower than the number of matches.

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

Only perfumes from any of these brands (designers). Spelling is matched to Fragrantica's, e.g. "mfk" won't work but "maison francis" finds Maison Francis Kurkdjian.

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

Only perfumes that list every one of these notes, e.g. \["Oud", "Rose"]. English names, or names in the chosen language.

## `excludedNotes` (type: `array`):

Skip perfumes that list any of these notes, e.g. \["Vanilla"].

## `fragranceFamilies` (type: `array`):

Only perfumes in any of these olfactory families, e.g. \["Chypre Floral", "Woody Aromatic", "Oriental Vanilla"].

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

Only perfumes created by any of these perfumers, e.g. \["Alberto Morillas"].

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

Only perfumes Fragrantica lists for this gender.

## `brandType` (type: `string`):

Niche houses, mainstream designer houses (everything that isn't niche), celebrity brands or natural perfumery.

## `brandCountries` (type: `array`):

Only perfumes from brands based in any of these countries, e.g. \["France", "United Arab Emirates"].

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

Only perfumes launched in or after this year. Leave empty for no limit.

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

Only perfumes launched in or before this year. Leave empty for no limit.

## `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. Skips obscure entries whose rating rests on a handful of votes.

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

On: every perfume is opened for the full profile (notes with vote weights, accords, perfumers, all community votes, similar perfumes, pros and cons, shop prices, description). Off: fast, cheaper listing records from Fragrantica's search index (name, brand, year, gender, rating, review counts, popularity), thousands per minute.

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

Also save member reviews of each perfume as separate records (recordType "review"), with each reviewer's own votes. Needs full profiles.

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

Maximum reviews saved per perfume. Set 0 for all that Fragrantica shows to visitors: up to ~300 recent plus ~100 most popular positive and ~100 most popular negative.

## `reviewTypes` (type: `array`):

Which reviews to collect, in this order until the per-perfume maximum is reached: newest first, the most popular positive ones, the most popular negative ones.

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

Fragrantica edition to read. Note and accord names, gender labels, descriptions, pros and cons and reviews come in this language; each edition has its own reviews.

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

The default Apify datacenter proxy works and is the cheapest. Each worker uses its own IP and keeps to Fragrantica's per-IP rate limit, so runs are not capped at a few hundred profiles.

## Actor input object example

```json
{
  "searchQueries": [
    "Sauvage"
  ],
  "maxResults": 20,
  "sortBy": "popularity",
  "gender": "any",
  "brandType": "any",
  "minRating": "any",
  "scrapeDetails": true,
  "includeReviews": false,
  "maxReviewsPerPerfume": 20,
  "reviewTypes": [
    "recent",
    "positive",
    "negative"
  ],
  "language": "en",
  "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"
    ],
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("epicscrapers/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"],
    "maxResults": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("epicscrapers/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"
  ],
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call epicscrapers/fragrantica-perfume-scraper --silent --output-dataset

```

## MCP server setup

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