National Business Furniture
National Business Furniture's office-furniture catalog — search live inventory, read one product's real configurable options (finish, size) with each…
National Business Furniture's office-furniture catalog — search live inventory, read one product's real configurable options (finish, size) with each choice's exact price, and resolve a specific configuration to its real variant price rather than a researched estimate.
Domain: nationalbusinessfurniture.com
Also known as: National Business Furniture, NBF, nationalbusinessfurniture.com
Call it directly
bowmark.providers.nationalbusinessfurniture.searchProducts(query: string): Promise<NbfProductSummary[]>
bowmark.providers.nationalbusinessfurniture.getProduct(sku: string): Promise<NbfProduct>
bowmark.providers.nationalbusinessfurniture.priceConfiguration(sku: string, selections: Record<string, string>): Promise<NbfPriceResult>
bowmark.providers.nationalbusinessfurniture.addToCart(sku: string, selections: Record<string, string>): Promise<NbfCartHandoff>Functions
| Function | What it does |
|---|---|
searchProducts | Searches National Business Furniture's office-furniture catalog by free text (e.g. "desk", "conference chair") and returns every match's SKU, name, entry URL and starting price. |
getProduct | Reads one product's full configurable-option set (e.g. Finish) with each choice's REAL label and its exact variant price, plus the base product's price and page URL. |
priceConfiguration | Resolves ONE specific configuration — selections keyed by option group (case-insensitive), e.g. { Finish: "Ash Black" } — against the SKU's live options and returns the matching variant's… |
addToCart | Turns a configuration into the handoff you give the shopper: National Business Furniture's own product page URL plus the exact choices to click there (e.g. Finish: "Ash Black"), since this… |
Types
// National Business Furniture's OWN shapes — not a capability contract.
interface NbfProductSummary {
sku: string; // the key getProduct takes
name: string;
urlKey: string;
url: string;
basePrice: number;
basePriceFormatted: string; // "$1,969.00"
}
interface NbfOptionChoice { valueIndex: number; label: string; variantSku: string; price: number; priceFormatted: string }
interface NbfOption {
groupLabel: string; // "Finish" — the real swatch group name, not GraphQL's opaque attribute_code
choices: NbfOptionChoice[];
}
interface NbfProduct {
sku: string;
name: string;
url: string;
basePrice: number;
basePriceFormatted: string;
options: NbfOption[];
}
interface NbfPriceResult {
sku: string;
variantSku: string | null; // null until every option group is picked
price: number | null;
priceFormatted: string | null;
applied: { group: string; choice: string }[];
missingGroups: string[]; // option groups with no valid selection applied
unmatched: string[]; // selections that didn't match a real group/choice, named so nothing mispriced silently
handoffUrl: string; // the product's entry page — call addToCart for the same page plus which swatch to click
}
interface NbfCartHandoff {
sku: string;
name: string;
url: string; // the product page — NBF publishes no query-param deep link, so this is the base URL
applied: { group: string; choice: string }[];
price: number | null;
priceFormatted: string | null;
missingGroups: string[];
unmatched: string[];
}Examples
// What does the Ash Black finish of a specific desk actually cost, and where do I click?
const priced = await bowmark.providers.nationalbusinessfurniture.addToCart("227514", { Finish: "Ash Black" });
return { openThis: priced.url, price: priced.priceFormatted, pick: priced.applied };// Find desks, then price one specific finish.
const matches = await bowmark.providers.nationalbusinessfurniture.searchProducts("l-shaped desk");
const desk = matches[0];
const priced = await bowmark.providers.nationalbusinessfurniture.priceConfiguration(desk.sku, { Finish: "Gray" });
return { total: priced.priceFormatted, missing: priced.missingGroups, siteUrl: priced.handoffUrl };