
TikTok Shop Scraper
scrape.ly/store/shelfbright/tiktok-shop-scraperE-commerceSocial media
1 monthly user

Scrape perfumes from Fragrantica.com by search term, brand, perfumer, note or perfume URL. Get notes pyramid, main accords, ratings, longevity, sillage, season and gender votes, pros and cons, similar perfumes, perfumers, images and reviews.
Turn Fragrantica.com, the largest perfume encyclopedia, into clean data. Search by name, brand, perfumer or note, or paste perfume URLs, and get each perfume's notes pyramid, main accords, rating, longevity, sillage, season, gender and price-value votes, pros and cons, similar perfumes, perfumers, images and reviews. No login, no browser, a few seconds for the first results.
| Field | What it does |
|---|---|
startUrls | Perfume, search, brand (/designers/), perfumer (/noses/) or note (/notes/) URLs. Filters in search URLs are kept. |
searchQueries | Search terms, one per line, as in the site's search box. |
brands | Brand names. Alone: every perfume of the brands. With search terms: only matches from those brands. |
maxItems | Maximum perfumes to save (0 = no limit). |
includeDetails | On (default): full perfume pages. Off: fast list from the site's search. |
maxReviewsPerPerfume | Reviews saved with each perfume (default 20, 0 = none). |
gender, yearFrom, yearTo, minRating, minRatingCount | Filters for searches, brands, perfumers and notes. |
sortBy | Most popular, highest rated, longest lasting or strongest projection. |
omitFields | Output fields to leave out, e.g. reviews, images. |
proxyConfiguration | Datacenter proxy by default; switches to residential by itself if refused. |
{
"startUrls": [{ "url": "https://www.fragrantica.com/perfume/Dior/Sauvage-31861.html" }],
"searchQueries": ["Avon"],
"maxItems": 10,
"maxReviewsPerPerfume": 20,
"gender": "any",
"sortBy": "popular"
}
One row per perfume. The main fields:
| Field | Description |
|---|---|
id, url, title, name | Fragrantica id, page link, page title and perfume name |
brandName, brandUrl, brandLogo, collection | Brand and collection |
year, gender | Launch year; female, male or unisex |
description | The perfume's description text |
primaryImageUrl, thumbnailUrl, images | Bottle picture and gallery images |
mainAccords | Accords with strength (value, 0–100), hex/rgb colour and colour name |
pyramid | Top, middle and base notes (or allNotes for perfumes without a pyramid), each with name, image and link |
perfumers, perfumerDetails | Perfumer names, links and photos |
perfumeRating, bestRating, ratingCount, reviewCount | Rating out of 5, number of ratings and reviews |
longevity…, sillage…, priceValue…, rating… | Vote breakdown (…Breakout), …Average, …Sum, …Max |
seasonBreakout, genderBreakout, relationBreakout | Season and day/night votes, gender votes, have/had/want counts |
pros, cons | Community pros and cons with like and dislike votes |
thisPerfumeRemindsMeOf, peopleWhoLikeThisAlsoLike | Similar perfumes with links and images |
reviews | Reviewer, date, text, profile link and the reviewer's own votes |
popularity, recentPopularity, scrapedAt | Fragrantica popularity scores and the scrape time |
A real result, shortened (lists cut to 1–3 entries; the review is a made-up example):
{
"id": "31861",
"url": "https://www.fragrantica.com/perfume/Dior/Sauvage-31861.html",
"title": "Sauvage Dior cologne - a fragrance for men 2015",
"name": "Sauvage",
"brandName": "Dior",
"year": 2015,
"gender": "male",
"collection": "Sauvage Collection",
"primaryImageUrl": "https://fimgs.net/mdimg/perfume-thumbs/375x500.31861.jpg",
"mainAccords": [
{ "accord": "fresh spicy", "value": 100, "hex": "#83c928", "rgb": "rgb(131, 201, 40)", "color": "Atlantis" },
{ "accord": "amber", "value": 70.84, "hex": "#bc4d10", "rgb": "rgb(188, 77, 16)", "color": "Tia Maria" }
],
"pyramid": {
"type": "full",
"topNotes": [{ "name": "Calabrian bergamot", "img": "https://fimgs.net/mdimg/sastojci/t.75.jpg", "url": "https://www.fragrantica.com/notes/Bergamot-75.html" }],
"middleNotes": [{ "name": "Sichuan Pepper", "img": "https://fimgs.net/mdimg/sastojci/t.213.jpg", "url": "https://www.fragrantica.com/notes/Sichuan-Pepper-213.html" }],
"baseNotes": [{ "name": "Ambroxan", "img": "https://fimgs.net/mdimg/sastojci/t.563.jpg", "url": "https://www.fragrantica.com/notes/Ambroxan-563.html" }]
},
"perfumers": ["François Demachy"],
"perfumeRating": 3.85,
"ratingCount": 34696,
"reviewCount": 4241,
"longevityBreakout": [{ "very weak": 535 }, { "weak": 944 }, { "moderate": 6749 }, { "long lasting": 10580 }, { "eternal": 1821 }],
"longevityAverage": 3.5918,
"sillageAverage": 2.546,
"priceValueAverage": 2.7342,
"seasonBreakout": { "winter": 10383, "spring": 15327, "summer": 14276, "autumn": 14181, "day": 15177, "night": 13847 },
"genderBreakout": { "female": 152, "femaleUnisex": 39, "unisex": 577, "male": 13573, "maleUnisex": 2714 },
"relationBreakout": { "have": 55895, "had": 19684, "want": 13447 },
"pros": [{ "label": "Good projection", "like": 1697, "dislike": 109, "score": 3285, "userVote": 0 }],
"cons": [{ "label": "In-your-face aroma chemicals", "like": 1217, "dislike": 500, "score": 1934, "userVote": 0 }],
"thisPerfumeRemindsMeOf": [
{ "id": 43402, "title": "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", "image": "https://fimgs.net/mdimg/perfume/s.43402.jpg", "votesYes": 2207, "votesNo": 506 }
],
"peopleWhoLikeThisAlsoLike": [
{ "url": "https://www.fragrantica.com/perfume/Chanel/Bleu-de-Chanel-9099.html", "brand": "Chanel", "title": "Bleu de Chanel", "image": "https://fimgs.net/mdimg/perfume-thumbs/s.9099.jpg" }
],
"reviews": [
{
"id": "3249001",
"name": "scentlover_jane",
"authorUrl": "https://www.fragrantica.com/@scentlover_jane",
"published": "2026-10-21",
"comment": "Fresh and peppery at first, then a smooth ambery dry-down. Lasts all day on me.",
"votes": { "rating": 5, "winter": 0, "spring": 1, "summer": 1, "autumn": 1, "day": 1, "night": 0, "longevity": 4, "sillage": 3, "gender": "male", "relation": "have" }
}
],
"scrapedAt": "2026-10-21T18:56:01.653Z"
}
With Include full perfume details off, each row has id, url, name, brandName, brandUrl, year, gender, collection, perfumeRating, ratingCount, reviewCount, primaryImageUrl, thumbnailUrl, popularity, recentPopularity and scrapedAt.
Pay per result:
Example: 1,000 perfumes with full details cost $10.00, plus platform usage (compute and datacenter proxy traffic), which was about $0.12 per 1,000 perfumes in our tests. There is no start fee. Set a maximum charge per run to stay in control; the run stops cleanly when it is reached.
Is it legal to scrape Fragrantica? The actor reads public pages that anyone can open without an account. Check Fragrantica's terms and the data-protection rules that apply to you, especially before republishing reviews or reviewer names.
Do I need a Fragrantica account or a proxy? No account or login. The default datacenter proxy works; if the site ever refuses those addresses, the run switches to residential proxy by itself.
How many perfumes can I get? As many as match. Fragrantica's search returns at most 1,000 perfumes per query, so larger searches (a big brand, or every perfume launched in a year) are split automatically into smaller ones by year, gender, rating, country and brand.
How many reviews per perfume? Up to what Fragrantica shows logged-out visitors: about 200 to 300 reviews per perfume (newest and most helpful). Set Max reviews per perfume to 0 to skip reviews and keep rows small.
Why is a field empty? Fragrantica has no value for it: new or obscure perfumes often have no perfumers, pros and cons, collection or votes yet.
Can I schedule it or use it from my code? Yes. Schedule runs in the console, or start them through the API and read the dataset as JSON, CSV or Excel.
Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
startUrlsarrayOptionalFragrantica URLs
Pages copied from your browser: perfumes (https://www.fragrantica.com/perfume/Dior/Sauvage-31861.html), searches (https://www.fragrantica.com/search/?query=rose&spol=female, filters in the URL are kept), brands (https://www.fragrantica.com/designers/Chanel.html), perfumers (https://www.fragrantica.com/noses/Alberto_Morillas.html) or notes (https://www.fragrantica.com/notes/Rose-1.html). Other Fragrantica language sites work too; perfumes are read from the English site.
searchQueriesarrayOptionalSearch terms
Perfume names, brands or keywords, one per line, e.g. Avon, Baccarat Rouge, oud vanilla. Each term is a separate search, as in the site's own search.
brandsarrayOptionalBrands
Brand names, e.g. Chanel, Maison Francis Kurkdjian, Lattafa Perfumes. Alone, every perfume of these brands is scraped; with search terms, only matching perfumes of these brands are kept.
maxItemsintegerOptionaldefault 10Max perfumes
Maximum number of perfumes to save across all inputs. 0 means no limit. Fragrantica's search returns at most 1,000 perfumes per query; larger searches are split automatically (by year, gender, rating, country, brand).
includeDetailsbooleanOptionaldefault trueInclude full perfume details
Open each perfume page for notes pyramid, main accords, description, perfumers, longevity, sillage, season, gender and price-value votes, pros and cons, similar perfumes, images and reviews. Turn off for a fast, cheap list with name, brand, year, gender, rating, votes, review count and image only.
maxReviewsPerPerfumeintegerOptionaldefault 20Max reviews per perfume
Reviews saved with each perfume (newest and most helpful first). 0 skips reviews. Fragrantica shows logged-out visitors up to about 200 to 300 reviews per perfume, so higher values return all of those.
Filters apply to search terms, brands, and search, brand, perfumer and note URLs. Perfume URLs are always scraped.
genderenumOptionaldefault "any"Gender
Keep only perfumes for women, for men, or unisex.
yearFromintegerOptionalLaunched from (year)
Keep only perfumes launched in this year or later, e.g. 2020.
yearTointegerOptionalLaunched until (year)
Keep only perfumes launched in this year or earlier, e.g. 2024.
minRatingstringOptionalMinimum rating
Keep only perfumes rated at least this much out of 5, e.g. 4 or 4.2.
minRatingCountintegerOptionalMinimum number of ratings
Keep only perfumes with at least this many ratings, e.g. 100. Useful to skip obscure perfumes.
sortByenumOptionaldefault "popular"Sort by
Order of search results, as in the site's search. Very large searches (over 1,000 matches) are split into groups, so the order holds within each group.
omitFieldsarrayOptionalLeave out fields
Output field names to leave out of each perfume, e.g. reviews, images, peopleWhoLikeThisAlsoLike. Unknown names are ignored.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy
Datacenter proxy works for Fragrantica. The run switches to residential proxy by itself if the site refuses datacenter addresses.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| id | string | null | |
| url | string | null | |
| title | string | null | |
| name | string | null | |
| brandName | string | null | |
| brandUrl | string | null | |
| brandLogo | string | null | |
| gender | string | null | |
| collection | string | null | |
| description | string | null | |
| primaryImageUrl | string | null | |
| thumbnailUrl | string | null | |
| scrapedAt | string | null | |
| year | number | null | |
| perfumeRating | number | null | |
| bestRating | number | null | |
| ratingCount | number | null | |
| reviewCount | number | null | |
| longevityAverage | number | null | |
| longevitySum | number | null | |
| longevityMax | number | null | |
| sillageAverage | number | null | |
| sillageSum | number | null | |
| sillageMax | number | null | |
| priceValueAverage | number | null | |
| priceValueSum | number | null | |
| priceValueMax | number | null | |
| ratingAverage | number | null | |
| ratingSum | number | null | |
| ratingMax | number | null | |
| genderSum | number | null | |
| genderMax | number | null | |
| relationSum | number | null | |
| relationMax | number | null | |
| popularity | number | null | |
| recentPopularity | number | null | |
| images | array | null | |
| mainAccords | array | null | |
| perfumers | array | null | |
| perfumerDetails | array | null | |
| longevityBreakout | array | null | |
| sillageBreakout | array | null | |
| priceValueBreakout | array | null | |
| ratingBreakout | array | null | |
| pros | array | null | |
| cons | array | null | |
| thisPerfumeRemindsMeOf | array | null | |
| peopleWhoLikeThisAlsoLike | array | null | |
| reviews | array | null | |
| pyramid | object | null | |
| seasonBreakout | object | null | |
| genderBreakout | object | null | |
| relationBreakout | object | null |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Perfume | One saved perfume with full details (notes, accords, votes, similar perfumes, reviews included). | $0.01 |
| Perfume (list mode) | One saved perfume from the search list when full details are turned off. | $0.0015 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('shelfbright/fragrantica-scraper').call({
"startUrls": [
{
"url": "https://www.fragrantica.com/perfume/Dior/Sauvage-31861.html"
}
],
"searchQueries": [
"Avon"
],
"maxItems": 10,
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"DATACENTER"
]
}
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run shelfbright/fragrantica-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=shelfbright/fragrantica-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
Inputs the developer prepared for common jobs. Open one to see its input, then copy it to your account to run it as-is or adjust it.
Paste a Fragrantica search URL (oud, for men): 10 perfumes with notes, accords, votes and 5 reviews each.
Creed Aventus, Chanel No 5 and Le Labo Santal 33 (also from the German and Russian sites) with full details and 30 reviews each.
20 Chanel perfumes from the search index without opening each page: name, year, gender, rating, votes, review count and image.
Paste brand, perfumer and note pages: Maison Francis Kurkdjian, Alberto Morillas and rose perfumes with full details.
Vanilla perfumes for women launched 2018 to 2024, rated 4+ with at least 100 ratings, best rated first.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.