# Update a channel `PATCH /platform/v1/channels/{channel_id}` ## Request example ```bash curl --request PATCH \ --url 'https://api.eu1.luigisbox.ai/platform/v1/channels/' \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/json' \ --data '{ "attribute_aliases": { "additionalProperty": "example" }, "name": "example", "visibility_filter": { "conditions": [ { "field": "example", "on_missing": "fail_closed", "operator": "eq", "source": "request", "value": "example", "value_from": {} } ], "operator": "and" } }' ``` ## Path Parameters | Name | Type | Required | Description | Constraints | |---|---|---|---|---| | `channel_id` | `string` | Yes | Channel Id | — | ## Request Body **Required.** ### application/json Schema: `object` #### Attributes | Attribute | Type | Required | Description | Constraints | |---|---|---|---|---| | `attribute_aliases` | `object` | No | Channel-facing name (key) bound to a catalog field (value), e.g. `{"product_name": "title"}`. A request naming `product_name` resolves to catalog `title` and the response comes back keyed `product_name`, while the catalog field stays addressable under its own name. A key is checked against the catalog's fields only as it is written: should the catalog later gain a field of that name, that field takes the name back and the alias stops taking effect. See [Attribute aliases](/concepts/catalogs-and-channels/#attribute-aliases) for the full contract. | — | | `attribute_aliases.*` | `string` | No | Additional property. | — | | `name` | `string` | No | Name | >= 1 characters; <= 256 characters | | `visibility_filter` | `anyOf(oneOf(object, oneOf(object, object)), null)` | No | Channel-wide scope AND-ed into every request served on the channel, as a FilterGroup (`{"operator": "and", "conditions": [...]}`). Leaf fields name catalog fields and must exist in the catalog. Omit to leave unchanged; send null to clear it. | — | | `visibility_filter.conditions` | `Array` | No | Leaf conditions and nested groups. | — | | `visibility_filter.conditions[].field` | `string` | Yes | Object field the condition reads. | — | | `visibility_filter.conditions[].on_missing` | `anyOf(string, null)` | No | With `value_from`: what the condition does when no anchor carries the attribute. | — | | `visibility_filter.conditions[].operator` | `string` | Yes | Comparison operator. | allowed values: eq, neq, gt, gte, lt, lte, in, not_in, matches, starts_with, ends_with, range, exists | | `visibility_filter.conditions[].source` | `string` | No | Provenance of the condition; stamped by the system, never read from a client. | allowed values: request, collection, surface, autofilter, business_rule, visibility | | `visibility_filter.conditions[].value` | `any` | No | Literal to compare against, or a trigger reference `{trigger_ref: ...}`; a scalar for eq/neq and the comparisons, a non-empty list for in/not_in, absent for exists. | — | | `visibility_filter.conditions[].value_from` | `anyOf(object, null)` | No | Dynamic reference read from the request's anchors instead of a literal `value`. | — | | `visibility_filter.conditions[].value_from.anchor_attribute` | `string` | Yes | Anchor attribute whose value the condition compares against. | — | | `visibility_filter.operator` | `string` | Yes | Boolean combinator applied to `conditions`. | allowed values: and, or, not | | `visibility_filter.$and` | `Array` | No | Nodes that must all match. | >= 1 items; <= 100 items | | `visibility_filter.$not` | `oneOf(object, object)` | No | A node that must not match. | — | | `visibility_filter.$or` | `Array` | No | Nodes of which at least one must match. | >= 1 items; <= 100 items | | `visibility_filter.*` | `object` | No | Operators applied to one field. Several operators in one object combine as AND. | — | | `visibility_filter.*.eq` | `anyOf(string \| number \| integer \| boolean \| null, object, object)` | No | — | — | | `visibility_filter.*.eq.index` | `integer` | No | — | >= 0 | | `visibility_filter.*.eq.n` | `integer` | No | — | >= 1 | | `visibility_filter.*.eq.path` | `string` | No | — | allowed values: first, last, all, first_n, last_n, at_index, all_but_first, all_but_last | | `visibility_filter.*.eq.select` | `string` | No | — | allowed values: first, last, all, first_n, last_n, at_index, all_but_first, all_but_last | | `visibility_filter.*.eq.trigger_ref` | `string` | Yes | — | /^trigger\./ | | `visibility_filter.*.eq.on_missing` | `string` | No | What the condition does when no anchor carries the attribute; defaults to fail_closed. | allowed values: fail_closed, ignore | | `visibility_filter.*.eq.value_from` | `object` | Yes | — | — | | `visibility_filter.*.eq.value_from.anchor_attribute` | `string` | Yes | — | >= 1 characters | | `visibility_filter.*.exists` | `boolean` | No | — | — | | `visibility_filter.*.gt` | `anyOf(string \| number \| integer \| boolean \| null, object, object)` | No | — | — | | `visibility_filter.*.gt.index` | `integer` | No | — | >= 0 | | `visibility_filter.*.gt.n` | `integer` | No | — | >= 1 | | `visibility_filter.*.gt.path` | `string` | No | — | allowed values: first, last, all, first_n, last_n, at_index, all_but_first, all_but_last | | `visibility_filter.*.gt.select` | `string` | No | — | allowed values: first, last, all, first_n, last_n, at_index, all_but_first, all_but_last | | `visibility_filter.*.gt.trigger_ref` | `string` | Yes | — | /^trigger\./ | | `visibility_filter.*.gt.on_missing` | `string` | No | What the condition does when no anchor carries the attribute; defaults to fail_closed. | allowed values: fail_closed, ignore | | `visibility_filter.*.gt.value_from` | `object` | Yes | — | — | | `visibility_filter.*.gt.value_from.anchor_attribute` | `string` | Yes | — | >= 1 characters | | `visibility_filter.*.gte` | `anyOf(string \| number \| integer \| boolean \| null, object, object)` | No | — | — | | `visibility_filter.*.gte.index` | `integer` | No | — | >= 0 | | `visibility_filter.*.gte.n` | `integer` | No | — | >= 1 | | `visibility_filter.*.gte.path` | `string` | No | — | allowed values: first, last, all, first_n, last_n, at_index, all_but_first, all_but_last | | `visibility_filter.*.gte.select` | `string` | No | — | allowed values: first, last, all, first_n, last_n, at_index, all_but_first, all_but_last | | `visibility_filter.*.gte.trigger_ref` | `string` | Yes | — | /^trigger\./ | | `visibility_filter.*.gte.on_missing` | `string` | No | What the condition does when no anchor carries the attribute; defaults to fail_closed. | allowed values: fail_closed, ignore | | `visibility_filter.*.gte.value_from` | `object` | Yes | — | — | | `visibility_filter.*.gte.value_from.anchor_attribute` | `string` | Yes | — | >= 1 characters | | `visibility_filter.*.in` | `anyOf(Array, object, object)` | No | — | — | | `visibility_filter.*.in.index` | `integer` | No | — | >= 0 | | `visibility_filter.*.in.n` | `integer` | No | — | >= 1 | | `visibility_filter.*.in.path` | `string` | No | — | allowed values: first, last, all, first_n, last_n, at_index, all_but_first, all_but_last | | `visibility_filter.*.in.select` | `string` | No | — | allowed values: first, last, all, first_n, last_n, at_index, all_but_first, all_but_last | | `visibility_filter.*.in.trigger_ref` | `string` | Yes | — | /^trigger\./ | | `visibility_filter.*.in.on_missing` | `string` | No | What the condition does when no anchor carries the attribute; defaults to fail_closed. | allowed values: fail_closed, ignore | | `visibility_filter.*.in.value_from` | `object` | Yes | — | — | | `visibility_filter.*.in.value_from.anchor_attribute` | `string` | Yes | — | >= 1 characters | | `visibility_filter.*.lt` | `anyOf(string \| number \| integer \| boolean \| null, object, object)` | No | — | — | | `visibility_filter.*.lt.index` | `integer` | No | — | >= 0 | | `visibility_filter.*.lt.n` | `integer` | No | — | >= 1 | | `visibility_filter.*.lt.path` | `string` | No | — | allowed values: first, last, all, first_n, last_n, at_index, all_but_first, all_but_last | | `visibility_filter.*.lt.select` | `string` | No | — | allowed values: first, last, all, first_n, last_n, at_index, all_but_first, all_but_last | | `visibility_filter.*.lt.trigger_ref` | `string` | Yes | — | /^trigger\./ | | `visibility_filter.*.lt.on_missing` | `string` | No | What the condition does when no anchor carries the attribute; defaults to fail_closed. | allowed values: fail_closed, ignore | | `visibility_filter.*.lt.value_from` | `object` | Yes | — | — | | `visibility_filter.*.lt.value_from.anchor_attribute` | `string` | Yes | — | >= 1 characters | | `visibility_filter.*.lte` | `anyOf(string \| number \| integer \| boolean \| null, object, object)` | No | — | — | | `visibility_filter.*.lte.index` | `integer` | No | — | >= 0 | | `visibility_filter.*.lte.n` | `integer` | No | — | >= 1 | | `visibility_filter.*.lte.path` | `string` | No | — | allowed values: first, last, all, first_n, last_n, at_index, all_but_first, all_but_last | | `visibility_filter.*.lte.select` | `string` | No | — | allowed values: first, last, all, first_n, last_n, at_index, all_but_first, all_but_last | | `visibility_filter.*.lte.trigger_ref` | `string` | Yes | — | /^trigger\./ | | `visibility_filter.*.lte.on_missing` | `string` | No | What the condition does when no anchor carries the attribute; defaults to fail_closed. | allowed values: fail_closed, ignore | | `visibility_filter.*.lte.value_from` | `object` | Yes | — | — | | `visibility_filter.*.lte.value_from.anchor_attribute` | `string` | Yes | — | >= 1 characters | | `visibility_filter.*.matches` | `anyOf(string \| number \| integer \| boolean \| null, object, object)` | No | — | — | | `visibility_filter.*.matches.index` | `integer` | No | — | >= 0 | | `visibility_filter.*.matches.n` | `integer` | No | — | >= 1 | | `visibility_filter.*.matches.path` | `string` | No | — | allowed values: first, last, all, first_n, last_n, at_index, all_but_first, all_but_last | | `visibility_filter.*.matches.select` | `string` | No | — | allowed values: first, last, all, first_n, last_n, at_index, all_but_first, all_but_last | | `visibility_filter.*.matches.trigger_ref` | `string` | Yes | — | /^trigger\./ | | `visibility_filter.*.matches.on_missing` | `string` | No | What the condition does when no anchor carries the attribute; defaults to fail_closed. | allowed values: fail_closed, ignore | | `visibility_filter.*.matches.value_from` | `object` | Yes | — | — | | `visibility_filter.*.matches.value_from.anchor_attribute` | `string` | Yes | — | >= 1 characters | | `visibility_filter.*.neq` | `anyOf(string \| number \| integer \| boolean \| null, object, object)` | No | — | — | | `visibility_filter.*.neq.index` | `integer` | No | — | >= 0 | | `visibility_filter.*.neq.n` | `integer` | No | — | >= 1 | | `visibility_filter.*.neq.path` | `string` | No | — | allowed values: first, last, all, first_n, last_n, at_index, all_but_first, all_but_last | | `visibility_filter.*.neq.select` | `string` | No | — | allowed values: first, last, all, first_n, last_n, at_index, all_but_first, all_but_last | | `visibility_filter.*.neq.trigger_ref` | `string` | Yes | — | /^trigger\./ | | `visibility_filter.*.neq.on_missing` | `string` | No | What the condition does when no anchor carries the attribute; defaults to fail_closed. | allowed values: fail_closed, ignore | | `visibility_filter.*.neq.value_from` | `object` | Yes | — | — | | `visibility_filter.*.neq.value_from.anchor_attribute` | `string` | Yes | — | >= 1 characters | | `visibility_filter.*.not_in` | `anyOf(Array, object, object)` | No | — | — | | `visibility_filter.*.not_in.index` | `integer` | No | — | >= 0 | | `visibility_filter.*.not_in.n` | `integer` | No | — | >= 1 | | `visibility_filter.*.not_in.path` | `string` | No | — | allowed values: first, last, all, first_n, last_n, at_index, all_but_first, all_but_last | | `visibility_filter.*.not_in.select` | `string` | No | — | allowed values: first, last, all, first_n, last_n, at_index, all_but_first, all_but_last | | `visibility_filter.*.not_in.trigger_ref` | `string` | Yes | — | /^trigger\./ | | `visibility_filter.*.not_in.on_missing` | `string` | No | What the condition does when no anchor carries the attribute; defaults to fail_closed. | allowed values: fail_closed, ignore | | `visibility_filter.*.not_in.value_from` | `object` | Yes | — | — | | `visibility_filter.*.not_in.value_from.anchor_attribute` | `string` | Yes | — | >= 1 characters | #### Request body example ```json { "attribute_aliases": { "additionalProperty": "example" }, "name": "example", "visibility_filter": { "conditions": [ { "field": "example", "on_missing": "fail_closed", "operator": "eq", "source": "request", "value": "example", "value_from": {} } ], "operator": "and" } } ``` ## Responses | Status | Description | Content | |---|---|---| | `200` | Successful Response | application/json: object | | `401` | Missing or invalid credentials | application/json: object | | `403` | Authenticated but not permitted | application/json: object | | `404` | Resource not found | application/json: object | | `409` | State conflict | application/json: object | | `422` | Request validation failed | application/json: object | | `503` | The catalog's field types could not be read, so `visibility_filter` and `attribute_aliases` could not be checked against the catalog's fields. Retryable: `Retry-After` carries the number of seconds to wait. | application/json: object | ### 200 Successful Response #### application/json Schema: `object` ##### Attributes | Attribute | Type | Required | Description | Constraints | |---|---|---|---|---| | `attribute_aliases` | `object` | Yes | Channel-facing name (key) bound to a catalog field (value), e.g. `{"product_name": "title"}`. A request naming `product_name` resolves to catalog `title` and the response comes back keyed `product_name`, while the catalog field stays addressable under its own name. A key is checked against the catalog's fields only as it is written: should the catalog later gain a field of that name, that field takes the name back and the alias stops taking effect. See [Attribute aliases](/concepts/catalogs-and-channels/#attribute-aliases) for the full contract. | — | | `attribute_aliases.*` | `string` | No | Additional property. | — | | `catalog_id` | `string` | Yes | Catalog Id | — | | `created_at` | `string` | Yes | Created At | format: date-time | | `id` | `string` | Yes | Id | — | | `name` | `string` | Yes | Name | — | | `updated_at` | `string` | Yes | Updated At | format: date-time | | `visibility_filter` | `anyOf(object, oneOf(object, object), null)` | Yes | Channel-wide scope AND-ed into every request served on the channel, as a FilterGroup (`{"operator": "and", "conditions": [...]}`). Leaf fields name catalog fields and must exist in the catalog. | — | | `visibility_filter.conditions` | `Array` | No | Leaf conditions and nested groups. | — | | `visibility_filter.conditions[].field` | `string` | Yes | Object field the condition reads. | — | | `visibility_filter.conditions[].on_missing` | `anyOf(string, null)` | No | With `value_from`: what the condition does when no anchor carries the attribute. | — | | `visibility_filter.conditions[].operator` | `string` | Yes | Comparison operator. | allowed values: eq, neq, gt, gte, lt, lte, in, not_in, matches, starts_with, ends_with, range, exists | | `visibility_filter.conditions[].source` | `string` | No | Provenance of the condition; stamped by the system, never read from a client. | allowed values: request, collection, surface, autofilter, business_rule, visibility | | `visibility_filter.conditions[].value` | `any` | No | Literal to compare against, or a trigger reference `{trigger_ref: ...}`; a scalar for eq/neq and the comparisons, a non-empty list for in/not_in, absent for exists. | — | | `visibility_filter.conditions[].value_from` | `anyOf(object, null)` | No | Dynamic reference read from the request's anchors instead of a literal `value`. | — | | `visibility_filter.conditions[].value_from.anchor_attribute` | `string` | Yes | Anchor attribute whose value the condition compares against. | — | | `visibility_filter.operator` | `string` | Yes | Boolean combinator applied to `conditions`. | allowed values: and, or, not | | `visibility_filter.$and` | `Array` | No | Nodes that must all match. | >= 1 items; <= 100 items | | `visibility_filter.$not` | `oneOf(object, object)` | No | A node that must not match. | — | | `visibility_filter.$or` | `Array` | No | Nodes of which at least one must match. | >= 1 items; <= 100 items | | `visibility_filter.*` | `object` | No | Operators applied to one field. Several operators in one object combine as AND. | — | | `visibility_filter.*.eq` | `anyOf(string \| number \| integer \| boolean \| null, object, object)` | No | — | — | | `visibility_filter.*.eq.index` | `integer` | No | — | >= 0 | | `visibility_filter.*.eq.n` | `integer` | No | — | >= 1 | | `visibility_filter.*.eq.path` | `string` | No | — | allowed values: first, last, all, first_n, last_n, at_index, all_but_first, all_but_last | | `visibility_filter.*.eq.select` | `string` | No | — | allowed values: first, last, all, first_n, last_n, at_index, all_but_first, all_but_last | | `visibility_filter.*.eq.trigger_ref` | `string` | Yes | — | /^trigger\./ | | `visibility_filter.*.eq.on_missing` | `string` | No | What the condition does when no anchor carries the attribute; defaults to fail_closed. | allowed values: fail_closed, ignore | | `visibility_filter.*.eq.value_from` | `object` | Yes | — | — | | `visibility_filter.*.eq.value_from.anchor_attribute` | `string` | Yes | — | >= 1 characters | | `visibility_filter.*.exists` | `boolean` | No | — | — | | `visibility_filter.*.gt` | `anyOf(string \| number \| integer \| boolean \| null, object, object)` | No | — | — | | `visibility_filter.*.gt.index` | `integer` | No | — | >= 0 | | `visibility_filter.*.gt.n` | `integer` | No | — | >= 1 | | `visibility_filter.*.gt.path` | `string` | No | — | allowed values: first, last, all, first_n, last_n, at_index, all_but_first, all_but_last | | `visibility_filter.*.gt.select` | `string` | No | — | allowed values: first, last, all, first_n, last_n, at_index, all_but_first, all_but_last | | `visibility_filter.*.gt.trigger_ref` | `string` | Yes | — | /^trigger\./ | | `visibility_filter.*.gt.on_missing` | `string` | No | What the condition does when no anchor carries the attribute; defaults to fail_closed. | allowed values: fail_closed, ignore | | `visibility_filter.*.gt.value_from` | `object` | Yes | — | — | | `visibility_filter.*.gt.value_from.anchor_attribute` | `string` | Yes | — | >= 1 characters | | `visibility_filter.*.gte` | `anyOf(string \| number \| integer \| boolean \| null, object, object)` | No | — | — | | `visibility_filter.*.gte.index` | `integer` | No | — | >= 0 | | `visibility_filter.*.gte.n` | `integer` | No | — | >= 1 | | `visibility_filter.*.gte.path` | `string` | No | — | allowed values: first, last, all, first_n, last_n, at_index, all_but_first, all_but_last | | `visibility_filter.*.gte.select` | `string` | No | — | allowed values: first, last, all, first_n, last_n, at_index, all_but_first, all_but_last | | `visibility_filter.*.gte.trigger_ref` | `string` | Yes | — | /^trigger\./ | | `visibility_filter.*.gte.on_missing` | `string` | No | What the condition does when no anchor carries the attribute; defaults to fail_closed. | allowed values: fail_closed, ignore | | `visibility_filter.*.gte.value_from` | `object` | Yes | — | — | | `visibility_filter.*.gte.value_from.anchor_attribute` | `string` | Yes | — | >= 1 characters | | `visibility_filter.*.in` | `anyOf(Array, object, object)` | No | — | — | | `visibility_filter.*.in.index` | `integer` | No | — | >= 0 | | `visibility_filter.*.in.n` | `integer` | No | — | >= 1 | | `visibility_filter.*.in.path` | `string` | No | — | allowed values: first, last, all, first_n, last_n, at_index, all_but_first, all_but_last | | `visibility_filter.*.in.select` | `string` | No | — | allowed values: first, last, all, first_n, last_n, at_index, all_but_first, all_but_last | | `visibility_filter.*.in.trigger_ref` | `string` | Yes | — | /^trigger\./ | | `visibility_filter.*.in.on_missing` | `string` | No | What the condition does when no anchor carries the attribute; defaults to fail_closed. | allowed values: fail_closed, ignore | | `visibility_filter.*.in.value_from` | `object` | Yes | — | — | | `visibility_filter.*.in.value_from.anchor_attribute` | `string` | Yes | — | >= 1 characters | | `visibility_filter.*.lt` | `anyOf(string \| number \| integer \| boolean \| null, object, object)` | No | — | — | | `visibility_filter.*.lt.index` | `integer` | No | — | >= 0 | | `visibility_filter.*.lt.n` | `integer` | No | — | >= 1 | | `visibility_filter.*.lt.path` | `string` | No | — | allowed values: first, last, all, first_n, last_n, at_index, all_but_first, all_but_last | | `visibility_filter.*.lt.select` | `string` | No | — | allowed values: first, last, all, first_n, last_n, at_index, all_but_first, all_but_last | | `visibility_filter.*.lt.trigger_ref` | `string` | Yes | — | /^trigger\./ | | `visibility_filter.*.lt.on_missing` | `string` | No | What the condition does when no anchor carries the attribute; defaults to fail_closed. | allowed values: fail_closed, ignore | | `visibility_filter.*.lt.value_from` | `object` | Yes | — | — | | `visibility_filter.*.lt.value_from.anchor_attribute` | `string` | Yes | — | >= 1 characters | | `visibility_filter.*.lte` | `anyOf(string \| number \| integer \| boolean \| null, object, object)` | No | — | — | | `visibility_filter.*.lte.index` | `integer` | No | — | >= 0 | | `visibility_filter.*.lte.n` | `integer` | No | — | >= 1 | | `visibility_filter.*.lte.path` | `string` | No | — | allowed values: first, last, all, first_n, last_n, at_index, all_but_first, all_but_last | | `visibility_filter.*.lte.select` | `string` | No | — | allowed values: first, last, all, first_n, last_n, at_index, all_but_first, all_but_last | | `visibility_filter.*.lte.trigger_ref` | `string` | Yes | — | /^trigger\./ | | `visibility_filter.*.lte.on_missing` | `string` | No | What the condition does when no anchor carries the attribute; defaults to fail_closed. | allowed values: fail_closed, ignore | | `visibility_filter.*.lte.value_from` | `object` | Yes | — | — | | `visibility_filter.*.lte.value_from.anchor_attribute` | `string` | Yes | — | >= 1 characters | | `visibility_filter.*.matches` | `anyOf(string \| number \| integer \| boolean \| null, object, object)` | No | — | — | | `visibility_filter.*.matches.index` | `integer` | No | — | >= 0 | | `visibility_filter.*.matches.n` | `integer` | No | — | >= 1 | | `visibility_filter.*.matches.path` | `string` | No | — | allowed values: first, last, all, first_n, last_n, at_index, all_but_first, all_but_last | | `visibility_filter.*.matches.select` | `string` | No | — | allowed values: first, last, all, first_n, last_n, at_index, all_but_first, all_but_last | | `visibility_filter.*.matches.trigger_ref` | `string` | Yes | — | /^trigger\./ | | `visibility_filter.*.matches.on_missing` | `string` | No | What the condition does when no anchor carries the attribute; defaults to fail_closed. | allowed values: fail_closed, ignore | | `visibility_filter.*.matches.value_from` | `object` | Yes | — | — | | `visibility_filter.*.matches.value_from.anchor_attribute` | `string` | Yes | — | >= 1 characters | | `visibility_filter.*.neq` | `anyOf(string \| number \| integer \| boolean \| null, object, object)` | No | — | — | | `visibility_filter.*.neq.index` | `integer` | No | — | >= 0 | | `visibility_filter.*.neq.n` | `integer` | No | — | >= 1 | | `visibility_filter.*.neq.path` | `string` | No | — | allowed values: first, last, all, first_n, last_n, at_index, all_but_first, all_but_last | | `visibility_filter.*.neq.select` | `string` | No | — | allowed values: first, last, all, first_n, last_n, at_index, all_but_first, all_but_last | | `visibility_filter.*.neq.trigger_ref` | `string` | Yes | — | /^trigger\./ | | `visibility_filter.*.neq.on_missing` | `string` | No | What the condition does when no anchor carries the attribute; defaults to fail_closed. | allowed values: fail_closed, ignore | | `visibility_filter.*.neq.value_from` | `object` | Yes | — | — | | `visibility_filter.*.neq.value_from.anchor_attribute` | `string` | Yes | — | >= 1 characters | | `visibility_filter.*.not_in` | `anyOf(Array, object, object)` | No | — | — | | `visibility_filter.*.not_in.index` | `integer` | No | — | >= 0 | | `visibility_filter.*.not_in.n` | `integer` | No | — | >= 1 | | `visibility_filter.*.not_in.path` | `string` | No | — | allowed values: first, last, all, first_n, last_n, at_index, all_but_first, all_but_last | | `visibility_filter.*.not_in.select` | `string` | No | — | allowed values: first, last, all, first_n, last_n, at_index, all_but_first, all_but_last | | `visibility_filter.*.not_in.trigger_ref` | `string` | Yes | — | /^trigger\./ | | `visibility_filter.*.not_in.on_missing` | `string` | No | What the condition does when no anchor carries the attribute; defaults to fail_closed. | allowed values: fail_closed, ignore | | `visibility_filter.*.not_in.value_from` | `object` | Yes | — | — | | `visibility_filter.*.not_in.value_from.anchor_attribute` | `string` | Yes | — | >= 1 characters | ##### Response example ```json { "attribute_aliases": { "additionalProperty": "example" }, "catalog_id": "example", "created_at": "2026-04-15T12:00:00Z", "id": "example", "name": "example", "updated_at": "2026-04-15T12:00:00Z", "visibility_filter": { "conditions": [ { "field": "example", "on_missing": "fail_closed", "operator": "eq", "source": "request", "value": "example", "value_from": { "anchor_attribute": "example" } } ], "operator": "and" } } ``` ### 401 Missing or invalid credentials #### application/json Schema: `object` ##### Attributes | Attribute | Type | Required | Description | Constraints | |---|---|---|---|---| | `exception_details` | `object` | No | Machine-readable error context; empty object when there is nothing to add. | — | | `exception_details.validation_errors` | `anyOf(Array, null)` | No | Every field-level problem found in the request, when validation is what failed. Absent when the rejection is not about a specific value. | — | | `exception_details.validation_errors[].loc` | `Array` | Yes | Path to the offending value from the request root, e.g. `["body", "filters", 0, "operator"]`. | — | | `exception_details.validation_errors[].msg` | `string` | Yes | What is wrong with the value at `loc`. | — | | `exception_details.validation_errors[].type` | `string` | Yes | Stable machine code for the problem, e.g. `missing` or `string_too_short`. | — | | `exception_details.*` | `any` | No | Additional property. | — | | `reason` | `string` | Yes | Human-readable, actionable error message. | — | | `request_id` | `anyOf(string, null)` | No | Request correlation ID (matches the X-Request-Id response header). | — | ##### Response example ```json { "exception_details": { "validation_errors": [ { "loc": [ "example" ], "msg": "example", "type": "example" } ] }, "reason": "example", "request_id": "example" } ``` ### 403 Authenticated but not permitted #### application/json Schema: `object` ##### Attributes | Attribute | Type | Required | Description | Constraints | |---|---|---|---|---| | `exception_details` | `object` | No | Machine-readable error context; empty object when there is nothing to add. | — | | `exception_details.validation_errors` | `anyOf(Array, null)` | No | Every field-level problem found in the request, when validation is what failed. Absent when the rejection is not about a specific value. | — | | `exception_details.validation_errors[].loc` | `Array` | Yes | Path to the offending value from the request root, e.g. `["body", "filters", 0, "operator"]`. | — | | `exception_details.validation_errors[].msg` | `string` | Yes | What is wrong with the value at `loc`. | — | | `exception_details.validation_errors[].type` | `string` | Yes | Stable machine code for the problem, e.g. `missing` or `string_too_short`. | — | | `exception_details.*` | `any` | No | Additional property. | — | | `reason` | `string` | Yes | Human-readable, actionable error message. | — | | `request_id` | `anyOf(string, null)` | No | Request correlation ID (matches the X-Request-Id response header). | — | ##### Response example ```json { "exception_details": { "validation_errors": [ { "loc": [ "example" ], "msg": "example", "type": "example" } ] }, "reason": "example", "request_id": "example" } ``` ### 404 Resource not found #### application/json Schema: `object` ##### Attributes | Attribute | Type | Required | Description | Constraints | |---|---|---|---|---| | `exception_details` | `object` | No | Machine-readable error context; empty object when there is nothing to add. | — | | `exception_details.validation_errors` | `anyOf(Array, null)` | No | Every field-level problem found in the request, when validation is what failed. Absent when the rejection is not about a specific value. | — | | `exception_details.validation_errors[].loc` | `Array` | Yes | Path to the offending value from the request root, e.g. `["body", "filters", 0, "operator"]`. | — | | `exception_details.validation_errors[].msg` | `string` | Yes | What is wrong with the value at `loc`. | — | | `exception_details.validation_errors[].type` | `string` | Yes | Stable machine code for the problem, e.g. `missing` or `string_too_short`. | — | | `exception_details.*` | `any` | No | Additional property. | — | | `reason` | `string` | Yes | Human-readable, actionable error message. | — | | `request_id` | `anyOf(string, null)` | No | Request correlation ID (matches the X-Request-Id response header). | — | ##### Response example ```json { "exception_details": { "validation_errors": [ { "loc": [ "example" ], "msg": "example", "type": "example" } ] }, "reason": "example", "request_id": "example" } ``` ### 409 State conflict #### application/json Schema: `object` ##### Attributes | Attribute | Type | Required | Description | Constraints | |---|---|---|---|---| | `exception_details` | `object` | No | Machine-readable error context; empty object when there is nothing to add. | — | | `exception_details.validation_errors` | `anyOf(Array, null)` | No | Every field-level problem found in the request, when validation is what failed. Absent when the rejection is not about a specific value. | — | | `exception_details.validation_errors[].loc` | `Array` | Yes | Path to the offending value from the request root, e.g. `["body", "filters", 0, "operator"]`. | — | | `exception_details.validation_errors[].msg` | `string` | Yes | What is wrong with the value at `loc`. | — | | `exception_details.validation_errors[].type` | `string` | Yes | Stable machine code for the problem, e.g. `missing` or `string_too_short`. | — | | `exception_details.*` | `any` | No | Additional property. | — | | `reason` | `string` | Yes | Human-readable, actionable error message. | — | | `request_id` | `anyOf(string, null)` | No | Request correlation ID (matches the X-Request-Id response header). | — | ##### Response example ```json { "exception_details": { "validation_errors": [ { "loc": [ "example" ], "msg": "example", "type": "example" } ] }, "reason": "example", "request_id": "example" } ``` ### 422 Request validation failed #### application/json Schema: `object` ##### Attributes | Attribute | Type | Required | Description | Constraints | |---|---|---|---|---| | `exception_details` | `object` | No | Machine-readable error context; empty object when there is nothing to add. | — | | `exception_details.validation_errors` | `anyOf(Array, null)` | No | Every field-level problem found in the request, when validation is what failed. Absent when the rejection is not about a specific value. | — | | `exception_details.validation_errors[].loc` | `Array` | Yes | Path to the offending value from the request root, e.g. `["body", "filters", 0, "operator"]`. | — | | `exception_details.validation_errors[].msg` | `string` | Yes | What is wrong with the value at `loc`. | — | | `exception_details.validation_errors[].type` | `string` | Yes | Stable machine code for the problem, e.g. `missing` or `string_too_short`. | — | | `exception_details.*` | `any` | No | Additional property. | — | | `reason` | `string` | Yes | Human-readable, actionable error message. | — | | `request_id` | `anyOf(string, null)` | No | Request correlation ID (matches the X-Request-Id response header). | — | ##### Response example ```json { "exception_details": { "validation_errors": [ { "loc": [ "example" ], "msg": "example", "type": "example" } ] }, "reason": "example", "request_id": "example" } ``` ### 503 The catalog's field types could not be read, so `visibility_filter` and `attribute_aliases` could not be checked against the catalog's fields. Retryable: `Retry-After` carries the number of seconds to wait. #### application/json Schema: `object` ##### Attributes | Attribute | Type | Required | Description | Constraints | |---|---|---|---|---| | `exception_details` | `object` | No | Machine-readable error context; empty object when there is nothing to add. | — | | `exception_details.validation_errors` | `anyOf(Array, null)` | No | Every field-level problem found in the request, when validation is what failed. Absent when the rejection is not about a specific value. | — | | `exception_details.validation_errors[].loc` | `Array` | Yes | Path to the offending value from the request root, e.g. `["body", "filters", 0, "operator"]`. | — | | `exception_details.validation_errors[].msg` | `string` | Yes | What is wrong with the value at `loc`. | — | | `exception_details.validation_errors[].type` | `string` | Yes | Stable machine code for the problem, e.g. `missing` or `string_too_short`. | — | | `exception_details.*` | `any` | No | Additional property. | — | | `reason` | `string` | Yes | Human-readable, actionable error message. | — | | `request_id` | `anyOf(string, null)` | No | Request correlation ID (matches the X-Request-Id response header). | — | ##### Response example ```json { "exception_details": { "validation_errors": [ { "loc": [ "example" ], "msg": "example", "type": "example" } ] }, "reason": "example", "request_id": "example" } ```