Fragrance schema
A JSON-LD schema for fragrance oils. Suppliers who embed it on their product pages get clean ingestion into Scentral-Park (and any other agent that speaks it) without our crawler falling back to HTML heuristics.
Why
Our crawler parses each supplier's product page to extract name, price, packaging
variants, olfactive notes, IFRA usage limits, and image URL. Every supplier's HTML is
different, so parsing relies on per-vendor heuristics that break when a theme changes
and go stale when a new product template lands. If your product page carries a <script type="application/ld+json"> block matching the schema
below, we skip the heuristics entirely and index the structured data directly.
Concretely, embedding the schema:
- guarantees your product name and packaging variants render as you intend;
- lets you publish IFRA usage limits in a machine-checkable form;
- surfaces olfactive notes in the same shape the catalog uses for search and browse;
- gives you a stable extraction contract that survives theme redesigns.
Shape
Extends schema.org/Product with fragrance-specific fields under a Scentral-Park namespace. Base @context = https://schema.org plus a secondary context of https://scentral-park.com/schema/v1.
Top-level fields
| Field | Type | Required | Notes |
|---|---|---|---|
@context | string[] | yes | Both schema.org and the Scentral-Park schema URL. |
@type | string[] | yes | Product and sp:FragranceOil. |
name | string | yes | Product name as you sell it. |
brand.name | string | yes | Your brand / storefront name. |
description | string | optional | Prose description; HTML is stripped on ingest. |
url | string | yes | Canonical product-page URL. |
image | string | string[] | optional | Absolute image URL. First entry is used as the hero. |
offers | Offer[] | yes | One entry per packaging variant. See below. |
sp:family | string[] | optional | Fragrance families (Floral, Woody, Citrus, Gourmand, …). |
sp:notes | object | optional | Olfactive pyramid; keys top, middle, base, each a string[]. |
sp:ifraApplications | IFRAApplication[] | optional | IFRA usage limits per leaf category. See below. |
sp:ifraDocumentURL | string | optional | Link to the IFRA certificate PDF. |
sp:shipsTo | string[] | optional | ISO-3166-1 alpha-2 country codes where you ship this product. |
Offer (packaging variant)
| Field | Type | Required | Notes |
|---|---|---|---|
@type | string | yes | Offer. |
sku | string | yes | Stable identifier for the variant. |
price | number | yes | Numeric — no currency symbol. |
priceCurrency | string | yes | ISO-4217 (USD, EUR, GBP, …). |
availability | string | yes | https://schema.org/InStock or OutOfStock. |
sp:sizeValue | number | yes | Numeric size. |
sp:sizeUnit | string | yes | ml, oz, g, lb, kg. |
sp:packCount | integer | optional | For discrete-supply packs (e.g. reeds sold in packs of 100). |
IFRAApplication
| Field | Type | Required | Notes |
|---|---|---|---|
@type | string | yes | sp:IFRAApplication. |
sp:category | string | yes | IFRA leaf category ID (Amendment 51): 1, 2, …, 5A, 5B, 5C, 5D, 6, 7A, 7B, 8, 9, 10A, 10B, 11A, 11B, 12. |
sp:maxPercent | number | yes | Maximum permitted concentration, decimal number. |
Example
Drop this into your product page's <head>. One block per product;
use the URL of the current page as url.
<script type="application/ld+json">
{
"@context": [
"https://schema.org",
"https://scentral-park.com/schema/v1"
],
"@type": ["Product", "sp:FragranceOil"],
"name": "Adriatic Fig Fragrance Oil",
"brand": { "@type": "Brand", "name": "Bulk Apothecary" },
"description": "Green, ripe fig with a soft green-leaf top.",
"url": "https://www.example-supplier.com/adriatic-fig-fragrance-oil",
"image": [
"https://cdn.example-supplier.com/adriatic-fig-350.jpg"
],
"offers": [
{
"@type": "Offer",
"sku": "ADRFIG-1OZ",
"price": 2.39,
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"sp:sizeValue": 1,
"sp:sizeUnit": "oz"
},
{
"@type": "Offer",
"sku": "ADRFIG-16OZ",
"price": 26.99,
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"sp:sizeValue": 16,
"sp:sizeUnit": "oz"
}
],
"sp:family": ["Green", "Fruity"],
"sp:notes": {
"top": ["green leaf", "bergamot"],
"middle": ["fig", "coconut milk"],
"base": ["cedar", "musk"]
},
"sp:ifraApplications": [
{ "@type": "sp:IFRAApplication", "sp:category": "1", "sp:maxPercent": 0.5 },
{ "@type": "sp:IFRAApplication", "sp:category": "4", "sp:maxPercent": 25.0 },
{ "@type": "sp:IFRAApplication", "sp:category": "5A", "sp:maxPercent": 10.0 }
],
"sp:ifraDocumentURL": "https://cdn.example-supplier.com/ifra/adriatic-fig.pdf",
"sp:shipsTo": ["US", "CA"]
}
</script>Ingestion behaviour
- When our crawler finds a matching JSON-LD block on a product page, it uses those values verbatim and skips its HTML-parsing heuristics.
- Fields marked optional above can be omitted — we simply won't index them. Fields marked required must be present, or the block is ignored and we fall back to parsing.
- If a supplier ships multiple JSON-LD blocks on one page, only the block whose
@typearray containssp:FragranceOilis used. - Extraction runs on the same
ScentralParkBotuser-agent documented on the bot info page; be sure your JSON-LD is served in the initial HTML, not injected later by client-side JavaScript.
Questions
Feedback, corrections, or schema-extension requests: legalexap.product172@passmail.net.
The schema is versioned via the https://scentral-park.com/schema/v1 context URL; breaking changes will land under a new version and both will be honoured
during a deprecation window.