Collections require product scopes. Reads use read_products; writes use write_products. Collections support name, slug, description, seo_title, seo_description, image_id, template_handle, match_type, is_active, and rule fields. slug is optional on create and generated from the name when omitted; on update, a supplied slug must be non-empty and valid. Rules can match tag, category, vendor, brand, or product title. Assigning a non-empty image_id also requires read_files for the referenced upload image. On create, omitting template_handle assigns default_collection. Use default_collection for the default Collection template, or pass an alternate Collection template handle configured for the store. Omit template_handle on update to leave the current assignment unchanged; an empty string is invalid. AI translation is not exposed through the Store API.
Endpoints#
Collection limits
Fetch Collection limits and per-field constraints.
Returns the per-field maximum lengths, list limits, rule limits, and request caps that apply to Collection endpoints. This endpoint is for external integrations; Tringify admin clients use the admin contract endpoint.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
List collections
List collections for the store.
Returns paginated collections. Pagination, sorting, search, and status validation are enforced by the storefront service.
Query parameters
| Name | Type | Description |
|---|---|---|
page
|
integer |
Page number. |
limit
|
integer |
Page size. |
search
|
string |
Search collections by name or slug. |
status
|
string |
Filter by active or inactive. |
sort_by
|
string |
Sort field from the Collection list contract.
Allowed values
nameproduct_countcreated_atupdated_at |
sort_direction
|
string |
Sort direction from the Collection list contract.
Allowed values
ascdesc |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Search collections
Search collections for picker-style suggestions.
Returns lightweight collection suggestions by query. This endpoint is intended for pickers and simple selection UIs.
Query parameters
| Name | Type | Description |
|---|---|---|
q
|
string |
Search query. |
limit
|
integer |
Suggestion count. |
offset
|
integer |
Number of suggestions to skip. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Get a collection
Fetch one collection by id.
Returns the collection if it belongs to the token's store.
Path parameters
| Name | Type | Description |
|---|---|---|
id
required
|
uuid |
Collection id. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
400STORE_API_INVALID_COLLECTION_IDCollection id is not a valid UUID.
-
404COLLECTION_NOT_FOUNDCollection does not exist in this store.
Create a collection
Create a collection.
Creates a collection. name is required; optional text fields, image assignment, template assignment, match type, active state, and rules follow the Collection resource contract. If image_id is non-empty, it must point to an upload image in the same store and the token must also have read_files.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
name
required
|
string |
Collection name. |
slug
|
string |
Optional slug. Omit to generate from name. |
description
|
string |
Optional plain-text description. |
seo_title
|
string |
Optional SEO title. |
seo_description
|
string |
Optional SEO description. |
image_id
|
string |
Optional upload image file id. Non-empty values require |
template_handle
|
string |
Template assignment. On create, omitting this field or sending an empty string assigns |
match_type
|
string |
|
is_active
|
boolean |
Whether the collection is visible on the storefront. |
rules
|
array<object> |
Automatic collection rules. Each rule has field, operator, optional value, and include_subcategories. |
Errors
-
400STORE_API_INVALID_REQUEST_BODYRequest body is not valid JSON.
-
400COLLECTION_NAME_REQUIREDName is empty after normalization.
-
400COLLECTION_NAME_TOO_LONGName exceeds the Collection contract max length.
-
400COLLECTION_NAME_INVALID_CHARSName contains unsupported control characters.
-
400COLLECTION_DESCRIPTION_TOO_LONGDescription exceeds the Collection contract max length.
-
400COLLECTION_SEO_TITLE_TOO_LONGSEO title exceeds the Collection contract max length.
-
400COLLECTION_SEO_DESCRIPTION_TOO_LONGSEO description exceeds the Collection contract max length.
-
400COLLECTION_SLUG_REQUIREDA provided update slug is empty after normalization.
-
400COLLECTION_SLUG_TOO_LONGSlug exceeds the Collection contract max length.
-
400COLLECTION_SLUG_INVALID_FORMATSlug is not valid for Collection URLs.
-
400COLLECTION_SLUG_GENERATION_FAILEDA slug could not be generated from the supplied name.
-
400COLLECTION_MATCH_TYPE_INVALIDMatch type is not valid.
-
400COLLECTION_RULES_LIMIT_REACHEDRule count exceeds the Collection rule cap.
-
400COLLECTION_LIMIT_REACHEDStore collection cap has been reached.
-
400TEMPLATE_HANDLE_INVALIDTemplate handle is not valid for Collection templates.
-
400TEMPLATE_HANDLE_NOT_FOUNDTemplate handle does not exist on the store's primary active theme for Collection.
-
403STORE_ADMIN_TOKEN_RUNTIME_FORBIDDENA non-empty image_id requires read_files scope in addition to write_products.
-
404COLLECTION_NOT_FOUNDCollection does not exist in this store.
-
409COLLECTION_SLUG_DUPLICATESlug already exists in this store.
Update a collection
Update a collection.
Updates provided Collection fields. Omitted fields are left unchanged. Sending an empty image_id clears the image; sending a non-empty image_id requires read_files and the referenced file must be an upload image in the same store. Sending create_redirect can create a slug redirect when the slug changes.
Path parameters
| Name | Type | Description |
|---|---|---|
id
required
|
uuid |
Collection id. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
name
|
string |
Collection name. |
slug
|
string |
Optional slug. Omit to generate from name. |
description
|
string |
Optional plain-text description. |
seo_title
|
string |
Optional SEO title. |
seo_description
|
string |
Optional SEO description. |
image_id
|
string |
Optional upload image file id. Non-empty values require |
template_handle
|
string |
Template assignment. On create, omitting this field or sending an empty string assigns |
match_type
|
string |
|
is_active
|
boolean |
Whether the collection is visible on the storefront. |
rules
|
array<object> |
Automatic collection rules. Each rule has field, operator, optional value, and include_subcategories. |
create_redirect
|
boolean |
When slug changes, create a redirect from the previous slug. |
Errors
-
400STORE_API_INVALID_COLLECTION_IDCollection id is not a valid UUID.
-
400STORE_API_INVALID_REQUEST_BODYRequest body is not valid JSON.
-
400TRANSLATION_SOURCE_FIELD_HAS_TRANSLATIONSClearing a source field is blocked while translated values exist.
-
400COLLECTION_NAME_REQUIREDName is empty after normalization.
-
400COLLECTION_NAME_TOO_LONGName exceeds the Collection contract max length.
-
400COLLECTION_NAME_INVALID_CHARSName contains unsupported control characters.
-
400COLLECTION_DESCRIPTION_TOO_LONGDescription exceeds the Collection contract max length.
-
400COLLECTION_SEO_TITLE_TOO_LONGSEO title exceeds the Collection contract max length.
-
400COLLECTION_SEO_DESCRIPTION_TOO_LONGSEO description exceeds the Collection contract max length.
-
400COLLECTION_SLUG_REQUIREDA provided update slug is empty after normalization.
-
400COLLECTION_SLUG_TOO_LONGSlug exceeds the Collection contract max length.
-
400COLLECTION_SLUG_INVALID_FORMATSlug is not valid for Collection URLs.
-
400COLLECTION_SLUG_GENERATION_FAILEDA slug could not be generated from the supplied name.
-
400COLLECTION_MATCH_TYPE_INVALIDMatch type is not valid.
-
400COLLECTION_RULES_LIMIT_REACHEDRule count exceeds the Collection rule cap.
-
400COLLECTION_LIMIT_REACHEDStore collection cap has been reached.
-
400TEMPLATE_HANDLE_INVALIDTemplate handle is not valid for Collection templates.
-
400TEMPLATE_HANDLE_NOT_FOUNDTemplate handle does not exist on the store's primary active theme for Collection.
-
403STORE_ADMIN_TOKEN_RUNTIME_FORBIDDENA non-empty image_id requires read_files scope in addition to write_products.
-
404COLLECTION_NOT_FOUNDCollection does not exist in this store.
-
409COLLECTION_SLUG_DUPLICATESlug already exists in this store.
Delete a collection
Delete a collection.
Deletes a collection. If catalog links, discount targeting, menu items, or other dependent records require confirmation, retry with the returned confirmation token.
Path parameters
| Name | Type | Description |
|---|---|---|
id
required
|
uuid |
Collection id. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
confirmed
|
boolean |
On a confirmation retry, set this to true and send the returned confirmation_token. Omit it on the first request. |
confirmation_token
|
string |
Token from the CONFIRMATION_REQUIRED response. Omit it on the first request and resend the exact same id selection when using it. |
Errors
-
400STORE_API_INVALID_COLLECTION_IDCollection id is not a valid UUID.
-
400STORE_API_INVALID_REQUEST_BODYRequest body is not valid JSON.
-
400COLLECTION_CONFIRMATION_INVALIDConfirmation token is missing, expired, or mismatched.
-
400COLLECTION_BULK_DELETE_TOO_MANYBatch exceeds the Collection bulk delete cap.
-
404COLLECTION_NOT_FOUNDCollection does not exist in this store.
-
409CONFIRMATION_REQUIREDDelete requires confirmation because dependent records will be changed.
Bulk delete collections
Delete multiple collections.
Send collection UUIDs in collection_ids. Collections linked to a catalog cannot be deleted. If discount targeting or menu items will be removed, the API returns CONFIRMATION_REQUIRED; retry the exact same ids with confirmed: true and its confirmation_token. This operation is all-or-nothing: every requested collection must still exist and pass validation at commit time. A successful response returns the number deleted.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
collection_ids
required
|
array<string> |
Collection UUIDs to delete. |
confirmed
|
boolean |
On a confirmation retry, set this to true and send the returned confirmation_token. Omit it on the first request. |
confirmation_token
|
string |
Token from the CONFIRMATION_REQUIRED response. Omit it on the first request and resend the exact same id selection when using it. |
Errors
-
400STORE_API_INVALID_REQUEST_BODYRequest body is not valid JSON.
-
409COLLECTION_BULK_RACEDDelete impact changed during the transaction; retry with fresh data.
-
400STORE_API_INVALID_COLLECTION_IDCollection id is not a valid UUID.
-
400STORE_API_INVALID_REQUEST_BODYRequest body is not valid JSON.
-
400COLLECTION_CONFIRMATION_INVALIDConfirmation token is missing, expired, or mismatched.
-
400COLLECTION_BULK_DELETE_TOO_MANYBatch exceeds the Collection bulk delete cap.
-
404COLLECTION_NOT_FOUNDCollection does not exist in this store.
-
409CONFIRMATION_REQUIREDDelete requires confirmation because dependent records will be changed.
Bulk activate collections
Activate or deactivate multiple collections.
Updates storefront visibility for multiple collections.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
collection_ids
required
|
array<string> |
Collection ids to update. |
is_active
required
|
boolean |
Target storefront visibility. |
Errors
-
400STORE_API_INVALID_REQUEST_BODYRequest body is not valid JSON.
-
400COLLECTION_BULK_UPDATE_TOO_MANYBatch exceeds the Collection bulk update cap.
-
404COLLECTION_NOT_FOUNDCollection does not exist in this store.
List collection products
List product ids matched by a collection.
Returns the ids of products currently in this collection.
Path parameters
| Name | Type | Description |
|---|---|---|
id
required
|
uuid |
Collection id. |
Query parameters
| Name | Type | Description |
|---|---|---|
page
|
integer |
Page number. |
limit
|
integer |
Page size. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
400STORE_API_INVALID_COLLECTION_IDCollection id is not a valid UUID.
-
404COLLECTION_NOT_FOUNDCollection does not exist in this store.
List collection product details
List display-ready products matched by a collection.
Returns paginated product rows from the materialized collection, including title, slug, SKU, type, and image URL. Use search to filter by product title or SKU.
Path parameters
| Name | Type | Description |
|---|---|---|
id
required
|
uuid |
Collection id. |
Query parameters
| Name | Type | Description |
|---|---|---|
page
|
integer |
Page number. |
limit
|
integer |
Page size. |
search
|
string |
Filter products by title or SKU. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
400STORE_API_INVALID_COLLECTION_IDCollection id is not a valid UUID.
-
404COLLECTION_NOT_FOUNDCollection does not exist in this store.
List collection rules
List rules for a collection.
Returns automatic matching rules for this collection.
Path parameters
| Name | Type | Description |
|---|---|---|
id
required
|
uuid |
Collection id. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
400STORE_API_INVALID_COLLECTION_IDCollection id is not a valid UUID.
-
404COLLECTION_NOT_FOUNDCollection does not exist in this store.
Add collection rule
Add a rule to a collection.
Adds one automatic matching rule, then updates which products the collection includes.
Path parameters
| Name | Type | Description |
|---|---|---|
id
required
|
uuid |
Collection id. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
field
required
|
string |
Rule field: tag, category, vendor, brand, or title. |
operator
required
|
string |
Rule operator allowed for the field. |
value
|
string |
Rule value. Required for value-bearing operators. |
include_subcategories
|
boolean |
Only valid for category rules. |
Errors
-
400STORE_API_INVALID_COLLECTION_IDCollection id is not a valid UUID.
-
400STORE_API_INVALID_REQUEST_BODYRequest body is not valid JSON.
-
400COLLECTION_RULES_LIMIT_REACHEDRule count exceeds the Collection rule cap.
-
400COLLECTION_RULE_FIELD_INVALIDRule field is not valid.
-
400COLLECTION_RULE_OPERATOR_INVALIDRule operator is not valid for the selected field.
-
400COLLECTION_RULE_VALUE_REQUIREDThis rule operator requires a value.
-
400COLLECTION_RULE_SUBCATEGORIES_NOT_ALLOWEDinclude_subcategories is only valid for category rules.
-
400COLLECTION_RULE_TAG_ID_INVALIDTag value is not a valid integer id.
-
400COLLECTION_RULE_CATEGORY_ID_INVALIDCategory value is not a valid integer id.
-
400COLLECTION_RULE_VENDOR_ID_INVALIDVendor value is not a valid integer id.
-
400COLLECTION_RULE_BRAND_ID_INVALIDBrand value is not a valid integer id.
-
400COLLECTION_RULE_TITLE_TOO_LONGTitle rule value exceeds the contract max length.
-
400COLLECTION_RULE_TAG_NOT_FOUNDReferenced tag does not exist in this store.
-
400COLLECTION_RULE_CATEGORY_NOT_FOUNDReferenced category does not exist in this store.
-
400COLLECTION_RULE_VENDOR_NOT_FOUNDReferenced vendor does not exist in this store.
-
400COLLECTION_RULE_BRAND_NOT_FOUNDReferenced brand does not exist in this store.
-
404COLLECTION_NOT_FOUNDCollection does not exist in this store.
-
409COLLECTION_RULE_DUPLICATEThe rule already exists on this collection.
Update collection rule
Update a rule on a collection.
Updates one automatic matching rule, then updates which products the collection includes.
Path parameters
| Name | Type | Description |
|---|---|---|
id
required
|
uuid |
Collection id. |
rule_id
required
|
uuid |
Rule id. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
field
required
|
string |
Rule field: tag, category, vendor, brand, or title. |
operator
required
|
string |
Rule operator allowed for the field. |
value
|
string |
Rule value. Required for value-bearing operators. |
include_subcategories
|
boolean |
Only valid for category rules. |
Errors
-
400STORE_API_INVALID_COLLECTION_IDCollection id is not a valid UUID.
-
400STORE_API_INVALID_REQUEST_BODYRequest body is not valid JSON.
-
400COLLECTION_RULES_LIMIT_REACHEDRule count exceeds the Collection rule cap.
-
400COLLECTION_RULE_FIELD_INVALIDRule field is not valid.
-
400COLLECTION_RULE_OPERATOR_INVALIDRule operator is not valid for the selected field.
-
400COLLECTION_RULE_VALUE_REQUIREDThis rule operator requires a value.
-
400COLLECTION_RULE_SUBCATEGORIES_NOT_ALLOWEDinclude_subcategories is only valid for category rules.
-
400COLLECTION_RULE_TAG_ID_INVALIDTag value is not a valid integer id.
-
400COLLECTION_RULE_CATEGORY_ID_INVALIDCategory value is not a valid integer id.
-
400COLLECTION_RULE_VENDOR_ID_INVALIDVendor value is not a valid integer id.
-
400COLLECTION_RULE_BRAND_ID_INVALIDBrand value is not a valid integer id.
-
400COLLECTION_RULE_TITLE_TOO_LONGTitle rule value exceeds the contract max length.
-
400COLLECTION_RULE_TAG_NOT_FOUNDReferenced tag does not exist in this store.
-
400COLLECTION_RULE_CATEGORY_NOT_FOUNDReferenced category does not exist in this store.
-
400COLLECTION_RULE_VENDOR_NOT_FOUNDReferenced vendor does not exist in this store.
-
400COLLECTION_RULE_BRAND_NOT_FOUNDReferenced brand does not exist in this store.
-
404COLLECTION_NOT_FOUNDCollection does not exist in this store.
-
409COLLECTION_RULE_DUPLICATEThe rule already exists on this collection.
-
400STORE_API_INVALID_COLLECTION_RULE_IDRule id is not a valid UUID.
Delete collection rule
Delete a rule from a collection.
Deletes one automatic matching rule, then updates which products the collection includes.
Path parameters
| Name | Type | Description |
|---|---|---|
id
required
|
uuid |
Collection id. |
rule_id
required
|
uuid |
Rule id. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
400STORE_API_INVALID_COLLECTION_IDCollection id is not a valid UUID.
-
400STORE_API_INVALID_COLLECTION_RULE_IDRule id is not a valid UUID.
-
404COLLECTION_NOT_FOUNDCollection or rule does not exist in this store.
Fields#
Field |
Kind |
Create |
Update |
Required |
Translatable |
|---|---|---|---|---|---|
|
text |
Yes |
Yes |
create |
Yes |
|
slug |
Yes |
Yes |
Yes |
|
|
textarea |
Yes |
Yes |
Yes |
|
|
text |
Yes |
Yes |
Yes |
|
|
textarea |
Yes |
Yes |
Yes |
|
|
image |
Yes |
Yes |
No |
|
|
template |
Yes |
Yes |
No |
|
|
select |
Yes |
Yes |
No |
|
|
boolean |
Yes |
Yes |
No |
|
|
boolean |
No |
Yes |
No |
|
|
integer |
No |
No |
No |
|
|
datetime |
No |
No |
No |
|
|
datetime |
No |
No |
No |
|
|
datetime |
No |
No |
No |
|
|
url |
No |
No |
No |
No |
Webhook events#
Collection webhook events are declared by the Collection resource contract. The event cards below include the topic, subscription scope, store permission, payload schema, and sample payload.
Collection created
Fired when a collection is created.
Payload fields
| Field | Type | Description |
|---|---|---|
collection.id |
string |
Always present |
collection.name |
string |
Can be removed/added via the Payload builder |
collection.slug |
string |
Can be removed/added via the Payload builder |
collection.description |
string |
Can be removed/added via the Payload builder |
collection.image_id |
string |
Can be removed/added via the Payload builder |
collection.image_url |
string |
Can be removed/added via the Payload builder |
collection.image_cdn_url |
string |
Can be removed/added via the Payload builder |
collection.seo_title |
string |
Can be removed/added via the Payload builder |
collection.seo_description |
string |
Can be removed/added via the Payload builder |
collection.template_handle |
string |
Can be removed/added via the Payload builder |
collection.match_type |
string |
Can be removed/added via the Payload builder |
collection.is_active |
boolean |
Can be removed/added via the Payload builder |
collection.product_count |
integer |
Can be removed/added via the Payload builder |
collection.materialized_at |
string |
Can be removed/added via the Payload builder |
collection.created_at |
string |
Can be removed/added via the Payload builder |
collection.updated_at |
string |
Can be removed/added via the Payload builder |
collection.rules[*].id |
string |
Can be removed/added via the Payload builder |
collection.rules[*].collection_id |
string |
Can be removed/added via the Payload builder |
collection.rules[*].field |
string |
Can be removed/added via the Payload builder |
collection.rules[*].operator |
string |
Can be removed/added via the Payload builder |
collection.rules[*].value |
string |
Can be removed/added via the Payload builder |
collection.rules[*].value_label |
string |
Can be removed/added via the Payload builder |
collection.rules[*].include_subcategories |
boolean |
Can be removed/added via the Payload builder |
Collection updated
Fired when a collection is updated — including rule changes and image changes.
Payload fields
| Field | Type | Description |
|---|---|---|
collection.id |
string |
Always present |
collection.name |
string |
Can be removed/added via the Payload builder |
collection.slug |
string |
Can be removed/added via the Payload builder |
collection.description |
string |
Can be removed/added via the Payload builder |
collection.image_id |
string |
Can be removed/added via the Payload builder |
collection.image_url |
string |
Can be removed/added via the Payload builder |
collection.image_cdn_url |
string |
Can be removed/added via the Payload builder |
collection.seo_title |
string |
Can be removed/added via the Payload builder |
collection.seo_description |
string |
Can be removed/added via the Payload builder |
collection.template_handle |
string |
Can be removed/added via the Payload builder |
collection.match_type |
string |
Can be removed/added via the Payload builder |
collection.is_active |
boolean |
Can be removed/added via the Payload builder |
collection.product_count |
integer |
Can be removed/added via the Payload builder |
collection.materialized_at |
string |
Can be removed/added via the Payload builder |
collection.created_at |
string |
Can be removed/added via the Payload builder |
collection.updated_at |
string |
Can be removed/added via the Payload builder |
collection.rules[*].id |
string |
Can be removed/added via the Payload builder |
collection.rules[*].collection_id |
string |
Can be removed/added via the Payload builder |
collection.rules[*].field |
string |
Can be removed/added via the Payload builder |
collection.rules[*].operator |
string |
Can be removed/added via the Payload builder |
collection.rules[*].value |
string |
Can be removed/added via the Payload builder |
collection.rules[*].value_label |
string |
Can be removed/added via the Payload builder |
collection.rules[*].include_subcategories |
boolean |
Can be removed/added via the Payload builder |
changed_fields |
array |
Always present |
Collection deleted
Fired when a collection is deleted.
Payload fields
| Field | Type | Description |
|---|---|---|
collection.id |
string |
Always present |
collection.name |
string |
Can be removed/added via the Payload builder |
collection.slug |
string |
Can be removed/added via the Payload builder |