- Update Attribute Set
Partially updates an existing attribute set identified by id. Accepted values:
default(case-insensitive) — updates the tenant's default attribute set.- Positive integer — updates the attribute set with that numeric ID.
Any other value is rejected with 400 Bad Request.
Requires a valid API key in the X-API-KEY header.
All fields are optional. Omitted (null) fields are left unchanged (PATCH semantics). When a layout is supplied it fully replaces the currently stored layout — it is not merged.
| Field | Description |
|---|---|
name | New unique name for the attribute set. |
productLayout | Replacement form layout for Products. |
variantLayout | Form layout for Variants. Sets the Variant layout when the set does not yet have one (e.g. created without it), or replaces it when it does. |
Each layout is a JSON document with a sections array. Each section has a title and a rows array. Each row has a fields array and an optional divider (dividerType, dividerTitle). Each field carries an attributeId and a size.
{
"sections": [
{
"title": "General",
"rows": [
{
"fields": [
{ "attributeId": "prod_title", "size": "half" },
{ "attributeId": "prod_ref", "size": "half" }
]
},
{
"dividerType": "normal",
"dividerTitle": "Details",
"fields": [
{ "attributeId": "prod_description", "size": "row" }
]
}
]
}
]
}size — width of the field in the form grid. One of: quarter, half, threeQuarters, row.
dividerType — optional visual separator above the row. One of: normal, wide, lineBreak. dividerTitle is optional and only meaningful when dividerType is set. Both properties are omitted from rows that have no divider.
A layout may contain any subset of the tenant's valid attributes — you do not need to include all of them. Attributes omitted from the layout simply do not appear in the form for this attribute set; they are not removed from the tenant.
This is different from PUT /Categories/layout and PUT /CustomEntities('{id}')/layout, where the payload must contain every attribute currently in the stored layout — no more, no less.
If a layout is supplied it must satisfy all of the following rules; otherwise the request returns 400 Bad Request describing each failure:
- The layout must be well-formed: the
sections,rowsandfieldsarrays must all be present (non-null). Omitting asections,rowsorfieldsarray (or sending it asnull) is rejected. - Every
attributeIdincluded must exist for the entity type (Products or Variants) in the tenant's storage definition. - No
attributeIdmay appear more than once across the entire layout. - Each field
sizemust be one of:quarter,half,threeQuarters,row. - The sum of field sizes within any single row must not exceed a full row.
- Every row must contain at least one field.
- Section
titlevalues must be unique (case-insensitive). - When a row sets
dividerTypeit must be one of:normal,wide,lineBreak.
These attributes must always be present in their respective layout:
| Layout | Required attribute IDs |
|---|---|
productLayout | typ_id, prod_ref, prod_title, cat_ref, prod_stat, prod_description, prod_image, prod_tags |
variantLayout | frmt_stat, prod_ref, frmt_ref, frmt_tags |
200 OK — The updated attribute set (UpdateAttributeSet2Response).
- 400 Bad Request — Invalid
id, missing body, or layout validation failure. - 401 Unauthorized — Missing or invalid API key. Returned by the API gateway as
{ "message": "Unauthorized", "request_id": "d8aafa5b8f3e400b60bea0123dd33317" }. - 403 Forbidden — The API key does not have write permissions for this operation.
- 404 Not Found — No attribute set with the given identifier exists for this tenant.
- 500 Internal Server Error — Unexpected technical error.
Request:
PATCH /v2/AttributeSets(1) HTTP/1.1
X-API-KEY: your-api-key-here
Content-Type: application/json
{ "name": "Electronics v2" }Response:
HTTP/1.1 200 OK
Content-Type: application/json- application/json
- text/json
- application/*+json
curl -i -X PATCH \
'https://api2.saleslayer.com/catalog/v2/AttributeSets({id})' \
-H 'Content-Type: application/json' \
-d '{
"name": "string",
"productLayout": {
"sections": [
{
"title": "General",
"rows": [
{
"fields": [
{
"attributeId": "code",
"size": "half"
},
{
"attributeId": "name",
"size": "half"
}
]
},
{
"fields": [
{
"attributeId": "parent_ref",
"size": "row"
}
],
"dividerType": "normal",
"dividerTitle": "Hierarchy"
}
]
},
{
"title": "Content",
"rows": [
{
"fields": [
{
"attributeId": "status",
"size": "quarter"
},
{
"attributeId": "description",
"size": "threeQuarters"
}
]
},
{
"fields": [
{
"attributeId": "image",
"size": "half"
},
{
"attributeId": "tags",
"size": "half"
}
]
}
]
}
]
},
"variantLayout": {
"sections": [
{
"title": "General",
"rows": [
{
"fields": [
{
"attributeId": "code",
"size": "half"
},
{
"attributeId": "name",
"size": "half"
}
]
},
{
"fields": [
{
"attributeId": "parent_ref",
"size": "row"
}
],
"dividerType": "normal",
"dividerTitle": "Hierarchy"
}
]
},
{
"title": "Content",
"rows": [
{
"fields": [
{
"attributeId": "status",
"size": "quarter"
},
{
"attributeId": "description",
"size": "threeQuarters"
}
]
},
{
"fields": [
{
"attributeId": "image",
"size": "half"
},
{
"attributeId": "tags",
"size": "half"
}
]
}
]
}
]
}
}'{ "@readLink": "string", "@editLink": "string", "@etag": "string", "@navigationLinks": [ { … } ], "@associationLinks": [ { … } ], "@context": "string", "value": null }