> ## Documentation Index
> Fetch the complete documentation index at: https://docs.whop.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Product

A Product is a digital good or service sold on Whop. Products may contain plans for pricing and/or experiences for content delivery.

Use the Products API to create products, list products visible to your credentials, retrieve product details, update product metadata or merchandising fields, and delete products that should no longer be sold.

## Endpoints

| Endpoint                                                          | Request                                                               |
| ----------------------------------------------------------------- | --------------------------------------------------------------------- |
| [List Products](/api-reference/beta/products/list-products)       | <Badge color="blue" size="sm" stroke>GET</Badge> `/products`          |
| [Create Product](/api-reference/beta/products/create-product)     | <Badge color="green" size="sm" stroke>POST</Badge> `/products`        |
| [Retrieve Product](/api-reference/beta/products/retrieve-product) | <Badge color="blue" size="sm" stroke>GET</Badge> `/products/{id}`     |
| [Update Product](/api-reference/beta/products/update-product)     | <Badge color="orange" size="sm" stroke>PATCH</Badge> `/products/{id}` |
| [Delete Product](/api-reference/beta/products/delete-product)     | <Badge color="red" size="sm" stroke>DELETE</Badge> `/products/{id}`   |

## Attributes

<Columns cols={2}>
  <Column>
    <ResponseField name="company" type="object" required>
      The company this product belongs to.

      <Accordion title="Properties" defaultOpen={true}>
        <ResponseField name="id" type="string" required>
          The unique identifier for the company.
        </ResponseField>

        <ResponseField name="route" type="string" required>
          URL slug for the account's store page, e.g. `pickaxe` in whop.com/pickaxe.
        </ResponseField>

        <ResponseField name="title" type="string" required>
          The display name of the company shown to customers.
        </ResponseField>
      </Accordion>
    </ResponseField>

    <ResponseField name="created_at" type="string" required>
      The datetime the product was created.
    </ResponseField>

    <ResponseField name="custom_cta" type="string" 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`
    </ResponseField>

    <ResponseField name="custom_cta_url" type="string | null" required>
      An optional URL that the call-to-action button links to instead of the default
      checkout flow. Null if no custom URL is set.
    </ResponseField>

    <ResponseField name="custom_statement_descriptor" type="string | null" required>
      Custom bank statement descriptor for product purchases. Maximum 22 characters,
      including required `WHOP*` prefix.
    </ResponseField>

    <ResponseField name="description" type="string | null" required>
      A brief summary of what the product offers, displayed on product pages and
      search results.
    </ResponseField>

    <ResponseField name="external_identifier" type="string | null" required>
      External identifier for the product. Providing it on a product creation
      endpoint updates the existing product with this identifier instead of creating
      a new one.
    </ResponseField>

    <ResponseField name="gallery_images" type="object[]" required>
      The gallery images for this product, ordered by position.

      <Accordion title="Properties" defaultOpen={true}>
        <ResponseField name="id" type="string" required />

        <ResponseField name="url" type="string | null" required>
          A pre-optimized URL for rendering this attachment on the client. This should be used for displaying attachments in apps.
        </ResponseField>
      </Accordion>
    </ResponseField>

    <ResponseField name="global_affiliate_percentage" type="number | null" required>
      Marketplace affiliate commission percentage for this product, or `null` if
      program is inactive.
    </ResponseField>

    <ResponseField name="global_affiliate_status" type="string" required>
      The enrollment status of this product in the Whop marketplace global affiliate program.

      Available options: `enabled`, `disabled`
    </ResponseField>

    <ResponseField name="headline" type="string | null" required>
      A short marketing headline displayed prominently on the product's product
      page.
    </ResponseField>

    <ResponseField name="id" type="string" required>
      The unique identifier for the product.
    </ResponseField>

    <ResponseField name="member_affiliate_percentage" type="number | null" required>
      Member referral commission percentage for this product, or `null` if program
      is inactive.
    </ResponseField>

    <ResponseField name="member_affiliate_status" type="string" required>
      The enrollment status of this product in the member affiliate program.

      Available options: `enabled`, `disabled`
    </ResponseField>

    <ResponseField name="member_count" type="integer" required>
      Active memberships for this product. Returns `0` if the account has disabled
      public member counts.
    </ResponseField>

    <ResponseField name="metadata" type="object | null" required>
      Custom key-value pairs stored on the product and included in payment and
      membership webhook payloads. Max 50 keys, 100 characters per key, 500
      characters per string value.
    </ResponseField>

    <ResponseField name="owner_user" type="object" required>
      The user who owns the company that sells this product.

      <Accordion title="Properties" defaultOpen={true}>
        <ResponseField name="id" type="string" required>
          The unique identifier for the user.
        </ResponseField>

        <ResponseField name="name" type="string | null" required>
          The user's display name shown on their public profile.
        </ResponseField>

        <ResponseField name="username" type="string" required>
          The user's unique username shown on their public profile.
        </ResponseField>
      </Accordion>
    </ResponseField>

    <ResponseField name="product_tax_code" type="object | null" required>
      The tax classification code applied to purchases of this product for sales tax calculation. Null if no tax code is assigned.

      <Accordion title="Properties" defaultOpen={true}>
        <ResponseField name="id" type="string" required>
          The unique identifier for the product tax code.
        </ResponseField>

        <ResponseField name="name" type="string" required>
          Human-readable name of this tax classification, such as 'Digital - SaaS'.
        </ResponseField>

        <ResponseField name="product_type" type="string" required>
          Broad product category this tax code covers, such as physical goods or digital services.

          Available options: `physical`, `digital`, `services`
        </ResponseField>
      </Accordion>
    </ResponseField>

    <ResponseField name="published_reviews_count" type="integer" required>
      The total number of published customer reviews for this product's company.
    </ResponseField>

    <ResponseField name="route" type="string" required>
      URL slug in the product's public link, e.g. `pickaxe-analytics` in
      whop.com/company/pickaxe-analytics.
    </ResponseField>

    <ResponseField name="title" type="string" required>
      The display name of the product shown to customers on the product page and in
      search results.
    </ResponseField>

    <ResponseField name="updated_at" type="string" required>
      The datetime the product was last updated.
    </ResponseField>

    <ResponseField name="verified" type="boolean" required>
      Whether this company has been verified by Whop's trust and safety team.
    </ResponseField>

    <ResponseField name="visibility" type="string" required>
      Controls whether the product is visible to customers. When set to 'hidden', the product is only accessible via direct link.

      Available options: `visible`, `hidden`, `archived`, `quick_link`
    </ResponseField>
  </Column>

  <Column>
    <div className="api-resource-sticky-example">
      ```json Product theme={null}
      {
      	"company": {
      		"id": "biz_xxxxxxxxxxxxxx",
      		"route": "pickaxe",
      		"title": "Pickaxe"
      	},
      	"created_at": "2023-12-01T05:00:00.401Z",
      	"custom_cta": "get_access",
      	"custom_cta_url": "https://example.com/signup",
      	"custom_statement_descriptor": "PICKAXE",
      	"description": "Track your revenue, members, and growth in real time.",
      	"external_identifier": "ext_prod_12345",
      	"gallery_images": [
      		{
      			"id": "file_xxxxxxxxxxxxx",
      			"url": "https://media.whop.com/abc123/optimized.jpg"
      		}
      	],
      	"global_affiliate_percentage": 6.9,
      	"global_affiliate_status": "enabled",
      	"headline": "Real-time data analytics for creators",
      	"id": "prod_xxxxxxxxxxxxx",
      	"member_affiliate_percentage": 6.9,
      	"member_affiliate_status": "enabled",
      	"member_count": 42,
      	"metadata": {
      		"external_product_id": "prod_123"
      	},
      	"owner_user": {
      		"id": "user_xxxxxxxxxxxxx",
      		"name": "John Doe",
      		"username": "johndoe42"
      	},
      	"product_tax_code": {
      		"id": "ptc_xxxxxxxxxxxxxx",
      		"name": "Digital - SaaS",
      		"product_type": "digital"
      	},
      	"published_reviews_count": 12,
      	"route": "pickaxe-analytics",
      	"title": "Pickaxe Analytics",
      	"updated_at": "2023-12-01T05:00:00.401Z",
      	"verified": true,
      	"visibility": "visible"
      }
      ```
    </div>
  </Column>
</Columns>
