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

# Update product

`PUT /v1/products/{product_id}`

The Update Product API allows users to modify the details of
    an existing product identified by its unique product_id. You can
    retrieve supported categories and subcategories from the
    [GET /products/categories endpoint](/reference/api/products/get-product-categories),
    or browse the full catalog with descriptions and examples in the
    [Product Categories guide](/docs/guides/product-categories)

## Path parameters

- `product_id` string, required — Unique identifier of the product to be updated.

## Headers

- `x-organization-id` string, nullable, required — The unique identifier for the organization making the request

## Request body

- union
  - ProductUpdate
    - `id` string, nullable — The unique identifier of the product to be updated.
    - `external_id` string, nullable — External identifier provided for the product, typically by the source system.
    - `sku` string[], nullable
    - `name` string, required — Name of the product.
    - `description` string, nullable — Description of the product.
    - `status` 'APPROVED' | 'PARTIALLY_APPROVED' | 'PENDING' | 'ARCHIVED'
    - `product_category` string, required — Main category of the product. For example, Physical, Digital, etc. You can retrieve supported categories from [GET /products/categories endpoint](/reference/api/products/get-product-categories)
    - `product_subcategory` string, required — Subcategory of the product. For example, General Clothing, UNKNOWN, etc. You can retrieve supported subcategories from [GET /products/categories endpoint](/reference/api/products/get-product-categories)
    - `tax_exempt` boolean, required — Indicates whether the product is tax-exempt.
    - `classification_failed` boolean, nullable — Indicates if the product classification failed.
  - ProductUpdateV2
    - `name` string, required
    - `status` 'APPROVED' | 'PARTIALLY_APPROVED' | 'PENDING' | 'ARCHIVED', required
    - `product_category` string, required
    - `product_subcategory` string, required
    - `tax_exempt` boolean, required
    - `external_id` string, nullable
    - `sku` string[], nullable
    - `description` string, nullable
    - `classification_failed` boolean, nullable

## Response `200`

Successfully retrieved product by id

- ProductRead
  - `id` string, required
  - `external_id` string, required
  - `sku` string[], nullable, required
  - `code` string, required
  - `name` string, required
  - `description` string, nullable, required
  - `status` 'APPROVED' | 'PARTIALLY_APPROVED' | 'PENDING' | 'ARCHIVED', required
  - `product_category` string, required — Main category of the product. For example, Physical, Digital, etc. You can retrieve supported categories from [GET /products/categories endpoint](/reference/api/products/get-product-categories)
  - `product_subcategory` string, required — Subcategory of the product. For example, General Clothing, UNKNOWN, etc. You can retrieve supported subcategories from [GET /products/categories endpoint](/reference/api/products/get-product-categories)
  - `tax_exempt` boolean, required
  - `source` 'BIGCOMMERCE' | 'BESTBUY' | 'BUNNY' | 'CHARGEBEE' | 'SHOPIFY' | 'SHOPLINE' | 'ECWID' | 'STRIPE' | 'AMAZON' | 'TIKTOK' | 'CUSTOM' | 'UNKNOWN' | 'IMPORT' | 'ZUORA' | 'APIDECK' | 'QUICKBOOKS' | 'API' | 'APPLE_APP_STORE' | 'GOOGLE_APP_STORE' | 'WALMART' | 'PAYPAL' | 'NETSUITE' | 'XERO' | 'MAXIO' | 'RECURLY' | 'SALESFORCE' | 'ETSY' | 'EBAY' | 'WIX' | 'SQUARESPACE' | 'WOOCOMMERCE' | 'MAGENTO' | 'MACYS' | 'BILLING_PLATFORM' | 'DEEL' | 'RIPPLING' | 'GUSTO' | 'FACEBOOK' | 'OTHER' | 'ORDWAY' | 'INSTAGRAM' | 'PINTEREST' | 'WAYFAIR' | 'WISH' | 'POS' | 'TARGET' | 'NEWEGG' | 'GROUPON' | 'GOOGLE_EXPRESS' | 'NOCNOC' | 'MERCADO_LIBRE' | 'MODALYST' | 'NORDSTROM' | 'FAIRE' | 'SHOPWARE' | 'ZOHO' | 'SAGE-INTACCT' | 'AIRWALLEX' | 'ORB' | 'ZENSKAR' | 'MICROSOFT_DYNAMICS_365' | 'KICKSTARTER' | 'INTERNAL_ERP' | 'RILLET' | 'CAMPFIRE' | 'KILL_BILL' | 'PROVISION' | 'VERTEX_O_SERIES' | 'CHECKOUTCHAMP' | 'DUALENTRY' | 'ODOO' | 'BILL_COM' | 'INTUIT_ENTERPRISE_SUITE' | 'ACUMATICA', required
  - `connection_id` string, nullable, required
  - `classification_failed` boolean, nullable, required
  - `store_name` string, nullable
  - `source_taxonomy_type` string, nullable
  - `source_taxonomy_code` string, nullable
  - `source_taxonomy_id` string, nullable
  - `source_taxonomy_name` string, nullable
  - `source_taxonomy_categories` object[], nullable
  - `source_taxonomy_metadata` object, nullable

## Other responses

- `401` — Unauthenticated request.
- `404` — Resource Not Found
- `422` — Validation error
- `500` — Internal server error

## Changes

- **2026-08-29** `6ba4f4c774c3` — 6 breaking, 25 warning, 10 info
  - added the new required `header` request parameter `x-organization-id`
  - the request's body type changed from `object` to no type
  - response property `classification_failed` list-of-types was widened by adding types `null` to media type `application/json` of response `200`
  - response property `connection_id` list-of-types was widened by adding types `null` to media type `application/json` of response `200`
  - …37 more
  - …this revision’s changelog is incomplete

[Change history](https://skmtc.dev/trykintsugi/apis/tax-platform/changes/v1/products/:product_id/put.md)

---

[API](https://skmtc.dev/trykintsugi/apis/tax-platform.md) · [All operations](https://skmtc.dev/trykintsugi/apis/tax-platform/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/trykintsugi/tax-platform/revisions/846cc8ce4d30/schema)
