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
| Function | What it does |
|---|---|
listSofas | Lists 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… |
getConfigurator | Reads 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. |
priceConfiguration | Prices 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 | |
|---|---|
joybird | Joybird |
interiordefine | Interior Define |