Bowmark AIdocs

Custom sofa configurator (fabric selection, live pricing)

Configure a real sofa or sectional — pick a fabric, wood stain or leg finish — and get the maker's own live price, across every maker whose site publishes…

Configure a real sofa or sectional — pick a fabric, wood stain or leg finish — and get the maker's own live price, across every maker whose site publishes a real configurator (Joybird, Interior Define). Not a researched estimate: the same total the maker's own customizer would show for that exact pick. No sofa named yet? Call listSofas() and configure/price the first result — that alone answers 'configure a sofa with fabric selection and live pricing' without asking the caller to pick one first.

Also known as: sofa configurator, configure a sofa, configure sofa, custom sofa, sofa builder, build a sofa, sofa fabric, fabric picker

Call it

bowmark.custom_sofa_configurator.listSofas(query?: string): Promise<CustomSofaListResult>
bowmark.custom_sofa_configurator.getConfigurator(id: string): Promise<CustomSofaConfigurator>
bowmark.custom_sofa_configurator.priceConfiguration(id: string, selections: Record<string, string>): Promise<CustomSofaPriceResult>

Functions

FunctionWhat it does
listSofasLists configurable sofas/sectionals across every maker — Joybird's whole catalogue (filtered to sofas and sectionals) plus an Interior Define search (defaults to "sofa" when query is…
getConfiguratorReads one sofa's full configurator — every option slot (Fabric, Wood Stain, Color, Finish, Cushion Fill — the exact set varies by product and maker) with each choice's label and price delta.
priceConfigurationPrices ONE exact configuration against the maker's own live customizer and returns the real total, a per-choice breakdown, which required slots are still unpicked (the total is a floor…

Types

type CustomSofa = {
  id: string;             // "<source>:<nativeId>" — pass to getConfigurator/priceConfiguration
  source: string;         // "joybird" | "interiordefine"
  brand: string;
  name: string;
  url: string;
  basePrice: number;      // whole dollars — see basePriceNote for what it means
  basePriceNote: string;
}
type CustomSofaListResult = { sofas: CustomSofa[]; warnings: string[] }

type CustomSofaChoice = { key: string; label: string; priceDelta: number }
type CustomSofaOption = {
  key: string;            // pass as a SELECTIONS key: { [option.key]: choice.key }
  title: string;
  required: boolean;
  choices: CustomSofaChoice[];
}
type CustomSofaConfigurator = {
  id: string; source: string; brand: string; name: string; url: string;
  basePrice: number; basePriceNote: string; options: CustomSofaOption[];
  warnings: string[];    // always empty today — getConfigurator is a route to ONE maker
}

type CustomSofaPriceLine = { option: string; choice: string; priceDelta: number }
type CustomSofaPriceResult = {
  id: string; source: string; brand: string;
  total: number;               // the maker's own live total for this configuration
  breakdown: CustomSofaPriceLine[];
  missingRequired: string[];   // total is a FLOOR while this is non-empty
  unmatched: string[];         // selections that matched no real option/choice
  url: string;
  warnings: string[];    // always empty today — priceConfiguration is a route to ONE maker
}

type CallOptions = {
  timeoutMs?: number   // per-provider budget in ms, default 30000, clamped to 1000-55000.
                       // A provider slower than this is DROPPED from the results and
                       // NAMED in warnings — never silently absent
}

Examples

// What sofas can I configure, and what does one cost as-is?
const { sofas, warnings } = await bowmark.custom_sofa_configurator.listSofas("sectional");
for (const w of warnings) log(w);
const first = sofas[0];
return { count: sofas.length, example: first && { name: first.name, from: first.basePrice, brand: first.brand } };
// Configure a specific sofa's fabric and get the maker's own live price.
const { sofas } = await bowmark.custom_sofa_configurator.listSofas("sofa");
const pick = sofas[0];
const cat = await bowmark.custom_sofa_configurator.getConfigurator(pick.id);
const fabric = cat.options.find(o => /fabric|color/i.test(o.title));
const choice = fabric?.choices[0];
const selections = choice ? { [fabric.key]: choice.key } : {};
const priced = await bowmark.custom_sofa_configurator.priceConfiguration(pick.id, selections);
return { total: priced.total, missing: priced.missingRequired, orderAt: priced.url };

Providers behind it

Provider
joybirdJoybird
interiordefineInterior Define