Update Variant
Update a variant’s pricing, billing interval, visibility, stock, and other settings.
Authorizations
An Account API key, an App API key, an account access token, an account-scoped user token, or a user OAuth token. Prepend the key or token with Bearer, for example Bearer ***************************. See Auth & API keys for how to get each one.
Headers
Pins the request to a dated API version.
"2026-09-25"
Path Parameters
Variant ID, prefixed plan_.
Body
Whether this variant accepts local currency payments via adaptive pricing.
true
Attribute values that make this variant one variant of its product, as a map of attribute name to value, e.g. {"size": "Large", "color": "Blue"}. Names are normalized to snake_case identifiers (Ring Size becomes ring_size) and come back in alphabetical order. Every variant on a product must carry the same attribute names and a distinct set of values. Send null to make the variant an ordinary pricing option again.
Recurring billing interval in days, such as 30 for monthly or 365 for annual.
30
How many renewals the retention discount applies to. Required when offer_cancel_discount is true.
3
Percentage taken off each discounted renewal. Required when offer_cancel_discount is true.
20
Checkout styling overrides for this variant.
The three-letter ISO currency code for the variant's pricing. Defaults to USD.
"usd"
An array of custom field definitions to collect from customers at checkout. Omitting this field clears existing custom fields.
A text description of the variant displayed to customers on the product page.
"Two hand washes a month, interior vacuum, and a quarterly sealant top-up."
Access duration in days before the membership expires.
365
An image displayed on the product page to represent this variant.
Initial amount charged in the variant's currency, e.g. 10.43 for $10.43. A paid fiat variant charges at least 1.00 in its currency; use 0 for free.
0
Private notes visible only to the account owner. Not shown to customers.
"Maintenance tier. Upsell the interior shampoo add-on at renewal."
Custom key-value pairs to store on the variant. Included in webhook payloads for payment and membership events. Max 50 keys, 100 chars per key, 500 chars per string value. The reserved keys custom_cta (a checkout call-to-action button label — one of the product custom CTA values, e.g. subscribe, get_offer) and custom_cta_url (a URL the button links to; web or tel:) override the product's call to action for this variant and are validated on save.
Whether to offer a retention discount when a customer attempts to cancel.
true
Override the default tax classification for this specific variant.
"inclusive"
Explicit payment method configuration for the variant. When not provided, the account's defaults apply. Send at least one of enabled or disabled; an omitted one is empty.
Sales method for this variant.
"buy_now"
The amount charged each billing period for recurring variants, in the variant's currency. A paid fiat variant charges at least 1.00 in its currency.
59
Stock keeping unit for this variant. Maximum 100 characters. Free text, not enforced unique.
"TEE-LARGE-BLUE"
The maximum number of units available for purchase. Ignored when unlimited_stock is true.
25
A comparison price displayed with a strikethrough for the initial price.
99
A comparison price displayed with a strikethrough for the renewal price.
79
3D Secure behavior for supported on-session card payments. mandate_challenge requires a 3DS challenge before payment processing; mandate_if_required mandates a challenge only when the payment processor requires it; frictionless_if_required uses the regular frictionless 3DS flow. Payments of $1,000 or more use mandate_if_required unless mandate_challenge is selected. Risk and authentication recovery requirements can override the preference. Send null to inherit the account default.
mandate_challenge, mandate_if_required, frictionless_if_required, null "frictionless_if_required"
The display name of the variant shown to customers on the product page. Maximum 30 characters.
30"Unlimited Wash Club"
Free trial duration before the first recurring charge.
7
Whether the variant has unlimited stock. When true, the stock field is ignored.
false
Whether the variant is visible to customers or hidden from public view.
"visible"
Response
variant updated
Account that sells this variant; null for standalone invoice variants.
Whether adaptive pricing is enabled for this variant. Raw setting — does not check processor compatibility or feature flags.
true
Attribute values that distinguish this variant within its product, as a map of attribute name to value, e.g. {"color": "Blue", "size": "Large"}. Names are snake_case identifiers and come back in alphabetical order. Every attributed variant on a product carries the same attribute names and a distinct set of values; the product lists the full option set as variant_attributes. null when the variant has no attributes.
Number of days between recurring charges, such as 30 for monthly or 365 for annual. null for one-time variants.
30
Billing intervals the cancellation discount applies to (0 forever, 1 first payment, or a month count). null when none is offered or the actor lacks the plan:basic:read scope.
3
Cancellation discount as a whole-number percentage. null when none is offered or the actor lacks the plan:basic:read scope.
20
Variant-level checkout styling (background_color, button_color, font_family, border_style); null inherits the account default.
Whether tax is collected on purchases of this variant, based on the account's tax configuration.
false
When the variant was created, as an ISO 8601 timestamp.
"2026-01-01T12:00:00.000Z"
Three-letter ISO currency code for this variant's prices.
"usd"
Whether the variant can be deleted (it has no memberships or waitlist entries). null unless the actor has the plan:basic:read scope on the variant's account.
true
Customer-visible variant description. Maximum 1000 characters. null if no description is set.
"Two hand washes a month, interior vacuum, and a quarterly sealant top-up."
The configuration governing a checkout for this variant, resolved through every layer (the variant's own and the account's) — the shape a session's payment_method_configuration carries. Apply it over the payment method types catalogue for the offerable set. null means platform defaults; payment_method_configuration stays the variant's own editable override.
Access duration in days for expiration-based variants, such as 365 for a one-year pass. null for variants without an expiration.
365
Human-readable price for display (currency + interval), e.g. "$10 / month".
"$59.00 / month"
Variant ID, prefixed plan_.
"plan_xxxxxxxxxxxxxx"
Pricing-tier image (url, blurhash) shown on the product page; null when no image is set.
Initial purchase price in variant currency.
0
Total charged at checkout for one unit, before promo codes and tax: initial_price plus the first renewal_price for recurring variants, or initial_price alone while a free trial applies. The trial does not apply when the viewing user has already used one for this variant.
Private notes not shown to customers. null unless the actor has the plan:basic:read scope on the variant's account.
"Maintenance tier. Upsell the interior shampoo add-on at renewal."
Invoice this variant was generated for; null unless created for an invoice.
Active memberships through this variant. null unless the actor has the plan:basic:read scope on the variant's account.
0
Custom key-value pairs stored on the variant. Included in webhook payloads for payment and membership events. Maximum 50 keys, 100 characters per key, 500 characters per value. The reserved keys custom_cta and custom_cta_url, when set, override the product's checkout call to action for this variant.
Whether a cancellation discount is offered. null unless the actor has the plan:basic:read scope on the variant's account.
true
Payment method configuration (enabled, disabled, include_platform_defaults); null when variant uses default settings.
Billing model for this variant.
renewal, one_time "renewal"
Product this variant belongs to; null for standalone variants.
URL where customers can purchase this variant directly.
"https://whop.com/checkout/plan_xxxxxxxxxxxxxx"
Sales method for this variant.
buy_now, waitlist "buy_now"
Recurring price charged every billing period.
59
Stock keeping unit, free text set by the seller (e.g. TSHIRT-LARGE-BLUE). Not enforced unique. null when unset.
"WASH-CLUB-TEE-LARGE-BLUE"
Installment payments required before the subscription pauses. Must be greater than 1. null if split pay is not configured.
4
Units available for purchase. null unless the actor has the plan:basic:read scope on the variant's account.
0
Original initial price shown with a strikethrough, in the variant's currency. null when no strikethrough is set.
99
Original renewal price shown with a strikethrough, in the variant's currency. null when no strikethrough is set.
79
How tax is handled for this variant, including whether tax is included in the price, added at checkout, or not configured.
inclusive, exclusive, unspecified "unspecified"
3D Secure behavior for supported on-session card payments. mandate_challenge requires a 3DS challenge before payment processing; mandate_if_required mandates a challenge only when the payment processor requires it; frictionless_if_required uses the regular frictionless 3DS flow. Payments of $1,000 or more use mandate_if_required unless mandate_challenge is selected. Risk and authentication recovery requirements can override the preference. null inherits the account default.
mandate_challenge, mandate_if_required, frictionless_if_required, null "frictionless_if_required"
Variant display name shown to customers. Maximum 30 characters. A variant created without one defaults to its attribute values joined with /. null if no title has been set.
"Unlimited Wash Club"
Free trial days before the first renewal charge. null if no trial is configured or the user has already used a trial for this variant.
7
Whether the variant has unlimited stock. When true, the stock field is ignored; waitlist variants always report true.
false
When the variant was last updated, as an ISO 8601 timestamp.
"2026-01-01T12:00:00.000Z"
Controls where this variant can be seen. When hidden, the variant is reachable only by its direct link.
visible, hidden, archived, quick_link "visible"

