> For the complete Lynkow documentation index in agent-friendly format, see [llms.txt](/llms.txt).

# List published products

**Publié le** : 2026-08-19
**Catégorie** : Commerce

## `GET /products`

**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.

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `page` | query | number | No | Number |
| `limit` | query | number | No | Number <= 100 |
| `search` | query | string | No | Full-text search query. Max 200 characters |
| `kind` | query | "standard" \| "bookable" | No | Product kind: standard or bookable. One of: standard, bookable |
| `collection` | query | string | No | 1-200 characters |
| `category` | query | string | No | 1-200 characters |
| `sortBy` | query | "title" \| "price_cents" \| "created_at" | No | One of: title, price_cents, created_at |
| `sortOrder` | query | "asc" \| "desc" | No | One of: asc, desc |


### Responses

| Status | Description |
| --- | --- |
| `200` | Successful response |
| `401` | Missing or invalid storefront publishable key |
| `402` | The site subscription does not currently permit this operation |
| `403` | The storefront key origin is not allowed |
| `404` | Site, resource, or commerce feature not found |
| `422` | Validation error |


---