Price a school-supply list across Target and Walmart
Given a list of item queries (a school supply list), fans out to Target and Walmart search, picks the cheapest in-stock match per item per retailer, and…
Given a list of item queries (a school supply list), fans out to Target and Walmart search, picks the cheapest in-stock match per item per retailer, and returns each retailer's basket total plus which items neither retailer has in stock right now — kept apart from the items a retailer stocks but would not price, and from the searches that never answered.
Also known as: back to school shopping, back-to-school shopping list, school supply list price, school shopping basket, price a shopping list, compare school supplies target walmart
Call it
bowmark.school_shopping_basket.priceList(args: { items: string[] }): Promise<SchoolShoppingBasket>Functions
| Function | What it does |
|---|---|
priceList | Prices a multi-item shopping list at Target and Walmart, one basket total per retailer. |
Types
interface BasketItemMatch {
query: string
title: string
url: string
price: { amount: number; currency: string } // integer minor units
}
interface RetailerBasket {
total: { amount: number; currency: string } | null // sums matched only — a partial
// sum whenever unpriced, unmatched
// or incomplete is non-empty
matched: BasketItemMatch[]
unavailable: string[] // this retailer ANSWERED with no in-stock row at all —
// a real stockout
unmatched: string[] // this retailer answered with in-stock rows, none identifiable
// as the thing asked for — NOT out of stock; ask more
// specifically, or read their search page. Not in total
unpriced: string[] // this retailer HAS it in stock and rendered no price — NOT
// out of stock; go read the price on the page. Not in total
incomplete: string[] // this retailer's search never answered — NOT out of stock,
// nothing was learned; retry with fewer items or more time
}
interface SchoolShoppingBasket {
retailers: { target: RetailerBasket; walmart: RetailerBasket }
warnings: string[]
}
type CallOptions = {
timeoutMs?: number // per-provider budget in ms, default 30000, clamped to 1000-55000.
// A provider slower than this is DROPPED from the results and
// NAMED in warnings — never silently absent
}Examples
// A real back-to-school list — run this as-is to see genuine live baskets.
const basket = await bowmark.school_shopping_basket.priceList({
items: [
"24 pack crayola crayons",
"TI-84 Plus CE calculator",
"5 subject wide ruled notebook",
],
});
// unavailable is the ONLY stock fact. unpriced means they HAVE it and showed no
// price; unmatched means they answered and we could not identify it; incomplete
// means the search never answered. Never report any of those three as out of
// stock — open the product page, ask more specifically, or retry.
for (const [name, b] of Object.entries(basket.retailers)) {
log(`${name}: ${b.total?.amount ?? "n/a"} cents, ${b.unavailable.length} not stocked, ${b.unmatched.length} unidentified, ${b.unpriced.length} unpriced, ${b.incomplete.length} unread`);
}
return basket;