---
title: "Create a product"
method: POST
path: "/products"
tags: ["Products"]
---

# Create a product

`POST /products`

## Request

- Base URL: `https://api.whatnot.com/seller-api/rest/v2`
- URL: `https://api.whatnot.com/seller-api/rest/v2/products`
- Auth: OAuth 2
  - Authorization code: `https://api.whatnot.com/seller-api/rest/oauth/authorize`
  - Token URL: `https://api.whatnot.com/seller-api/rest/oauth/token`

Create a product in the seller's catalog. Whatnot creates one variant for every combination of the product's option values, or a single variant when it has no options. Variants start without a price or inventory, so the product is not on sale until you price them, set their inventory, and merchandise the product.

## Request body

- CreateProductRequest: The settable fields when creating a product. Only what a seller can set on create: server-derived fields (id, url, timestamps) live on ExternalProduct and are not accepted here.
  - `title` string, required: The product's title.
  - `description` string, nullable: The product's description.
  - `external_id` string, nullable: The seller-provided external identifier for the product.
  - `category` Category, required
    - `id` string, required: The category's id.
    - `name` string, nullable: The category's display name.
  - `attributes` ProductAttribute[]: The product's attribute values.
    - `id` string, required: The product attribute's id.
    - `name` string, nullable: The product attribute's display name, if the definition is known.
    - `value` string, required: The attribute's value for this product.
  - `options` ProductOption[]: The product's option axes (e.g. Color, Size). At most 3 options are allowed, and the product of their value counts must not exceed the seller's variant limit.
    - `id` string, nullable: The product option's id.
    - `name` string, required: The option's display name, e.g. 'Color'.
    - `values` string[], required: The option's values, e.g. ['Red', 'Blue'].
  - `media` Media[]: The product's images.
    - `id` string, nullable: The image's id.
    - `url` string, required: On create, the image URL to ingest. On read, the CDN URL of the ingested image.
    - `alt` string, nullable: The image's alt text / label, if set.
  - `dimension_profile` DimensionProfile, required: A dimension profile, also embedded in products and shipment items. On read, the resolved profile. On create, reference an existing profile by `id`, or supply `weight` and `dimensions` (with an optional `name`) to auto-create one.
    - `id` string, nullable: An existing dimension profile id to reference.
    - `name` string, nullable: The dimension profile's name. When auto-creating a profile this is used as a name prefix, with the weight and dimensions appended.
    - `weight` Weight
      - `value` number, required: The weight amount.
      - `unit` 'ounce' | 'pound' | 'gram' | 'kilogram', required: The unit used to express weight.
    - `dimensions` Dimensions
      - `length` number, required: The package length.
      - `width` number, required: The package width.
      - `height` number, required: The package height.
      - `unit` 'inch' | 'feet' | 'centimeter' | 'meter', required
    - `ownership` 'seller' | 'whatnot'
    - `active` boolean, nullable: Whether the dimension profile is active.

## Response `201`

The product was created.

- Product: The full representation of a product, shared by the REST v2 `get_product` response and any full-body product webhooks.
  - `id` string, nullable: The product's id.
  - `title` string, required: The product's title.
  - `description` string, nullable: The product's description.
  - `external_id` string, nullable: The seller-provided external identifier for the product.
  - `url` string, nullable: The url of the product in the seller's inventory dashboard.
  - `category` Category
    - `id` string, required: The category's id.
    - `name` string, nullable: The category's display name.
  - `attributes` ProductAttribute[]: The product's attribute values.
    - `id` string, required: The product attribute's id.
    - `name` string, nullable: The product attribute's display name, if the definition is known.
    - `value` string, required: The attribute's value for this product.
  - `options` ProductOption[]: The product's option axes (e.g. Color, Size).
    - `id` string, nullable: The product option's id.
    - `name` string, required: The option's display name, e.g. 'Color'.
    - `values` string[], required: The option's values, e.g. ['Red', 'Blue'].
  - `media` Media[]: The product's images.
    - `id` string, nullable: The image's id.
    - `url` string, required: On create, the image URL to ingest. On read, the CDN URL of the ingested image.
    - `alt` string, nullable: The image's alt text / label, if set.
  - `dimension_profile` DimensionProfile: A dimension profile, also embedded in products and shipment items. On read, the resolved profile. On create, reference an existing profile by `id`, or supply `weight` and `dimensions` (with an optional `name`) to auto-create one.
    - `id` string, nullable: An existing dimension profile id to reference.
    - `name` string, nullable: The dimension profile's name. When auto-creating a profile this is used as a name prefix, with the weight and dimensions appended.
    - `weight` Weight
      - `value` number, required: The weight amount.
      - `unit` 'ounce' | 'pound' | 'gram' | 'kilogram', required: The unit used to express weight.
    - `dimensions` Dimensions
      - `length` number, required: The package length.
      - `width` number, required: The package width.
      - `height` number, required: The package height.
      - `unit` 'inch' | 'feet' | 'centimeter' | 'meter', required
    - `ownership` 'seller' | 'whatnot'
    - `active` boolean, nullable: Whether the dimension profile is active.
  - `created_at` string, date-time, nullable: When the product was created.
  - `updated_at` string, date-time, nullable: When the product was last updated.

## Other responses

- `403`: The seller is not approved to create products, or product creation is not enabled for them.
- `422`: The request failed validation.

---

[API](https://skmtc.dev/whatnot/apis/whatnot-seller-api.md) - [All operations](https://skmtc.dev/whatnot/apis/whatnot-seller-api/llms.txt) - [OpenAPI document](https://skmtc.dev/whatnot/apis/whatnot-seller-api/revisions/e619f15f7ce0?raw)
