Station 8 of 13 · Accord · a design draft
The Device API
A way to write down a scent instruction — which components, in what proportions, when and how strongly — from the public teaching accords. A schema and its examples; no hardware, nothing executes.
Design only · no hardware · nothing executes A proposed standard way to write down a scent instruction (which components, in what proportions, when and how strongly), derived only from the public teaching accords. No device implements it; it never carries a Radler formula or any real perfume’s composition.
What it is
- A JSON Schema (draft 2020-12) for a scent instruction: /data/device-api/schema.json.
- Derived from public records only. The source must be a teaching accord (
source.purposeis always “teaching”); each channel names a component by its record id, with its PubChem CID where the record has one, so any reader can follow it back to its sources. - Proportion, timing, intensity. Each channel carries the component’s modeled teaching share, its volatility class (from the records, or modeled and saying so), a timing envelope for a one-minute demonstration (modeled: the top arrives first, the base last) and a relative intensity (its share against the largest; proportion, not perceived strength). A timeline of keyframes gives every channel’s level every five seconds.
- Safety fields that cannot be switched on.
safety.for_skinandsafety.assessedare always false; the regulation records the accord names are listed for reading. IFRA Standards are the industry’s own standards and are not law in the US; EU rules apply in the EU. - Why. Devices that release scent on command are being researched (the house’s vision notes wearables); a shared, open description of what to release, tied to sourced records, is a small, useful layer that needs no hardware to write down. This page offers one; it is a draft for discussion.
One instruction: the rose teaching accord
| Channel | Component | Proportion | Class | Envelope (s) | Intensity |
|---|---|---|---|---|---|
| 1 | 2-phenylethyl alcohol (Molecule, PubChem CID 6054) | 0.450 | heart (its role in the accord (documented)) | from 8, rise 6, hold 24, fade 20 | 1.000 |
| 2 | citronellol (Molecule, PubChem CID 8842) | 0.300 | heart (its role in the accord (documented)) | from 8, rise 6, hold 24, fade 20 | 0.667 |
| 3 | geraniol (Molecule, PubChem CID 637566) | 0.249 | heart (its role in the accord (documented)) | from 8, rise 6, hold 24, fade 20 | 0.553 |
| 4 | β-damascenone (Molecule, PubChem CID 5366074) | 0.001 | heart (no class on record (role: trace): modeled as heart) | from 8, rise 6, hold 24, fade 20 | 0.002 |
| Time | 2-phenylethyl alcohol | citronellol | geraniol | β-damascenone |
|---|---|---|---|---|
| 0 s | 0.00 | 0.00 | 0.00 | 0.00 |
| 5 s | 0.00 | 0.00 | 0.00 | 0.00 |
| 10 s | 0.33 | 0.22 | 0.18 | 0.00 |
| 15 s | 1.00 | 0.67 | 0.55 | 0.00 |
| 20 s | 1.00 | 0.67 | 0.55 | 0.00 |
| 25 s | 1.00 | 0.67 | 0.55 | 0.00 |
| 30 s | 1.00 | 0.67 | 0.55 | 0.00 |
| 35 s | 1.00 | 0.67 | 0.55 | 0.00 |
| 40 s | 0.90 | 0.60 | 0.50 | 0.00 |
| 45 s | 0.65 | 0.43 | 0.36 | 0.00 |
| 50 s | 0.40 | 0.27 | 0.22 | 0.00 |
| 55 s | 0.15 | 0.10 | 0.08 | 0.00 |
| 60 s | 0.00 | 0.00 | 0.00 | 0.00 |
The first lines of the file
{
"format": "radler-scent-instruction",
"version": "0.1.0",
"status": "design draft: no device implements this, and nothing executes it",
"source": {
"type": "Accord",
"id": "rose-teaching-accord",
"record_version": 2,
"url": "https://www.radlerparfums.com/accord/rose-teaching-accord",
"data": "https://www.radlerparfums.com/data/accord/rose-teaching-accord.json",
"purpose": "teaching",
"licence": "https://creativecommons.org/licenses/by/4.0/"
},
"disclaimer": "A teaching accord for learning: not a Radler formula, not a finished perfume, not safety-assessed; do not make it for skin.",
"units": {
"time": "seconds from the start of the instruction",
"proportion": "share of the accord, 0 to 1 (modeled teaching share)",
"intensity": "relative, 0 to 1: the channel's share against the largest share (proportion, not perceived strength)"
},
"channels": [
{
"channel": 1,
"component": {
"type": "Molecule",
"id": "phenylethyl-alcohol",
"name": "2-phenylethyl alcohol",
"pubchem_cid": 6054,
"url": "https://www.radlerparfums.com/molecule/phenylethyl-alcohol"
},
"proportion": 0.45,
"volatility_class": "heart",
"class_from": "its role in the accord (documented)",
"envelope": {
"onset_s": 8,
"attack_s": 6,
"hold_s": 24,
"release_s": 20
},
"intensity": 1
},
"…"
],
"timeline": [
{
"t_s": 0,
"levels": [
0,
0,
0,
0
]
},
{
"t_s": 5,
"levels": [
0,
0,
0,
0
]
},
"…"
],
"safety": {
"for_skin": false,
"assessed": false,
"regulation_refs": [
"ifra-rose-ketones",
"eu-2009-1223",
"eu-2023-1545"
],
"note": "A teaching accord for learning, not a finished product; IFRA Standards are the industry's own standards (not law in the US); EU regulation applies in the EU. Read each regulation record for its jurisdiction."
}
}Every field
| Field | Required | Value | Meaning |
|---|---|---|---|
format | yes | always "radler-scent-instruction" | Names this representation. |
version | yes | string, pattern ^0\.1\.[0-9]+$ | The version of this draft. |
status | yes | always "design draft: no device implements this, and nothing executes it" | Says what the file is, every time. |
source | yes | object | The public record the instruction is derived from. Only a teaching accord is allowed. |
source.type | yes | always "Accord" | |
source.id | yes | string, pattern ^[a-z0-9-]+-teaching-accord$ | |
source.record_version | yes | integer, ≥ 1 | |
source.url | yes | string, pattern ^https://www\.radlerparfums\.com/accord/[a-z0-9-]+$ | |
source.data | no | string, pattern ^https://www\.radlerparfums\.com/data/accord/[a-z0-9-]+\.json$ | |
source.purpose | yes | always "teaching" | |
source.licence | yes | always "https://creativecommons.org/licenses/by/4.0/" | |
disclaimer | yes | string | Carried from the teaching accord record, unchanged. |
units | yes | object | |
units.time | yes | always "seconds from the start of the instruction" | |
units.proportion | yes | always "share of the accord, 0 to 1 (modeled teaching share)" | |
units.intensity | yes | always "relative, 0 to 1: the channel's share against the largest share (proportion, not perceived strength)" | |
channels | yes | array | One channel per component of the accord. |
channels.[ ]channel | yes | integer, ≥ 1 | |
channels.[ ]component | yes | object | |
channels.[ ]component.type | yes | one of Molecule, Material, Unrecorded | |
channels.[ ]component.id | yes | string or null, pattern ^[a-z0-9-]+$ | |
channels.[ ]component.name | yes | string | |
channels.[ ]component.pubchem_cid | no | integer or null, ≥ 1 | |
channels.[ ]component.url | no | string or null | |
channels.[ ]proportion | yes | number, ≥ 0, ≤ 1 | |
channels.[ ]volatility_class | yes | one of top, heart, base | |
channels.[ ]class_from | yes | string | Where the class came from on the records, or that it is modeled. |
channels.[ ]envelope | yes | object | Modeled timing for a demonstration playback: when the channel starts, rises, holds and fades. |
channels.[ ]envelope.onset_s | yes | number, ≥ 0 | |
channels.[ ]envelope.attack_s | yes | number, ≥ 0 | |
channels.[ ]envelope.hold_s | yes | number, ≥ 0 | |
channels.[ ]envelope.release_s | yes | number, ≥ 0 | |
channels.[ ]intensity | yes | number, ≥ 0, ≤ 1 | |
timeline | yes | array | Keyframes: at each time, the level of every channel in channel order (envelope times intensity). |
timeline.[ ]t_s | yes | number, ≥ 0 | |
timeline.[ ]levels | yes | array | |
safety | yes | object | |
safety.for_skin | yes | always false | |
safety.assessed | yes | always false | Not safety-assessed; not assessed against any standard. |
safety.regulation_refs | yes | array | Regulation record ids the source accord names, for reading; their wording names their jurisdiction. |
safety.note | yes | string |
An instruction for every teaching accord
Generated from the records at every build and checked against the schema; a build fails if one does not validate.
- An amber (/data/device-api/examples/amber-teaching-accord.json)
- The chypre skeleton (/data/device-api/examples/chypre-teaching-accord.json)
- A cologne (/data/device-api/examples/cologne-teaching-accord.json)
- The fougère skeleton (/data/device-api/examples/fougere-teaching-accord.json)
- A muguet (/data/device-api/examples/muguet-teaching-accord.json)
- A rose, from four molecules (/data/device-api/examples/rose-teaching-accord.json)
- A white floral, indolic (/data/device-api/examples/white-floral-teaching-accord.json)
- A woody-ambery (/data/device-api/examples/woody-ambery-teaching-accord.json)
The Olfactory Genome · The Spatial Sillage Lab · The rose teaching accord · The teaching accords
This page’s data is published under CC BY 4.0: /data/device-api/schema.json.
schema version 0.1.0 · updated 2026-09-30
