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

# Update Product

`PATCH /products/{id}`

Updates an existing product.

## Request body

- object
  - `description` string, nullable — A written description displayed on the product page.
  - `headline` string, nullable — A short marketing headline for the product page.
  - `metadata` object, nullable — Custom key-value pairs to store on the product.
  - `product_tax_code_id` string, nullable — The unique identifier of the tax classification code. See the available [product categories](https://docs.numeral.com/essentials/product-categories).
  - `send_welcome_message` boolean, nullable — Whether to send an automated welcome message via support chat when a user joins this product.
  - `title` string — The display name of the product.
  - `visibility` string — Whether the product is visible to customers.

## Response `200`

product tax code updated

- Product — A product is a digital good or service sold on Whop. Products contain plans for pricing and experiences for content delivery.
  - `company` object, required — The company this product belongs to.
    - `id` string, required — The unique identifier for the company.
    - `route` string, required — URL slug for the account's store page, e.g. `pickaxe` in whop.com/pickaxe.
    - `title` string, required — The display name of the company shown to customers.
  - `created_at` string, date-time, required — The datetime the product was created.
  - `custom_cta` 'get_access' | 'join' | 'order_now' | 'shop_now' | 'call_now' | 'donate_now' | 'contact_us' | 'sign_up' | 'subscribe' | 'purchase' | 'get_offer' | 'apply_now' | 'complete_order', required — The different types of custom CTAs that can be selected.
  - `custom_cta_url` string, nullable, required — An optional URL that the call-to-action button links to instead of the default checkout flow. Null if no custom URL is set.
  - `custom_statement_descriptor` string, nullable, required — Custom bank statement descriptor for product purchases. Maximum 22 characters, including required `WHOP*` prefix.
  - `description` string, nullable, required — A brief summary of what the product offers, displayed on product pages and search results.
  - `external_identifier` string, nullable, required — External identifier for the product. Providing it on a product creation endpoint updates the existing product with this identifier instead of creating a new one.
  - `gallery_images` object[], required — The gallery images for this product, ordered by position.
    - `id` string, required — Represents a unique identifier that is Base64 obfuscated. It is often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as `"VXNlci0xMA=="`) or integer (such as `4`) input value will be accepted as an ID.
    - `url` string, nullable, required — A pre-optimized URL for rendering this attachment on the client. This should be used for displaying attachments in apps.
  - `global_affiliate_percentage` number, nullable, required — Marketplace affiliate commission percentage for this product, or `null` if program is inactive.
  - `global_affiliate_status` 'enabled' | 'disabled', required — The different statuses of the global affiliate program for a product.
  - `headline` string, nullable, required — A short marketing headline displayed prominently on the product's product page.
  - `id` string, required — The unique identifier for the product.
  - `member_affiliate_percentage` number, nullable, required — Member referral commission percentage for this product, or `null` if program is inactive.
  - `member_affiliate_status` 'enabled' | 'disabled', required — The different statuses of the global affiliate program for a product.
  - `member_count` integer, required — Active memberships for this product. Returns `0` if the account has disabled public member counts.
  - `metadata` object, nullable, required — Custom key-value pairs stored on the product and included in payment and membership webhook payloads. Max 50 keys, 100 characters per key, 500 characters per string value.
  - `owner_user` object, required — The user who owns the company that sells this product.
    - `id` string, required — The unique identifier for the user.
    - `name` string, nullable, required — The user's display name shown on their public profile.
    - `username` string, required — The user's unique username shown on their public profile.
  - `product_tax_code` object, nullable, required — The tax classification code applied to purchases of this product for sales tax calculation. Null if no tax code is assigned.
    - `id` string, required — The unique identifier for the product tax code.
    - `name` string, required — Human-readable name of this tax classification, such as 'Digital - SaaS'.
    - `product_type` 'physical' | 'digital' | 'services', required — The product_type of the ProductTaxCode
  - `published_reviews_count` integer, required — The total number of published customer reviews for this product's company.
  - `route` string, required — URL slug in the product's public link, e.g. `pickaxe-analytics` in whop.com/company/pickaxe-analytics.
  - `title` string, required — The display name of the product shown to customers on the product page and in search results.
  - `updated_at` string, date-time, required — The datetime the product was last updated.
  - `verified` boolean, required — Whether this company has been verified by Whop's trust and safety team.
  - `visibility` 'visible' | 'hidden' | 'archived' | 'quick_link', required — Visibility of a resource

## Other responses

- `401` — Unauthorized
- `404` — Resource not found

---

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