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

# Create a product

`POST /v3/products`

Creates a new product.

## Request body

- ProductCreateRequestModel
  - `name` string, required — Name of the product. Letters (a-z, A-Z), numbers, underscores, hyphens, dots and spaces. Cannot start or end with a space.
  - `displayName` string, required — Display name of the product, shown in the customer portal. Any printable characters, including letters from any script, punctuation and emoji. Cannot contain line breaks, tabs, other control characters, invisible formatting characters (zero-width and bidirectional marks), and cannot start or end with whitespace.
  - `description` string, required — Description for the product. Any printable characters and line breaks. Cannot contain control characters other than tab, carriage return and line feed, nor invisible formatting characters (zero-width and bidirectional marks), and cannot start or end with whitespace.
  - `iconUrl` string, uri, nullable — URL of the product icon.
  - `licenseTemplateId` string, required — Unique identifier for the license template.
  - `licensePolicyId` string, nullable — Use 'licenseTemplateId' instead.
  - `trialPolicyId` string, nullable — Unique identifier for the trial policy.
  - `metadata` ProductMetadataRequestModel[], nullable — List of metdata key/value pairs.
    - `key` string, required — Name of the key.
    - `value` string, required — Value of the key.
    - `viewPermissions` ViewPermission[], nullable — Array of view permissions associated with the metadata.
    - `visible` boolean, nullable — Set true to access the metadata on activation.
  - `customAttributes` CustomAttributeValueRequestModel[], nullable — List of custom attribute name/value pairs.
    - `name` string, required — Letters (a-z, A-Z), numbers, underscores, hyphens and dots.
    - `value` string, required

## Response `201`

Created

- ProductDto
  - `id` string, required
  - `createdAt` string, date-time, required
  - `updatedAt` string, date-time, required
  - `name` string, required
  - `displayName` string, required
  - `description` string, required
  - `iconUrl` string, nullable
  - `publicKey` string, required
  - `totalLicenses` integer, required
  - `totalTrialActivations` integer, required
  - `totalReleases` integer, required
  - `totalProductVersions` integer, required
  - `totalFeatureFlags` integer, required
  - `automatedEmails` string[], required
  - `licenseTemplateId` string, required
  - `trialPolicyId` string, required
  - `metadata` AdminMetadataDto[], required
    - `id` string, required
    - `createdAt` string, date-time, required
    - `updatedAt` string, date-time, required
    - `key` string, required
    - `value` string, nullable
    - `viewPermissions` ViewPermission[], required
    - `visible` boolean, required
  - `customAttributes` CustomAttributeValueDto[], required
    - `name` string, required
    - `dataType` 'string', required
    - `value` string, nullable

## Other responses

- `400` — Bad Request
- `401` — Unauthorized
- `403` — Forbidden
- `409` — Conflict
- `429` — Too Many Requests
- `500` — Server Error

---

[API](https://skmtc.net/cryptlex/apis/cryptlex-web-api.md) · [All operations](https://skmtc.net/cryptlex/apis/cryptlex-web-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/cryptlex/cryptlex-web-api/revisions/66dcb6293180/schema)
