---
title: "Retrieve Product"
method: GET
path: "/products/{id}"
tags: ["Products"]
---

# Retrieve Product

`GET /products/{id}`

Retrieves a product. Public — no credentials.

## Response `200`

product retrieved without authentication

- Product
  - `account` object, nullable, required — Account that sells this product.
  - `created_at` string, required — When the product was created, as an ISO 8601 timestamp.
  - `custom_cta` 'get_access' | 'join' | 'order_now' | 'shop_now' | 'call_now' | 'donate_now' | 'contact_us' | 'sign_up' | 'subscribe' | 'purchase' | 'get_offer' | 'apply_now' | 'complete_order' | 'null', nullable, required — Call-to-action button label shown on the product purchase page.
  - `custom_cta_url` string, nullable, required — URL the call-to-action button links to instead of checkout.
  - `custom_statement_descriptor` string, nullable, required — Custom text label on customer's bank statement.
  - `default_plan` ProductPublicPlan, required
    - `billing_period` number, nullable, required — Number of days between recurring charges, such as 30 for monthly or 365 for annual. `null` for one-time plans.
    - `expiration_days` number, nullable, required — Access duration in days for expiration-based plans. `null` for plans without an expiration.
    - `id` string, required — Plan ID, prefixed `plan_`.
    - `initial_price` Money, required
      - `amount` 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.
      - `currency` string, required — Three-letter ISO 4217 currency code, lowercase.
      - `decimals` integer, required — How many decimal places the amount CARRIES — the precision the charge itself runs at.
      - `display_decimals` 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.
    - `plan_type` 'renewal' | 'one_time', required — Billing model for this plan: `one_time` or `renewal`.
    - `renewal_price` Money, required
      - `amount` 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.
      - `currency` string, required — Three-letter ISO 4217 currency code, lowercase.
      - `decimals` integer, required — How many decimal places the amount CARRIES — the precision the charge itself runs at.
      - `display_decimals` 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.
    - `title` string, nullable, required — Plan display name shown to customers. `null` if no title has been set.
    - `unlimited_stock` boolean, required — Whether the plan has unlimited stock.
    - `visibility` 'visible' | 'hidden' | 'archived' | 'quick_link', required — Where this plan can be seen. `visible` plans appear on the product page.
  - `description` string, nullable, required — Written description displayed on the product page. `null` if none is set.
  - `external_identifier` string, nullable, required — External identifier stored on the product for your own reference.
  - `gallery_images` ProductGalleryImage[], required
    - `content_type` string, nullable, required — Uploaded file MIME type, such as image/jpeg.
    - `id` string, required — Gallery image ID.
    - `url` string, nullable, required — Pre-optimized URL for rendering this image on the client.
  - `global_affiliate_percentage` number, nullable, required — Commission rate affiliates earn through the global affiliate program.
  - `global_affiliate_status` 'enabled' | 'disabled' | 'null', nullable, required — Enrollment status in the global affiliate program.
  - `headline` string, nullable, required — Short marketing headline displayed on product page.
  - `id` string, required — Product ID, prefixed `prod_`.
  - `labels` string[], required
  - `marketplace_status` 'not_available' | 'pending_review' | 'live_marketplace', required — Listing state on the whop.com marketplace. `pending_review` means submitted and awaiting review; `live_marketplace` means approved and discoverable.
  - `member_affiliate_percentage` number, nullable, required — Commission rate members earn through the member affiliate program.
  - `member_affiliate_status` 'enabled' | 'disabled' | 'null', nullable, required — Enrollment status in the member affiliate program.
  - `member_count` number, required — Active memberships for this product; 0 if public member counts are disabled.
  - `metadata` object, nullable, required — Custom key-value pairs stored on the product.
  - `owner_user` object, nullable, required — User who owns the account selling this product.
  - `product_tax_code` object, nullable, required — Tax classification code for this product, or `null` if no tax code is set.
  - `published_reviews_count` number, required — Published customer reviews for this product.
  - `route` string, required — URL slug for the product's public link.
  - `title` string, required — Product display name shown to customers.
  - `updated_at` string, required — When the product was last updated, as an ISO 8601 timestamp.
  - `verified` boolean, required — Whether the product has been verified by Whop.
  - `visibility` string, nullable, required — Whether the product is publicly visible, hidden, or archived.

## Other responses

- `404` — Resource not found

## Changes

- **2026-08-24** `e91d507bda45` — 1 info
  - added the required property `default_plan` to the response with the `200` status
- **2026-08-19** `23dfbe1a0d1f` — 1 info
  - added the required property `labels` to the response with the `200` status
- **2026-08-07** `f1020c3ecda4` — 1 info
  - added the optional property `error/code` to the response with the `404` status
- **2026-08-04** `bdd0e2c70d58` — 1 info
  - the endpoint scheme security `bearerAuth` was removed from the API
- **2026-07-31** `099fdc3be422` — 20 warning
  - added the new `apply_now` enum value to the `custom_cta` response property for the response status `200`
  - added the new `call_now` enum value to the `custom_cta` response property for the response status `200`
  - added the new `complete_order` enum value to the `custom_cta` response property for the response status `200`
  - added the new `contact_us` enum value to the `custom_cta` response property for the response status `200`
  - …16 more

[Full history](https://skmtc.dev/whop/apis/whop-api/changes/products/:id/get.md)

---

[API](https://skmtc.dev/whop/apis/whop-api.md) · [All operations](https://skmtc.dev/whop/apis/whop-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/whop/whop-api/revisions/9e320991dd2f/schema)
