Fragrantica APIfragrantica.es ↗
Retrieve perfume names, brands, fragrance notes, accords with strength percentages, ratings, and vote counts from Fragrantica Spain pages.
What is the Fragrantica API?
The Fragrantica.es API exposes 6 structured response fields per perfume through a single endpoint, get_perfume_details, covering brand, rating, vote count, main accords with relative strength percentages, and fragrance notes organized by pyramid level. Pass any fragrantica.es perfume page URL to retrieve machine-readable data that would otherwise require manual browsing across multiple page sections.
curl -X GET 'https://api.parse.bot/scraper/342ff16e-4c05-413b-a83e-ce1b08ce816e/get_perfume_details?perfume_url=https%3A%2F%2Fwww.fragrantica.es%2Fperfume%2FLattafa-Perfumes%2FKhamrah-Qahwa-88175.html' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace fragrantica-es-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: Fragrantica ES — fetch perfume details and explore accords & notes."""
from parse_apis.fragrantica_es_api import Fragrantica, PerfumeNotFound
client = Fragrantica()
# Fetch a perfume by its fragrantica.es page URL.
try:
perfume = client.perfumes.get(
url="https://www.fragrantica.es/perfume/Lattafa-Perfumes/Khamrah-Qahwa-88175.html"
)
except PerfumeNotFound:
print("Perfume page not found")
raise SystemExit
print(f"{perfume.name} by {perfume.brand}")
print(f"Rating: {perfume.rating}/5 ({perfume.votes} votes)")
# Walk the main accords with their relative strengths.
for accord in perfume.accords:
print(f" {accord.name}: {accord.percentage}%")
# Explore the fragrance pyramid: top, heart, and base notes.
print("Top notes:", ", ".join(perfume.notes.top))
print("Heart notes:", ", ".join(perfume.notes.heart))
print("Base notes:", ", ".join(perfume.notes.base))
print("exercised: perfumes.get")
Retrieve detailed information about a specific perfume from its fragrantica.es page URL. Returns the perfume name, brand, main accords with relative strength percentages, overall rating (out of 5), total vote count, and fragrance notes organized by pyramid level (top/heart/base). One HTTP round-trip per call. When the URL points to a nonexistent perfume, the endpoint returns stale_input with kind input_not_found.
| Param | Type | Description |
|---|---|---|
| perfume_urlrequired | string | Full URL of a perfume page on fragrantica.es, e.g. https://www.fragrantica.es/perfume/Dior/Sauvage-Eau-de-Toilette-31861.html |
{
"type": "object",
"fields": {
"marca": "Brand / designer name",
"notas": "Object with three arrays: salida (top notes), corazon (heart notes), base (base notes)",
"votos": "Total number of user votes (integer), or null if not available",
"nombre": "Perfume name without the brand suffix",
"acordes": "Array of main accords, each with nombre (string) and porcentaje (number 0-100 indicating relative strength)",
"calificacion": "Overall rating out of 5 (float), or null if not available"
},
"sample": {
"data": {
"marca": "Lattafa Perfumes",
"notas": {
"base": [
"vainilla",
"café",
"haba tonka",
"benjuí",
"almizcle"
],
"salida": [
"canela",
"cardamomo",
"jengibre"
],
"corazon": [
"praliné",
"Frutas confitadas",
"flores blancas"
]
},
"votos": 15684,
"nombre": "Khamrah Qahwa",
"acordes": [
{
"nombre": "cálido especiado",
"porcentaje": 100
},
{
"nombre": "dulce",
"porcentaje": 87.5
},
{
"nombre": "avainillado",
"porcentaje": 81.3
},
{
"nombre": "canela",
"porcentaje": 64.1
},
{
"nombre": "café",
"porcentaje": 60.5
},
{
"nombre": "ámbar",
"porcentaje": 51.8
},
{
"nombre": "atalcado",
"porcentaje": 44.9
}
],
"calificacion": 4.34
},
"status": "success"
}
}About the Fragrantica API
What the API Returns
The get_perfume_details endpoint accepts a single required parameter, perfume_url, which must be a full URL pointing to a perfume page on fragrantica.es (for example, https://www.fragrantica.es/perfume/Lattafa-Perfumes/Khamrah-Qahwa-88175.html). The response includes nombre (perfume name without the brand suffix) and marca (brand or designer name), giving you a clean, split representation of the product identity.
Accords and Ratings
The acordes array lists the main accords attributed to a fragrance, each with a nombre string and a porcentaje value between 0 and 100 representing relative accord strength as shown on the Fragrantica page. The calificacion field returns the community rating as a float out of 5, and votos returns the total number of user votes as an integer. Both fields return null when the data is unavailable for a given perfume.
Fragrance Notes by Pyramid Level
The notas object organizes fragrance notes into three arrays: salida (top notes), corazon (heart notes), and base (base notes). Each array contains the note names as strings. This structure maps directly to the standard fragrance pyramid and makes it straightforward to query, filter, or compare notes across multiple perfumes programmatically.
The Fragrantica API is a managed, monitored endpoint for fragrantica.es — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when fragrantica.es changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official fragrantica.es API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a fragrance recommendation engine that matches perfumes by shared base or heart notes from the
notasfield. - Aggregate accord profiles across hundreds of perfumes to identify which
acordesdominate a particular brand's catalog. - Compare community
calificacionscores andvotoscounts to surface highly-rated but underexposed fragrances. - Populate a perfume database with structured pyramid note data (
salida,corazon,base) for search and filtering. - Track accord strength percentages (
porcentaje) across a brand's product line to analyze house style trends. - Feed structured perfume metadata into a shopping assistant or chatbot that answers questions about note profiles.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Fragrantica offer an official developer API?+
What does `acordes` actually contain, and how should I interpret `porcentaje`?+
acordes array contains one object per main accord listed on the perfume's Fragrantica.es page. Each object has a nombre string (e.g., "amaderado", "especiado") and a porcentaje number from 0 to 100. The percentage reflects relative strength compared to the other accords on that page — it is not a global score and should be interpreted within the context of a single perfume's accord breakdown.Are user reviews or individual review text available from the endpoint?+
get_perfume_details endpoint returns aggregate data: rating (calificacion), vote count (votos), accords, and notes. Individual review text, reviewer usernames, and review dates are not part of the response. You can fork this API on Parse and revise it to add a reviews endpoint targeting that section of the perfume page.Does the API cover all fragrantica.es perfume pages, or only certain brands?+
perfume_url from fragrantica.es — there is no brand or category restriction built into the API. Coverage depends on whether the target page exists and has the expected data fields populated. Pages for very new or minimally-documented fragrances may return null for calificacion and votos if community data has not accumulated.