Create Product
Creates a new product for an account.
Headers
A unique key that makes this request safe to retry. See Idempotent requests.
Request body
Example request
{
"account_id": "biz_xxxxxxxxxxxxxx",
"custom_cta": "order_now",
"custom_cta_url": "https://shinetime.example/book",
"custom_statement_descriptor": "WHOP*SHINETIME",
"description": "Full interior extraction, leather conditioning, and an ozone odor treatment.",
"gallery_images": [
{
"direct_upload_id": "eyJfcmFpbHMiOnsiZGF0YSI6MSwicHVyIjoiYmxvYl9pZCJ9fQ==--xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"id": "file_xxxxxxxxxxxxxx"
}
],
"global_affiliate_percentage": 10,
"global_affiliate_status": "enabled",
"headline": "Steam, shampoo, and odor removal in one visit",
"labels": [
"interior"
],
"member_affiliate_percentage": 5,
"member_affiliate_status": "enabled",
"metadata": {
"bay": "1",
"duration_hours": "4"
},
"product_tax_code_id": "ptc_xxxxxxxxxxxxxx",
"redirect_purchase_url": "https://shinetime.example/thanks",
"route": "interior-deep-clean",
"send_welcome_message": true,
"title": "Interior Deep Clean",
"visibility": "visible"
}Response
product created
Example response
{
"account": {
"id": "biz_xxxxxxxxxxxxxx",
"route": "biz_xxxxxxxxxxxxxx",
"title": "Shine Time Auto Detailing"
},
"created_at": "2026-01-01T12:00:00.000Z",
"custom_cta": "order_now",
"custom_cta_url": "https://shinetime.example/book",
"custom_statement_descriptor": "WHOP*SHINETIME",
"default_plan": {
"billing_period": 30,
"id": "plan_xxxxxxxxxxxxxx",
"initial_price": {
"amount": "-2.50",
"currency": "usd",
"decimals": 2,
"display_decimals": 2
},
"plan_type": "renewal",
"renewal_price": {
"amount": "-2.50",
"currency": "usd",
"decimals": 2,
"display_decimals": 2
},
"unlimited_stock": true,
"visibility": "visible"
},
"description": "Full interior extraction, leather conditioning, and an ozone odor treatment.",
"external_identifier": "SHINE-CERAMIC-01",
"gallery_images": [
{
"content_type": "image/png",
"id": "file_xxxxxxxxxxxxxx",
"url": "https://whop-assets-example.s3.amazonaws.com/uploads/image/2026-01-01/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
],
"global_affiliate_percentage": 10,
"global_affiliate_status": "enabled",
"headline": "Steam, shampoo, and odor removal in one visit",
"id": "prod_xxxxxxxxxxxxxx",
"labels": [
"interior"
],
"marketplace_status": "not_available",
"member_affiliate_percentage": 5,
"member_affiliate_status": "enabled",
"metadata": {
"bay": "1",
"duration_hours": "4"
},
"owner_user": {
"id": "user_xxxxxxxxxxxxxx",
"name": "Marcus Webb",
"username": "marcuswebb"
},
"product_tax_code": {
"id": "ptc_xxxxxxxxxxxxxx",
"name": "General - Digital Goods",
"product_type": "digital"
},
"route": "interior-deep-clean",
"title": "Interior Deep Clean",
"updated_at": "2026-01-01T12:00:00.000Z",
"variant_attributes": {
"color": [
"Red",
"Blue"
],
"size": [
"M",
"S"
]
},
"variants": [
{
"account": {
"id": "biz_xxxxxxxxxxxxxx",
"title": "Shine Time Auto Detailing"
},
"adaptive_pricing_enabled": true,
"attributes": {
"color": "Blue",
"size": "S"
},
"billing_period": 30,
"cancel_discount_intervals": 3,
"cancel_discount_percentage": 20,
"checkout_styling": {
"background_color": "#0f172a",
"border_style": "rounded",
"button_color": "#f59e0b",
"font_family": "roboto"
},
"created_at": "2026-01-01T12:00:00.000Z",
"currency": "usd",
"custom_fields": [
{
"field_type": "text",
"id": "field_xxxxxxxxxxxxxx",
"name": "Vehicle make and model",
"placeholder": "2021 Audi S5",
"required": true
}
],
"description": "Two hand washes a month, interior vacuum, and a quarterly sealant top-up.",
"expiration_days": 365,
"formatted_price": "$59.00 / month",
"id": "plan_xxxxxxxxxxxxxx",
"image": {
"blurhash": "LA6bDXT$E3b:R6i+RibEIWbp%ej1",
"url": "https://whop-assets-example.s3.amazonaws.com/uploads/image/2026-01-01/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
},
"initial_price_due": {
"amount": "-2.50",
"currency": "usd",
"decimals": 2,
"display_decimals": 2
},
"internal_notes": "Maintenance tier. Upsell the interior shampoo add-on at renewal.",
"invoice": {
"id": "inv_xxxxxxxxxxxxxx"
},
"metadata": {
"custom_cta": "subscribe",
"custom_cta_url": "https://shinetime.example/wash-club"
},
"offer_cancel_discount": true,
"payment_method_configuration": {
"disabled": [
"crypto"
],
"enabled": [
"card"
],
"include_platform_defaults": true
},
"plan_type": "renewal",
"product": {
"id": "prod_xxxxxxxxxxxxxx",
"title": "Ceramic Coating Package"
},
"purchase_url": "https://whop.com/checkout/plan_xxxxxxxxxxxxxx",
"release_method": "buy_now",
"renewal_price": 59,
"sku": "CERAMIC-COATING-S-BLUE",
"split_pay_required_payments": 4,
"strike_through_initial_price": 99,
"strike_through_renewal_price": 79,
"three_ds_level": "frictionless_if_required",
"title": "Unlimited Wash Club",
"trial_period_days": 7,
"updated_at": "2026-01-01T12:00:00.000Z",
"visibility": "visible"
}
],
"visibility": "visible"
}Changes
Changed in 10 of the 74 revisions of this API.192455
- ●
the
request property's maxLength was set to1500request-property-max-length-set
- ●
the
request property's maxLength was set to80request-property-max-length-set
- ●
the
request property's maxLength was set to80request-property-max-length-set
- ○
added the required property
to the response with the statusresponse-required-property-added
- ○
added the required property
to the response with the statusresponse-required-property-added
This revision also has 1 change that name no endpoint, such as unreferenced schemas being removed. See the revision's changelog
- ●
- ○
added the new optional request property
new-optional-request-property
This revision also has 1 change that name no endpoint, such as unreferenced schemas being removed. See the revision's changelog
- ○
- ○
added the required property
to the response with the statusresponse-required-property-added
This revision also has 1 change that name no endpoint, such as unreferenced schemas being removed. See the revision's changelog
- ○
- ○
added the required property
to the response with the statusresponse-required-property-added
- ○
- ○
added the new optional request property
new-optional-request-property
- ○
added the required property
to the response with the statusresponse-required-property-added
This revision also has 1 change that name no endpoint, such as unreferenced schemas being removed. See the revision's changelog
- ○
- ○
added the non-success response with the status
response-non-success-status-added
- ○
- ○
added the optional property
/to the response with the statusresponse-optional-property-added
This revision also has 9 changes that name no endpoint, such as unreferenced schemas being removed. See the revision's changelog
- ○
- ○
the security scope
access_pass:createwas added to the endpoint's security schemebearerAuthapi-security-scope-added
- ○
the security scope
product:createwas removed from the endpoint's security schemebearerAuthapi-security-scope-removed
This revision also has 16 changes that name no endpoint, such as unreferenced schemas being removed. See the revision's changelog
- ○
- ▲
request property
was restricted to a list of enum valuesrequest-property-became-enum
- ▲
request property
was restricted to a list of enum valuesrequest-property-became-enum
- ▲
request property
was restricted to a list of enum valuesrequest-property-became-enum
- ●
added the new
apply_nowenum value to theresponse property for the response statusresponse-property-enum-value-added
- ●
added the new
call_nowenum value to theresponse property for the response statusresponse-property-enum-value-added
- ●
added the new
complete_orderenum value to theresponse property for the response statusresponse-property-enum-value-added
- ●
added the new
contact_usenum value to theresponse property for the response statusresponse-property-enum-value-added
- ●
added the new
disabledenum value to theresponse property for the response statusresponse-property-enum-value-added
- ●
added the new
disabledenum value to theresponse property for the response statusresponse-property-enum-value-added
- ●
added the new
donate_nowenum value to theresponse property for the response statusresponse-property-enum-value-added
- ●
added the new
enabledenum value to theresponse property for the response statusresponse-property-enum-value-added
- ●
added the new
enabledenum value to theresponse property for the response statusresponse-property-enum-value-added
- ●
added the new
get_accessenum value to theresponse property for the response statusresponse-property-enum-value-added
- ●
added the new
get_offerenum value to theresponse property for the response statusresponse-property-enum-value-added
- ●
added the new
joinenum value to theresponse property for the response statusresponse-property-enum-value-added
- ●
added the new
order_nowenum value to theresponse property for the response statusresponse-property-enum-value-added
- ●
added the new
purchaseenum value to theresponse property for the response statusresponse-property-enum-value-added
- ●
added the new
shop_nowenum value to theresponse property for the response statusresponse-property-enum-value-added
- ●
added the new
sign_upenum value to theresponse property for the response statusresponse-property-enum-value-added
- ●
added the new
subscribeenum value to theresponse property for the response statusresponse-property-enum-value-added
- ●
added the new
undefinedenum value to theresponse property for the response statusresponse-property-enum-value-added
- ●
added the new
undefinedenum value to theresponse property for the response statusresponse-property-enum-value-added
- ●
added the new
undefinedenum value to theresponse property for the response statusresponse-property-enum-value-added
- ○
added the new
apply_nowenum value to the request propertyrequest-property-enum-value-added
- ○
added the new
call_nowenum value to the request propertyrequest-property-enum-value-added
- ○
added the new
complete_orderenum value to the request propertyrequest-property-enum-value-added
- ○
added the new
contact_usenum value to the request propertyrequest-property-enum-value-added
- ○
added the new
disabledenum value to the request propertyrequest-property-enum-value-added
- ○
added the new
disabledenum value to the request propertyrequest-property-enum-value-added
- ○
added the new
donate_nowenum value to the request propertyrequest-property-enum-value-added
- ○
added the new
enabledenum value to the request propertyrequest-property-enum-value-added
- ○
added the new
enabledenum value to the request propertyrequest-property-enum-value-added
- ○
added the new
get_accessenum value to the request propertyrequest-property-enum-value-added
- ○
added the new
get_offerenum value to the request propertyrequest-property-enum-value-added
- ○
added the new
joinenum value to the request propertyrequest-property-enum-value-added
- ○
added the new
order_nowenum value to the request propertyrequest-property-enum-value-added
- ○
added the new
purchaseenum value to the request propertyrequest-property-enum-value-added
- ○
added the new
shop_nowenum value to the request propertyrequest-property-enum-value-added
- ○
added the new
sign_upenum value to the request propertyrequest-property-enum-value-added
- ○
added the new
subscribeenum value to the request propertyrequest-property-enum-value-added
- ○
added the new
undefinedenum value to the request propertyrequest-property-enum-value-added
This revision also has 4 changes that name no endpoint, such as unreferenced schemas being removed. See the revision's changelog
- ▲
- ▲
the response property
became nullable for the statusresponse-property-became-nullable
- ▲
the response property
became nullable for the statusresponse-property-became-nullable
- ▲
the response property
became nullable for the statusresponse-property-became-nullable
- ▲
the response property
became nullable for the statusresponse-property-became-nullable
- ▲
the response property
became nullable for the statusresponse-property-became-nullable
- ▲
the
response's property format changed fromdate-timeto no format for statusresponse-property-type-changed
- ▲
the
response's property type changed fromintegertonumberfor statusresponse-property-type-changed
- ▲
the
response's property type changed fromintegertonumberfor statusresponse-property-type-changed
- ▲
the
response's property format changed fromdate-timeto no format for statusresponse-property-type-changed
- ▲
removed the required property
from the response with the statusresponse-required-property-removed
- ▲
removed the required property
/from the response with the statusresponse-required-property-removed
- ▲
removed the required property
/from the response with the statusresponse-required-property-removed
- ▲
removed the required property
/from the response with the statusresponse-required-property-removed
- ▲
removed the required property
/from the response with the statusresponse-required-property-removed
- ▲
removed the required property
/from the response with the statusresponse-required-property-removed
- ▲
removed the required property
/from the response with the statusresponse-required-property-removed
- ●
removed the request property
request-property-removed
- ○
added the new optional
headerrequest parameterIdempotency-Keynew-optional-request-parameter
- ○
added the new optional request property
new-optional-request-property
- ○
removed the
apply_nowenum value from theresponse property for the response statusresponse-property-enum-value-removed
- ○
removed the
archivedenum value from theresponse property for the response statusresponse-property-enum-value-removed
- ○
removed the
call_nowenum value from theresponse property for the response statusresponse-property-enum-value-removed
- ○
removed the
complete_orderenum value from theresponse property for the response statusresponse-property-enum-value-removed
- ○
removed the
contact_usenum value from theresponse property for the response statusresponse-property-enum-value-removed
- ○
removed the
disabledenum value from theresponse property for the response statusresponse-property-enum-value-removed
- ○
removed the
disabledenum value from theresponse property for the response statusresponse-property-enum-value-removed
- ○
removed the
donate_nowenum value from theresponse property for the response statusresponse-property-enum-value-removed
- ○
removed the
enabledenum value from theresponse property for the response statusresponse-property-enum-value-removed
- ○
removed the
enabledenum value from theresponse property for the response statusresponse-property-enum-value-removed
- ○
removed the
get_accessenum value from theresponse property for the response statusresponse-property-enum-value-removed
- ○
removed the
get_offerenum value from theresponse property for the response statusresponse-property-enum-value-removed
- ○
removed the
hiddenenum value from theresponse property for the response statusresponse-property-enum-value-removed
- ○
removed the
joinenum value from theresponse property for the response statusresponse-property-enum-value-removed
- ○
removed the
order_nowenum value from theresponse property for the response statusresponse-property-enum-value-removed
- ○
removed the
purchaseenum value from theresponse property for the response statusresponse-property-enum-value-removed
- ○
removed the
quick_linkenum value from theresponse property for the response statusresponse-property-enum-value-removed
- ○
removed the
shop_nowenum value from theresponse property for the response statusresponse-property-enum-value-removed
- ○
removed the
sign_upenum value from theresponse property for the response statusresponse-property-enum-value-removed
- ○
removed the
subscribeenum value from theresponse property for the response statusresponse-property-enum-value-removed
- ○
removed the
visibleenum value from theresponse property for the response statusresponse-property-enum-value-removed
- ○
added the required property
to the response with the statusresponse-required-property-added
- ○
added the required property
//to the response with the statusresponse-required-property-added
- ○
added the required property
to the response with the statusresponse-required-property-added
This revision also has 1 change that name no endpoint, such as unreferenced schemas being removed. See the revision's changelog
- ▲
Of the 74 revisions, 1 has no diff computed.