Skip to main content
POST
/
products
Create Product
curl --request POST \
  --url https://{defaultHost}/products \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "title": "<string>",
  "company_id": "<string>",
  "visibility": "<string>",
  "headline": "<string>",
  "description": "<string>",
  "metadata": {},
  "route": "<string>",
  "global_affiliate_percentage": 123,
  "global_affiliate_status": "<string>",
  "member_affiliate_percentage": 123,
  "member_affiliate_status": "<string>",
  "custom_cta": "<string>",
  "custom_cta_url": "<string>",
  "custom_statement_descriptor": "<string>",
  "product_tax_code_id": "<string>",
  "redirect_purchase_url": "<string>",
  "collect_shipping_address": true
}
'
{
  "id": "<string>",
  "created_at": "<string>",
  "updated_at": "<string>",
  "title": "<string>",
  "visibility": "<string>",
  "headline": "<string>",
  "verified": true,
  "member_count": 123,
  "route": "<string>",
  "published_reviews_count": 123,
  "external_identifier": "<string>",
  "metadata": {},
  "description": "<string>",
  "custom_cta": "<string>",
  "custom_cta_url": "<string>",
  "custom_statement_descriptor": "<string>",
  "global_affiliate_percentage": 123,
  "global_affiliate_status": "<string>",
  "member_affiliate_percentage": 123,
  "member_affiliate_status": "<string>",
  "gallery_images": "<array>",
  "product_tax_code": {},
  "owner_user": {},
  "company": {}
}

Authorizations

Authorization
string
header
required

A company API key, company scoped JWT, app API key, or user OAuth token.

Headers

Api-Version-Date
string<date>

Pins the request to a dated API version. When omitted, the request uses the original (2025-01-01) request/response shapes, so existing unversioned callers are never broken. Generated SDKs always send the latest version they were built against. An unrecognized value is rejected with a 400. The schemas documented here always describe the latest version.

Example:

"2026-06-09"

Body

application/json
title
string
required

The display name of the product. Maximum 80 characters.

company_id
string

The unique identifier of the company to create this product for.

visibility
string

Whether the product is visible to customers.

headline
string | null

A short marketing headline for the product page.

description
string | null

A written description displayed on the product page.

metadata
object

Custom key-value pairs to store on the product.

route
string | null

The URL slug for the product's public link.

global_affiliate_percentage
number | null

The commission rate affiliates earn.

global_affiliate_status
string

The enrollment status in the global affiliate program.

member_affiliate_percentage
number | null

The commission rate members earn.

member_affiliate_status
string

The enrollment status in the member affiliate program.

custom_cta
string | null

The call-to-action button label.

custom_cta_url
string | null

A URL the call-to-action button links to.

custom_statement_descriptor
string | null

Custom bank statement descriptor. Must start with WHOP*.

product_tax_code_id
string | null

The unique identifier of the tax classification code.

redirect_purchase_url
string | null

A URL to redirect the customer to after purchase.

collect_shipping_address
boolean | null

Whether to collect a shipping address at checkout.

Response

product created

id
string
required

The ID of the product, which will look like prod_*************

created_at
string
required

When the product was created, as an ISO 8601 timestamp

updated_at
string
required

When the product was last updated, as an ISO 8601 timestamp

title
string | null
required

The display name of the product shown to customers

visibility
string | null
required

Whether the product is publicly visible, hidden, or archived

headline
string | null
required

A short marketing headline displayed on the product page

verified
boolean
required

Whether the product has been verified by Whop

member_count
number
required

The number of active memberships on this product. Returns 0 if the company has disabled public member counts

route
string | null
required

The URL slug for the product's public link

published_reviews_count
number
required

The number of published customer reviews for this product

external_identifier
string | null
required

An external identifier stored on the product for your own reference

metadata
object
required

Custom key-value pairs stored on the product

description
string | null
required

A written description of the product displayed on the product page

custom_cta
string | null
required

The call-to-action button label displayed on the product's purchase page

custom_cta_url
string | null
required

A URL that the call-to-action button links to instead of the default checkout flow

custom_statement_descriptor
string | null
required

A custom text label on the customer's bank statement for purchases of this product

global_affiliate_percentage
number | null
required

The commission rate affiliates earn through the global affiliate program

global_affiliate_status
string | null
required

The enrollment status of this product in the global affiliate program

member_affiliate_percentage
number | null
required

The commission rate members earn through the member affiliate program

member_affiliate_status
string | null
required

The enrollment status of this product in the member affiliate program

The gallery images for this product, each an object with id and url

product_tax_code
object
required

The tax classification code for this product, an object with id, name and product_type. Null if no tax code is set

owner_user
object
required

The user who owns the company selling this product, an object with id, name and username

company
object
required

The company that sells this product, an object with id, route and title