API ReferenceEndpointsAttributes

Attributes

Attributes define variant axes (Size: S/M/L, Color: red/blue) — every variant of a variable product is the cartesian product of its parent's attribute options.

List attributes with pagination

Lists attributes, 20 per page.

GET
/v1/attributes
AuthorizationBearer <token>

Admin API key (server-to-server). Issue via the dashboard at Settings → API keys. Plain-text key is shown once — store in a secret manager. Format: Authorization: Bearer brainerce_xxxxxxxxx.

In: header

Query Parameters

platform?string

Only attributes imported from this platform code.

source?string

GLOBAL attributes belong to the store, PLATFORM attributes were imported from a platform.

Value in"GLOBAL" | "PLATFORM"
search?string

Text search on the attribute name.

limit?integer

Items per page. Default 20. Maximum 100.

Default20
Range1 <= value <= 100
page?integer

1-based page number.

Default1
Range1 <= value
curl -X GET "https://api.brainerce.com/api/v1/attributes?platform=string&source=GLOBAL&search=string&limit=20&page=1"
{
  "data": [
    {
      "id": "clx1a2b3c4d5e6f7g8h9",
      "accountId": "clx1a2b3c4d5e6f7g8h9",
      "storeId": "clx1a2b3c4d5e6f7g8h9",
      "name": "Color",
      "displayType": "COLOR_SWATCH",
      "source": "GLOBAL",
      "platform": "SHOPIFY",
      "externalId": "clx1a2b3c4d5e6f7g8h9",
      "platformMetadata": {
        "slug": "string",
        "type": "string",
        "orderBy": "string",
        "hasArchives": true
      },
      "translations": {},
      "isActive": true,
      "deletedAt": "2019-08-24T14:15:22Z",
      "createdAt": "2019-08-24T14:15:22Z",
      "updatedAt": "2019-08-24T14:15:22Z",
      "productCount": 15,
      "options": [
        {
          "id": "clx1a2b3c4d5e6f7g8h9",
          "attributeId": "clx1a2b3c4d5e6f7g8h9",
          "name": "Black",
          "value": "black",
          "swatchColor": "#000000",
          "swatchColor2": "#FFFFFF",
          "swatchImageUrl": "https://cdn.example.com/swatches/black.png",
          "source": "GLOBAL",
          "platform": "SHOPIFY",
          "externalId": "clx1a2b3c4d5e6f7g8h9",
          "platformMetadata": {
            "slug": "string",
            "description": "string",
            "productCount": 0
          },
          "translations": {},
          "position": 0,
          "isActive": true,
          "deletedAt": "2019-08-24T14:15:22Z",
          "createdAt": "2019-08-24T14:15:22Z",
          "updatedAt": "2019-08-24T14:15:22Z"
        }
      ]
    }
  ],
  "meta": {
    "page": 1,
    "limit": 20,
    "total": 137,
    "totalPages": 7
  }
}

{
  "statusCode": 400,
  "code": "VALIDATION_FAILED",
  "message": "name should not be empty, price must be a positive number",
  "timestamp": "2026-08-23T10:15:00.000Z",
  "path": "/api/v1/attributes"
}

{
  "statusCode": 401,
  "code": "UNAUTHORIZED",
  "message": "Invalid or expired credential",
  "timestamp": "2026-08-23T10:15:00.000Z",
  "path": "/api/v1/attributes"
}

{
  "statusCode": 403,
  "code": "INSUFFICIENT_SCOPE",
  "message": "API key does not have the required scope: products:write",
  "timestamp": "2026-08-23T10:15:00.000Z",
  "path": "/api/v1/attributes"
}

{
  "statusCode": 429,
  "code": "RATE_LIMITED",
  "message": "Too many requests",
  "details": {
    "retryAfterSeconds": 12
  },
  "timestamp": "2026-08-23T10:15:00.000Z",
  "path": "/api/v1/store"
}

Create a new attribute

Supports Idempotency-Key header for safe retries.

POST
/v1/attributes
AuthorizationBearer <token>

Admin API key (server-to-server). Issue via the dashboard at Settings → API keys. Plain-text key is shown once — store in a secret manager. Format: Authorization: Bearer brainerce_xxxxxxxxx.

In: header

Header Parameters

Idempotency-Key?string

Client-supplied key (a UUID v4 is the recommended form, max 255 characters) that makes this mutation safe to retry.

  • Replay window: 24 hours. The first response for a key is cached; a retry inside the window with the same request body returns the original status and body without re-running the handler.
  • Reusing a key with a different body returns 409 Conflict with code: "IDEMPOTENCY_KEY_REUSED". The request fingerprint (method + path + body hash) is compared against the stored one; a mismatch is refused rather than served the old response.
  • Keys are scoped to the calling credential and store — two API keys may safely use the same key value.
  • Error responses are cached too, so a retry of a request that failed validation returns the same 400 immediately.
  • Sending this header on a GET returns 400 with code: "IDEMPOTENCY_KEY_NOT_SUPPORTED" — GETs are already idempotent.
  • Support is per-route and this parameter is the authoritative signal: a key sent to a route that does not declare it is accepted and silently ignored.

See /docs/api/idempotency.

Lengthlength <= 255
namestring

Attribute name, for example Color or Size. Must be unique per store, source and platform.

displayType?string

How the storefront renders the options. DEFAULT is a plain text or dropdown list, COLOR_SWATCH fills a round button with swatchColor, IMAGE_SWATCH shows swatchImageUrl, MIXED_SWATCH picks image or color per option. Defaults to DEFAULT.

Default"DEFAULT"
Value in"DEFAULT" | "COLOR_SWATCH" | "IMAGE_SWATCH" | "MIXED_SWATCH"
sourcestring

GLOBAL for an attribute that belongs to the store (omit platform), PLATFORM for one imported from a platform (then platform is required).

Value in"GLOBAL" | "PLATFORM"
platform?string

Platform code the attribute was imported from. Required when source is PLATFORM, rejected when source is GLOBAL.

storeId?stringDeprecated

Deprecated and ignored. The attribute always belongs to the store of the API key. Accepted only so clients that still send it are not rejected.

externalId?string

ID of the attribute on the source platform. Only meaningful for PLATFORM attributes.

platformMetadata?object

Platform-specific data kept with the attribute as is. Free-form JSON object defined by the caller.

isActive?boolean

Whether the attribute is active. Defaults to true.

Defaulttrue
options?array<CreateAttributeOptionInlineDto>

Options to create together with the attribute.

curl -X POST "https://api.brainerce.com/api/v1/attributes" \  -H "Idempotency-Key: string" \  -H "Content-Type: application/json" \  -d '{    "name": "Color",    "source": "GLOBAL"  }'
{
  "id": "clx1a2b3c4d5e6f7g8h9",
  "accountId": "clx1a2b3c4d5e6f7g8h9",
  "storeId": "clx1a2b3c4d5e6f7g8h9",
  "name": "Color",
  "displayType": "COLOR_SWATCH",
  "source": "GLOBAL",
  "platform": "SHOPIFY",
  "externalId": "clx1a2b3c4d5e6f7g8h9",
  "platformMetadata": {
    "slug": "string",
    "type": "string",
    "orderBy": "string",
    "hasArchives": true
  },
  "translations": {},
  "isActive": true,
  "deletedAt": "2019-08-24T14:15:22Z",
  "createdAt": "2019-08-24T14:15:22Z",
  "updatedAt": "2019-08-24T14:15:22Z",
  "productCount": 15,
  "options": [
    {
      "id": "clx1a2b3c4d5e6f7g8h9",
      "attributeId": "clx1a2b3c4d5e6f7g8h9",
      "name": "Black",
      "value": "black",
      "swatchColor": "#000000",
      "swatchColor2": "#FFFFFF",
      "swatchImageUrl": "https://cdn.example.com/swatches/black.png",
      "source": "GLOBAL",
      "platform": "SHOPIFY",
      "externalId": "clx1a2b3c4d5e6f7g8h9",
      "platformMetadata": {
        "slug": "string",
        "description": "string",
        "productCount": 0
      },
      "translations": {},
      "position": 0,
      "isActive": true,
      "deletedAt": "2019-08-24T14:15:22Z",
      "createdAt": "2019-08-24T14:15:22Z",
      "updatedAt": "2019-08-24T14:15:22Z"
    }
  ]
}

{
  "statusCode": 400,
  "code": "VALIDATION_FAILED",
  "message": "name should not be empty, price must be a positive number",
  "timestamp": "2026-08-23T10:15:00.000Z",
  "path": "/api/v1/attributes"
}

{
  "statusCode": 401,
  "code": "UNAUTHORIZED",
  "message": "Invalid or expired credential",
  "timestamp": "2026-08-23T10:15:00.000Z",
  "path": "/api/v1/attributes"
}

{
  "statusCode": 403,
  "code": "INSUFFICIENT_SCOPE",
  "message": "API key does not have the required scope: products:write",
  "timestamp": "2026-08-23T10:15:00.000Z",
  "path": "/api/v1/attributes"
}

{
  "statusCode": 429,
  "code": "RATE_LIMITED",
  "message": "Too many requests",
  "details": {
    "retryAfterSeconds": 12
  },
  "timestamp": "2026-08-23T10:15:00.000Z",
  "path": "/api/v1/store"
}

Get a single attribute by ID

Returns one attribute of this store.

GET
/v1/attributes/{id}
AuthorizationBearer <token>

Admin API key (server-to-server). Issue via the dashboard at Settings → API keys. Plain-text key is shown once — store in a secret manager. Format: Authorization: Bearer brainerce_xxxxxxxxx.

In: header

Path Parameters

idstring

Attribute ID

curl -X GET "https://api.brainerce.com/api/v1/attributes/string"
{
  "id": "clx1a2b3c4d5e6f7g8h9",
  "accountId": "clx1a2b3c4d5e6f7g8h9",
  "storeId": "clx1a2b3c4d5e6f7g8h9",
  "name": "Color",
  "displayType": "COLOR_SWATCH",
  "source": "GLOBAL",
  "platform": "SHOPIFY",
  "externalId": "clx1a2b3c4d5e6f7g8h9",
  "platformMetadata": {
    "slug": "string",
    "type": "string",
    "orderBy": "string",
    "hasArchives": true
  },
  "translations": {},
  "isActive": true,
  "deletedAt": "2019-08-24T14:15:22Z",
  "createdAt": "2019-08-24T14:15:22Z",
  "updatedAt": "2019-08-24T14:15:22Z",
  "productCount": 15,
  "options": [
    {
      "id": "clx1a2b3c4d5e6f7g8h9",
      "attributeId": "clx1a2b3c4d5e6f7g8h9",
      "name": "Black",
      "value": "black",
      "swatchColor": "#000000",
      "swatchColor2": "#FFFFFF",
      "swatchImageUrl": "https://cdn.example.com/swatches/black.png",
      "source": "GLOBAL",
      "platform": "SHOPIFY",
      "externalId": "clx1a2b3c4d5e6f7g8h9",
      "platformMetadata": {
        "slug": "string",
        "description": "string",
        "productCount": 0
      },
      "translations": {},
      "position": 0,
      "isActive": true,
      "deletedAt": "2019-08-24T14:15:22Z",
      "createdAt": "2019-08-24T14:15:22Z",
      "updatedAt": "2019-08-24T14:15:22Z"
    }
  ]
}

{
  "statusCode": 401,
  "code": "UNAUTHORIZED",
  "message": "Invalid or expired credential",
  "timestamp": "2026-08-23T10:15:00.000Z",
  "path": "/api/v1/attributes/{id}"
}

{
  "statusCode": 403,
  "code": "INSUFFICIENT_SCOPE",
  "message": "API key does not have the required scope: products:write",
  "timestamp": "2026-08-23T10:15:00.000Z",
  "path": "/api/v1/attributes/{id}"
}

{
  "statusCode": 404,
  "code": "RESOURCE_NOT_FOUND",
  "message": "Resource not found",
  "timestamp": "2026-08-23T10:15:00.000Z",
  "path": "/api/v1/attributes/{id}"
}

{
  "statusCode": 429,
  "code": "RATE_LIMITED",
  "message": "Too many requests",
  "details": {
    "retryAfterSeconds": 12
  },
  "timestamp": "2026-08-23T10:15:00.000Z",
  "path": "/api/v1/store"
}

Update an attribute

Supports Idempotency-Key header for safe retries.

PATCH
/v1/attributes/{id}
AuthorizationBearer <token>

Admin API key (server-to-server). Issue via the dashboard at Settings → API keys. Plain-text key is shown once — store in a secret manager. Format: Authorization: Bearer brainerce_xxxxxxxxx.

In: header

Path Parameters

idstring

Attribute ID

Header Parameters

Idempotency-Key?string

Client-supplied key (a UUID v4 is the recommended form, max 255 characters) that makes this mutation safe to retry.

  • Replay window: 24 hours. The first response for a key is cached; a retry inside the window with the same request body returns the original status and body without re-running the handler.
  • Reusing a key with a different body returns 409 Conflict with code: "IDEMPOTENCY_KEY_REUSED". The request fingerprint (method + path + body hash) is compared against the stored one; a mismatch is refused rather than served the old response.
  • Keys are scoped to the calling credential and store — two API keys may safely use the same key value.
  • Error responses are cached too, so a retry of a request that failed validation returns the same 400 immediately.
  • Sending this header on a GET returns 400 with code: "IDEMPOTENCY_KEY_NOT_SUPPORTED" — GETs are already idempotent.
  • Support is per-route and this parameter is the authoritative signal: a key sent to a route that does not declare it is accepted and silently ignored.

See /docs/api/idempotency.

Lengthlength <= 255
name?string

New attribute name. A rename is also applied to the attribute name stored on existing product variants.

displayType?string

How the storefront renders the options. DEFAULT is a plain text or dropdown list, COLOR_SWATCH fills a round button with swatchColor, IMAGE_SWATCH shows swatchImageUrl, MIXED_SWATCH picks image or color per option. Omit to leave unchanged.

Value in"DEFAULT" | "COLOR_SWATCH" | "IMAGE_SWATCH" | "MIXED_SWATCH"
platformMetadata?object

Platform-specific data kept with the attribute as is. Free-form JSON object defined by the caller.

isActive?boolean

Whether the attribute is active.

translations?object

Translated attribute name keyed by ISO locale code. Replaces the stored translations of the attribute.

curl -X PATCH "https://api.brainerce.com/api/v1/attributes/string" \  -H "Idempotency-Key: string" \  -H "Content-Type: application/json" \  -d '{}'
{
  "id": "clx1a2b3c4d5e6f7g8h9",
  "accountId": "clx1a2b3c4d5e6f7g8h9",
  "storeId": "clx1a2b3c4d5e6f7g8h9",
  "name": "Color",
  "displayType": "COLOR_SWATCH",
  "source": "GLOBAL",
  "platform": "SHOPIFY",
  "externalId": "clx1a2b3c4d5e6f7g8h9",
  "platformMetadata": {
    "slug": "string",
    "type": "string",
    "orderBy": "string",
    "hasArchives": true
  },
  "translations": {},
  "isActive": true,
  "deletedAt": "2019-08-24T14:15:22Z",
  "createdAt": "2019-08-24T14:15:22Z",
  "updatedAt": "2019-08-24T14:15:22Z",
  "productCount": 15,
  "options": [
    {
      "id": "clx1a2b3c4d5e6f7g8h9",
      "attributeId": "clx1a2b3c4d5e6f7g8h9",
      "name": "Black",
      "value": "black",
      "swatchColor": "#000000",
      "swatchColor2": "#FFFFFF",
      "swatchImageUrl": "https://cdn.example.com/swatches/black.png",
      "source": "GLOBAL",
      "platform": "SHOPIFY",
      "externalId": "clx1a2b3c4d5e6f7g8h9",
      "platformMetadata": {
        "slug": "string",
        "description": "string",
        "productCount": 0
      },
      "translations": {},
      "position": 0,
      "isActive": true,
      "deletedAt": "2019-08-24T14:15:22Z",
      "createdAt": "2019-08-24T14:15:22Z",
      "updatedAt": "2019-08-24T14:15:22Z"
    }
  ]
}

{
  "statusCode": 400,
  "code": "VALIDATION_FAILED",
  "message": "name should not be empty, price must be a positive number",
  "timestamp": "2026-08-23T10:15:00.000Z",
  "path": "/api/v1/attributes/{id}"
}

{
  "statusCode": 401,
  "code": "UNAUTHORIZED",
  "message": "Invalid or expired credential",
  "timestamp": "2026-08-23T10:15:00.000Z",
  "path": "/api/v1/attributes/{id}"
}

{
  "statusCode": 403,
  "code": "INSUFFICIENT_SCOPE",
  "message": "API key does not have the required scope: products:write",
  "timestamp": "2026-08-23T10:15:00.000Z",
  "path": "/api/v1/attributes/{id}"
}

{
  "statusCode": 404,
  "code": "RESOURCE_NOT_FOUND",
  "message": "Resource not found",
  "timestamp": "2026-08-23T10:15:00.000Z",
  "path": "/api/v1/attributes/{id}"
}

{
  "statusCode": 429,
  "code": "RATE_LIMITED",
  "message": "Too many requests",
  "details": {
    "retryAfterSeconds": 12
  },
  "timestamp": "2026-08-23T10:15:00.000Z",
  "path": "/api/v1/store"
}

Delete an attribute

Supports Idempotency-Key header for safe retries.

DELETE
/v1/attributes/{id}
AuthorizationBearer <token>

Admin API key (server-to-server). Issue via the dashboard at Settings → API keys. Plain-text key is shown once — store in a secret manager. Format: Authorization: Bearer brainerce_xxxxxxxxx.

In: header

Path Parameters

idstring

Attribute ID

Header Parameters

Idempotency-Key?string

Client-supplied key (a UUID v4 is the recommended form, max 255 characters) that makes this mutation safe to retry.

  • Replay window: 24 hours. The first response for a key is cached; a retry inside the window with the same request body returns the original status and body without re-running the handler.
  • Reusing a key with a different body returns 409 Conflict with code: "IDEMPOTENCY_KEY_REUSED". The request fingerprint (method + path + body hash) is compared against the stored one; a mismatch is refused rather than served the old response.
  • Keys are scoped to the calling credential and store — two API keys may safely use the same key value.
  • Error responses are cached too, so a retry of a request that failed validation returns the same 400 immediately.
  • Sending this header on a GET returns 400 with code: "IDEMPOTENCY_KEY_NOT_SUPPORTED" — GETs are already idempotent.
  • Support is per-route and this parameter is the authoritative signal: a key sent to a route that does not declare it is accepted and silently ignored.

See /docs/api/idempotency.

Lengthlength <= 255
curl -X DELETE "https://api.brainerce.com/api/v1/attributes/string" \  -H "Idempotency-Key: string"
Empty

{
  "statusCode": 401,
  "code": "UNAUTHORIZED",
  "message": "Invalid or expired credential",
  "timestamp": "2026-08-23T10:15:00.000Z",
  "path": "/api/v1/attributes/{id}"
}

{
  "statusCode": 403,
  "code": "INSUFFICIENT_SCOPE",
  "message": "API key does not have the required scope: products:write",
  "timestamp": "2026-08-23T10:15:00.000Z",
  "path": "/api/v1/attributes/{id}"
}

{
  "statusCode": 404,
  "code": "RESOURCE_NOT_FOUND",
  "message": "Resource not found",
  "timestamp": "2026-08-23T10:15:00.000Z",
  "path": "/api/v1/attributes/{id}"
}

{
  "statusCode": 429,
  "code": "RATE_LIMITED",
  "message": "Too many requests",
  "details": {
    "retryAfterSeconds": 12
  },
  "timestamp": "2026-08-23T10:15:00.000Z",
  "path": "/api/v1/store"
}

Get attribute options

Returns the options of an attribute, ordered by position.

GET
/v1/attributes/{id}/options
AuthorizationBearer <token>

Admin API key (server-to-server). Issue via the dashboard at Settings → API keys. Plain-text key is shown once — store in a secret manager. Format: Authorization: Bearer brainerce_xxxxxxxxx.

In: header

Path Parameters

idstring

Attribute ID

Query Parameters

platform?string

Only options imported from this platform code.

curl -X GET "https://api.brainerce.com/api/v1/attributes/string/options?platform=string"
[
  {
    "id": "clx1a2b3c4d5e6f7g8h9",
    "attributeId": "clx1a2b3c4d5e6f7g8h9",
    "name": "Black",
    "value": "black",
    "swatchColor": "#000000",
    "swatchColor2": "#FFFFFF",
    "swatchImageUrl": "https://cdn.example.com/swatches/black.png",
    "source": "GLOBAL",
    "platform": "SHOPIFY",
    "externalId": "clx1a2b3c4d5e6f7g8h9",
    "platformMetadata": {
      "slug": "string",
      "description": "string",
      "productCount": 0
    },
    "translations": {},
    "position": 0,
    "isActive": true,
    "deletedAt": "2019-08-24T14:15:22Z",
    "createdAt": "2019-08-24T14:15:22Z",
    "updatedAt": "2019-08-24T14:15:22Z"
  }
]

{
  "statusCode": 401,
  "code": "UNAUTHORIZED",
  "message": "Invalid or expired credential",
  "timestamp": "2026-08-23T10:15:00.000Z",
  "path": "/api/v1/attributes/{id}/options"
}

{
  "statusCode": 403,
  "code": "INSUFFICIENT_SCOPE",
  "message": "API key does not have the required scope: products:write",
  "timestamp": "2026-08-23T10:15:00.000Z",
  "path": "/api/v1/attributes/{id}/options"
}

{
  "statusCode": 404,
  "code": "RESOURCE_NOT_FOUND",
  "message": "Resource not found",
  "timestamp": "2026-08-23T10:15:00.000Z",
  "path": "/api/v1/attributes/{id}/options"
}

{
  "statusCode": 429,
  "code": "RATE_LIMITED",
  "message": "Too many requests",
  "details": {
    "retryAfterSeconds": 12
  },
  "timestamp": "2026-08-23T10:15:00.000Z",
  "path": "/api/v1/store"
}

Create an attribute option

Supports Idempotency-Key header for safe retries.

POST
/v1/attributes/{id}/options
AuthorizationBearer <token>

Admin API key (server-to-server). Issue via the dashboard at Settings → API keys. Plain-text key is shown once — store in a secret manager. Format: Authorization: Bearer brainerce_xxxxxxxxx.

In: header

Path Parameters

idstring

Attribute ID

Header Parameters

Idempotency-Key?string

Client-supplied key (a UUID v4 is the recommended form, max 255 characters) that makes this mutation safe to retry.

  • Replay window: 24 hours. The first response for a key is cached; a retry inside the window with the same request body returns the original status and body without re-running the handler.
  • Reusing a key with a different body returns 409 Conflict with code: "IDEMPOTENCY_KEY_REUSED". The request fingerprint (method + path + body hash) is compared against the stored one; a mismatch is refused rather than served the old response.
  • Keys are scoped to the calling credential and store — two API keys may safely use the same key value.
  • Error responses are cached too, so a retry of a request that failed validation returns the same 400 immediately.
  • Sending this header on a GET returns 400 with code: "IDEMPOTENCY_KEY_NOT_SUPPORTED" — GETs are already idempotent.
  • Support is per-route and this parameter is the authoritative signal: a key sent to a route that does not declare it is accepted and silently ignored.

See /docs/api/idempotency.

Lengthlength <= 255
namestring

Option label, for example Red or XL. Unique per attribute, source, platform and externalId.

value?string

Optional value stored with the option, separate from the display name. Translatable per locale.

swatchColor?string

Swatch color as a CSS color string such as a hex code. Shown when the attribute displayType is COLOR_SWATCH or MIXED_SWATCH.

swatchColor2?string

Second swatch color. When set, the swatch is drawn as a 50/50 split of swatchColor and swatchColor2 (for example black and white).

swatchImageUrl?string

Swatch image URL. Shown when the attribute displayType is IMAGE_SWATCH, or MIXED_SWATCH for options that have an image. Upload via /v1/media first.

sourcestring

GLOBAL for an option that belongs to the store (omit platform), PLATFORM for one imported from a platform (then platform is required).

Value in"GLOBAL" | "PLATFORM"
platform?string

Platform code the option was imported from. Required when source is PLATFORM, rejected when source is GLOBAL.

externalId?string

ID of the option on the source platform. Only meaningful for PLATFORM options.

platformMetadata?object

Platform-specific data kept with the option as is. Free-form JSON object defined by the caller.

position?integer

Sort position among the attribute options. Lower values come first.

Default0
Range0 <= value
isActive?boolean

Whether the option is active. Defaults to true.

Defaulttrue
curl -X POST "https://api.brainerce.com/api/v1/attributes/string/options" \  -H "Idempotency-Key: string" \  -H "Content-Type: application/json" \  -d '{    "name": "Red",    "source": "GLOBAL"  }'
{
  "id": "clx1a2b3c4d5e6f7g8h9",
  "attributeId": "clx1a2b3c4d5e6f7g8h9",
  "name": "Black",
  "value": "black",
  "swatchColor": "#000000",
  "swatchColor2": "#FFFFFF",
  "swatchImageUrl": "https://cdn.example.com/swatches/black.png",
  "source": "GLOBAL",
  "platform": "SHOPIFY",
  "externalId": "clx1a2b3c4d5e6f7g8h9",
  "platformMetadata": {
    "slug": "string",
    "description": "string",
    "productCount": 0
  },
  "translations": {},
  "position": 0,
  "isActive": true,
  "deletedAt": "2019-08-24T14:15:22Z",
  "createdAt": "2019-08-24T14:15:22Z",
  "updatedAt": "2019-08-24T14:15:22Z"
}

{
  "statusCode": 400,
  "code": "VALIDATION_FAILED",
  "message": "name should not be empty, price must be a positive number",
  "timestamp": "2026-08-23T10:15:00.000Z",
  "path": "/api/v1/attributes/{id}/options"
}

{
  "statusCode": 401,
  "code": "UNAUTHORIZED",
  "message": "Invalid or expired credential",
  "timestamp": "2026-08-23T10:15:00.000Z",
  "path": "/api/v1/attributes/{id}/options"
}

{
  "statusCode": 403,
  "code": "INSUFFICIENT_SCOPE",
  "message": "API key does not have the required scope: products:write",
  "timestamp": "2026-08-23T10:15:00.000Z",
  "path": "/api/v1/attributes/{id}/options"
}

{
  "statusCode": 404,
  "code": "RESOURCE_NOT_FOUND",
  "message": "Resource not found",
  "timestamp": "2026-08-23T10:15:00.000Z",
  "path": "/api/v1/attributes/{id}/options"
}

{
  "statusCode": 429,
  "code": "RATE_LIMITED",
  "message": "Too many requests",
  "details": {
    "retryAfterSeconds": 12
  },
  "timestamp": "2026-08-23T10:15:00.000Z",
  "path": "/api/v1/store"
}