Bowmark AIdocs

Semihandmade

Semihandmade's real custom IKEA-cabinet door/drawer/trim/toe-kick/panel catalog and its real, size-dependent Shopify pricing — search real parts for a…

Semihandmade's real custom IKEA-cabinet door/drawer/trim/toe-kick/panel catalog and its real, size-dependent Shopify pricing — search real parts for a given IKEA cabinet system (Sektion, Akurum, Besta, Godmorgon), read one part's real size grid, and get the exact price Semihandmade's own store would charge for one specific size.

Domain: semihandmade.com

Also known as: Semihandmade, semihandmade, SemiHandmade, semihandmade.com

Call it directly

bowmark.providers.semihandmade.searchParts(system: string, query?: string): Promise<SemihandmadePart[]>
bowmark.providers.semihandmade.getPartOptions(handle: string): Promise<SemihandmadePartOptions>
bowmark.providers.semihandmade.priceConfiguration(handle: string, selections: Record<string, string>): Promise<SemihandmadePriceResult>

Functions

FunctionWhat it does
searchPartsSearches Semihandmade's real catalog for ONE IKEA cabinet system ("sektion" | "akurum" | "media-units" | "bathroom") via the site's own Shopify collection JSON, optionally filtered by a…
getPartOptionsReads one part's real live size grid: every real size (or size+grain, or size+color) combination with its own real price and availability, keyed by that part's OWN option names — which…
priceConfigurationResolves ONE exact size selection (selections keyed by that part's own option names, e.g. { Width, Height, Color } or { Size, Color } — call getPartOptions(handle) first for the real…

Types

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

interface SemihandmadePart {
  system: string;         // "sektion" | "akurum" | "media-units" | "bathroom"
  handle: string;         // the key getPartOptions/priceConfiguration take
  title: string;
  url: string;
  material: string;       // e.g. "supermatte" | "impression" | "classic" | ""
  style: string;          // e.g. "slab" | "shaker" | "beaded" | "quarterline" | "walnut-vertical" | ""
  partType: string;       // "door" | "drawer" | "trim" | "toe-kick" | "cover-panels" | ""
  priceMin: number;       // dollars — the cheapest real size for this part
  priceMax: number;
  variantCount: number;
}

interface SemihandmadeSizeOption {
  options: Record<string, string>;  // this part's OWN option names -> this size's values
  price: number;                    // this exact size's own real price
  available: boolean;
  sku: string;
  variantId: string;
}

interface SemihandmadePartOptions {
  handle: string;
  title: string;
  url: string;
  optionNames: string[];   // this part's own option names, in the site's order
  sizes: SemihandmadeSizeOption[];
}

interface SemihandmadePriceResult {
  handle: string;
  title: string;
  selections: Record<string, string>;
  price: number;           // the real price for this exact size
  available: boolean;
  sku: string;
  productUrl: string;      // finish choosing/checkout on the real product page
}

Examples

// What does a 24" x 30" white supermatte slab door actually cost?
const parts = await bowmark.providers.semihandmade.searchParts("sektion", "white supermatte slab door");
const door = parts[0];
const options = await bowmark.providers.semihandmade.getPartOptions(door.handle);
const priced = await bowmark.providers.semihandmade.priceConfiguration(door.handle, {
  Width: '24"',
  Height: '30"',
  Color: "White",
});
return { price: priced.price, available: priced.available, finishOnSite: priced.productUrl };
// What stone-finish shaker doors and drawers does Sektion offer, and what's the price range?
const parts = await bowmark.providers.semihandmade.searchParts("sektion", "stone shaker");
return parts.map((p) => `${p.title}: $${p.priceMin}-$${p.priceMax} (${p.variantCount} sizes)`);