---
title: "List Products"
method: GET
path: "/products"
tags: ["Products"]
---

# List Products

`GET /products`

Returns a paginated list of products. Omit `account_id` to search the public marketplace.

## Query parameters

- `account_id` string
- `query` string
- `marketplace_category_route` string
- `plan_types` string[]
- `price_minimum` number
- `price_maximum` number
- `visibilities` string[]
- `access_pass_types` string[]
- `labels` string[]
- `direction` 'asc' | 'desc'
- `order` string
- `first` integer
- `after` string
- `last` integer
- `before` string
- `created_after` string
- `created_before` string

## Response `200`

marketplace products listed without an account

- object
  - `data` ProductListItem[], required
    - `account` object, nullable, required — Account that sells this product.
    - `created_at` string, required — When the product was created, as an ISO 8601 timestamp.
    - `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.
    - `headline` string, nullable, required — Short marketing headline displayed on product page.
    - `id` string, required — Product ID, prefixed `prod_`.
    - `labels` string[], required
    - `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.
    - `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.
  - `page_info` object, required
    - `end_cursor` string, nullable, required
    - `has_next_page` boolean, required
    - `has_previous_page` boolean, required
    - `start_cursor` string, nullable, required

## Other responses

- `400` — Invalid Parameters
- `401` — Unauthorized

## Changes

- **2026-08-24** `e91d507bda45` — 11 info
  - added the new optional `query` request parameter `created_after`
  - added the new optional `query` request parameter `created_before`
  - added the new optional `query` request parameter `marketplace_category_route`
  - added the new optional `query` request parameter `plan_types`
  - …7 more
- **2026-08-19** `23dfbe1a0d1f` — 2 info
  - added the new optional `query` request parameter `labels`
  - added the required property `data/items/labels` to the response with the `200` status
- **2026-08-07** `f1020c3ecda4` — 2 info
  - added the optional property `error/code` to the response with the `400` status
  - added the optional property `error/code` to the response with the `401` status
- **2026-08-04** `bdd0e2c70d58` — 2 info
  - the security scope `access_pass:basic:read` was added to the endpoint's security scheme `bearerAuth`
  - the security scope `product:basic:read` was removed from the endpoint's security scheme `bearerAuth`
- **2026-07-26** `60bbb4a6ffbc` — 6 breaking, 1 warning, 5 info
  - added the new required `query` request parameter `account_id`
  - the response property `data/items/visibility` became nullable for the status `200`
  - the `data/items/created_at` response's property type/format changed from `string`/`date-time` to `string`/`` for status `200`
  - the `data/items/member_count` response's property type/format changed from `integer`/`` to `number`/`` for status `200`
  - …8 more

[Change history](https://skmtc.dev/whop/apis/whop-api/changes/products/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)
