---
title: "Update promotion"
method: PATCH
path: "/api/v1/promotions/{id}"
tags: ["promotions"]
---

# Update promotion

`PATCH /api/v1/promotions/{id}`

Partially updates a promotion by its identifier. The code is immutable. Editing content is blocked while the promotion is active and in effect; toggling "active" is always allowed.

## Path parameters

- `id` string, uuid, required

## Request body

- PromotionUpdate
  - `name` string
  - `description` string, nullable
  - `active` boolean
  - `validity` PromotionValidityUpdate
    - `starts_at` string, required
    - `ends_at` string, nullable
    - `recurring_weekdays` string[], required
  - `eligibility` PromotionEligibilityUpdate
    - `scope` 'ALL' | 'ONLY' | 'EXCEPT', required
    - `cluster_ids` string[], required
    - `strategy_ids` string[], required
    - `apply_to_all_channels` boolean, required
    - `channel_ids` string[], required
  - `benefit` PromotionBenefitUpdate
    - `type` 'DISCOUNT' | 'SHIPPING' | 'GIFT', required
    - `kind` string
    - `value` number
    - `apply_by` 'CART' | 'ITEM'
    - `quantity` number
    - `product_ids` string[]
  - `item_restrictions` PromotionItemRestrictionUpdate[]
    - `dimension` 'PRODUCT' | 'CATEGORY', required
    - `operator` 'IN' | 'NOT_IN', required
    - `values` string[], required
  - `conditions` PromotionConditionUpdate[]
    - `type` 'ORDER_VALUE' | 'SHIPPING_TYPE' | 'PAYMENT_METHOD' | 'INSTALLMENTS', required
    - `min` number
    - `max` number
    - `values` string[]
  - `usage_limits` PromotionUsageLimitsUpdate
    - `per_customer` number, nullable
    - `total` number, nullable
    - `eligible_items` PromotionEligibleItemsLimitUpdate
      - `limit` number, required
      - `count_by` 'ORDER' | 'PRODUCT', required
  - `accumulation` PromotionAccumulationUpdate
    - `with_discount_promotions` boolean, required
    - `with_manual_prices` boolean, required
  - `metadata` object, nullable

## Response `200`

Promotion updated.

- PromotionUpdateResponse
  - `metadata` object, nullable, required
  - `id` string, required
  - `code` string, required
  - `name` string, required
  - `description` string, nullable, required
  - `active` boolean, required
  - `validity` object, required
  - `eligibility` object, required
  - `benefit` object, required
  - `item_restrictions` object[], required
  - `conditions` object[], required
  - `usage_limits` object, required
  - `accumulation` object, required
  - `created_at` string, required
  - `updated_at` string, required

## Other responses

- `400` — Request payload, query string, or path parameter failed validation.
- `401` — Authentication is missing, malformed, expired, or refers to a session that is no longer active.
- `403` — The caller is authenticated but lacks the required permission for this action.
- `404` — Promotion not found in the caller account.
- `422` — The payload passed schema validation but breaks a domain invariant, references a missing entity, or the promotion cannot have its content edited in its current lifecycle state.
- `500` — Unexpected server error. The response body never leaks internal details.

---

[API](https://skmtc.net/kruzer-corp/apis/oms-api.md) · [All operations](https://skmtc.net/kruzer-corp/apis/oms-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/kruzer-corp/oms-api/revisions/38ef6e16a7a8/schema)
