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

# Create Product

`POST /products`

## Request

- Base URL: `https://api.monei.com/v1`
- URL: `https://api.monei.com/v1/products`
- Auth: API key in header `Authorization`
- TypeScript: <https://skmtc.dev/monei/apis/monei-api-v1/docs/products/post.ts> (a function with typed inputs; its response is checked against the schema)

Creates a product.

Only `name` is required. To give the product a default price, first [create the price](https://docs.monei.com/apis/rest/prices-create/), then set `defaultPriceId` with [Update Product](https://docs.monei.com/apis/rest/products-update/).

**Slug**:

A `slug` is unique in your account. A slug another product already has is rejected with `409`.

## Request body

- CreateProductRequest
  - `name` string, required: The name of the product.
  - `description` string: A description of the product.
  - `images` string[]: Up to 8 image URLs of the product. Each URL must use `https`.
  - `slug` string: A short name of the product: lowercase letters and digits, joined by single hyphens. A slug is unique in your account. A request that sets a slug another product already has is rejected with `409`. An archived product keeps its slug until you remove it.
  - `shippable` boolean: Whether the product is shipped to the buyer.
  - `unitLabel` string: The name of one unit of the product, for example `seat` or `hour`.
  - `descriptor` string: A statement descriptor stored on the product and returned in its responses. It is not applied to payments or subscriptions yet: set `descriptor` on the subscription instead.
  - `active` boolean: Whether the product is active. Products are never deleted: set `active` to `false` to archive one. Archiving a product does not archive its prices, and its prices can still start subscriptions.
  - `metadata` Metadata: A set of key-value pairs that you can attach to a resource. This can be useful for storing additional information about the resource in a structured format.

## Response `200`

A product object

- Product
  - `id` string, uuid, required: Unique identifier for the product.
  - `name` string, required: The name of the product.
  - `description` string: A description of the product.
  - `images` string[]: Up to 8 image URLs of the product. Each URL must use `https`.
  - `slug` string: A short name of the product: lowercase letters and digits, joined by single hyphens. A slug is unique in your account. A request that sets a slug another product already has is rejected with `409`. An archived product keeps its slug until you remove it.
  - `shippable` boolean: Whether the product is shipped to the buyer.
  - `unitLabel` string: The name of one unit of the product, for example `seat` or `hour`.
  - `descriptor` string: A statement descriptor stored on the product and returned in its responses. It is not applied to payments or subscriptions yet: set `descriptor` on the subscription instead.
  - `defaultPriceId` string, uuid: The default [price](https://docs.monei.com/apis/rest/prices-create/) of the product. It is always a price of this product. You set it with [Update Product](https://docs.monei.com/apis/rest/products-update/), after you create the price.
  - `active` boolean, required: Whether the product is active. Products are never deleted: set `active` to `false` to archive one. Archiving a product does not archive its prices, and its prices can still start subscriptions.
  - `metadata` Metadata: A set of key-value pairs that you can attach to a resource. This can be useful for storing additional information about the resource in a structured format.
  - `createdAt` integer, required: Time at which the resource was created. Measured in seconds since the Unix epoch.
  - `updatedAt` integer: Time at which the resource updated last time. Measured in seconds since the Unix epoch.

## Other responses

- `400`: The request is incorrect or could not be processed
- `401`: Unauthorized error. Please check your auth credentials
- `409`: The request conflicts with the current state of the resource
- `422`: The request was well-formed but could not be processed due to semantic errors
- `500`: Unexpected server error
- `503`: The service is temporarily unavailable

## Changes

- **2026-10-29** `50bc7df2aa43`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/monei/apis/monei-api-v1/changes/products/post.md)

---

[API](https://skmtc.dev/monei/apis/monei-api-v1.md) - [All operations](https://skmtc.dev/monei/apis/monei-api-v1/llms.txt) - [OpenAPI document](https://skmtc.dev/monei/apis/monei-api-v1/revisions/50bc7df2aa43?raw)
