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
| Function | What it does |
|---|---|
searchParts | Searches 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… |
getPartOptions | Reads 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… |
priceConfiguration | Resolves 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)`);