---
title: "Changes to Create tier structure"
method: POST
path: "/v2/loyalties/tier-structures"
---

# Changes to Create tier structure

`POST /v2/loyalties/tier-structures`

> Every recorded change to this endpoint, newest first.

## Timeline

Changed in 4 of 62 revisions.

- **2026-07-31** (v2) `703a0a42ea43` — 3 breaking, 2 warning, 2 info
- **2026-07-17** (v2) `4cbaee5a82d5` — 8 info
- **2026-07-17** (v2) `26ef7b3dd1ef` — 2 breaking, 2 warning
- **2026-07-06** (v2) `341403eb19e5` — 19 breaking, 7 warning, 27 info

## Changes

- **2026-07-31** (v2) `703a0a42ea43` — 3 breaking, 2 warning, 2 info
  - added `subschema #2, subschema #3` to the request body `allOf` list
  - the `type` request property const value changed from `NO_EXPIRATION` to `NO_RETENTION`
  - removed the enum value `NO_EXPIRATION` of the request property `expiration/oneOf[#/components/schemas/TierStructureExpirationUpsert]/type`
  - removed `subschema #2, subschema #3` from the request body `allOf` list
  - added the new `NO_RETENTION` enum value to the `expiration/type` response property for the response status `200`
  - added the new `NO_RETENTION` enum value to the request property `expiration/oneOf[#/components/schemas/TierStructureExpirationUpsert]/type`
  - removed the `NO_EXPIRATION` enum value from the `expiration/type` response property for the response status `200`
- **2026-07-17** (v2) `4cbaee5a82d5` — 8 info
  - added the optional property `resource_id` to the response with the `400` status
  - added the optional property `resource_id` to the response with the `404` status
  - added the optional property `resource_id` to the response with the `409` status
  - added the optional property `resource_id` to the response with the `500` status
  - added the optional property `resource_type` to the response with the `400` status
  - added the optional property `resource_type` to the response with the `404` status
  - added the optional property `resource_type` to the response with the `409` status
  - added the optional property `resource_type` to the response with the `500` status
- **2026-07-17** (v2) `26ef7b3dd1ef` — 2 breaking, 2 warning
  - added `subschema #2, subschema #3` to the request body `allOf` list
  - added `subschema #3, subschema #4, subschema #5` to the `expiration/oneOf[#/components/schemas/TierStructureExpirationUpsert]/` request property `allOf` list
  - removed `subschema #2, subschema #3` from the request body `allOf` list
  - removed `subschema #3, subschema #4, subschema #5` from the `expiration/oneOf[#/components/schemas/TierStructureExpirationUpsert]/` request property `allOf` list
- **2026-07-06** (v2) `341403eb19e5` — 19 breaking, 7 warning, 27 info
  - added `subschema #1, subschema #2, subschema #3` to the request body `allOf` list
  - removed `#/components/schemas/TierStructureDowngradeRequest` from the `downgrade` request property `oneOf` list
  - removed `#/components/schemas/TierStructureExpirationRequest` from the `expiration` request property `oneOf` list
  - removed `#/components/schemas/TierStructurePointEarnedRequest` from the `point_earned` request property `oneOf` list
  - the response property `updated_at` became nullable for the status `200`
  - the response property `code` became optional for the status `400`
  - the response property `code` became optional for the status `404`
  - the response property `code` became optional for the status `500`
  - the response property `key` became optional for the status `400`
  - the response property `key` became optional for the status `404`
  - the response property `key` became optional for the status `500`
  - the response property `message` became optional for the status `400`
  - the response property `message` became optional for the status `404`
  - the response property `message` became optional for the status `500`
  - the `name` response property's maxLength was unset from `200` for the response status `200`
  - the `downgrade` response's property type changed from no type to `object` for status `200`
  - the `expiration` response's property type changed from no type to `object` for status `200`
  - the `point_earned` response's property type changed from no type to `object` for status `200`
  - removed the required property `card_definition_id` from the response with the `200` status
  - removed the request property `card_definition_id`
  - removed the optional property `resource_id` from the response with the `400` status
  - removed the optional property `resource_id` from the response with the `404` status
  - removed the optional property `resource_id` from the response with the `500` status
  - removed the optional property `resource_type` from the response with the `400` status
  - removed the optional property `resource_type` from the response with the `404` status
  - removed the optional property `resource_type` from the response with the `500` status
  - added the new optional request property `point_balance`
  - the request property `name` became optional
  - the request property `type` became optional
  - added `#/components/schemas/TierStructureDowngradeUpsert` to the `downgrade` request property `oneOf` list
  - added `#/components/schemas/TierStructureExpirationUpsert` to the `expiration` request property `oneOf` list
  - added `#/components/schemas/TierStructurePointEarnedUpsert` to the `point_earned` request property `oneOf` list
  - added the non-success response with the status `409`
  - added the optional property `downgrade/grace_period` to the response with the `200` status
  - added the optional property `downgrade/type` to the response with the `200` status
  - added the optional property `expiration/calendar_expiration` to the response with the `200` status
  - added the optional property `expiration/fixed_duration` to the response with the `200` status
  - added the optional property `expiration/sliding_expiration` to the response with the `200` status
  - added the optional property `expiration/type` to the response with the `200` status
  - added the optional property `point_balance` to the response with the `200` status
  - …13 more

---

[Operation](https://skmtc.dev/voucherifyio/apis/voucherify-loyalty-v2-api/docs/v2/loyalties/tier-structures/post.md) · [API](https://skmtc.dev/voucherifyio/apis/voucherify-loyalty-v2-api.md) · [Page](https://skmtc.dev/voucherifyio/apis/voucherify-loyalty-v2-api/changes/v2/loyalties/tier-structures/post)
