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

# Update a product

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

Partially update product fields. The fee_type is immutable and cannot be changed.

## Path parameters

- `product_id` string, MeteroidId, required

## Request body

- UpdateProductRequest
  - `description` string, nullable
  - `fee_structure` union
    - RateFeeStructure
    - SlotFeeStructure
      - `downgrade_policy` 'REMOVE_AT_END_OF_PERIOD', required
      - `slot_unit_name` string, required
      - `upgrade_policy` 'PRORATED', required
    - CapacityFeeStructure
      - `metric_id` string, MeteroidId, required
    - UsageFeeStructure
      - `metric_id` string, MeteroidId, required
      - `model` 'PER_UNIT' | 'TIERED' | 'VOLUME' | 'PACKAGE' | 'MATRIX', required
    - ExtraRecurringFeeStructure
      - `billing_type` 'ADVANCE' | 'ARREARS', required
    - OneTimeFeeStructure
  - `name` string, nullable

## Response `200`

Product updated

- Product
  - `archived_at` string, date-time, nullable
  - `catalog` boolean, required
  - `created_at` string, date-time, required
  - `description` string, nullable
  - `fee_structure` union, required
    - RateFeeStructure
    - SlotFeeStructure
      - `downgrade_policy` 'REMOVE_AT_END_OF_PERIOD', required
      - `slot_unit_name` string, required
      - `upgrade_policy` 'PRORATED', required
    - CapacityFeeStructure
      - `metric_id` string, MeteroidId, required
    - UsageFeeStructure
      - `metric_id` string, MeteroidId, required
      - `model` 'PER_UNIT' | 'TIERED' | 'VOLUME' | 'PACKAGE' | 'MATRIX', required
    - ExtraRecurringFeeStructure
      - `billing_type` 'ADVANCE' | 'ARREARS', required
    - OneTimeFeeStructure
  - `fee_type` 'RATE' | 'SLOT' | 'CAPACITY' | 'USAGE' | 'EXTRA_RECURRING' | 'ONE_TIME', required
  - `id` string, MeteroidId, required
  - `name` string, required
  - `product_family_id` string, MeteroidId, required

## Other responses

- `400` — Bad request
- `401` — Unauthorized
- `404` — Product not found
- `429` — Too many requests

## Changes

> 54 revisions in range; 1 could not be searched.

- **2026-03-31** (v1) `ee465c53a423` — 2 info
  - request discriminator property name changed for `fee_structure/oneOf[#/components/schemas/ProductFeeStructure]/` request property from `fee_type` to `type`
  - response discriminator property name changed for `fee_structure` response property from `fee_type` to `type` for the response status `200`
- **2026-03-31** (v1) `560215310a09` — 2 breaking, 4 info
  - removed `subschema #1, subschema #2, subschema #3, subschema #4, subschema #5, subschema #6` from the `fee_structure/oneOf[#/components/schemas/ProductFeeStructure]/` request property `oneOf` list
  - added `#/components/schemas/RateFeeStructure, #/components/schemas/SlotFeeStructure, #/components/schemas/CapacityFeeStructure, #/components/schemas/UsageFeeStructure, #/components/schemas/ExtraRecurringFeeStructure, #/components/schemas/OneTimeFeeStructure` to the `fee_structure` response property `oneOf` list for the response status `200`
  - added discriminator to `fee_structure/oneOf[#/components/schemas/ProductFeeStructure]/` request property
  - added `#/components/schemas/RateFeeStructure, #/components/schemas/SlotFeeStructure, #/components/schemas/CapacityFeeStructure, #/components/schemas/UsageFeeStructure, #/components/schemas/ExtraRecurringFeeStructure, #/components/schemas/OneTimeFeeStructure` to the `fee_structure/oneOf[#/components/schemas/ProductFeeStructure]/` request property `oneOf` list
  - …2 more
- …earlier changes not shown

[Full history](https://skmtc.dev/meteroid-oss/apis/meteroid/changes/api/v1/products/:product_id/patch.md)

---

[API](https://skmtc.dev/meteroid-oss/apis/meteroid.md) · [All operations](https://skmtc.dev/meteroid-oss/apis/meteroid/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/meteroid-oss/meteroid/revisions/03f9d8ae5c5e/schema)
