10ML Perfume Finder · for developers
Perfume recommendation API and similar perfume API
10ML's perfume recommendation API is a set of free GET routes with no API key. /similar ranks perfumes by shared notes and accords and can steer them fresher, sweeter or darker. /alternatives returns alternatives from other houses. Picks from a person's taste come from the recommend_perfumes tool on the MCP endpoint.
Similar perfume API
https://mcp.10ml.com/api/v1/similarJSON over GET, OpenAPI 3.1. Free, no API key.
Similar perfume API
GET /api/v1/similar?perfume= takes the name of a perfume in the index and returns the perfumes closest to it. Each result says which notes and accords it shares and how close it is: very close, similar vibe or same spirit. Two results of fourteen are shown, trimmed, from 21 October 2026.
curl "https://mcp.10ml.com/api/v1/similar?perfume=Creed+Aventus&limit=2"{
"results": [
{
"perfume": {
"name": "Club de Nuit Intense Man Parfum",
"house": "Armaf",
"family": "Fruity woody"
},
"closeness": "very close",
"shared_notes": ["pineapple", "bergamot", "apple", "black currant", "birch", "jasmine"],
"shared_accords": ["fruity", "woody", "smoky", "fresh"],
"why": "shares pineapple, bergamot, apple, black currant"
},
{
"perfume": {
"name": "Club de Nuit Intense Man EDT",
"house": "Armaf",
"family": "Fruity woody"
},
"closeness": "similar vibe",
"shared_notes": ["pineapple", "bergamot", "apple", "black currant", "birch", "jasmine"],
"shared_accords": ["fruity", "woody", "smoky", "musky"],
"why": "shares pineapple, bergamot, apple, black currant"
}
],
"total": 14,
"source": "10ML Fragrance Index"
}Pass house= when a name is ambiguous, gender= to keep men’s, women’s or unisex perfumes, other_houses_only=true to leave out the starting perfume’s own house, and limit= and cursor= to page.
Steer the result
steer= moves the result away from the starting perfume in one direction: fresher, sweeter, darker, lighter, longer_lasting or more_projection. The last two need a perfume that is in the index. The reason in each result names the direction.
curl "https://mcp.10ml.com/api/v1/similar?perfume=Creed+Aventus&steer=fresher&limit=2"{
"target": {
"name": "Aventus",
"house": "Creed"
},
"results": [
{
"perfume": {
"name": "Club de Nuit Intense Man EDT",
"house": "Armaf",
"gender": "men",
"family": "Fruity woody",
"accords": ["citrus", "fruity", "smoky"]
},
"closeness": "very close",
"shared_notes": ["pineapple", "bergamot", "apple", "black currant", "birch", "jasmine"],
"why": "shares pineapple, bergamot, apple, black currant; fresher than the starting point"
},
{
"perfume": {
"name": "Club de Nuit Intense Man Parfum",
"house": "Armaf",
"gender": "men",
"family": "Fruity woody",
"accords": ["fruity", "smoky", "woody"]
},
"closeness": "very close",
"shared_notes": ["pineapple", "bergamot", "apple", "black currant", "birch", "jasmine"],
"why": "shares pineapple, bergamot, apple, black currant; fresher than the starting point"
}
],
"total": 1989,
"source": "10ML Fragrance Index"
}Similar perfumes from notes alone
For a perfume that is not in the index, pass its notes= and accords= instead of a name. The result ranks the index against that list.
curl "https://mcp.10ml.com/api/v1/similar?notes=vanilla,saffron&limit=2"{
"target": {
"name": "your notes",
"notes": ["vanilla", "saffron"]
},
"results": [
{
"perfume": {
"name": "Vanille & Ambre",
"house": "Berdoues",
"gender": "unisex",
"family": "Vanilla amber",
"accords": ["vanilla", "amber", "sweet"]
},
"closeness": "very close",
"shared_notes": ["vanilla", "saffron"],
"why": "shares vanilla, saffron"
},
{
"perfume": {
"name": "Liquid Brun",
"house": "French Avenue",
"gender": "unisex",
"family": "Gourmand spicy",
"accords": ["warm spicy", "sweet", "vanilla"]
},
"closeness": "very close",
"shared_notes": [],
"why": "a similar overall profile"
}
],
"total": 2612,
"source": "10ML Fragrance Index"
}Alternatives from other houses
GET /api/v1/alternatives?perfume= returns the editors’ alternatives to a famous perfume, always from other houses, each with why it is close. closeness= keeps only very close, similar vibe or same spirit.
curl "https://mcp.10ml.com/api/v1/alternatives?perfume=Creed+Aventus&limit=2"{
"total": 5,
"original": {
"name": "Creed Aventus",
"id": "creed-aventus-edp"
},
"alternatives": [
{
"name": "Armaf Club de Nuit Intense Man",
"closeness": "very close",
"why": "Pineapple, lemon, birch smoke and musk make it smell similar, a popular alternative at a different weight.",
"id": "armaf-club-de-nuit-intense-man-parfum",
"house": "Armaf",
"source": "editors"
},
{
"name": "Al Haramain L'Aventure",
"closeness": "very close",
"why": "Fruity-smoky opening over woods and musk follows the same blueprint.",
"id": "al-haramain-laventure",
"house": "Al Haramain",
"source": "editors"
}
],
"source": "10ML Fragrance Index"
}Recommendations from a person’s taste
Taste-based picks are not a REST route: they come from the recommend_perfumes tool of the MCP server. It takes the perfumes a person loves or dislikes, the notes they like or avoid, and gender, season, occasion, style and family, and says why for every pick. The MCP endpoint https://mcp.10ml.com/mcp also answers a plain JSON-RPC POST, so any code can call it. The response below is the reply's structuredContent, trimmed.
curl -X POST https://mcp.10ml.com/mcp \
-H "content-type: application/json" \
-H "accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"recommend_perfumes","arguments":{"likes":["Dior Sauvage"],"avoided_notes":["patchouli"],"season":"summer","limit":2}}}'{
"total": 3916,
"picks": [
{
"perfume": {
"name": "L'Immensité",
"house": "Louis Vuitton",
"gender": "men",
"family": "Aromatic aquatic",
"accords": ["fresh", "aquatic", "amber"],
"key_notes": ["sage", "labdanum", "ambroxan", "amber", "ginger"]
},
"why": "shares bergamot, labdanum, ambroxan with Sauvage Eau de Parfum; suits summer"
},
{
"perfume": {
"name": "Jean Lowe Immortel",
"house": "Maison Alhambra",
"gender": "men",
"family": "Fresh aromatic",
"accords": ["fresh", "aromatic", "woody"],
"key_notes": []
},
"why": "suits summer"
}
],
"taste": {
"liked_perfumes": ["Sauvage Eau de Parfum"],
"liked_notes": [],
"avoided_notes": ["patchouli"]
},
"source": "10ML Fragrance Index"
}An assistant makes the same call for you: ask Claude or ChatGPT “my signature scent is Dior Sauvage, what next?” once you have added the perfume MCP server.
Filter by notes, season and occasion
GET /api/v1/perfumes lists perfumes by notes_include, notes_exclude, accords, family, gender, season, occasion and style as well as free text. The example below keeps perfumes that carry both bergamot and ambroxan.
curl "https://mcp.10ml.com/api/v1/perfumes?notes_include=bergamot,ambroxan&limit=2"{
"total": 90,
"results": [
{
"name": "Imagination",
"house": "Louis Vuitton",
"family": "Citrus woody",
"key_notes": ["ginger", "cinnamon", "amberwood", "ambroxan", "citron"]
},
{
"name": "L'Immensité",
"house": "Louis Vuitton",
"family": "Aromatic aquatic",
"key_notes": ["sage", "labdanum", "ambroxan", "amber", "ginger"]
}
],
"filters": {
"notes_include": "bergamot, ambroxan"
},
"relaxed": false,
"source": "10ML Fragrance Index"
}Which route for which question
| The question | The call |
|---|---|
| Which perfumes are like this one? | GET /api/v1/similar?perfume= |
| Like this one, but fresher, sweeter or darker? | GET /api/v1/similar?perfume=&steer= |
| I only know the notes. | GET /api/v1/similar?notes= |
| What are the alternatives from other houses? | GET /api/v1/alternatives?perfume= |
| Perfumes with these notes for this season? | GET /api/v1/perfumes?notes_include=&season= |
| What fits what this person loves and avoids? | MCP tool recommend_perfumes |
The index holds 5,400+ perfumes and 285 notes. The perfume API page documents every endpoint, and the Fragrantica API alternative guide maps the other data developers look for.
Questions
Is there a perfume recommendation API?
Yes. The 10ML Fragrance Index API recommends through three free routes: /similar for perfumes like one you know, /alternatives for alternatives from other houses and /perfumes for filters by notes, season and occasion. Picks from a person's loved and avoided perfumes and notes come from the recommend_perfumes tool at https://mcp.10ml.com/mcp. No API key.
Is there a perfume similarity API?
Yes: GET https://mcp.10ml.com/api/v1/similar?perfume=Creed+Aventus returns the closest perfumes, each with the notes and accords it shares and how close it is (very close, similar vibe or same spirit). steer= moves the result fresher, sweeter, darker, lighter, longer_lasting or more_projection.
How is similarity measured?
By shared notes, accords and style. Every result lists what it shares and says how close it is. It is a comparison of the perfumes themselves, not a rating from reviews.
Can I get similar perfumes for a perfume that is not in the index?
Yes. Pass its notes and accords to /similar instead of a name, for example notes=vanilla,saffron, and the index is ranked against that list.
Can I get recommendations from a user’s taste over REST?
Not on a REST route today. The recommend_perfumes tool is on the MCP endpoint, which also answers a plain JSON-RPC POST, as the example above shows. The REST routes cover similar perfumes, alternatives and filters.
Is it free?
Yes. There is no API key, account or sign-up. Fair-use rate limiting may apply (see the terms), so cache what you fetch and keep bulk jobs polite.