---
title: "Update a product"
method: PATCH
path: "/api/v1/products/{id}"
tags: ["Products"]
---

# Update a product

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

Updates an existing product's properties such as display name, description, and metadata.

## Path parameters

- `id` string, required

## Headers

- `X-ACCOUNT-ID` string
- `X-ENVIRONMENT-ID` string

## Request body

- UpdateProductRequestDto — Partially update an existing product. Only provided fields are updated.
  - `displayName` string — Display name of the product
  - `description` string, nullable — Description of the product
  - `multipleSubscriptions` boolean — Indicates if multiple subscriptions to this product are allowed
  - `metadata` object, nullable — Additional metadata for the product
  - `productSettings` object
    - `subscriptionEndSetup` 'DOWNGRADE_TO_FREE' | 'CANCEL_SUBSCRIPTION', required — Setup for the end of the subscription
    - `subscriptionCancellationTime` 'END_OF_BILLING_PERIOD' | 'IMMEDIATE' | 'SPECIFIC_DATE', required — Time when the subscription will be cancelled
    - `downgradePlanId` string, nullable — ID of the plan to downgrade to at the end of the billing period
    - `subscriptionStartSetup` 'PLAN_SELECTION' | 'TRIAL_PERIOD' | 'FREE_PLAN', required — Setup for the start of the subscription
    - `subscriptionStartPlanId` string, nullable — ID of the plan to start the subscription with
    - `prorateAtEndOfBillingPeriod` boolean, nullable — Indicates if the subscription should be prorated at the end of the billing period
  - `usageResetCutoffRule` object — Rule defining when usage resets upon subscription update.
    - `behavior` 'NEVER_RESET' | 'ALWAYS_RESET' | 'BILLING_PERIOD_CHANGE', required — Behavior of the usage reset cutoff rule

## Response `200`

The updated product object.

- ProductResponseDto — Response object
  - `data` object, required — Product configuration object
    - `id` string, required — The unique identifier for the entity
    - `displayName` string, required — Display name of the product
    - `description` string, nullable, required — Description of the product
    - `status` 'PUBLISHED' | 'ARCHIVED', required — The status of the product
    - `multipleSubscriptions` boolean, required — Indicates if multiple subscriptions to this product are allowed
    - `metadata` object, required — Metadata associated with the entity
    - `productSettings` object — Product behavior settings for subscription lifecycle management.
      - `subscriptionEndSetup` 'DOWNGRADE_TO_FREE' | 'CANCEL_SUBSCRIPTION', required — Setup for the end of the subscription
      - `subscriptionCancellationTime` 'END_OF_BILLING_PERIOD' | 'IMMEDIATE' | 'SPECIFIC_DATE', required — Time when the subscription will be cancelled
      - `downgradePlanId` string, nullable — ID of the plan to downgrade to at the end of the billing period
      - `subscriptionStartSetup` 'PLAN_SELECTION' | 'TRIAL_PERIOD' | 'FREE_PLAN', required — Setup for the start of the subscription
      - `subscriptionStartPlanId` string, nullable — ID of the plan to start the subscription with
      - `prorateAtEndOfBillingPeriod` boolean, nullable — Indicates if the subscription should be prorated at the end of the billing period
    - `createdAt` string, date-time, required — Timestamp of when the record was created
    - `updatedAt` string, date-time, required — Timestamp of when the record was last updated

## Other responses

- `400` — bad request.
- `401` — User is not authenticated.
- `403` — User is not allowed to access this resource.
- `404` — Product not found.
- `429` — Too many requests.

## Changes

- **2026-07-28** `913f273cc2f7` — 1 warning
  - added the new `ContractNotFound` enum value to the `code` response property for the response status `404`
- **2026-07-23** `b876edd1a4fc` — 5 warning
  - added the new `CreditOveragePriceCurrencyNotFound` enum value to the `code` response property for the response status `400`
  - added the new `InvalidCreditOverageBillingModel` enum value to the `code` response property for the response status `400`
  - added the new `InvoicePreviewNotAvailableForDraftContract` enum value to the `code` response property for the response status `400`
  - added the new `OveragePriceNotSupportedOnAddon` enum value to the `code` response property for the response status `400`
  - …1 more
- **2026-07-08** `58bb216ff8ce` — 1 warning
  - added the new `GovernanceNotEnabled` enum value to the `code` response property for the response status `403`
- **2026-06-08** `3acd63d6c861` — 2 info
  - added the new optional `header` request parameter `X-ACCOUNT-ID`
  - added the new optional `header` request parameter `X-ENVIRONMENT-ID`
- **2026-06-04** `4fa87d66426d` — 1 warning
  - added the new `PricingModelNotSupportedByBillingIntegration` enum value to the `code` response property for the response status `400`

[Full history](https://skmtc.dev/stiggio/apis/stigg-api/changes/api/v1/products/:id/patch.md)

---

[API](https://skmtc.dev/stiggio/apis/stigg-api.md) · [All operations](https://skmtc.dev/stiggio/apis/stigg-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/stiggio/stigg-api/revisions/3e2c8cfcd035/schema)
