List published products
Paginated catalogue of the site's PUBLISHED products, scoped to the `:siteId` in the URL and served behind a required storefront publishable key. Supports free-text `search` on title and slug, an exact `kind` filter (`standard` | `bookable`), and `sortBy` on a whitelisted set (`title` | `price_cents` | `created_at`) with `sortOrder`. Draft, archived, and deleted products are never returned. Each item exposes only the public catalogue whitelist (wire id, slug, title, description, pricing, `images`, `thumbnail`, the enriched `gallery` of `{ url, alt, caption }` per image, kind, SEO fields, SKU); no stock, tenant, or internal fields are surfaced. `images` stays a plain URL array and `gallery` is the additive metadata-carrying projection of the same images (alt text + caption for image SEO and accessibility). When the `product_variants` slice is on, each item also carries its `variants` array with the closed per-variant whitelist (variant wire id, title, sku, priceCents, compareAtPriceCents, position, the per-variant `gallery` of `{ url, alt, caption }` (the variant's own image subset, or the full product gallery when it selects none), and option-value name pairs ordered by option position); per-variant stock is never surfaced. When the slice is off, or for a `bookable` product, `variants` is an empty array. The flag gates serialization ONLY: the published-only, tenant, and soft-delete filters hold on both flag states. Optional `collection` and `category` filters accept a public wire id or slug and resolve only within the current site. Category filters require a visible root and include its subtree while re-applying active, non-internal visibility through every ancestor. Unknown, hidden, internal, and cross-tenant values return the same 404. When the `product_collections` slice is off, both filters are ignored and the pre-D2 full catalogue behavior is restored. > **Note:** This endpoint requires the e-commerce feature to be enabled on your site.
/productshttps://api.lynkow.com/storefront/{siteId}Query parameters
categorystring1-200 characters
collectionstring1-200 characters
kindenum("standard" | "bookable")Product kind: standard or bookable. One of: standard, bookable
limitnumberNumber <= 100
pagenumberNumber
searchstringFull-text search query. Max 200 characters
sortByenum("title" | "price_cents" | "created_at")One of: title, price_cents, created_at
sortOrderenum("asc" | "desc")One of: asc, desc