Bowmark AIdocs

Salt & Stone

Salt & Stone's own Scent Quiz, reimplemented over its real six named scent families: list every family's real fragrance notes, compute a real ranked match…

Salt & Stone's own Scent Quiz, reimplemented over its real six named scent families: list every family's real fragrance notes, compute a real ranked match against a free-text preference, and shop the real core products (body wash, mist, lotion, deodorant, hand cream, candle) in the matched scent with real price and availability.

Domain: saltandstone.com

Also known as: Salt & Stone, Salt and Stone, saltandstone, saltandstone.com

Call it directly

bowmark.providers.saltandstone.listScentFamilies(): Promise<ScentFamily[]>
bowmark.providers.saltandstone.matchScent(preferences: string): Promise<ScentMatch[]>
bowmark.providers.saltandstone.getScentProducts(familyName: string): Promise<ScentProduct[]>

Functions

FunctionWhat it does
listScentFamiliesLists Salt & Stone's real six named scent families, each with its own real top/heart/base fragrance notes and mood description, read off the site's own collection pages.
matchScentSalt & Stone's own Scent Quiz, reimplemented: computes a real ranked match across all six scent families by scoring the preference's terms against each family's own published fragrance…
getScentProductsLists the real core products (body wash, body mist, body lotion, deodorant, hand cream, candle) available in one named scent family, with each one's real price, availability and product…

Types

// Salt & Stone's OWN shapes — not a capability contract.

interface ScentFamily {
  handle: string;
  name: string;             // e.g. "Santal & Vetiver"
  description: string;      // the site's own mood copy
  notes: { top: string[]; heart: string[]; base: string[] }; // real fragrance notes
  url: string;
}

interface ScentMatch {
  handle: string;
  name: string;
  score: number;            // 0-1 — how much of the caller's preference matched this family's real notes/copy
  matchedTerms: string[];   // which of the caller's own words matched, and why
  url: string;
}

interface ScentProduct {
  handle: string;           // "body-wash" | "body-mist" | "body-lotion" | "natural-deodorant" | "hand-cream" | "candle"
  title: string;
  productType: string;
  variantId: string;
  variantTitle: string;
  price: number;            // dollars, real Shopify variant price
  compareAtPrice: number | null;
  available: boolean;       // real live stock flag
  url: string;              // real product page, this exact variant preselected
}

Examples

// Salt & Stone's own quiz, run for a stated preference
const matches = await bowmark.providers.saltandstone.matchScent("woodsy, warm, a bit of spice");
const top = matches[0];
const products = await bowmark.providers.saltandstone.getScentProducts(top.name);
return { recommendation: top.name, score: top.score, shop: products.map((p) => p.title) };
// Which core products are in stock in Black Rose & Oud, and what do they cost?
const products = await bowmark.providers.saltandstone.getScentProducts("Black Rose & Oud");
return products.filter((p) => p.available).map((p) => `${p.title}: $${p.price}`);