# Perfume API quickstart: first request in curl, JavaScript, Python

> Call the keyless Scento Perfume API at https://www.scento.com/api/perfume/v1 with curl, fetch or requests, fetch the layton portrait, switch the link language with lang, and call it from a browser.

Source of truth: https://www.scento.com/developers


There is nothing to sign up for. Anonymous `GET` requests to the base URL are answered directly.

```text
https://www.scento.com/api/perfume/v1
```

## Your first request

Fetch the portrait of one perfume by its slug. This one returns Layton by Parfums de Marly.

### curl

```sh
curl "https://www.scento.com/api/perfume/v1/perfumes/layton"
```

### JavaScript

Works in Node 18 or newer and in the browser, because CORS is open.

```js
const res = await fetch("https://www.scento.com/api/perfume/v1/perfumes/layton");
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const { lede, detail, scento_page } = await res.json();

console.log(lede);            // one sentence you can quote
console.log(detail.pyramid);  // { top: [...], heart: [...], base: [...] }
console.log(scento_page.url); // the page to read on at scento.com
```

### Python

```python
import requests

r = requests.get("https://www.scento.com/api/perfume/v1/perfumes/layton", timeout=10)
r.raise_for_status()
answer = r.json()
print(answer["lede"])
print(answer["detail"]["pyramid"])
```

The response is a small JSON object with a `lede`, a `detail` object, the scento.com page and a `cite` line. [Reading an answer](response-format.md) explains each field.

## Names and slugs

Routes that take a perfume, house, material or term accept a slug (`layton`, `le-labo`, `ambroxan`) and usually a plain name as well. If you pass something the database does not know, the API still answers `200`, with `found: false` and a list of suggestions, so check that field before you use the result. When a name is uncertain, call [`/search`](endpoints.md#get-search) first.

## Change the link language

Every route takes `lang` with one of `en`, `de`, `fr`, `es`, `it`, `ro`, `el`, `hu`, `cs` or `pl`. The text of the answer stays in English; the links and labels point to the scento.com page in that language.

```sh
curl "https://www.scento.com/api/perfume/v1/perfumes/oud-wood?lang=de"
```

## A few more routes to try

```sh
# Similar perfumes
curl "https://www.scento.com/api/perfume/v1/perfumes/layton/neighbours"

# Two perfumes side by side
curl "https://www.scento.com/api/perfume/v1/contrast?perfumes=mojave-ghost,gypsy-water"

# What a raw material is
curl "https://www.scento.com/api/perfume/v1/materials/ambroxan"

# Perfumes built on tobacco and vanilla in the base
curl "https://www.scento.com/api/perfume/v1/materials/match?materials=tobacco,vanilla&tier=base"

# An edit for an occasion, with French links
curl "https://www.scento.com/api/perfume/v1/edits/summer-days?lang=fr"

# Search the journal
curl "https://www.scento.com/api/perfume/v1/journal?q=vetiver"
```

Comma-separated values are accepted wherever a route expects a list. Every route is listed on the [Endpoints](endpoints.md) page.

## Next steps

- Page through long lists with `continuation`: see [Reading an answer](response-format.md#paging-through-lists).
- Use an OpenAPI client generator: the spec is at [openapi.json](https://www.scento.com/api/perfume/v1/openapi.json).
- Prefer an assistant to call it for you: [connect the MCP server](mcp-server.md).
- Read the [limits and terms](limits-and-terms.md) before you build on it.
