Skip to main content
GET
Retrieve Variant

Authorizations

Authorization
string
header
required

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

Api-Version-Date
string

Pins the request to a dated API version.

Example:

"2026-10-15-1"

Path Parameters

id
string
required

Variant ID, prefixed plan_.

Query Parameters

presentment_currency
string | null

The currency to state each variant's prices in. Omit it, or send null, for each variant's own currency. auto states them in the currency of the country Whop places the buyer in: by ip_address when your server sends one, and by the request's own IP address otherwise. To choose that country instead, send presentment_country in place of this. A three-letter ISO 4217 code, such as eur, states them in that currency. A variant converts only where a payment quote for it would be priced in that currency, and stays in its own currency otherwise: a renewing variant, one with adaptive pricing off, a currency no payment method can collect, or auto for a buyer Whop cannot place in a country. Converted prices are an estimate at the current exchange rate. Nothing is held: the payment quote the buyer pays from fixes the rate.

Example:

"auto"

ip_address
string | null

The buyer's IP address, when your server reads on their behalf. Needs an API key; any other caller is placed by its own request. Where presentment_currency auto finds the buyer's local currency, and where a payment method must be able to collect it.

Example:

"203.0.113.7"

presentment_country
string | null

The country to state each variant's prices for, as an ISO 3166-1 alpha-2 code such as JP, when the buyer chose one: a store's country picker. States them in the currency auto would for a buyer in that country, so send it instead of presentment_currency, never with it. Whether a payment method can collect that currency is still judged where the buyer is: by ip_address, else by the request's own IP address. A country Whop has no currency for is ignored, and the prices are stated as auto would state them.

Example:

"JP"

Response

variant retrieved

account
object | null
required

Account that sells this variant; null for standalone invoice variants.

adaptive_pricing_enabled
boolean
required

Whether adaptive pricing is enabled for this variant. Raw setting — does not check processor compatibility or feature flags.

Example:

true

attributes
object | null
required

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.

Example:
billing_period
number | null
required

Number of days between recurring charges, such as 30 for monthly or 365 for annual. null for one-time variants.

Example:

30

cancel_discount_intervals
number | null
required

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.

Example:

3

cancel_discount_percentage
number | null
required

Cancellation discount as a whole-number percentage. null when none is offered or the actor lacks the plan:basic:read scope.

Example:

20

checkout_styling
object | null
required

Variant-level checkout styling (background_color, button_color, font_family, border_style); null inherits the account default.

Example:
collect_tax
boolean
required

Whether tax is collected on purchases of this variant, based on the account's tax configuration.

Example:

false

created_at
string
required

When the variant was created, as an ISO 8601 timestamp.

Example:

"2026-01-01T12:00:00.000Z"

currency
string
required

Three-letter ISO 4217 code of the currency every price on this variant is stated in, lowercase: the variant's own currency, or the presentment_currency the read asked for when the variant can be converted into it.

Example:

"usd"

custom_fields
object[]
required
deletable
boolean | null
required

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.

Example:

true

description
string | null
required

Customer-visible variant description. Maximum 1000 characters. null if no description is set.

Example:

"Two hand washes a month, interior vacuum, and a quarterly sealant top-up."

effective_payment_method_configuration
object | null
required

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.

expiration_days
number | null
required

Access duration in days for expiration-based variants, such as 365 for a one-year pass. null for variants without an expiration.

Example:

365

formatted_price
string
required

Human-readable price for display (currency + interval) in currency, e.g. "$10 / month".

Example:

"$59.00 / month"

id
string
required

Variant ID, prefixed plan_.

Example:

"plan_xxxxxxxxxxxxxx"

image
object | null
required

Pricing-tier image (url, blurhash) shown on the product page; null when no image is set.

Example:
initial_price
number
required

Initial purchase price, in currency.

Example:

0

initial_price_due
object
required

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. Stated in currency.

internal_notes
string | null
required

Private notes not shown to customers. null unless the actor has the plan:basic:read scope on the variant's account.

Example:

"Maintenance tier. Upsell the interior shampoo add-on at renewal."

invoice
object | null
required

Invoice this variant was generated for; null unless created for an invoice.

Example:
member_count
number | null
required

Active memberships through this variant. null unless the actor has the plan:basic:read scope on the variant's account.

Example:

0

metadata
object | null
required

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.

Example:
offer_cancel_discount
boolean | null
required

Whether a cancellation discount is offered. null unless the actor has the plan:basic:read scope on the variant's account.

Example:

true

payment_method_configuration
object | null
required

Payment method configuration (enabled, disabled, include_platform_defaults); null when variant uses default settings.

Example:
plan_type
enum<string>
required

Billing model for this variant.

Available options:
renewal,
one_time
Example:

"renewal"

product
object | null
required

Product this variant belongs to; null for standalone variants.

Example:
purchase_url
string
required

URL where customers can purchase this variant directly.

Example:

"https://whop.com/checkout/plan_xxxxxxxxxxxxxx"

release_method
enum<string>
required

Sales method for this variant.

Available options:
buy_now,
waitlist
Example:

"buy_now"

renewal_price
number
required

Recurring price charged every billing period, in currency.

Example:

59

sku
string | null
required

Stock keeping unit, free text set by the seller (e.g. TSHIRT-LARGE-BLUE). Not enforced unique. null when unset.

Example:

"WASH-CLUB-TEE-LARGE-BLUE"

split_pay_required_payments
number | null
required

Installment payments required before the subscription pauses. Must be greater than 1. null if split pay is not configured.

Example:

4

stock
number | null
required

Units available for purchase. null unless the actor has the plan:basic:read scope on the variant's account.

Example:

0

strike_through_initial_price
number | null
required

Original initial price shown with a strikethrough, in currency. null when no strikethrough is set.

Example:

99

strike_through_renewal_price
number | null
required

Original renewal price shown with a strikethrough, in currency. null when no strikethrough is set.

Example:

79

tax_type
enum<string>
required

How tax is handled for this variant, including whether tax is included in the price, added at checkout, or not configured.

Available options:
inclusive,
exclusive,
unspecified
Example:

"unspecified"

three_ds_level
enum<string> | null
required

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.

Available options:
mandate_challenge,
mandate_if_required,
frictionless_if_required,
null
Example:

"frictionless_if_required"

title
string | null
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.

Example:

"Unlimited Wash Club"

trial_period_days
number | null
required

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.

Example:

7

unlimited_stock
boolean
required

Whether the variant has unlimited stock. When true, the stock field is ignored; waitlist variants always report true.

Example:

false

updated_at
string
required

When the variant was last updated, as an ISO 8601 timestamp.

Example:

"2026-01-01T12:00:00.000Z"

visibility
enum<string>
required

Controls where this variant can be seen. When hidden, the variant is reachable only by its direct link.

Available options:
visible,
hidden,
archived,
quick_link
Example:

"visible"