Bowmark AIdocs

Zenni Optical

Online prescription eyewear.

Online prescription eyewear. Prices a real frame + Rx + lens-type configuration off the site's own configurator, and checks live per-SKU stock.

Domain: zennioptical.com

Also known as: Zenni, Zenni Optical, ZENNI

Call it directly

bowmark.providers.zennioptical.searchFrames(query: string, limit?: number): Promise<ZenniFrameSearch>
bowmark.providers.zennioptical.getFrame(skuId: string): Promise<ZenniFrame>
bowmark.providers.zennioptical.checkStock(skuId: string): Promise<ZenniStock>
bowmark.providers.zennioptical.priceLensConfig(skuId: string, rx: ZenniRx): Promise<ZenniLensPriceRow[]>

Functions

FunctionWhat it does
searchFramesSearches Zenni's own storefront catalog for what a shopper would type ("round tortoise", "titanium rimless") and returns matching frames with the sku every other function here takes.
getFrameReads one frame's name, base price and per-color-variant price straight off the product page's own embedded data.
checkStockChecks live per-SKU inventory off Zenni's own inventory endpoint.
priceLensConfigRuns a real prescription through Zenni's own order-configurator wizard (usage type -> manual Rx entry -> confirm) and returns the priced lens-type matrix the site computes for that exact Rx…

Types

interface ZenniFrameSummary {
  sku: string;
  name: string;
  color: string;
  price: number;
  salePrice: number;
  inStock: boolean;
  shape: string | null;
  material: string | null;
  url: string;
}
interface ZenniFrameSearch {
  frames: ZenniFrameSummary[];
  total: number;
}
interface ZenniFrame {
  sku: string;
  name: string;
  price: number;
  colors: Array<{ sku: string; price: number }>;
}
interface ZenniStock {
  skuId: string;
  inStock: boolean;
  quantity: number;
  backOrderable: boolean;
  preOrderable: boolean;
}
interface ZenniRx {
  odSph: number;
  osSph: number;
  pd: number;
  birthYear: number;
}
interface ZenniLensPriceRow {
  type: string;
  minPrice: number;
  maxPrice: number;
  subTypes: Array<{ type: string; usage: string; minPrice: number; maxPrice: number; tints: boolean }>;
}