Bowmark AIdocs

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

FunctionWhat it does
searchProductsSearches 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.
getProductReads 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.
priceConfigurationResolves 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…
addToCartTurns 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 };