Create an attribute definition
Adds a column to the brand's vocabulary. The key is derived from the name and returned — it is what product values join on, so it is assigned once and never changes on a rename. A name whose key is taken gets a numeric suffix (fabric_weight_2), because two attributes named the same must still be two columns.
Hand-authored attributes are product-scoped. Variant scope is evidence the importer reads off the source's variant array, not a choice.
Authorization
apiKey Your API key. X-Api-Key: <key> is accepted as an alternative.
A key belongs to an organization, not a user, so it outlives whoever created it. It carries two independent things, and both are checked: an org role (a member key cannot approve a publish or activate a mapping) and a set of scopes — catalog:read, catalog:write, enrichment:write, publishing:read, publishing:write, org:read, org:write. Holding a scope does not grant a role, and holding a role does not grant a scope.
GET /v1/me returns both for the key you are holding.
In: header
Path Parameters
The brand to read.
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
curl -X POST "https://example.com/v1/brands/string/attributes" \ -H "Content-Type: application/json" \ -d '{ "extract": true, "kind": "variant", "name": "string", "type": "String" }'{ "id": "string", "key": "string"}List a brand's attribute definitions GET
The vocabulary a catalog is described in. `scope` says whether values live on the product or per variant; `extract` says whether enrichment may write it.
Delete an attribute definition DELETE
**Cascades to every product value and category link for this attribute**, and cannot be undone. Read `/v1/brands/{brandId}/products?filter=attr:{attributeId}:notEmpty` first if you need to know how much data that is.