---
title: "Update a reward"
method: PUT
path: "/v2/loyalties/rewards/{rewardId}"
tags: ["Rewards"]
---

# Update a reward

`PUT /v2/loyalties/rewards/{rewardId}`

<Info>

<Badge color="gray">Documentation in progress</Badge>

This documentation is in progress. The parameters, fields, request and response bodies, and other data may be subject to change. If you need more information or you want to share feedback, contact [Voucherify support](https://www.voucherify.io/contact-support) or your Technical Account Manager.

</Info>

Updates an existing reward. When `type` is provided as `MATERIAL` the `material`
object is required and `digital` must be null; when `type` is provided as `DIGITAL`
the `digital` object is required and `material` must be null.

In `DRAFT` status all properties can be updated. In `ACTIVE`/`INACTIVE` status only
the following properties can be updated: `name`, `metadata`, `refunds`,
`validity_hours`, `start_date`, `end_date`, `costs`.

## Path parameters

- `id` string, required

## Request body

- RewardUpdateRequest — Request body for updating a reward. All properties are optional. When `type` is provided as `MATERIAL`, `material` is required and `digital` must be null; when `type` is provided as `DIGITAL`, `digital` is required and `material` must be null. In ACTIVE/INACTIVE status only `name`, `metadata`, `refunds`, `validity_hours`, `start_date`, `end_date` and `costs` can be updated.
  - `name` string — Display name of the reward.
  - `type` 'MATERIAL' | 'DIGITAL' — Reward type. Can only be changed while the reward is in DRAFT status.
  - `validity_hours` RewardValidityHoursRequest — Validity hours definition. `type` is required. When `type` is `ANY_TIME`, `daily` must be null; when `type` is `DAILY`, `daily` is required and must contain at least one entry.
    - `type` 'DAILY' | 'ANY_TIME', required — Whether the reward is purchasable at any time or only during specific daily windows.
    - `daily` RewardValidityDailyHoursRequest[], nullable — Daily time windows. Required when `type` is DAILY; must be null when `type` is ANY_TIME.
      - `days_of_week` integer[], required — Days of the week the window applies to, as integers 0-6 (0 = Sunday). Values must be unique.
      - `start_time` string, required — Window start time in `HH:mm` format.
      - `end_time` string, required — Window end time in `HH:mm` format.
  - `start_date` string, date-time, nullable — Date from which the reward is available. Must be an ISO-8601 compliant date.
  - `end_date` string, date-time, nullable — Date until which the reward is available. Must be an ISO-8601 compliant date.
  - `material` RewardMaterialRequest — Material reward definition. `type` is required. When `type` is `PRODUCT`, `product` is required and `sku` must be null; when `type` is `SKU`, `sku` is required and `product` must be null.
    - `type` 'PRODUCT' | 'SKU', required — Kind of material reward.
    - `product` RewardMaterialProductRequest — Product reference for a material reward.
      - `id` string, required — Product identifier, prefixed with `prod_`.
    - `sku` RewardMaterialSKURequest — SKU reference for a material reward.
      - `product_id` string, required — Unique identifier of the product the SKU belongs to, prefixed with `prod_`.
      - `id` string, required — SKU identifier, prefixed with `sku_`.
  - `digital` RewardDigitalRequest — Digital reward definition. `type` is required. Exactly the object matching `type` is required and the other two must be null: `DISCOUNT_COUPONS` requires `discount_coupons`, `GIFT_VOUCHERS` requires `gift_vouchers`, `LOYALTY_CARD_POINTS` requires `loyalty_card_points`.
    - `type` 'DISCOUNT_COUPONS' | 'GIFT_VOUCHERS' | 'LOYALTY_CARD_POINTS', required — Kind of digital reward.
    - `discount_coupons` RewardDigitalDiscountCouponsRequest — Discount coupons digital reward configuration.
      - `campaign_id` string, required — Unique identifier of the discount coupons campaign to publish a coupon from, prefixed with `camp_`.
    - `gift_vouchers` RewardDigitalGiftVouchersRequest — Gift vouchers digital reward configuration.
      - `campaign_id` string, required — Unique identifier of the gift vouchers campaign to publish a voucher from, prefixed with `camp_`.
      - `balance` number, required — Gift card balance credited when the reward is delivered.
    - `loyalty_card_points` RewardDigitalLoyaltyCardPointsRequest — Loyalty card points digital reward configuration.
      - `points` integer, required — Number of points credited to the member's card when the reward is delivered.
      - `card_definition_id` string, required — Unique identifier of the card definition to credit points to, prefixed with `lcdef_`.
  - `refunds` RewardRefundsRequest — Refund policy for the reward.
    - `type` 'NONE' | 'REFUNDABLE', required — Whether reward purchases can be refunded.
  - `costs` RewardCostUpdateRequest[] — Point costs of the reward. Include the `id` of an existing cost to update it; omit `id` to create a new cost.
    - `id` string — Unique identifier of an existing cost to update, prefixed with `lrcst_`. Omit to create a new cost.
    - `rules` RewardCostRulesRequest — Rules group for a reward cost. Contains a required `logic` property plus numbered rule definitions. Every property other than `logic` must be a positive-integer key (`^[1-9]\d*$`) mapping to a rule definition. At least one rule definition is required. No other properties are allowed.
      - `logic` string, required — A logical formula referencing the numbered rule definitions, e.g. `"1 AND 2"`.
    - `spending` RewardCostSpendingRequest[], required — Points to spend on a specific card definition. Exactly one entry is allowed.
      - `id` string — Optional spending identifier, prefixed with `lrspn_`. Provide on update to keep the same spending entry; omit on create to auto-assign.
      - `name` string, nullable — Optional display name of the spending definition (max 200 characters), or `null`.
      - `points` integer, required — Number of points the member must spend.
      - `card_definition_id` string, required — Unique identifier of the card definition the points are spent from, prefixed with `lcdef_`.
  - `purchase_limits` RewardPurchaseLimitsInput — Limits on how often a member can purchase the reward. On create, omitted values default to no cooldown and no frequency limit. On update, omit to leave unchanged; send `null` to reset to defaults.
    - `cooldown` RewardPurchaseLimitsCooldownInput — Purchase cooldown limits for a reward.
      - `type` 'NO_COOLDOWN' | 'FIXED_COOLDOWN', required — Cooldown type. `NO_COOLDOWN` requires `fixed_cooldown` to be null/omitted. `FIXED_COOLDOWN` requires `fixed_cooldown`.
      - `fixed_cooldown` RewardPurchaseLimitsCooldownFixedCooldownInput — Fixed cooldown configuration.
        - `period` RewardPurchaseLimitsCooldownFixedCooldownPeriodInput, required — Fixed cooldown period after a reward purchase.
          - `value` integer, required — Length of the cooldown period. Max depends on `unit`: HOUR 24, DAY 90, WEEK 52, MONTH 12, YEAR 1.
          - `unit` 'HOUR' | 'DAY' | 'WEEK' | 'MONTH' | 'YEAR', required — Unit of the cooldown period.
    - `frequency` RewardPurchaseLimitsFrequencyInput — Purchase frequency limits for a reward.
      - `type` 'NO_LIMIT' | 'LIMITED', required — Frequency limit type. `NO_LIMIT` allows empty/null `limits`. `LIMITED` requires exactly one limit.
      - `limits` RewardPurchaseLimitsFrequencyLimitInput[], nullable — Frequency limit definitions. Empty or null when `type` is `NO_LIMIT`; exactly one entry when `type` is `LIMITED`.
        - `type` 'TIME_BASED', required — Limit type. Always `TIME_BASED`.
        - `period` CardDefinitionSpendingLimitsGlobalTimeBasedPeriodInput, required — Time-based spending limit period. When `type` is `CURRENT_PERIOD` (the only allowed value), `current_period` is required.
          - `type` 'CURRENT_PERIOD', required — Period type. Currently only `CURRENT_PERIOD` (current calendar period) is supported.
          - `current_period` CardDefinitionSpendingLimitsGlobalTimeBasedCurrentPeriodInput — Calendar period unit used to reset the time-based spending limit.
            - `unit` 'DAY' | 'WEEK' | 'MONTH' | 'QUARTER' | 'YEAR', required — Calendar period unit.
        - `triggers` RewardPurchaseLimitsFrequencyLimitTriggersInput, required — Maximum number of purchases allowed in the period.
          - `max` integer, required — Maximum number of purchases in the configured period.
  - `metadata` object, nullable — Arbitrary key-value metadata attached to the reward, as a free-form object.

## Response `200`

The updated reward.

- RewardResponse — A reward, as returned by the API.
  - `id` string, required — Unique reward identifier, prefixed with `lrew_`.
  - `name` string, required — Display name of the reward.
  - `type` 'MATERIAL' | 'DIGITAL', required — Reward type.
  - `status` 'ACTIVE' | 'DRAFT' | 'INACTIVE' | 'DELETED', required — Current lifecycle status of the reward.
  - `start_date` string, date-time, nullable — Date from which the reward is available, or `null` when not set.
  - `end_date` string, date-time, nullable — Date until which the reward is available, or `null` when not set.
  - `validity_hours` RewardValidityHoursResponse, required — Validity hours. `daily` is present only when `type` is DAILY; omitted otherwise.
    - `type` 'DAILY' | 'ANY_TIME', required — Whether the reward is purchasable at any time or only during specific daily windows.
    - `daily` RewardValidityDailyHoursResponse[] — Daily time windows. Present only when `type` is DAILY.
      - `days_of_week` integer[], required — Days of the week the window applies to, as integers 0-6 (0 = Sunday).
      - `start_time` string, required — Window start time in `HH:mm` format.
      - `end_time` string, required — Window end time in `HH:mm` format.
  - `material` RewardMaterialResponse — Material reward definition.
    - `type` 'PRODUCT' | 'SKU', required — Kind of material reward.
    - `product` RewardMaterialProductResponse — Product reference.
      - `id` string, required — Product identifier, prefixed with `prod_`.
    - `sku` RewardMaterialSKUResponse — SKU reference.
      - `product_id` string, required — Unique identifier of the product the SKU belongs to, prefixed with `prod_`.
      - `id` string, required — SKU identifier, prefixed with `sku_`.
  - `digital` RewardDigitalResponse — Digital reward definition. Only the object matching `type` is present; the others are omitted.
    - `type` 'DISCOUNT_COUPONS' | 'GIFT_VOUCHERS' | 'LOYALTY_CARD_POINTS', required — Kind of digital reward.
    - `discount_coupons` RewardDigitalDiscountCouponsResponse — Discount coupons configuration.
      - `campaign_id` string, required — Unique identifier of the discount coupons campaign, prefixed with `camp_`.
    - `gift_vouchers` RewardDigitalGiftVouchersResponse — Gift vouchers configuration.
      - `campaign_id` string, required — Unique identifier of the gift vouchers campaign, prefixed with `camp_`.
      - `balance` number, required — Gift card balance credited when the reward is delivered.
    - `loyalty_card_points` RewardDigitalLoyaltyCardPointsResponse — Loyalty card points configuration.
      - `points` integer, required — Number of points credited when the reward is delivered.
      - `card_definition_id` string, required — Unique identifier of the card definition points are credited to, prefixed with `lcdef_`.
  - `refunds` RewardRefundsResponse, required — Refund policy.
    - `type` 'NONE' | 'REFUNDABLE', required — Whether reward purchases can be refunded. Defaults to NONE.
  - `costs` RewardCostResponse[], required — Point costs of the reward. Empty array when no costs are defined.
    - `id` string, required — Unique cost identifier, prefixed with `lrcst_`.
    - `rules` RewardCostRuleGroupResponse — Rules group. Contains a `logic` formula string plus numbered rule definition properties (positive-integer keys).
      - `logic` string — Logical formula combining the numbered rule definitions, e.g. `"1 AND 2"`.
    - `spending` RewardCostSpendingResponse[], nullable — Points spending definitions, or `null` when none are defined.
      - `id` string, required — Unique spending identifier, prefixed with `lrspn_`. Assigned by the API when omitted on create/update.
      - `name` string, nullable — Optional display name of the spending definition, or `null`.
      - `points` integer, required — Number of points the member must spend.
      - `card_definition_id` string, required — Unique identifier of the card definition the points are spent from, prefixed with `lcdef_`.
  - `purchase_limits` RewardPurchaseLimits, required — Limits on how often a member can purchase the reward. Always present on reward responses; defaults to no cooldown and no frequency limit.
    - `cooldown` RewardPurchaseLimitsCooldown — Purchase cooldown limits for a reward.
      - `type` 'NO_COOLDOWN' | 'FIXED_COOLDOWN', required — Cooldown type. `NO_COOLDOWN` - no cooldown. `FIXED_COOLDOWN` - wait a fixed period after each purchase.
      - `fixed_cooldown` RewardPurchaseLimitsCooldownFixedCooldown — Fixed cooldown configuration.
        - `period` RewardPurchaseLimitsCooldownFixedCooldownPeriod, required — Fixed cooldown period after a reward purchase.
          - `value` integer, required — Length of the cooldown period.
          - `unit` 'HOUR' | 'DAY' | 'WEEK' | 'MONTH' | 'YEAR', required — Unit of the cooldown period.
    - `frequency` RewardPurchaseLimitsFrequency — Purchase frequency limits for a reward.
      - `type` 'NO_LIMIT' | 'LIMITED', required — Frequency limit type. `NO_LIMIT` - unlimited purchases. `LIMITED` - limited by the `limits` array.
      - `limits` RewardPurchaseLimitsFrequencyLimit[], required — Frequency limit definitions. Empty array when `type` is `NO_LIMIT`; one entry when `type` is `LIMITED`.
        - `type` 'TIME_BASED', required — Limit type. Always `TIME_BASED`.
        - `period` CardDefinitionLimitTimeBasedPeriod, required — Time-based limit period.
          - `type` 'CURRENT_PERIOD', required — Period type.
          - `current_period` object — Current-period configuration. Present when `type` is `CURRENT_PERIOD`.
            - `unit` 'DAY' | 'WEEK' | 'MONTH' | 'QUARTER' | 'YEAR', required — Calendar period unit.
        - `triggers` RewardPurchaseLimitsFrequencyLimitTriggers, required — Maximum number of purchases allowed in the period.
          - `max` integer, required — Maximum number of purchases in the configured period.
  - `metadata` object, required — Arbitrary key-value metadata attached to the reward. Empty object when not set.
  - `created_at` string, date-time, required — Timestamp when the reward was created (ISO-8601).
  - `updated_at` string, date-time, nullable — Timestamp when the reward was last updated (ISO-8601), or `null` when never updated.
  - `object` 'reward', required — Object type marker; always `reward`.

## Other responses

- `400` — Validation error - request body or query parameters failed validation, or the operation is not allowed in the current resource state.
- `404` — Resource not found.
- `409` — Conflict - e.g. duplicate resource or invalid state transition.
- `500` — Internal server error.

---

[API](https://skmtc.net/voucherifyio/apis/voucherify-loyalty-v2-api.md) · [All operations](https://skmtc.net/voucherifyio/apis/voucherify-loyalty-v2-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/voucherifyio/voucherify-loyalty-v2-api/versions/69be73b5cff0/schema)
