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/similar

JSON over GET, OpenAPI 3.1. Free, no API key.

All eight endpoints

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 questionThe 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.