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

FieldTypeRequiredNotes
@contextstring[]yesBoth schema.org and the Scentral-Park schema URL.
@typestring[]yesProduct and sp:FragranceOil.
namestringyesProduct name as you sell it.
brand.namestringyesYour brand / storefront name.
descriptionstringoptionalProse description; HTML is stripped on ingest.
urlstringyesCanonical product-page URL.
imagestring | string[]optionalAbsolute image URL. First entry is used as the hero.
offersOffer[]yesOne entry per packaging variant. See below.
sp:familystring[]optionalFragrance families (Floral, Woody, Citrus, Gourmand, …).
sp:notesobjectoptionalOlfactive pyramid; keys top, middle, base, each a string[].
sp:ifraApplicationsIFRAApplication[]optionalIFRA usage limits per leaf category. See below.
sp:ifraDocumentURLstringoptionalLink to the IFRA certificate PDF.
sp:shipsTostring[]optionalISO-3166-1 alpha-2 country codes where you ship this product.

Offer (packaging variant)

FieldTypeRequiredNotes
@typestringyesOffer.
skustringyesStable identifier for the variant.
pricenumberyesNumeric — no currency symbol.
priceCurrencystringyesISO-4217 (USD, EUR, GBP, …).
availabilitystringyeshttps://schema.org/InStock or OutOfStock.
sp:sizeValuenumberyesNumeric size.
sp:sizeUnitstringyesml, oz, g, lb, kg.
sp:packCountintegeroptionalFor discrete-supply packs (e.g. reeds sold in packs of 100).

IFRAApplication

FieldTypeRequiredNotes
@typestringyessp:IFRAApplication.
sp:categorystringyesIFRA leaf category ID (Amendment 51): 1, 2, …, 5A, 5B, 5C, 5D, 6, 7A, 7B, 8, 9, 10A, 10B, 11A, 11B, 12.
sp:maxPercentnumberyesMaximum 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 @type array contains sp:FragranceOil is used.
  • Extraction runs on the same ScentralParkBot user-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.