Bowmark AIdocs

Mossy Oak

Mossy Oak camo-apparel and gear catalogue — every product, its camo-pattern and size variants, real prices and stock — read off the live Shopify…

Mossy Oak camo-apparel and gear catalogue — every product, its camo-pattern and size variants, real prices and stock — read off the live Shopify storefront, plus a live-validated checkout handoff link.

Domain: mossyoak.com

Also known as: mossyoak, Mossy Oak, Mossy Oak Store

Call it directly

bowmark.providers.mossyoak.listMossyoakProducts(opts?: { limit?: number }): Promise<MossyoakProduct[]>
bowmark.providers.mossyoak.getMossyoakProduct(handle: string): Promise<MossyoakProduct>
bowmark.providers.mossyoak.getMossyoakCheckoutLink(handle: string, variantTitleOrOptions: string, opts?: { quantity?: number }): Promise<MossyoakCheckoutLink>
bowmark.providers.mossyoak.searchProducts(opts?: { productType?: string; limit?: number }): Promise<MossyoakCatalogue>

Functions

FunctionWhat it does
listMossyoakProductsReads the live Mossy Oak catalogue as the storefront publishes it — every product, its handle, title, vendor, description, tags, images and the per-variant price the storefront is quoting…
getMossyoakProductReads one product by its handle — every camo-pattern/size variant, its exact price and whether that specific variant is purchasable right now.
getMossyoakCheckoutLinkResolves a product handle + a variant match (either the exact variant title like "Full Foliage / M/L", or a substring of it) to a real Shopify cart-permalink URL, validated live against the…
searchProductsReads the same live catalogue listMossyoakProducts does and filters it by product type ("vest", "jacket", …, matched case-insensitively against each product's own productType) before…

Types

interface MossyoakVariant {
  /** Shopify's numeric variant id as a string. */
  id: string;
  /** The variant's own label, e.g. "Full Foliage / M/L". */
  title: string;
  /** String verbatim from the storefront — "149.99" (dollars) on /products.json, "14999" (cents) on /products/<h>.js. */
  price: string;
  /** Same scale as price. Null when the variant is not on sale. */
  compareAtPrice: string | null;
  /** The store's own SKU. Null on a variant without one. */
  sku: string | null;
  /** Whether the variant is purchasable right now. */
  available: boolean;
  /** e.g. ["Full Foliage", "M/L"] — camo pattern + combined size. */
  options: string[];
}
interface MossyoakProduct {
  /** The handle is the only stable identifier across the catalogue. */
  handle: string;
  title: string;
  vendor: string;
  productType: string;
  url: string;
  descriptionHtml: string | null;
  optionNames: string[];
  variants: MossyoakVariant[];
  /** Same scale as variants — see MossyoakVariant.price. */
  priceRange: { min: string; max: string } | null;
  /** True if ANY variant is purchasable. */
  inStock: boolean;
  tags: string[];
  /** Mossy Oak's own images, in the order the storefront publishes them. */
  images: string[];
}
interface MossyoakCatalogue {
  /** All matching products, in-stock first, then by handle. */
  products: MossyoakProduct[];
  /** What the filter DROPPED, in the same register the rest of the library uses. */
  warnings: string[];
}
interface MossyoakCheckoutLink {
  /** Shopify's own cart-permalink URL — a GET that adds the line item and redirects into the cart. */
  url: string;
  /** The exact variant the link resolved to, read live off the storefront. */
  variant: MossyoakVariant;
  /** The product the variant belongs to. */
  product: MossyoakProduct;
}

Examples

// what are the cheapest in-stock Mossy Oak pieces right now?
const all = await bowmark.providers.mossyoak.listMossyoakProducts({ limit: 50 });
const inStock = all.filter(p => p.inStock).sort((a, b) => Number(a.priceRange?.min ?? 0) - Number(b.priceRange?.min ?? 0));
log(inStock.slice(0, 5).map(p => `${p.title} from $${p.priceRange?.min}`).join(", "));
// what camo patterns of the Longbeard Elite Turkey Vest are left, and in which sizes?
const p = await bowmark.providers.mossyoak.getMossyoakProduct("mossy-oak-longbeard-elite-turkey-vest");
const left = p.variants.filter(v => v.available);
log(left.length ? left.map(v => `${v.title} @ $${v.price}`).join(", ") : `${p.title} is sold out`);