Company Enrollment Packs index
Token-authenticated; requires storefront.view (legacy
enrollment_packs.view accepted during the migration). Returns
EVERY pack for the calling company regardless of lifecycle, so
admins can manage inactive (draft) rows. Same cursor / filter /
sort / q contract as the public catalog; adds filter[status]
(published/draft) and filter[active].
Authorizations
Bearer token authentication. Accepts company-admin tokens with
storefront.view for read operations and storefront.update
for writes and scan triggers (legacy per-resource grants like
categories.update / products.view / etc. are still accepted
during the migration), required on every company operation.
Storefront public operations under /api/v202604/{resource} and
/api/v202604/{resource}/{slug} are unauthenticated
(security: []).
Query Parameters
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.
"fr"
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.
Rotulus cursor returned in meta.pagination.next_cursor (or
prev_cursor). Omit on the first page.
Page size. Default 25. Max 100. Requests above 100 return 422.
1 <= x <= 100ISO-2 country code. Restricts the catalog to resources available
in that country — combining the with_country_iso scope's
OR-empty semantics: unrestricted resources (no access_countries
rows) match every country.
"GB"
ISO locale. Restricts the catalog to resources translated in that locale.
"fr"
One of draft, scheduled, or published. Restricts the index to a
single lifecycle state. Company-surface only. Matches the STORED
status column, not the read-time-resolved status: a past-due
scheduled row (its publish_at has passed, so it renders as
published) is matched by filter[status]=scheduled, NOT by
filter[status]=published.
draft, scheduled, published Company-surface only. "true" / "false" restrict to active /
inactive rows; a blank value (filter[active]=) means "no
filter" — it is NOT where(active: nil).
, true, false Single sort key. Prefix with - for descending. Default
-created_at. These resources have no manual position, so
the position sort key is not offered.
title, -title, created_at, -created_at, updated_at, -updated_at Response
A page of enrollment packs.
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.