---
title: "Update Product"
method: PUT
path: "/api/v1/products/{id}"
tags: ["Products"]
---

# Update Product

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

## Path parameters

- `id` string, required

## Request body

- object
  - `product` ProductClientUpdateSchema, required
    - `id` string, required
    - `name` string, required
    - `description` string, nullable
    - `imageURL` string, nullable
    - `active` boolean, required
    - `singularQuantityLabel` string, nullable
    - `pluralQuantityLabel` string, nullable
    - `default` boolean
    - `slug` string, nullable
  - `price` union
    - object
      - `intervalUnit` 'day' | 'week' | 'month' | 'year', required
      - `name` string, nullable
      - `intervalCount` integer, required — A positive integer
      - `type` 'subscription', required
      - `trialPeriodDays` union — The trial period in days. If the trial period is 0 or null, there will be no trial period.
        - integer — A positive integer
        - 0
      - `isDefault` boolean, required — Whether or not this price is the default price. For product prices, this indicates the default price for that product. For usage prices, this indicates the default price for that usage meter.
      - `unitPrice` union, required — The price per unit. This should be in the smallest unit of the currency. For example, if the currency is USD, GBP, CAD, EUR or SGD, the price should be in cents.
        - integer — A positive integer
        - 0
      - `usageEventsPerUnit` unknown
      - `productId` string, required — The product this price belongs to. Required for subscription prices.
      - `active` boolean
      - `slug` string, nullable
      - `usageMeterId` unknown
    - object
      - `intervalUnit` unknown
      - `name` string, nullable
      - `intervalCount` unknown
      - `type` 'single_payment', required
      - `trialPeriodDays` unknown
      - `isDefault` boolean, required — Whether or not this price is the default price. For product prices, this indicates the default price for that product. For usage prices, this indicates the default price for that usage meter.
      - `unitPrice` union, required — The price per unit. This should be in the smallest unit of the currency. For example, if the currency is USD, GBP, CAD, EUR or SGD, the price should be in cents.
        - integer — A positive integer
        - 0
      - `usageEventsPerUnit` unknown
      - `productId` string, required — The product this price belongs to. Required for single payment prices.
      - `active` boolean
      - `slug` string, nullable
      - `usageMeterId` unknown
    - object
      - `intervalUnit` 'day' | 'week' | 'month' | 'year', required
      - `name` string, nullable
      - `intervalCount` integer, required — A positive integer
      - `type` 'usage', required
      - `trialPeriodDays` unknown
      - `isDefault` boolean, required — Whether or not this price is the default price. For product prices, this indicates the default price for that product. For usage prices, this indicates the default price for that usage meter.
      - `unitPrice` union, required — The price per unit. This should be in the smallest unit of the currency. For example, if the currency is USD, GBP, CAD, EUR or SGD, the price should be in cents.
        - integer — A positive integer
        - 0
      - `usageEventsPerUnit` integer, required — The number of usage events per unit. Used to determine how to map usage events to quantities when raising invoices for usage.
      - `productId` unknown
      - `active` boolean
      - `slug` string, nullable
      - `usageMeterId` string, required — The usage meter that uses this price. All usage events on that meter must be associated with a price that is also associated with that usage meter.
  - `featureIds` string[]

## Response `200`

Successful response

- object
  - `product` ProductClientSelectSchema, required
    - `id` string, required
    - `createdAt` integer, required — Epoch milliseconds.
    - `updatedAt` integer, required — Epoch milliseconds.
    - `livemode` boolean, required
    - `name` string, required
    - `description` string, nullable, required
    - `imageURL` string, nullable, required
    - `organizationId` string, required
    - `active` boolean, required
    - `singularQuantityLabel` string, nullable, required
    - `pluralQuantityLabel` string, nullable, required
    - `pricingModelId` string, required
    - `default` boolean, required
    - `slug` string, nullable, required

## Other responses

- `400` — Invalid input data
- `401` — Authorization not provided
- `403` — Insufficient access
- `404` — Not found
- `500` — Internal server error

## Changes

- **2026-01-18** `06c4dd78e137` — 1 breaking, 2 info
  - the `price/oneOf[#/components/schemas/UsagePriceClientInsertSchema]/productId` request property type/format changed from `string`/`` to `null`/``
  - the request property `price/oneOf[#/components/schemas/UsagePriceClientInsertSchema]/productId` became nullable
  - the request property `price/oneOf[#/components/schemas/UsagePriceClientInsertSchema]/productId` became optional
- **2025-11-25** `71d495f9b7d8` — 1 breaking, 4 info
  - removed `#/components/schemas/SubscriptionPriceClientUpdateSchema, #/components/schemas/SinglePaymentPriceClientUpdateSchema, #/components/schemas/UsagePriceClientUpdateSchema` from the `price` request property `oneOf` list
  - mapped value for discriminator key `single_payment` changed from `#/components/schemas/SinglePaymentPriceClientUpdateSchema` to `#/components/schemas/SinglePaymentPriceClientInsertSchema` for `price` request property
  - mapped value for discriminator key `subscription` changed from `#/components/schemas/SubscriptionPriceClientUpdateSchema` to `#/components/schemas/SubscriptionPriceClientInsertSchema` for `price` request property
  - mapped value for discriminator key `usage` changed from `#/components/schemas/UsagePriceClientUpdateSchema` to `#/components/schemas/UsagePriceClientInsertSchema` for `price` request property
  - …1 more
- …earlier changes not shown

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

---

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