Create attribute template

Creates a new attribute template that defines the structure and fields for attributes. Templates specify field types (image, text, boolean, number, color) and can be associated with resources like products, categories, or tags. Reserved field keys (key, name, description) cannot be used.

POST/api/v1/{team_slug}/{app_slug}/attributes
API
Management
Updated
Apr 26, 2026

management-api:POST:/api/v1/{team_slug}/{app_slug}/attributes

Creates a new attribute template that defines the structure and fields for attributes. Templates specify field types (image, text, boolean, number, color) and can be associated with resources like products, categories, or tags. Reserved field keys (key, name, description) cannot be used.

API ownership

  • API family: Management API
  • Best for: Trusted back-office workflows that create, update, organize, or delete merchant-owned data.
  • Do not use from: Browser-only storefront code or public clients.
  • Guide route: /apis/management/latest

The OpenAPI contract defines the method, path, parameters, request body, and responses for this operation.

Operation

  • Method: POST
  • Path: /api/v1/\{team_slug\}/\{app_slug\}/attributes
  • Summary: Create attribute template
  • Description: Creates a new attribute template that defines the structure and fields for attributes. Templates specify field types (image, text, boolean, number, color) and can be associated with resources like products, categories, or tags. Reserved field keys (key, name, description) cannot be used.
  • OpenAPI contract: management-api
  • Operation ID: Not documented in the OpenAPI contract.

Operation key uses API family, method, and path because this OpenAPI contract does not publish an operation ID.

Parameters2 parameters
NameInRequiredTypeDescription
app_slugpathYesstringApp slug
team_slugpathYesstringTeam slug
Request bodyDocumented body
  • Required: Yes
  • Description: Attribute data
  • Content: application/json (object)

Input Attribute Template

PropertyTypeRequiredDetails
fieldsobject[]No-
filterablebooleanNo-
keystringYesKey of the attribute
namestringYesName of the attribute
resourcesstring[]No-
translatablebooleanNo-
typestringYesName of the attribute

Input Attribute Field

PropertyTypeRequiredDetails
keystringYesKey of the attribute template field
namestringYesName for the attribute template field
typeenum("boolean", "text", "number", "image", "color", "image_object")YesThe type of the attribute template field. This field defines how we should treat the field when you create, update or list attributes

Generated example (synthetic):

{
  "fields": [
    {
      "key": "string",
      "name": "string",
      "type": "boolean"
    }
  ],
  "filterable": false,
  "key": "string",
  "name": "string",
  "resources": [
    "string"
  ],
  "translatable": false,
  "type": "string"
}
Responses4 statuses
StatusDescriptionContent
200Attributesapplication/json (object)
400Invalid request (e.g. bad UUID, validation error)application/json (object)
401Unauthorized accessapplication/json (object)
500Internal server errorapplication/json (object)

200 - object

Attribute Template Response

PropertyTypeRequiredDetails
dataobjectNo-
detailsstring[]NoAdditional contextual information about the response. Used to provide supplementary details beyond the main data payload, such as validation warnings or processing notes
successbooleanNo-
Attribute Template
PropertyTypeRequiredDetails
attributesobject[]No-
created_atstringNo-
fieldsobject[]No-
filterablebooleanNo-
idstringNo-
keystringNo-
namestringNo-
resourcesstring[]No-
source_app_idstringNo-
source_idstringNo-
translatablebooleanNo-
typestringNo-
updated_atstringNo-
Attribute
PropertyTypeRequiredDetails
created_atstringNo-
descriptionstringNo-
filterablebooleanNo-
idstringNo-
keystringNo-
namestringNo-
template_keystringNo-
template_namestringNo-
translatablebooleanNo-
translationsobjectNo-
updated_atstringNo-
valuesobjectNo-
Attribute Template Field
PropertyTypeRequiredDetails
created_atstringNo-
idstringNo-
keystringNo-
namestringNo-
typestringNo-
updated_atstringNo-
{
  "data": {
    "attributes": [
      {
        "created_at": "string",
        "description": "string",
        "filterable": false,
        "id": "string",
        "key": "string",
        "name": "string",
        "template_key": "string",
        "template_name": "string",
        "translatable": false,
        "translations": {
          "description": null,
          "name": null
        },
        "updated_at": "string",
        "values": {}
      }
    ],
    "created_at": "string",
    "fields": [
      {
        "created_at": "string",
        "id": "string",
        "key": "string",
        "name": "string",
        "type": "string",
        "updated_at": "string"
      }
    ],
    "filterable": false,
    "id": "string",
    "key": "string",
    "name": "string",
    "resources": [
      "string"
    ],
    "source_app_id": "string",
    "source_id": "string",
    "translatable": false,
    "type": "string",
    "updated_at": "string"
  },
  "details": [
    "string"
  ],
  "success": false
}

400 - object

Error Message

PropertyTypeRequiredDetails
detailsstring[]No-
messagestringNo-
successbooleanNo-

Generated example (synthetic):

{
  "details": [
    "string"
  ],
  "message": "string",
  "success": false
}

401 - object

Error Message

PropertyTypeRequiredDetails
detailsstring[]No-
messagestringNo-
successbooleanNo-

Generated example (synthetic):

{
  "details": [
    "string"
  ],
  "message": "string",
  "success": false
}

500 - object

Error Message

PropertyTypeRequiredDetails
detailsstring[]No-
messagestringNo-
successbooleanNo-

Generated example (synthetic):

{
  "details": [
    "string"
  ],
  "message": "string",
  "success": false
}

Contract identity

Use these fields to confirm you are implementing the intended endpoint contract.

  • API family: Management API
  • Method: POST
  • Path: /api/v1/\{team_slug\}/\{app_slug\}/attributes
  • Operation ID: Not documented in the OpenAPI contract.
  • OpenAPI tag: Attribute Templates
  • OpenAPI summary: Create attribute template

Create attribute template

# Create attribute template Creates a new attribute template that defines the structure and fields for attributes. Templates specify field types (image, text, boolean, number, color) and can be associated with resources like products, categories, or tags. Reserved field keys (key, name, description) cannot be used.
POST /api/v1/{team_slug}/{app_slug}/attributes
Purpose

Creates a new attribute template that defines the structure and fields for attributes.

Required inputs

app_slug path team_slug path

Primary response

200 ยท Attributes

Operation key

management-api:POST:/api/v1/{team_slug}/{app_slug}/attributes

## API ownership - API family: Management API - Best for: Trusted back-office workflows that create, update, organize, or delete merchant-owned data. - Do not use from: Browser-only storefront code or public clients. - Guide route: [/apis/management/latest](/apis/management/latest) The OpenAPI contract defines the method, path, parameters, request body, and responses for this operation. ## Operation - Method: `POST` - Path: `/api/v1/{team_slug}/{app_slug}/attributes` - Summary: Create attribute template - Description: Creates a new attribute template that defines the structure and fields for attributes. Templates specify field types (image, text, boolean, number, color) and can be associated with resources like products, categories, or tags. Reserved field keys (key, name, description) cannot be used. - OpenAPI contract: management-api - Operation ID: Not documented in the OpenAPI contract. - Stable operation key: `management-api:POST:/api/v1/{team_slug}/{app_slug}/attributes` Operation key uses API family, method, and path because this OpenAPI contract does not publish an operation ID. ## Parameters | Name | In | Required | Type | Description | | --- | --- | --- | --- | --- | | app_slug | path | Yes | string | App slug | | team_slug | path | Yes | string | Team slug | ## Request body - Required: Yes - Description: Attribute data - Content: application/json (object) ### Input Attribute Template | Property | Type | Required | Details | | --- | --- | --- | --- | | `fields` | object[] | No | - | | `filterable` | boolean | No | - | | `key` | string | Yes | Key of the attribute | | `name` | string | Yes | Name of the attribute | | `resources` | string[] | No | - | | `translatable` | boolean | No | - | | `type` | string | Yes | Name of the attribute | #### Input Attribute Field | Property | Type | Required | Details | | --- | --- | --- | --- | | `key` | string | Yes | Key of the attribute template field | | `name` | string | Yes | Name for the attribute template field | | `type` | enum("boolean", "text", "number", "image", "color", "image_object") | Yes | The type of the attribute template field. This field defines how we should treat the field when you create, update or list attributes | **Generated example (synthetic):** ```json { "fields": [ { "key": "string", "name": "string", "type": "boolean" } ], "filterable": false, "key": "string", "name": "string", "resources": [ "string" ], "translatable": false, "type": "string" } ``` ## Responses | Status | Description | Content | | --- | --- | --- | | 200 | Attributes | application/json (object) | | 400 | Invalid request (e.g. bad UUID, validation error) | application/json (object) | | 401 | Unauthorized access | application/json (object) | | 500 | Internal server error | application/json (object) | ### 200 - object #### Attribute Template Response | Property | Type | Required | Details | | --- | --- | --- | --- | | `data` | object | No | - | | `details` | string[] | No | Additional contextual information about the response. Used to provide supplementary details beyond the main data payload, such as validation warnings or processing notes | | `success` | boolean | No | - | ##### Attribute Template | Property | Type | Required | Details | | --- | --- | --- | --- | | `attributes` | object[] | No | - | | `created_at` | string | No | - | | `fields` | object[] | No | - | | `filterable` | boolean | No | - | | `id` | string | No | - | | `key` | string | No | - | | `name` | string | No | - | | `resources` | string[] | No | - | | `source_app_id` | string | No | - | | `source_id` | string | No | - | | `translatable` | boolean | No | - | | `type` | string | No | - | | `updated_at` | string | No | - | ##### Attribute | Property | Type | Required | Details | | --- | --- | --- | --- | | `created_at` | string | No | - | | `description` | string | No | - | | `filterable` | boolean | No | - | | `id` | string | No | - | | `key` | string | No | - | | `name` | string | No | - | | `template_key` | string | No | - | | `template_name` | string | No | - | | `translatable` | boolean | No | - | | `translations` | object | No | - | | `updated_at` | string | No | - | | `values` | object | No | - | ##### Attribute Template Field | Property | Type | Required | Details | | --- | --- | --- | --- | | `created_at` | string | No | - | | `id` | string | No | - | | `key` | string | No | - | | `name` | string | No | - | | `type` | string | No | - | | `updated_at` | string | No | - |
Generated example (synthetic) ```json { "data": { "attributes": [ { "created_at": "string", "description": "string", "filterable": false, "id": "string", "key": "string", "name": "string", "template_key": "string", "template_name": "string", "translatable": false, "translations": { "description": null, "name": null }, "updated_at": "string", "values": {} } ], "created_at": "string", "fields": [ { "created_at": "string", "id": "string", "key": "string", "name": "string", "type": "string", "updated_at": "string" } ], "filterable": false, "id": "string", "key": "string", "name": "string", "resources": [ "string" ], "source_app_id": "string", "source_id": "string", "translatable": false, "type": "string", "updated_at": "string" }, "details": [ "string" ], "success": false } ```
### 400 - object #### Error Message | Property | Type | Required | Details | | --- | --- | --- | --- | | `details` | string[] | No | - | | `message` | string | No | - | | `success` | boolean | No | - | **Generated example (synthetic):** ```json { "details": [ "string" ], "message": "string", "success": false } ``` ### 401 - object #### Error Message | Property | Type | Required | Details | | --- | --- | --- | --- | | `details` | string[] | No | - | | `message` | string | No | - | | `success` | boolean | No | - | **Generated example (synthetic):** ```json { "details": [ "string" ], "message": "string", "success": false } ``` ### 500 - object #### Error Message | Property | Type | Required | Details | | --- | --- | --- | --- | | `details` | string[] | No | - | | `message` | string | No | - | | `success` | boolean | No | - | **Generated example (synthetic):** ```json { "details": [ "string" ], "message": "string", "success": false } ``` ## Contract identity Use these fields to confirm you are implementing the intended endpoint contract. - API family: Management API - Method: `POST` - Path: `/api/v1/{team_slug}/{app_slug}/attributes` - Operation ID: Not documented in the OpenAPI contract. - Stable operation key: `management-api:POST:/api/v1/{team_slug}/{app_slug}/attributes` - OpenAPI tag: Attribute Templates - OpenAPI summary: Create attribute template