Skip to main content
A Product is a digital good or service sold on Whop. Products contain variants for pricing and may contain experiences for content delivery. Use the Products API to search the public marketplace, list an account’s products, retrieve a product, and create, update, or delete products.
Replaces the Legacy Products resource. Existing Legacy integrations keep working; see API versions for the stability contract.

Endpoints

Attributes

string
required
Product ID, prefixed prod_.
object | null
required
Account that sells this product.
number
required
Average star rating across published reviews for this product, from 1.0 to 5.0. Returns 0.0 when no published-review rating is available.
string
required
When the product was created, as an ISO 8601 timestamp.
string | null
required
Call-to-action button label shown on the product purchase page.Available options: get_access, join, order_now, shop_now, call_now, donate_now, contact_us, sign_up, subscribe, purchase, get_offer, apply_now, complete_order
string | null
required
URL the call-to-action button links to instead of checkout.
string | null
required
Custom text label on customer’s bank statement.
object | null
required
Buyable variant to show and check out with. The configured default when that variant is buyable, otherwise the first buyable variant in product-page order. null when none is buyable.

Properties

string
required
Variant ID, prefixed plan_.
number | null
required
Number of days between recurring charges, such as 30 for monthly or 365 for annual. null for one-time variants.
number | null
required
Access duration in days for expiration-based variants. null for variants without an expiration.
object
required
What checkout charges up front. amount is "0.00" when the first charge is free, such as a trial.

Properties

string
required
The amount in major units, as an exact decimal string — "10.00" is ten dollars. A string so no float rounds it in transit.
string
required
Three-letter ISO 4217 currency code, lowercase.
integer
required
How many decimal places the amount CARRIES — the precision the charge itself runs at.
integer
required
How many decimal places to SHOW. Usually equal to decimals, and deliberately not always: COP is charged in centavos but written in whole pesos, so it is 2 and 0. Format the number in your own locale using this.
string
required
Billing model for this variant: one_time or renewal.Available options: renewal, one_time
object
required
The recurring charge every billing_period days. amount is "0.00" for one-time variants.

Properties

string
required
The amount in major units, as an exact decimal string — "10.00" is ten dollars. A string so no float rounds it in transit.
string
required
Three-letter ISO 4217 currency code, lowercase.
integer
required
How many decimal places the amount CARRIES — the precision the charge itself runs at.
integer
required
How many decimal places to SHOW. Usually equal to decimals, and deliberately not always: COP is charged in centavos but written in whole pesos, so it is 2 and 0. Format the number in your own locale using this.
string | null
required
Variant display name shown to customers. null if no title has been set.
boolean
required
Whether the variant has unlimited stock.
string
required
Where this variant can be seen. visible variants appear on the product page.Available options: visible, hidden, archived, quick_link
string | null
required
Written description displayed on the product page. null if none is set.
string | null
required
External identifier stored on the product for your own reference.
Gallery images for this product, ordered by position.

Properties

string
required
Gallery image ID.
string | null
required
Uploaded file MIME type, such as image/jpeg.
string | null
required
Pre-optimized URL for rendering this image on the client.
number | null
required
Commission rate affiliates earn through the global affiliate program.
string | null
required
Enrollment status in the global affiliate program.Available options: enabled, disabled
string | null
required
Short marketing headline displayed on product page.
string[]
required
Lowercased labels used to group products into collections. Filter the list endpoint by labels to fetch one collection.
string
required
Listing state on the whop.com marketplace. pending_review means submitted and awaiting review; live_marketplace means approved and discoverable.Available options: not_available, pending_review, live_marketplace
number | null
required
Commission rate members earn through the member affiliate program.
string | null
required
Enrollment status in the member affiliate program.Available options: enabled, disabled
number
required
Active memberships for this product; 0 if public member counts are disabled.
object | null
required
Custom key-value pairs stored on the product.
object | null
required
User who owns the account selling this product.
object | null
required
Tax classification code for this product, or null if no tax code is set.
number
required
Published customer reviews for this product.
string
required
URL slug for the product’s public link.
string
required
Product display name shown to customers.
string
required
When the product was last updated, as an ISO 8601 timestamp.
object | null
required
The option set the product’s variants span, as a map of attribute name to the values in use, e.g. \{"color": ["Blue", "Red"], "size": ["S", "M", "L"]}. Derived from the visible, non-invoice variants that carry attributes: keys alphabetical, values in the order the variants were created. Read-only. null when the product has no variants.
object[] | null
required
The product’s variants whose visibility is visible and that were not generated for an invoice, in creation order. Plain pricing options are included with attributes: null. Hidden, archived, quick-link, and invoice variants stay reachable through GET /variants. null when the product has more than 1000 variants (page them through GET /variants?product_ids=) and in webhook payloads.

Properties

string
required
Variant ID, prefixed plan_.
object | null
required
Account that sells this variant; null for standalone invoice variants.

Properties

string
required
Account ID, prefixed biz_.
string
required
Account display name.
boolean
required
Whether adaptive pricing is enabled for this variant. Raw setting — does not check processor compatibility or feature flags.
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.
number | null
required
Number of days between recurring charges, such as 30 for monthly or 365 for annual. null for one-time variants.
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.
number | null
required
Cancellation discount as a whole-number percentage. null when none is offered or the actor lacks the plan:basic:read scope.
object | null
required
Variant-level checkout styling (background_color, button_color, font_family, border_style); null inherits the account default.
string
required
When the variant was created, as an ISO 8601 timestamp.
string
required
Three-letter ISO currency code for this variant’s prices.
object[]
required
Custom input fields collected on the checkout form.

Properties

string
required
Custom field ID, prefixed field_.
string
required
Custom field input type.Available options: text
string
required
Field label shown to customer at checkout.
number
required
Field position on checkout form.
string | null
required
Placeholder text shown in the empty field. null if none is set.
boolean
required
Whether the customer must complete this field to check out.
string | null
required
Customer-visible variant description. Maximum 1000 characters. null if no description is set.
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.
string
required
Human-readable price for display (currency + interval), e.g. “$10 / month”.
object | null
required
Pricing-tier image (url, blurhash) shown on the product page; null when no image is set.
number
required
Initial purchase price in variant currency.
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.

Properties

string
required
The amount in major units, as an exact decimal string — "10.00" is ten dollars. A string so no float rounds it in transit.
string
required
Three-letter ISO 4217 currency code, lowercase.
integer
required
How many decimal places the amount CARRIES — the precision the charge itself runs at.
integer
required
How many decimal places to SHOW. Usually equal to decimals, and deliberately not always: COP is charged in centavos but written in whole pesos, so it is 2 and 0. Format the number in your own locale using this.
string | null
required
Private notes not shown to customers. null unless the actor has the plan:basic:read scope on the variant’s account.
object | null
required
Invoice this variant was generated for; null unless created for an invoice.
number | null
required
Active memberships through this variant. null unless the actor has the plan:basic:read scope on the variant’s account.
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.
boolean | null
required
Whether a cancellation discount is offered. null unless the actor has the plan:basic:read scope on the variant’s account.
object | null
required
Payment method configuration (enabled, disabled, include_platform_defaults); null when variant uses default settings.
string
required
Billing model for this variant.Available options: renewal, one_time
object | null
required
Product this variant belongs to; null for standalone variants.
string
required
URL where customers can purchase this variant directly.
string
required
Sales method for this variant.Available options: buy_now, waitlist
number
required
Recurring price charged every billing period.
string | null
required
Stock keeping unit, free text set by the seller (e.g. TSHIRT-LARGE-BLUE). Not enforced unique. null when unset.
number | null
required
Installment payments required before the subscription pauses. Must be greater than 1. null if split pay is not configured.
number | null
required
Units available for purchase. null unless the actor has the plan:basic:read scope on the variant’s account.
number | null
required
Original initial price shown with a strikethrough, in the variant’s currency. null when no strikethrough is set.
number | null
required
Original renewal price shown with a strikethrough, in the variant’s currency. null when no strikethrough is set.
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
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.
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.
boolean
required
Whether the variant has unlimited stock. When true, the stock field is ignored; waitlist variants always report true.
string
required
When the variant was last updated, as an ISO 8601 timestamp.
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
boolean
required
Whether the product has been verified by Whop.
string | null
required
Whether the product is publicly visible, hidden, or archived.
Product