Bowmark AIdocs

Caraway Home

Caraway Home product catalogue — every ceramic cookware piece, its variants, real prices and stock — read off the live Shopify storefront, plus the…

Caraway Home product catalogue — every ceramic cookware piece, its variants, real prices and stock — read off the live Shopify storefront, plus the buyer-archetype rail the Caraway Home Quiz terminal renders.

Domain: carawayhome.com

Also known as: caraway, Caraway, Caraway Home

Call it directly

bowmark.providers.caraway.listCarawayProducts(opts?: { limit?: number }): Promise<CarawayProduct[]>
bowmark.providers.caraway.getCarawayProduct(handle: string): Promise<CarawayProduct>
bowmark.providers.caraway.runCarawayQuiz(answers: { archetype: string }): Promise<CarawayQuizResult>

Functions

FunctionWhat it does
listCarawayProductsReads the live Caraway catalogue as Caraway publishes it — every product, its handle, title, vendor, description, tags, images and the per-variant price the storefront is quoting right now.
getCarawayProductReads one product by its handle — every variant, its exact price, the image the storefront is showing and whether that specific variant is purchasable right now.
runCarawayQuizRoutes a quiz's buyer-fit answers to a Caraway archetype and resolves the Recommended rail the quiz terminal page renders.

Types

interface CarawayVariant {
  /** Shopify's numeric variant id as a string. */
  id: string;
  /** The variant's own label, e.g. "Cream" or "Default Title". */
  title: string;
  /** String verbatim from the storefront — "50.00" (dollars) on /products.json, "44500" (cents) on /products/<h>.js. */
  price: string;
  /** Same scale as price. Null when the product is not on sale. */
  compareAtPrice: string | null;
  /** The store's own SKU. Null on a product without one. */
  sku: string | null;
  /** Whether the variant is purchasable right now. */
  available: boolean;
  options: string[];
}
interface CarawayProduct {
  /** The handle is the only stable identifier across the catalogue. */
  handle: string;
  title: string;
  vendor: string;
  productType: string;
  url: string;
  descriptionHtml: string | null;
  optionNames: string[];
  variants: CarawayVariant[];
  /** Same scale as variants — see CarawayVariant.price. */
  priceRange: { min: string; max: string } | null;
  /** True if ANY variant is purchasable. */
  inStock: boolean;
  tags: string[];
  /** Caraway's own images, in the order the storefront publishes them. */
  images: string[];
}
interface CarawayCatalogue {
  /** All matching products, in-stock first, then by handle. */
  products: CarawayProduct[];
  /** What the filter DROPPED, in the same register the rest of the library uses. */
  warnings: string[];
}
interface CarawayQuizArchetype {
  /** The archetype slug (e.g. new-customer, 90s-baby). */
  slug: string;
  /** Caraway's own copy for the archetype. */
  label: string;
  /** Caraway's own one-line archetype blurb. */
  description: string;
  /** The product handles the quiz route marks as Recommended. */
  recommendedHandles: string[];
}
interface CarawayQuizResult {
  /** The archetype the quiz terminal page lands on, with the site copy. */
  archetype: CarawayQuizArchetype;
  /** The Recommended rail, in stock first. */
  recommended: CarawayProduct[];
  /** What the resolver DROPPED, in the same register the rest of the library uses. */
  warnings: string[];
}

Examples

// what are the cheapest in-stock Caraway pieces right now?
const all = await bowmark.providers.caraway.listCarawayProducts({ limit: 50 });
const inStock = all.filter(p => p.inStock).sort((a, b) => Number(a.priceRange?.min ?? 0) - Number(b.priceRange?.min ?? 0));
log(inStock.slice(0, 5).map(p => `${p.title} from $${p.priceRange?.min}`).join(", "));
// what variants of the Caraway Cookware Set are left?
const p = await bowmark.providers.caraway.getCarawayProduct("cookware-sets");
const left = p.variants.filter(v => v.available);
log(left.length ? left.map(v => `${v.title} @ $${v.price}`).join(", ") : `${p.title} is sold out`);