DecksDirect
DecksDirect's decking/railing catalog — search live inventory, read one product's real configurable options (pack size, color, size) with each…
DecksDirect's decking/railing catalog — search live inventory, read one product's real configurable options (pack size, color, size) with each combination's exact price and stock status, and resolve a specific configuration to its real variant rather than a researched estimate.
Domain: decksdirect.com
Also known as: DecksDirect, DecksDirect.com, Decks Direct
Call it directly
bowmark.providers.decksdirect.searchProducts(query: string): Promise<DdProductSummary[]>
bowmark.providers.decksdirect.getProduct(urlKey: string): Promise<DdProduct>
bowmark.providers.decksdirect.priceConfiguration(urlKey: string, selections: Record<string, string>): Promise<DdPriceResult>
bowmark.providers.decksdirect.addToCart(urlKey: string, selections: Record<string, string>): Promise<DdCartHandoff>Functions
| Function | What it does |
|---|---|
searchProducts | Searches DecksDirect's decking/railing/hardware catalog by free text (e.g. "composite decking", "deck screws") and returns every match's urlKey, SKU, name, entry URL, stock status and… |
getProduct | Reads one product's full configurable-option set (e.g. Pack Size, Color) with each choice's real label, plus every real buildable variant's exact price and stock status. |
priceConfiguration | Resolves ONE specific configuration — selections keyed by option group (case-insensitive), e.g. { "Pack Size": "350 pack", "Color": "Havana Gold" } — against the product's live options and… |
addToCart | Turns a configuration into the handoff you give the shopper: DecksDirect's own product page URL plus the exact choices to click there, since this storefront does not honour a query-param… |
Types
// DecksDirect's OWN shapes — not a capability contract.
interface DdProductSummary {
urlKey: string; // the key getProduct takes
sku: string;
name: string;
url: string;
stockStatus: string; // "IN_STOCK" | "OUT_OF_STOCK"
basePrice: number;
basePriceFormatted: string; // "$9.96"
}
interface DdOptionChoice { label: string; valueIndex: number }
interface DdOption {
groupLabel: string; // "Pack Size", "Color" — the real group name
attributeCode: string;
choices: DdOptionChoice[];
}
interface DdVariant {
sku: string;
stockStatus: string;
price: number;
priceFormatted: string;
selections: Record<string, number>; // attributeCode -> valueIndex
}
interface DdProduct {
urlKey: string;
sku: string;
name: string;
url: string;
stockStatus: string;
basePrice: number;
basePriceFormatted: string;
options: DdOption[];
variants: DdVariant[];
}
interface DdPriceResult {
urlKey: string;
sku: string;
variantSku: string | null; // null until every multi-choice group is picked
stockStatus: string | null;
price: number | null;
priceFormatted: string | null;
applied: { group: string; choice: string }[];
missingGroups: string[]; // groups with >1 choice and no selection applied
unmatched: string[]; // selections that didn't match a real group/choice
handoffUrl: string; // the product's entry page
}
interface DdCartHandoff {
urlKey: string;
sku: string;
name: string;
url: string; // the product page — DecksDirect publishes no query-param deep link
applied: { group: string; choice: string }[];
price: number | null;
priceFormatted: string | null;
stockStatus: string | null;
missingGroups: string[];
unmatched: string[];
}Examples
// What does the Beach Dune, 1050-pack option of a specific screw actually cost, and is it in stock?
const priced = await bowmark.providers.decksdirect.addToCart("trapease-3-composite-deck-screw-by-fastenmaster", { "Pack Size": "1050 pack", Color: "Beach Dune" });
return { openThis: priced.url, price: priced.priceFormatted, inStock: priced.stockStatus === "IN_STOCK", pick: priced.applied };// Find composite decking, then price one specific board.
const matches = await bowmark.providers.decksdirect.searchProducts("composite decking");
const board = matches[0];
const priced = await bowmark.providers.decksdirect.priceConfiguration(board.urlKey, { Color: "Beach Dune" });
return { total: priced.priceFormatted, missing: priced.missingGroups, siteUrl: priced.handoffUrl };