Skip to main content
GET
Products in a Category

Path Parameters

id
integer
required

The unique identifier of the category whose products to list.

Query Parameters

lang
string

Response locale. ISO code (e.g. fr, de). When omitted, responds in the company's default locale. On the public surface, falls back to en for any translated field missing in the requested locale.

Example:

"fr"

country
string

ISO-2 country code that selects COUNTRY-RELATIVE Product pricing. Product-only — Categories and other storefront resources use filter[country] as an access-list visibility filter instead.

For Products, country drives the pricing block and each variant's variant_countries: it picks which per-country variant price and currency are rendered. On the catalog it also drops products with no active variant in the requested country. When omitted, falls back to the company's default country.

Example:

"GB"

q
string

Free-text search. Backed by Searchkick / Elasticsearch over translation-aware title and description fields, plus slug. On /products it additionally matches the product-level sku and every variant SKU.

On /products the match is TIERED: the term is matched first against the fields that NAME a product — title in every locale, slug, sku and every variant SKU — and description / metafields answer only when no name match survives the other filters on the request. A bundle's copy lists the products it contains, so matching name and copy in one pass returned every pack that merely mentions a product ahead of the product itself.

Substring-aware (word_middle), so partial terms match. Results are returned in the requested sort order, not by relevance — search resolves to an id set that the ordinary paginated query then filters, and that id set is capped at 1000 matches per request.

page[cursor]
string

Rotulus cursor returned in meta.pagination.next_cursor (or prev_cursor). Omit on the first page.

page[limit]
integer
default:25

Page size. Default 25. Max 100. Requests above 100 return 422.

Required range: 1 <= x <= 100
filter[status]
enum<string>

Restrict to a single stored lifecycle state.

Available options:
active,
draft,
archived
filter[availability]
enum<string>
default:all

Stock filter. in_stock restricts to purchasable products; all (default) imposes no stock constraint.

Available options:
all,
in_stock
filter[bundle]
boolean

true returns only bundle products; false returns only non-bundle products.

filter[has_subscription_plans]
boolean

true returns only products that have at least one active subscription plan; false returns only products that have none. Matches the has_subscription_plans field on each product in the response exactly — a product whose only plan link is inactive, or whose only plan has been deactivated, reads false and is returned by false. Omit the parameter to apply no subscription constraint.

sort
enum<string>

Single sort key. Prefix with - for descending. Default priority then id.

Available options:
priority,
-priority,
title,
-title,
created_at,
-created_at,
updated_at,
-updated_at

Response

A page of products in this category, every lifecycle state.

Shared success envelope for list / show / create / update responses: the resource payload is returned alongside a top-level integer status and meta. Composed onto each resource response via allOf.

status
integer
required
Example:

200

meta
object
required

Response metadata included on every successful response body. request_id and timestamp are always present; list endpoints also add pagination.

products
object[]
required