Bowmark AIdocs

B&H Photo

B&H Photo (bhphotovideo.com) — live product search over this store's own catalogue, cheapest matching item first.

Domain: bhphotovideo.com

Also known as: B&H, B&H Photo, BH Photo, bhphoto

Prefer the capability

bowmark.pcparts covers this provider and routes around it when it is having a bad day. Reach for this page when you need bhphotovideo.com specifically.

Call it directly

bowmark.providers.bhphoto.search(part: string): Promise<StoreOffer[]>
bowmark.providers.bhphoto.getProduct(url: string): Promise<StoreProduct>
bowmark.providers.bhphoto.checkStock(url: string): Promise<StoreStock>

Functions

FunctionWhat it does
searchSearches bhphotovideo.com for a part and returns up to 3 rows, cheapest first.
getProductReads ONE bhphotovideo.com product page in full — the identity search cannot give you (SKU, manufacturer part number, brand), the current price and availability, and the store's whole…
checkStockAnswers whether ONE bhphotovideo.com item is actually gettable right now, rather than merely listed at a price — the question search cannot answer, because the grid carries no…

Types

// B&H Photo's OWN row shape — not the `pcparts` capability contract.
interface StoreOffer {
  title: string;           // the listing title as the store writes it
  price: number | null;    // USD; null when the tile shows no price
  url: string | null;      // product page on bhphotovideo.com
}

// One product page in full. Nulls mean "B&H Photo does not report it for
// this product", never "we failed to read it".
interface StoreSpec { group: string; name: string; value: string }
interface StoreProduct {
  url: string;
  title: string;
  brand: string | null;
  sku: string | null;          // B&H Photo's own stock number
  mpn: string | null;          // manufacturer part number — the cross-retailer identity
  price: number | null;        // USD
  currency: string;
  availability: string | null; // "InStock" / "OutOfStock" / …
  rating: number | null;       // mean customer rating; null when unrated
  description: string | null;
  images: string[];
  specs: StoreSpec[];          // the store's own spec sheet, in its own groups
}

// "Can I actually get this right now?" — THREE facts, because on a real
// storefront they disagree: B&H Photo will cart a "Temporarily Out of
// Stock" item, so `orderable` alone overstates and the wording alone
// understates. Read the one your decision turns on.
interface StoreStock {
  url: string;
  title: string;
  sku: string | null;
  availability: string | null;     // "InStock" | "BackOrder" | "OutOfStock" |
                                   // "Discontinued" | "PreOrder" |
                                   // "LimitedAvailability"; null = wording we
                                   // do not classify — read availabilityText
  availabilityText: string | null; // B&H Photo's OWN words, verbatim
  orderable: boolean;              // is the cart control actually on the page
  price: number | null;            // USD
  currency: string;
  checkedAt: string;               // ISO-8601 — stock is only true at an instant
}

Examples

const rows = await bowmark.providers.bhphoto.search("RTX 4070 Super");
return rows[0] ?? null;
// Price a part, then pull the full spec sheet + part number for the cheapest one.
const [cheapest] = await bowmark.providers.bhphoto.search("Samsung 990 PRO 1TB");
if (!cheapest?.url) return null;
const product = await bowmark.providers.bhphoto.getProduct(cheapest.url);
return { mpn: product.mpn, price: product.price, specs: product.specs };
pcpartsPC Parts (multi-retailer) — the capability this provider backs.
microcenterAlso backs the same capability.
neweggAlso backs the same capability.