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
| Function | What it does |
|---|---|
listCarawayProducts | Reads 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. |
getCarawayProduct | Reads 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. |
runCarawayQuiz | Routes 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`);