| sku | No | SKU of the product. | |
| price | No | Patch the product's single price - top-level fields you omit keep their value, but `recurring` and `paymentPlan` are replaced whole: omitted sub-fields are not kept (interval defaults to month, intervalCount to 1, and trialPeriodDays, billingCycleAnchorConfig and startDate are dropped), so read the current config with `get_product` and re-send it in full when touching either. Valid only while the product has at most one price; products with multiple prices must be updated through `prices[]`. Ignored when `prices` is also sent. `billingType` and `payWhatYouWant` are fixed once a price exists. Cannot be null. | |
| stock | No | Available stock of the product. | |
| title | No | Product title. | |
| prices | No | Replaces the full price list. Read the current prices with `get_product` first and include `id` on every price you want to keep; entries without an id are created and existing prices missing from the list are removed. At least one entry must be enabled. `billingType` and `payWhatYouWant` cannot change on an existing price. Takes precedence over `price` when both are sent. | |
| fileIds | No | | |
| taxCode | No | If Stripe Tax is enabled, determines the tax code used when calculating tax. Defaults to your Stripe Tax settings. | |
| imageIds | No | Replaces the product images with these image file IDs (upload with `upload_file`). Send `[]` to remove all images; null is not accepted. | |
| variants | No | Replaces the full variant list; nothing is merged from the stored variants. Read the current variants with `get_product` first and include `id` on every variant and option you want to keep; entries without an id are created and existing ones missing from the list are removed. Send `[]` to remove all variants. Three fields do not round-trip from `get_product`: re-send each option image as `imageId: option.image.fileId` or it is dropped; option `discountedFromPrice` is not returned at all, so re-supply it or it is lost; and an option returned with `type: "pay_what_you_want"` must be sent back as `type: "one_time"` with `payWhatYouWant: true`. To link a discount to specific options, give those options a `key` and reference it in `discounts[].variantOptionIds[].key` in the same request. | |
| discounts | No | Bulk discounts for the product.
Use `checkout_quantity` when the discount should apply to the total checkout quantity.
Use `variant_option_quantity` when the discount should apply only to specific variant options. In that mode, you must do all of the following in the same request:
1. Include `productData.variants`.
2. Give each target variant option a temporary `key` in `variants[].options[].key`.
3. Reference those exact keys in `discounts[].variantOptionIds[].key`.
- `variants[].options`: [{ name: "Red", key: "red" }, { name: "Blue", key: "blue" }]
- `discounts`: [{ quantityCondition: "variant_option_quantity", variantOptionIds: [{ key: "red" }, { key: "blue" }], minQuantity: 3, percentOff: 10 }]
[Learn more](https://checkoutpage.com/docs/articles/bulk-discounts) | |
| productId | Yes | The ID of the product to update. Find it on a page response as `data.product.id` (see `get_checkout_page`). | |
| description | No | Description of the product. Accepts HTML or plain text. | |
| pricePicker | No | Price picker settings: the heading and description above the options, Show more / less, and tab labels, defaults and order. | |
| taxBehavior | No | If Stripe Tax is enabled, determines the behaviour of Stripe Tax. Defaults to your Stripe Tax settings. | |
| limitPayments | No | Duplicate-payment prevention settings for this product. Applies to one-time payments only. | |
| defaultPriceId | No | ID of the price pre-selected at checkout. Must reference an existing price `id` (after this update is applied). Cannot be cleared; set a different price instead. | |
| fixedTaxRateIds | No | Tax Rate IDs applied to this product (at most one). Send `[]` to clear; null is not accepted. Call `list_tax_rates` to find an existing rate. | |
| variantsRequired | No | Use when no variants are marked as required but you still need the customer to select at least one variant option. Ignored when any variant is individually required. Defaults to `false`. | |
| hasUnlimitedStock | No | Whether or not the stock of the product is unlimited. If set to `true`, the `stock` field is ignored. | |
| limitSubscriptions | No | Configuration to limit the number of active subscriptions for this product. Used to cap subscriptions to a specific number. | |
| generateLicenseKeys | No | If true, on purchase a license key for the product is generated | |
| enableFileAccessForInactiveSubscriptions | No | Allow customers with inactive subscriptions to keep accessing file downloads. | |