Bowmark AIdocs

Framebridge

Framebridge's real custom picture-framing catalog and CPQ pricing engine — search real frame styles, read a style's real sizes and the site's live mat…

Framebridge's real custom picture-framing catalog and CPQ pricing engine — search real frame styles, read a style's real sizes and the site's live mat catalog, and price an exact frame + size + mat build against Framebridge's own pricing engine rather than a researched estimate.

Domain: framebridge.com

Also known as: Framebridge, framebridge, Framebridge Inc, framebridge.com

Call it directly

bowmark.providers.framebridge.listFrameStyles(query?: string): Promise<FramebridgeFrameStyle[]>
bowmark.providers.framebridge.getConfigurator(productId: string): Promise<FramebridgeConfigurator>
bowmark.providers.framebridge.priceConfiguration(productId: string, selections: { size: string, conveyance?: "Digital" | "Physical", mats?: string[] }): Promise<FramebridgePriceResult>

Functions

FunctionWhat it does
listFrameStylesSearches Framebridge's real custom-framing catalog via the site's own Shopify Storefront MCP, filtered to genuine build-your-own frame styles (never gift bundles or readymade tabletop…
getConfiguratorReads one frame style's real live configurator: every Size x Conveyance variant with its own real price, plus the site's current global mat catalog (color, style, standard-vs-premium).…
priceConfigurationPrices ONE specific build (frame style + size + conveyance + up to a primary and accent mat) against Framebridge's own live CPQ engine and returns the real itemized total plus a handoffUrl…

Types

// Framebridge's OWN shapes — not a capability contract.

interface FramebridgeFrameStyle {
  productId: string;   // the key getConfigurator/priceConfiguration take
  handle: string;       // the site's own product/moulding permalink
  title: string;
  url: string;
  priceRangeMin: number; // dollars — the cheapest size x conveyance combo
  priceRangeMax: number;
}

interface FramebridgeSizeOption {
  size: string;          // "XS" | "S" | "M" | "L" | "XL" | "GR" | "XG" | "MG"
  conveyance: "Digital" | "Physical";
  price: number;         // this exact combination's own real price
  variantId: string;
}

interface FramebridgeMatOption {
  code: string;          // the value priceConfiguration's mats[] takes, e.g. "WH02"
  presentation: string;  // e.g. "White"
  hexColor: string;
  style: string;         // "" | "linen" | "silk" | "metallic" | "8-ply" | "pattern" | "gingham" | "art-deco" | "farrow-and-ball"
  standard: boolean;     // true = free-tier solid color
}

interface FramebridgeConfigurator {
  productId: string;
  handle: string;
  title: string;
  sizes: FramebridgeSizeOption[];
  mats: FramebridgeMatOption[];
}

interface FramebridgePriceLine { key: string; amount: number; presentation: string }

interface FramebridgePriceResult {
  productId: string;
  handle: string;
  size: string;
  conveyance: "Digital" | "Physical";
  totalPrice: number;         // the real, itemized total
  breakdown: FramebridgePriceLine[];
  readyForCheckout: boolean;  // false until a real photo is uploaded on the site itself
  issues: string[];           // the site's own validation messages, e.g. "artwork: can't be blank"
  handoffUrl: string;         // the real product page to finish the exact build
}

Examples

// What would an S/Digital Irvine Slim with a black accent mat actually cost?
const styles = await bowmark.providers.framebridge.listFrameStyles("irvine slim");
const irvine = styles.find((s) => s.title === "Irvine Slim");
const priced = await bowmark.providers.framebridge.priceConfiguration(irvine.productId, {
  size: "S",
  conveyance: "Digital",
  mats: ["WH02", "BL42"],
});
return { total: priced.totalPrice, finishOnSite: priced.handoffUrl };
// What sizes and mat colors does a given frame style actually offer?
const config = await bowmark.providers.framebridge.getConfigurator("8671405474107");
return {
  sizes: config.sizes.map((s) => `${s.size} / ${s.conveyance}: $${s.price}`),
  mats: config.mats.filter((m) => m.standard).map((m) => m.presentation),
};